NoteOnMe博客平台搭建
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

655 wiersze
33 KiB

3 lat temu
  1. /**
  2. * jQuery.Markdown.js v0.0.10
  3. * Author: taknakamu
  4. * Git: https://github.com/taknakamu/jquery-markdown
  5. *
  6. * Copyright (c) 2013 Kosuke Nakamuta
  7. * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
  8. */
  9. (function($) {
  10. $.fn.extend({
  11. markdown: function(options) {
  12. var defaults = {
  13. target_form : $(this).selector
  14. }
  15. options = $.extend(defaults, options);
  16. function markdownConvert(art_body) {
  17. var md = {
  18. options : {
  19. empty_mark : "\n" // "\n" or "<br>"
  20. },
  21. vs : {},
  22. variable : {
  23. editbody : null,
  24. stack : {
  25. tag : [],
  26. text : []
  27. },
  28. text : "",
  29. html : ""
  30. },
  31. convert : {
  32. tags : {
  33. hr : {
  34. default_ : function() { return "<hr />"; }
  35. },
  36. a : {
  37. default_ : function(href, v) { return '<a href="' + href + '">' + v + '</a>'; },
  38. title : function(href, v, title) { return '<a href="' + href + '" title="' + title + '" target="_blank">' + v + '</a>'; },
  39. target_blank : function(href, v) { return '<a href="' + href + '" target="_blank">' + v + '</a>'; }
  40. },
  41. img : {
  42. default_ : function(src, alt) { return '<img class="img-frame" style="max-width:100%;" src="' + src + '" alt="' + alt + '"/>'; },
  43. title : function(src, alt, title) { return '<img title="' + title + '" class="img-frame" style="max-width:100%;" src="' + src + '" alt="' + alt + '"/>'; }
  44. },
  45. pre : {
  46. default_ : function(lang, v) { return '<pre class="brush: ' + lang.toLowerCase() + ';">' + v + '</pre>'; }
  47. },
  48. empty : {
  49. default_ : function() { return md.options.empty_mark; }
  50. },
  51. th : {
  52. default_ : function(v) { return '<th>' + v + '</th>'; },
  53. center : function(v) { return '<th align="center">' + v + '</th>'; },
  54. left : function(v) { return '<th align="left">' + v + '</th>'; },
  55. right : function(v) { return '<th align="right">' + v + '</th>'; }
  56. },
  57. td : {
  58. default_ : function(v) { return '<td>' + v + '</td>'; },
  59. center : function(v) { return '<td align="center">' + v + '</td>'; },
  60. left : function(v) { return '<td align="left">' + v + '</td>'; },
  61. right : function(v) { return '<td align="right">' + v + '</td>'; }
  62. },
  63. notag : {
  64. default_ : function(tag, v) { return '<' + tag + '>' + v + '</' + tag + '>'; }
  65. }
  66. },
  67. replacer : {
  68. strong : ["__([^_]+)__", "\\\*\\\*([^*]+)\\\*\\\*"],
  69. em : ["_([^_]+)_", "\\\*([^*]+)\\\*"],
  70. del : ["~~([^~]+)~~"],
  71. code : ["`([^`]+)`"]
  72. },
  73. push : function(tag, text) {
  74. if (!md.convert.inStack(tag)) {
  75. md.variable.stack.tag.push(tag);
  76. }
  77. if (!md.variable.stack.text[tag]) {
  78. md.variable.stack.text[tag] = [];
  79. }
  80. if (typeof text !== 'undefined') {
  81. md.variable.stack.text[tag].push(text);
  82. }
  83. return this;
  84. },
  85. pushest : function(text) {
  86. if (md.convert.inStack()) {
  87. var maxi = md.variable.stack.tag.length - 1;
  88. var tag = md.variable.stack.tag[maxi];
  89. return md.convert.push(tag, text);
  90. }
  91. return this;
  92. },
  93. pop : function(called, arguments_) {
  94. if (md.convert.inStack()) {
  95. var tag = md.variable.stack.tag.pop();
  96. var text = innerHtml = "";
  97. var args = (arguments_ || []);
  98. while (typeof (text = md.variable.stack.text[tag].shift()) !== 'undefined') {
  99. if (tag === "pre" && args.length === 0) {
  100. args.push(text);
  101. continue;
  102. }
  103. md.convert.text(md.convert.text() + text);
  104. if (tag === "pre" || tag === "blockquote") {
  105. md.convert.text(md.convert.text() + md.options.empty_mark);
  106. }
  107. }
  108. if (tag === "blockquote") {
  109. md.convert.text(markdownConvert(md.convert.text()));
  110. }
  111. if (typeof called === 'undefined') {
  112. called = 'default_';
  113. }
  114. if (args.length === 0 && !md.convert.tags[tag]) {
  115. args.push(tag);
  116. tag = "notag";
  117. }
  118. args.push(md.convert.text());
  119. innerHtml = md.convert.tags[tag][called].apply(this, args);
  120. $.each(md.convert.replacer, function(rep, regs) {
  121. $(regs).each(function(i, exp) {
  122. var regexp = new RegExp(exp, "g");
  123. innerHtml = innerHtml.replace(regexp, '<' + rep + '>$1</' + rep + '>');
  124. });
  125. });
  126. if (!md.convert.inStack()) {
  127. md.convert.html(innerHtml);
  128. }
  129. md.convert.text("");
  130. return innerHtml;
  131. }
  132. return this;
  133. },
  134. _string : function(variable, string) {
  135. if (typeof string === 'undefined') {
  136. return md.variable[variable];
  137. } else {
  138. md.variable[variable] = string;
  139. return this;
  140. }
  141. },
  142. text : function(text) { return md.convert._string("text", text); },
  143. html : function(html) { return md.convert._string("html", html); },
  144. inStack : function(tag) {
  145. if (typeof tag === 'undefined') {
  146. return (md.variable.stack.tag.length !== 0) ? true : false;
  147. }
  148. if (tag === "h" && md.convert.inStack()) {
  149. var maxi = md.variable.stack.tag.length - 1;
  150. if (md.variable.stack.tag[maxi].match(/^h[1-6]/)) {
  151. return true;
  152. }
  153. }
  154. return ($.inArray(tag, md.variable.stack.tag) !== -1) ? true : false;
  155. }
  156. },
  157. check : {
  158. init : function() {
  159. md.vs = {};
  160. },
  161. valid : function(callmethod) {
  162. if ('' !== md.convert.html()) {
  163. return false;
  164. }
  165. if (md.convert.inStack() && !md.convert.inStack(callmethod)) {
  166. return false;
  167. }
  168. return true;
  169. },
  170. _pre : function(i, v) {
  171. return {
  172. "nowv" : v,
  173. "prev" : md.variable.editbody[i-1],
  174. "nexv" : md.variable.editbody[i+1],
  175. "tag" : "",
  176. "args" : false
  177. };
  178. },
  179. isset : function(v) {
  180. return (md.options.empty_mark !== v && "" !== v) ? true : false;
  181. },
  182. wrapper : function(callmethod, args) {
  183. md.check.init();
  184. if (md.check.valid(callmethod)) {
  185. md.vs = md.check._pre.apply(this, args);
  186. } else {
  187. return false;
  188. }
  189. md.check.tags[callmethod].apply(this);
  190. if (typeof md.vs.nexv === 'undefined') {
  191. while (md.convert.inStack()) {
  192. md.convert.pushest(md.convert.pop());
  193. }
  194. }
  195. },
  196. tags : {
  197. h : function(args) {
  198. /**
  199. * # H1 Text - ###### H6 Text
  200. */
  201. if (null !== md.vs.nowv.match(/^#{1,6}\s/)) {
  202. var tag = "h" + md.vs.nowv.match(/^#{1,6}/)[0].length;
  203. var text = md.vs.nowv.replace(/^#{1,6}\s/, "")
  204. md.convert.push(tag, text).pop();
  205. } else if (md.check.isset(md.vs.nowv) && md.vs.nexv) {
  206. if (md.convert.inStack("h")) {
  207. md.convert.pop();
  208. }
  209. /**
  210. * H1 Text
  211. * ================
  212. */
  213. if (md.vs.nexv.match(/^=+$/)) {
  214. md.convert.push("h1", md.vs.nowv);
  215. }
  216. /**
  217. * H2 Text
  218. * ----------------
  219. */
  220. if (md.vs.nexv.match(/^\-+$/)) {
  221. md.convert.push("h2", md.vs.nowv);
  222. }
  223. } else if (md.convert.inStack("h")) {
  224. md.convert.pop();
  225. }
  226. },
  227. hr : function() {
  228. var checker = function(mark) {
  229. if (md.vs.nowv.indexOf(mark) === 0) {
  230. var regexp = new RegExp(((mark === "*") ? "\\" + mark : mark), "g");
  231. if ("" === md.vs.nowv.replace(regexp, "")) {
  232. md.convert.push("hr").pop();
  233. }
  234. }
  235. }
  236. checker("-");
  237. checker("*");
  238. checker("_");
  239. },
  240. empty : function() {
  241. if ("" === md.vs.nowv || md.vs.nowv.match(/^!?\[.*\]:.*/)) {
  242. md.convert.push("empty").pop();
  243. }
  244. },
  245. pre : function() {
  246. if (md.vs.nowv.indexOf("```") !== -1) {
  247. (!md.convert.inStack("pre")) ?
  248. md.convert.push("pre", md.vs.nowv.replace(/`/g, "")):
  249. md.convert.pop();
  250. } else if (md.convert.inStack("pre")) {
  251. md.convert.pushest(md.vs.nowv);
  252. }
  253. },
  254. blockquote : function(args) {
  255. if (md.vs.nowv.match(/^(\s{1,3})?>\s?/)) {
  256. md.vs.nowv = md.vs.nowv.replace(/^(\s{1,3})?>\s?/, "");
  257. md.convert.push("blockquote", md.vs.nowv);
  258. } else if (!md.check.isset(md.vs.nowv)) {
  259. if (typeof md.vs.nexv !== 'undefined' && md.check.isset(md.vs.nexv)) {
  260. if (!md.vs.nexv.match(/^(\s{1,3})?>/)) {
  261. md.convert.pop();
  262. }
  263. }
  264. } else if (md.convert.inStack("blockquote")) {
  265. md.convert.pushest(md.vs.nowv);
  266. }
  267. },
  268. ol : function() {
  269. var nv = md.vs.nowv;
  270. var nn = md.vs.nexv;
  271. if (nv.match(/^(\s{0,7})?[0-9]+[.]\s/)) {
  272. if (!md.convert.inStack("ol")) {
  273. md.convert.push("ol");
  274. nv = nv.replace(/^\s+/g, "");
  275. }
  276. }
  277. if (md.convert.inStack("ol")) {
  278. if (nv.match(/^[0-9]+[.]\s/) || nv.match(/^[\*\+\-]\s/)) {
  279. lipop();
  280. md.convert.push("li", nv.replace(/^\s{0,7}?[0-9]+[.]\s(.*)/, "$1")
  281. .replace(/^[\*\+\-]\s(.*)/, "$1"));
  282. } else if (nv.match(/^\s+/)) {
  283. nv = nv.replace(/^\s+/g, "");
  284. if (nv.match(/^[\*\+\-]\s/)) {
  285. md.convert.pushest(nv);
  286. if (nn.match(/^[0-9]+[.]\s/)) {
  287. lipop();
  288. }
  289. } else if (nv.match(/^.*/)) {
  290. md.convert.pushest(nv);
  291. } else if (!md.check.isset(nv)) {
  292. md.convert.pushest(nv);
  293. }
  294. } else if (!md.check.isset(nv)) {
  295. if (!md.check.isset(nn)) {
  296. md.convert.pushest(nv);
  297. return true;
  298. }
  299. if (nn && nn.match(/^\s+/)) {
  300. if (!nn.match(/^\s{1,7}?[\*\+\-]\s/)) {
  301. md.convert.pushest(nv);
  302. return true;
  303. }
  304. } else if (nn) {
  305. if (nn.match(/^[0-9]+[.]\s/)) {
  306. md.convert.pushest(nv);
  307. return true;
  308. }
  309. }
  310. lipop();
  311. md.convert.pop();
  312. md.addP = false;
  313. } else {
  314. md.convert.pushest(nv);
  315. }
  316. }
  317. },
  318. ul : function() {
  319. var nv = md.vs.nowv;
  320. var nn = md.vs.nexv;
  321. if (nv.match(/^(\s{0,7})?[\*\+\-]\s/)) {
  322. if (!md.convert.inStack("ul")) {
  323. md.convert.push("ul");
  324. nv = nv.replace(/^\s+/g, "");
  325. }
  326. }
  327. if (md.convert.inStack("ul")) {
  328. if (nv.match(/^[0-9]+[.]\s/) || nv.match(/^[\*\+\-]\s/)) {
  329. lipop();
  330. md.convert.push("li", nv.replace(/^\s{0,7}?[0-9]+[.]\s(.*)/, "$1")
  331. .replace(/^[\*\+\-]\s(.*)/, "$1"));
  332. } else if (nv.match(/^\s+/)) {
  333. nv = nv.replace(/^\s+/g, "");
  334. if (nv.match(/^[0-9]+[.]\s/)) {
  335. md.convert.pushest(nv);
  336. if (nn.match(/^[\*\+\-]\s/)) {
  337. lipop();
  338. }
  339. } else if (nv.match(/^.*/)) {
  340. md.convert.pushest(nv);
  341. } else if (!md.check.isset(nv)) {
  342. md.convert.pushest(nv);
  343. }
  344. } else if (!md.check.isset(nv)) {
  345. if (!md.check.isset(nn)) {
  346. md.convert.pushest(nv);
  347. return true;
  348. }
  349. if (nn && nn.match(/^\s+/)) {
  350. if (!nn.match(/^\s{1,7}?[0-9]+[.]\s/)) {
  351. md.convert.pushest(nv);
  352. return true;
  353. }
  354. } else if (nn) {
  355. if (nn.match(/^[\*\+\-]\s/)) {
  356. md.convert.pushest(nv);
  357. return true;
  358. }
  359. }
  360. lipop();
  361. md.convert.pop();
  362. md.addP = false;
  363. } else {
  364. md.convert.pushest(nv);
  365. }
  366. }
  367. },
  368. table : function() {
  369. var nv = md.vs.nowv;
  370. var nn = md.vs.nexv;
  371. if (nn && nv.match(/\|/) && nn.match(/:?-+:?[\s+]?\|/)) {
  372. if (!md.convert.inStack("table")) {
  373. md.convert.push("table").push("thead").push("tr");
  374. var trs = nn.replace(/^\|(.*)\|$/, "$1").split("|");
  375. md.aligns = [];
  376. $(trs).each(function(i, v) {
  377. var repv = v.replace(/^\s+|\s+$/g, "");
  378. if (repv.match(/^:.*:$/)) {
  379. md.aligns[i] = "center";
  380. } else if (repv.match(/^:/)) {
  381. md.aligns[i] = "left";
  382. } else if (repv.match(/:$/)) {
  383. md.aligns[i] = "right";
  384. } else {
  385. md.aligns[i] = "default_";
  386. }
  387. });
  388. var ths = nv.replace(/^\|(.*)\|$/, "$1").split("|");
  389. $(ths).each(function(i, v) {
  390. md.convert.pushest(
  391. md.convert.push("th", v.replace(/^\s+|\s+$/g, "")).pop(md.aligns[i])
  392. );
  393. });
  394. md.convert.pushest((md.convert.pop()));
  395. md.convert.pushest((md.convert.pop()));
  396. }
  397. } else if (nn && nv.match(/\|/)) {
  398. if (!md.convert.inStack("tbody")) {
  399. md.convert.push("tbody");
  400. } else {
  401. md.convert.push("tr");
  402. var tds = nv.replace(/^\|(.*)\|$/, "$1").split("|");
  403. $(tds).each(function(i, v) {
  404. md.convert.pushest(
  405. md.convert.push("td", v.replace(/^\s+|\s+$/g, "")).pop(md.aligns[i])
  406. );
  407. });
  408. md.convert.pushest((md.convert.pop()));
  409. }
  410. } else if (md.convert.inStack("table")) {
  411. md.convert.pushest((md.convert.pop()));
  412. md.convert.pop();
  413. }
  414. },
  415. p : function() {
  416. if ((!md.vs.nowv.match(/^\s*?</) && md.vs.nowv !== "\n")) {
  417. if (!md.vs.nowv.match(/^\s*?</)) {
  418. if (!md.convert.inStack("p")) {
  419. md.convert.push("p");
  420. }
  421. var getTitle = function(src) {
  422. src = src.replace(/\\/g, "\\\\")
  423. .replace(/\*/g, "\\*")
  424. .replace(/\(/g, "\\(")
  425. .replace(/\)/g, "\\)")
  426. .replace(/\[/g, "\\[")
  427. .replace(/\]/g, "\\]")
  428. .replace(/\^/g, "\\^")
  429. .replace(/\$/g, "\\$")
  430. .replace(/\-/g, "\\-")
  431. .replace(/\|/g, "\\|")
  432. .replace(/\//g, "\\/");
  433. var title = null;
  434. var matches = new RegExp("\\[" + src + "\\]:", "i");
  435. $.each(md.variable.editbody, function(i, v) {
  436. if (v.match(matches)) {
  437. if ((uri = v.match(/\[.*\]:(.*)/))) {
  438. uri = uri[1].replace(/^\s+/, "");
  439. src = uri.split(" ")[0];
  440. title = uri.match(/.*"(.*)"/);
  441. title = (title) ? title[1] : null;
  442. }
  443. }
  444. });
  445. return [src, title];
  446. }
  447. var createtags = function(src, alt, title) {
  448. if (null !== md.vs.nowv.match(/!/)) {
  449. var img = md.convert.push("img").pop((title ? "title" : "default_"), [src, alt, title]);
  450. var a = md.convert.push("a").pushest(img).pop("target_blank", [src]);
  451. } else {
  452. a = md.convert.push("a").pop((title ? "title" : "default_"), [src, alt, title]);
  453. }
  454. return a;
  455. }
  456. while (null !== md.vs.nowv.match(/!?\[.*?\]\(.*?\)/)) {
  457. var a_match = md.vs.nowv.match(/\[(.*?)\]\((.*?)\)/);
  458. var src_title = a_match[2].split(" ");
  459. var title = src_title[1] && src_title[1].replace(/"/g, "");
  460. var a = createtags(src_title[0], a_match[1], title);
  461. md.vs.nowv = md.vs.nowv.replace(a_match[0], a);
  462. }
  463. if (null !== md.vs.nowv.match(/!?\[.*\]\[.*\]/)) {
  464. var alt = md.vs.nowv.replace(/!?\[(.*)\]\[.*\]/, "$1");
  465. var src = md.vs.nowv.replace(/!?\[.*\]\[(.*)\]/, "$1");
  466. var title_matches = getTitle(src);
  467. src = title_matches[0];
  468. title = title_matches[1];
  469. md.vs.nowv = createtags(src, alt, title);
  470. }
  471. if (null !== md.vs.nowv.match(/!?\[.*\]/)) {
  472. var alt = src = md.vs.nowv.replace(/^.*?!?\[(.*)\].*?/, "$1");
  473. var title_matches = getTitle(src);
  474. src = title_matches[0];
  475. title = title_matches[1];
  476. var a = createtags(src, alt, title);
  477. md.vs.nowv = md.vs.nowv.replace(/^(.*)?!?\[(.*)\](.*)?/, "$1" + a + "$3");
  478. }
  479. if (typeof md.vs.nexv !== 'undefined') {
  480. if (md.convert.inStack("p")) {
  481. if (md.vs.nexv.match(/^=+$/)) {
  482. md.convert.pop();
  483. md.convert.push("h1", md.vs.nowv);
  484. return true;
  485. }
  486. if (md.vs.nexv.match(/^\-+$/)) {
  487. md.convert.pop();
  488. md.convert.push("h2", md.vs.nowv);
  489. return true;
  490. }
  491. }
  492. var convertedtext = markdownConvert(md.vs.nexv);
  493. if ("" !== convertedtext && "<p>" !== convertedtext.substr(0,3)) {
  494. md.convert.pushest(md.vs.nowv).pop();
  495. }
  496. }
  497. if (typeof md.vs.nexv === 'undefined') {
  498. md.convert.pushest(md.vs.nowv).pop();
  499. } else {
  500. md.convert.pushest(md.vs.nowv + '<br>');
  501. }
  502. }
  503. }
  504. },
  505. etc : function() {
  506. var innerHtml = md.vs.nowv;
  507. /*
  508. $.each(md.convert.replacer, function(rep, regs) {
  509. $(regs).each(function(i, exp) {
  510. var regexp = new RegExp(exp, "g");
  511. innerHtml = innerHtml.replace(regexp, '<' + rep + '>$1</' + rep + '>');
  512. });
  513. });
  514. */
  515. md.convert.html(innerHtml);
  516. }
  517. }
  518. }
  519. };
  520. var lipop = function() {
  521. var tag = "li";
  522. if (md.convert.inStack(tag)) {
  523. var textlength = getTextLength();
  524. var textlengthAddSpace = getTextLength(true);
  525. var converttext = getConvertText();
  526. if (textlength !== 1 && textlength !== textlengthAddSpace) {
  527. md.addP = true;
  528. }
  529. md.convert.pop();
  530. var poped = markdownConvert(converttext);
  531. if (!md.addP) {
  532. poped = poped.replace("<p>", "").replace("</p>", "");
  533. }
  534. md.convert.push(tag, poped);
  535. md.convert.pushest(md.convert.pop());
  536. }
  537. };
  538. var getConvertText = function(mode_length) {
  539. var tag = "li";
  540. var textlength = 0;
  541. var converttext = "";
  542. $(md.variable.stack.text[tag]).each(function(i, v) {
  543. if ("" !== v) {
  544. textlength++;
  545. }
  546. converttext += v + md.options.empty_mark;
  547. });
  548. return ((mode_length) ? textlength : converttext);
  549. };
  550. var getTextLength = function(isset_) {
  551. tag = "li";
  552. return ((isset_) ? getConvertText(true) : md.variable.stack.text[tag].length);
  553. };
  554. md.variable.editbody = art_body.split(/\n/);
  555. var md_format = "";
  556. $.each(md.variable.editbody, function() {
  557. var args = arguments;
  558. $.each(md.check.tags, function(tagname) {
  559. md.check.wrapper(tagname, args);
  560. })
  561. md_format += md.convert.html();
  562. md.convert.html("");
  563. });
  564. return md_format;
  565. }
  566. return this.each(function() {
  567. var markdownconvert = "";
  568. $.each($(this), function(i, v) {
  569. var v = ($(v).val() || $(v).html());
  570. markdownconvert += markdownConvert.apply(this, [v]);
  571. });
  572. $(this).addClass("markdown-body").html(markdownconvert);
  573. });
  574. }
  575. });
  576. })(jQuery);