From dc72403acc14f8f9d19d3576db4c7bf2891442c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o=20Soares=20dos=20Santos?= Date: Sat, 11 Jul 2015 23:02:02 +0100 Subject: [PATCH] feat(tasklists): add support for GFM tasklists Github Flavored Markdown supports tasklist by `[x]` or `[ ]` after list item marker. This commit adds this feature to showdown through an option called "tasklists". Related to #164 --- .gitignore | 1 + dist/showdown.js | Bin 61125 -> 61141 bytes dist/showdown.js.map | Bin 192260 -> 190512 bytes dist/showdown.min.js | Bin 20710 -> 20999 bytes dist/showdown.min.js.map | Bin 23655 -> 23917 bytes src/showdown.js | 3 +- src/subParsers/lists.js | 63 ++++++++++++---------------- test/features/#164.4.tasklists.html | 10 +++++ test/features/#164.4.tasklists.md | 8 ++++ test/node/showdown.js | 3 +- test/node/testsuite.features.js | 4 +- 11 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 test/features/#164.4.tasklists.html create mode 100644 test/features/#164.4.tasklists.md diff --git a/.gitignore b/.gitignore index ed1e238..ab96a23 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .DS_Store node_modules npm-debug.log +localtest.html diff --git a/dist/showdown.js b/dist/showdown.js index e4240a359e32bb3c2822d446a6ea8635830c6c65..cff5e09d4f288d758f2893661bb304a88655fd6f 100644 GIT binary patch delta 789 zcmZWnJ#W)M7*^9xSwJ9$GQDJ|9g;Xn5e)gDBT`i{09!w#i~Ytq<<7S5E+G+Ag?|9D z#NPnPRS^S749tjuu|hELH{d-dhETkmb@#l_*WIV{^{?maZ)9n$p30J20WeID1=mJ* z;NmxALSy!#^x$<0nRmrK*mq}7p}KQe-Pwl&b9ghopFP{H=M)1I)xjU3KgOU6Ps$6f zB?@x%o($)YsC`sEcp29>hAB*XFdilq-lZDGEQxKbkkWP?lhSOg^ulKB3yMOl|HUNcYq9QxCs&Y)#7L3Q` z?A__Bwe<6c^3h--1e%97k&RAVOV~=ut9@R;7hTxL)5v>i*xEV}#SsNfpMTp-kIpV# zb)W{Tqcw0cd8XD*noUTU(saErGE%@}ZblR##F^)LxfMb@8gWf0LV%tq6mu9dE^KQ$ zmIydA7-@O}5TMTk)L>#Ni$x(?ZWbz*jDT)yJW1#h75YZZbLuI}zQ65lWFOyew0{Hl Cvh(i2`(xR$?!X*B7b;XGOO!9rFSd zXkLLnC?kX@QbJ8bnOC5vW9E!w6fRSYc6I*w|8u^X@0ay2m-P>mnq)OsUDTeP4MKkx z%%Vjl29@B@+k7@TnbPbfaYHL{6Xr!X?FvJnBpViNq~(n0Q%-xW>c^0X)b~&*&+ zmK5rp5+C1g-9NDIz=@b~2Gx{80Ai}QhmUEY-hbj-N`5}v?rWXJdy;W@m6wzZaL67Y zQP-lh(>rZF2x<_7iP+Tj)Rtci>AcnGE-l*r*Sjm&1LS^vFjF^&y4v%&;F>GuA~j3c z_*?kq3wgyB^k2yc_q2tXXj>5`^qo^UE?0W4l8-Z9&e-q(s=S=hAsi8KjLpJq37dBs zOLUET$qS5fqX)n3o|91~iW35~EXP@{UzIlIkg-za`YHUkbMtVU;70q`?(~nLFwP4{ MCf^U$w~L+jFG&5!ApigX diff --git a/dist/showdown.js.map b/dist/showdown.js.map index 483b81d9417838e90cc189ec2eeffb415c8086fc..2335ad9eb2545e03997bc48d243f6527cff7d2aa 100644 GIT binary patch delta 5440 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 delta 5794 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 diff --git a/dist/showdown.min.js.map b/dist/showdown.min.js.map index 7a42788d630b51d7735ab4eb005330d0355eae7c..9da2df7c9650a3eb0d46d3116f71694c3f63c939 100644 GIT binary patch literal 23917 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 literal 23655 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 Oz3F-z`Tp#~|NVbH3VAaC diff --git a/src/showdown.js b/src/showdown.js index b3e6269..7dfa015 100644 --- a/src/showdown.js +++ b/src/showdown.js @@ -17,7 +17,8 @@ var showdown = {}, strikethrough: false, tables: false, tablesHeaderId: false, - ghCodeBlocks: true // true due to historical reasons + ghCodeBlocks: true, // true due to historical reasons + tasklists: false }, globalOptions = JSON.parse(JSON.stringify(defaultOptions)); //clone default options out of laziness =P diff --git a/src/subParsers/lists.js b/src/subParsers/lists.js index ecd816f..5182837 100644 --- a/src/subParsers/lists.js +++ b/src/subParsers/lists.js @@ -42,25 +42,28 @@ showdown.subParser('lists', function (text, options, globals) { // attacklab: add sentinel to emulate \z listStr += '~0'; - /* - list_str = list_str.replace(/ - (\n)? // leading line = $1 - (^[ \t]*) // leading whitespace = $2 - ([*+-]|\d+[.]) [ \t]+ // list marker = $3 - ([^\r]+? // list item text = $4 - (\n{1,2})) - (?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+)) - /gm, function(){...}); - */ - var rgx = /(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm; + var rgx = /(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+((\[(x| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm; + + listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) { + checked = (checked && checked.trim() !== ''); - listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4) { var item = showdown.subParser('outdent')(m4, options, globals); - //m1 - LeadingLine + //m1 - LeadingLine if (m1 || (item.search(/\n{2,}/) > -1)) { item = showdown.subParser('blockGamut')(item, options, globals); } else { + if (taskbtn && options.tasklists) { + item = item.replace(taskbtn, function () { + var otp = ' -1) ? 'ul' : 'ol'; - return spl + tp + '
  • ' + item + '
  • \n'; + var tp = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol', + bulletStyle = ''; + + if (taskbtn) { + bulletStyle = ' style="list-style-type: none;"'; + } + + return spl + tp + '' + item + '\n'; }); // attacklab: strip sentinel @@ -87,6 +96,8 @@ showdown.subParser('lists', function (text, options, globals) { * @returns {string|*} */ function splitConsecutiveLists (results, listType) { + // parsing html with regex... + // This will surely fail if some extension decides to change paragraph markup directly var cthulhu = /(]+?>|

    |<\/p>)/img, holder = [[]], res = '', @@ -125,28 +136,6 @@ showdown.subParser('lists', function (text, options, globals) { text += '~0'; // Re-usable pattern to match any entire ul or ol list: - - /* - var whole_list = / - ( // $1 = whole list - ( // $2 - [ ]{0,3} // attacklab: g_tab_width - 1 - ([*+-]|\d+[.]) // $3 = first list item marker - [ \t]+ - ) - [^\r]+? - ( // $4 - ~0 // sentinel for workaround; should be $ - | - \n{2,} - (?=\S) - (?! // Negative lookahead for another list item marker - [ \t]* - (?:[*+-]|\d+[.])[ \t]+ - ) - ) - )/g - */ var wholeList = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; if (globals.gListLevel) { diff --git a/test/features/#164.4.tasklists.html b/test/features/#164.4.tasklists.html new file mode 100644 index 0000000..128e848 --- /dev/null +++ b/test/features/#164.4.tasklists.html @@ -0,0 +1,10 @@ +

    my things

    + +
      +
    • foo
    • +
    • bar
    • +
    • baz
    • +
    • bazinga
    • +
    + +

    otherthings

    diff --git a/test/features/#164.4.tasklists.md b/test/features/#164.4.tasklists.md new file mode 100644 index 0000000..0054490 --- /dev/null +++ b/test/features/#164.4.tasklists.md @@ -0,0 +1,8 @@ +# my things + + - foo + - [] bar + - [ ] baz + - [x] bazinga + +otherthings diff --git a/test/node/showdown.js b/test/node/showdown.js index e72849b..db28ea7 100644 --- a/test/node/showdown.js +++ b/test/node/showdown.js @@ -28,7 +28,8 @@ describe('showdown.options', function () { strikethrough: false, tables: false, tablesHeaderId: false, - ghCodeBlocks: true + ghCodeBlocks: true, + tasklists: false }; expect(showdown.getDefaultOptions()).to.be.eql(opts); }); diff --git a/test/node/testsuite.features.js b/test/node/testsuite.features.js index e6d60de..948fbf5 100644 --- a/test/node/testsuite.features.js +++ b/test/node/testsuite.features.js @@ -21,8 +21,10 @@ describe('makeHtml() features testsuite', function () { converter = new showdown.Converter({literalMidWordUnderscores: true}); } else if (testsuite[i].name === '#164.3.strikethrough') { converter = new showdown.Converter({strikethrough: true}); - } else if (testsuite[i].name === 'disable_gh_codeblocks') { + } else if (testsuite[i].name === 'disable_gh_codeblocks') { converter = new showdown.Converter({ghCodeBlocks: false}); + } else if (testsuite[i].name === '#164.4.tasklists') { + converter = new showdown.Converter({tasklists: true}); } else { converter = new showdown.Converter(); }