From f6a33e402c283e9a5a433e486375d4a2dafcec3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Estev=C3=A3o=20Soares=20dos=20Santos?= Date: Mon, 13 Jul 2015 05:09:03 +0100 Subject: [PATCH] feat(CLI): add a simple cli tool --- .gitignore | 2 +- .jshintignore | 2 + Gruntfile.js | 1 + bin/showdown.js | Bin 0 -> 47 bytes dist/showdown.js | Bin 62302 -> 63926 bytes dist/showdown.js.map | Bin 201705 -> 202169 bytes dist/showdown.min.js | Bin 21490 -> 22509 bytes dist/showdown.min.js.map | Bin 24458 -> 25145 bytes package.json | 5 +- src/cli.js | 23 ------- src/cli/cli.js | 30 +++++++++ src/cli/errorexit.js | 6 ++ src/cli/makehtml.cmd.js | 123 ++++++++++++++++++++++++++++++++++++ src/converter.js | 16 +++-- src/options.js | 80 +++++++++++++++++++++++ src/showdown.js | 27 ++------ src/subParsers/headers.js | 9 +-- test/cli/basic.html | 3 + test/cli/basic.md | 3 + test/node/cli.js | 13 ++++ test/node/showdown.js | 3 + test/optionswp.js | 9 +++ test/single.test.wrapper.js | 13 ---- 23 files changed, 301 insertions(+), 67 deletions(-) create mode 100644 bin/showdown.js delete mode 100644 src/cli.js create mode 100644 src/cli/cli.js create mode 100644 src/cli/errorexit.js create mode 100644 src/cli/makehtml.cmd.js create mode 100644 src/options.js create mode 100644 test/cli/basic.html create mode 100644 test/cli/basic.md create mode 100644 test/node/cli.js create mode 100644 test/optionswp.js delete mode 100644 test/single.test.wrapper.js diff --git a/.gitignore b/.gitignore index ab96a23..56ba81a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ .DS_Store node_modules npm-debug.log -localtest.html +/*.test.* diff --git a/.jshintignore b/.jshintignore index a76422d..54c5705 100644 --- a/.jshintignore +++ b/.jshintignore @@ -1,3 +1,5 @@ Gruntfile.js dist/**/*.js build/**/*.js +src/options.js +bin/* diff --git a/Gruntfile.js b/Gruntfile.js index 5b5eee7..10f0729 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -20,6 +20,7 @@ module.exports = function (grunt) { }, dist: { src: [ + 'src/options.js', 'src/showdown.js', 'src/helpers.js', 'src/converter.js', diff --git a/bin/showdown.js b/bin/showdown.js new file mode 100644 index 0000000000000000000000000000000000000000..4bacdaaa4c309f3bf7609532bf87680173bb477b GIT binary patch literal 47 zcmY#Z)GsYA(of3F(@)JSQ^?CtN#!a^EiBC}O4U%;)6*|5O4d)#$pm3_O=~Uyb1@G9 literal 0 HcmV?d00001 diff --git a/dist/showdown.js b/dist/showdown.js index 4e3bac879b875dd69160dcb60e0fc9a3e8a42db9..c0b42863414c6e9b1fffb6c7192057be91e13a21 100644 GIT binary patch delta 2283 zcmbVNOKV$46h>A^A|)wu19nMpd+cB&+p=ZFb_{k!;v{_-nz$i_LX9Y6-MP}>tC`Ep zTtA47nsruYx+oMAD3n5XMWl4qRewPjrBLXmBy`tByG%&W+$$-vq~M1@uXFBv-+9e< z{(Khy@!xoAF*iO8sv!i=0WF{;913fmD6Ok>6G(6S7GzBbj}o2^;djwlLvk)Y zq{N|e*;&A#ju_4-f#e`~PPi^6&Z#6C*()IsFy~NWr12$nYi#QTQ7{gh6DfY^sO#-#m;DmQU3558l56B+vq9Zyht<_UK_` z=KI(?N1ykPF#`%!=4=Y-K)`W8RY^#yfGF^A=q2&m&4;nuxmLO+**et~DS~q4gr&Aa z)WQH2_`c}wcGpEic1_m28a-);?P*N@n0!qbsFD-*!0@to6cDP*1ODHLAYIeNj)w;)&?kIN+)%o>#cZQ%z z1adTDl+N8n{9rCL#2*TULL}&84P`wosm5z-emFI;Y@gl5x7`kCwksh#?+OVSYZSf) z#+&WJrD6r5iDX$COT+w>9UVo4RXk8cn1ib(v`$4f^Tp*+lTDx7Tjb`KzSPBzm1R3q zf6@0O*3{nX=B78&_q0DEGYYyshd6@tE`8mNx&)zSVCZvXvZeSqJ8ZR%Vk(`)_bqF5|L(foR2`qryR+L#Um5=QvBm12sBk-%p#mgpCrH~lvU>+?&GKO1T4 zbmun0+%invC3iDsa)0FP*ce=gJS>>({+0S~Uw;})bsng%?0?n6nt1%Oulw2YZ)WfP E565oIm;e9( delta 561 zcmdn?nfcx`W&vw`Ek%XmjQsMH{PH{nL!*fTCX>&yr%vn>pSW1MUO^!(F{e0Hhf4tr z3W`$GGAle%6H`))JX5S7f)El#U0yy`H6WEJ>N3D4`J|Sm<^-1{7L_2GXb7@X4Wy$W zv8XuJGdJBOGdDG_I5R)57_JOz*yL**itI4O=xl6%z z@-;T?&0!o{7$;w6)7mV@Wxxz%=xk2moxnI*jNfANJ5gD_l+?7u(wq{gp3Uw2HJqDS zB)3XUzG1A*qNz~LHCfGM%H}gBznE+?(-brmVUeR(mY9>7l30@JT2TTC2#wT=5>1c} zP%tR~U0PCFlxGcb9@pfFPLh)?tZO$Pv3SEf`Mx{n;da5EEEI(+ZP705>VK&;S4c diff --git a/dist/showdown.js.map b/dist/showdown.js.map index f7627e7d8d9a46b403fb37b5b80b5ec902e20abe..d3c0eb274d534123b80b1779a22df5f497b2bb78 100644 GIT binary patch delta 19557 zcmcJ033OA}x$Zg}$=LEB*_Mn)>39I!U~G%o27~1ZLu@cZ1_A`jwu}Wr7P2q~0+?ix zw6{rdyc>4M#H4xm-Zqm-lhC9YoO{>nkS4)Nhcv5sf%LAvz9vm$y58;0N}J?;d+&3O zi{!j#7*l5k=CgE)IxqsP-I9_C-3vMnCZ7P`gZpk)hF*n|mB zDJ3oozt=4upgX@=#D@N^*ysaqI_OxAiB#3m)LjnxR&oLzD=@K@Pbz6__YV~dtzBqg z>N&;E+Dk#^(?`r~*MBG$Ht`_tRc^Dh%MUANi@yCpBfWGwn~v>FP72qRZSZ(D2+rtt zzUAa>%%y3&>@)1qR&J-2%RtX>VM*yAY;%|sbeaMB_URl>GAEWK7h{v$q0{5(qz40b zWi}DUE9}Enb~$$lokN>(upTlz8MHC(hI-m2~>)l|(jj zr;;Ghwoj*;H#5s+N9sJDBXv}HBx4q1Rwi5MV=r6SExVwS&>0S)KUl0cdOSB8C=D7g znN2b0@3wQr)5liC(|NnBSHaAR?NNhMNu%Xtk=Q( zMUltG*DH2-D!fE@-N#;@X@l9+F!2>Tt9?WBo7@MINvMvs{!q!LK!!A4?eau+=_P0y zerVzB8|Yqn6=k@8lSN0o=2<<)AP;P$Z1#9IM@^?wRdp5D!xOpBw1{Vn2RE{Jwkj?f zO1DtJclcezl^heh`&K2MJ?KC<8H|T&YVWboyW$fZe0`)r642>2v-e9CCmVf2u?S># zv+;#kV!f0|Yrkrt?LW5AuRNYWAKebedjp|q%g-~Y^Ii+JcjnQtA`^l6-g%{nhRV$B z&+DNZXQySc5Jlf$Wxb3a`fp7D{bw^hxHgN9y>6PaYsY9ow7J_y3l1Ji$IfklabdUYE<+bh(}e$QUUTSZKB|XCsod__Sfgrl zJpEm%DlFbjO}0W8-)wo^)i%$DXYv>-?Rb>i(P5}d-D>6b5N7L{rV;j!Y=((NoNzyN+NAHV2GRJA&@xZi2=2qASU94<9%aHkSa-?VD>kg@f+T|_$i>EU?#Z|9uDRTlO_ zC4{a0t0FCcqHgRq7wVH@YI|fZ+lG+KCjJUd*hEqwn9 z&6V{K(027G`B~Ch*w_=;alFh-Lz_+X9-B+|9y@)u28EemI+;56&81~qY#g0efyu}J zwFnW@%udWvEN8bV$@F5gD(hOo2W@dU1x|ZD!wR;)X3@bOGo6?xBkj@QItOb~6$k4* z2HQ;ho0VSt5d!miczm8kh z%4`?lDxu=z$xMGnXJ{BrQd)xGX-EjymIn zHCfwRoaJZCbi{3?k6xETe^it}cYEV$-6sXK^50X)(mLkdsW@p{mPxspp6WonyBVqU zOWt%k_@o&jK9!!#Nf+@8f#%>H@=@0NJ}Qs0ekZ&2e*ickGipU!ZixU%s8PoIe;g!< z*|hy#izv=VjzEr~V&n$G)L$Bm~raIf`U~n#V{l!e< zOEP1-p#0|?RHdm+qM=*W{+I*|$wx@
    0<(31tLsBHy`#{2@I%P@2ARx)IO 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 diff --git a/dist/showdown.min.js b/dist/showdown.min.js index 82dd5541b282c2c73147225cd45f7a10cc0b3871..c1bbb78fd16ef7b7321fd44fa1551cd42f52d5c1 100644 GIT binary patch delta 4098 zcma)9YitzP71qYAy|&j6@WOi6YkPM5U?w|Wdkx0KW^j#x1&4r%i4rg-x-)ZUcJSaHWVeRVZo|)cy#mEH#ugNmDiIL#;@DRFzUi6sc0%peSm8RI2)* z=g#b|y#_ZG(&fy(=Y01&&%6HH&A_L(0u8-SCK)GZ%`4Wt$z*n2Y3L$9<+qbSWo%`U zRj`WY43`~BW&{O0vaL&ah&_?lUB=B}rf|&QORkNW`JC=zLpL#l6a_1cYcaB=U`8@5 zdB$M{cVQNcCCf4}GTCLpw2ok;VEd>t^w^tLK>O63Z8DbGYpE)uVH4ZP1>~G($LPwV zptCks^-KR77;qJXp; zQ9lBVL5&!PS`~@wri(Rf1MV!c9egye9n|yKbacyfRyK!T7Zp8^G{{8JilI1^=_BEG z^!%)$t2$Oj=UnTUZq9rTKJSM;d-xd!fdyoC2FNcM_z`S!uBv6zYMG#pF?n5?w`_%( zGa=)SY}wdhki!^IGBz^SZ$E-A(AdvlH)mUOT5dDaD`mA(X2Ljgv$NJ((AP@PMUsJ? z%^=GVebvpOR(yret-Mi1VUP)>MN7`JDO5?R)Yj-}xiM&<1781>k?dR7jfECj@p^WS~}_Kyw+X96<0P}fA>52lg|+$&(ZsC3ap#3lQ9 zAtx?sx|^GmhG6K$30HNq(>qumR?<0a%wn5rD`^;Vg~s&0Nndk}+^()8*So98-cVgg zNo&|WG3%0sa4X%c(x%Wf7?S1YDEUdqQw(Vo32L9LG;fE^hLC?1Xnhu105|mN1mPPS z!9G;UNjx>bUd_Y7g{{rxesw&6$-lfcTJuyA!v&(WTt-e*=SJY$N35 zn%!|E7ClNku5##-dmQC4hj_RI0vVTiei1U4RMR=+oR~K!Yzv%s7dS+=*Cqpq4A!Jh2N`*7AR?;4hRCzbS_fVLxq6wpC=feq-2sc*yWh4Q!>*0YETv$$+_4CHk zdy8xUfjasyd>SHhy6(%c-mA;PdSkGO4Al>UWY?dC^=^H#LI%yd_06QVAx!>~+(ted zuOz(&*JuKc1dR0JeJUgQ{Pn4 zgdh(i5tDC6N7+&UA=!rzIGGoUEdteFyZ~lVd-E$zaQC7lN`(yQKu03)Hs7X!>m=Wb zB|z;*F$UI;Vgs-?#!m&5tJw%yh}VgJ72KgE`0KdoOQ1T@@`bRR)}FHs zXUdoc2SK3&Hcsg-Jae!`8^RRJc82rdJ+1WzEoT4-q}6i?FKkS92f5MORWDP9zS}bB zUU)WH$HQzY4r+y5?@vI(JG!(DR=TK_8RO6Oq?utbcJ9lz&{B3_d7h#$-R!Nt!2Jg zbFP9-7r1CVJUV!4Z6D9xTERblXFY^(2NU!m))8@#g z{#e*PDA32^1tA6QM#(pYm*6YYLob==q0m6AD(4ZSw02bSL&)>DDg9MAP4_pG)$|>Z z%w8T4I>}qTuX_7!Kz*U_lahQnbEqW$d7b=B|9ENt&Hi?ff7j2_8loeWY}@q|;2hi4 zl91`-%h4aOW7eGMI#YN$l^WtC5kpQc@1pT}V^?1_L|Au@qvISoF_758k7S0ZKu$6{ z$nSTD$rHPi6*yWAI6DjgUVKHiGom!RKJ5 z)$rn8`XbW4|8VaaS`lWpWi>nW11kPwm?^Ji=sAe0!kGq}a8-Kfu_4-$b(pk}=nN*6i#RSeA!fnjD&eukHUH4D;P1|Ay(Z z+CO@mGJ9~qhV|T--)dy+b@+l*27L}M9{eKMeRPlxqKRmXoIUg=NRh*x;7zQfj0>F+ zle5TN8%f?6$fo*BW5C;pa~qVUY;s_u8v^37~G=w8K-Umi|#t*@|G(HOI?~Er4 s>VJnX2mtxd)3p$#nqz7uY+QKuKCF|IFElF4{E(h5{-F<8Z%q#V7e;YX?EnA( delta 3001 zcmb7GYit`?6_(RDPdjm5w&U1|JxQFIdg8?CBdMKfn{-3cJiL|KZQ6#kJL9=yPct5e z@g!+CwOXyTE3^o<$28YZ4zvTTHq&j zk*1WeUf^Xa2o;I|jrG1~WBjr~6!p>+5oKZ=m*b%rujh8JGS<#4StZ&@Q#8yt9ubW^ zIi5{FrDlnqS95xv9?PrQWldF7B9E<@xmi_TLMvRT_eXKhG}I+xW{liQIzydJQPPNY ztf=j}5pLG|?Xd!%7T|8BuR`HqPyIVo?NKEuwp?i{ko@UGK` z@(<2Klk$SNC`g4T?h}+1J!RtCS&5gqb!H_`g7lRslS!xw8!D$6Rr4p&tfyHCw1$H| zN!Z!RoASgZGbv^XD{+{VtFF~2bKE*TPNEqx|MZ%E!pPxU&CAy5_F5gCPK9DIPG-R(tA^QuLP#+0OI{km%pK$D7sQCe(pMp8_}j0P=2pz z66GgN(*rc#j5l`ekW>_GFwW_%jv5KAu(Xq z=>ykr?IDHb)+Ir@a%H`cQ1FQ~A2F!v!8Ditcicq|!CayQNH2(RqSb>fm1#YR@`tS< z_+4edw}e;o;LJG2N9{6nAPd&S-i_v+}s(?iT8-Yu1 zqsBrIxd0!zJMmdp107z(-YSr25@b%1_^ilr@M@r=F2AOlsSGPFNKo+jF~L_nT`2E* z&Ymk$^goFr;oA@hRwrx0T|oUe-bj=;l7Jj2@`lj*@iJt+F^?40h@LhxiAY4@N@++7 z3Z~)11nzrj8jrm9Y|7T{cHY*Niso0O6Lf|cEF%*f01U^9{1UQ|rw~kDKtAqp~lrDF^seZQll z>T$3=7!17rSM69aR)l;0I~M9kaR~f45JdSPZ~&#J^Ay^(P6qzi?1o3lT6m+g2`$*Y z@Uu?6sG;9{*HMQYO+RC3`2}qed5R9*XgH;sIQh^-0o8>kEQu_>YcALhf9^v1Z_Ndt zvSGZ9P@+LbfTZFxWc1Nahv1VC<@}BQE}HmOgc-Ntt$KF`jlbyb#q3-b;Tn5$DTx;jcc)1&KzO6tgQPMp5X! z@NW3am>*60`M$my8p;Z`*=IcvKIq%P?XEF5yv*8>!n=q?^i)nJ$M6q>r8)eZ;3Q!` zUyNo?ThT9Y0bCcjRYYzg9D<8e4hZcHqHTQdFv{ol{?nG)NCx4R$cwlP@#jz$hfgiM z#O-sdx&9Wc-i`iSw0gPeA-Fd1-O|?VU^8kL1|zgS77||@{1RG5VzkHS zV>HBe%#ZoJmh@J0anXA2cFYZfL!ZGtalaSt4&6mU|L=G7 zmkvzq=pXIUPaUN5RNPPfe{_)kUf4cJIqkv`IUbPd9L&&<__5rIZsxIZjz|KDF#SwK zhTJgyG`=*<=(@652y?Zi;(rtom_$24e9Jcw?lxLKWcAus_US6qwNr z6Hz0X2y>W;q$AAefVIX|!XV~~p$Dy!+b>#0`s>J%{}q&t#QyKF_YRHKrHdVvDW+T^ z#mgg|wP`NW$Mj)LnsR-AETWXA3EUo`KP`}u4xCrm7$rh}D;_Fg=YZeF-JVkC^V;JE z=d(C?+7h(FbXI&P;VxfE>wU9nDZZM+iQUl_k>leY$r z{T+wMR{z8udeH};GEknKEVkMgCT|r_*i|dSxvA&y+}N%uV~t z!z4F7QdUEJH{74DDldOIy)%6NHtj20J7&s9Ht<8 diff --git a/dist/showdown.min.js.map b/dist/showdown.min.js.map index c0b8fa108a39787f1579490f5f4c6d168cb211e6..549457e351b3f2b3569f7975c138517a8b6cc40d 100644 GIT binary patch literal 25145 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 literal 24458 zcmc(nSyLO`mZtxUqwlOJj4{TXy2?x?Nm>Y52rSDT9Th?(l0XBN#8}b)y`Oijtr77Z z&ev7l7l_mz*F5c=`p*v!#bnwak3Rfkuk_)%KPW!@x zbbLSQ6w?p?_@B#8I{sJb!>B#<_J{VMf7PB9j4qyL#mE-*el<-d)oGW9NipNo27B{( z!vFb>JobvgU7@!AG@4A>&wAo-P>i~>9uJr8Y2iz;jSXweCjF7to;}}b``P$p{8&s9 z2J#J@X13m>=oU{joE6>l>5hl~^kQ^XT=z%C72hVs-Jsnu@TZ;jU6J(KlXi!x)1*BZ zT(ʀ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 diff --git a/package.json b/package.json index 71675e6..cf4093b 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "test": "grunt test" }, "bin": { - "showdown": "src/cli.js" + "showdown": "bin/showdown.js" }, "devDependencies": { "chai": "^1.10.0", @@ -53,5 +53,8 @@ "quiet-grunt": "^0.2.3", "sinon": "^1.14.1", "source-map-support": "^0.2.9" + }, + "dependencies": { + "yargs": "^3.15.0" } } diff --git a/src/cli.js b/src/cli.js deleted file mode 100644 index 0b78b77..0000000 --- a/src/cli.js +++ /dev/null @@ -1,23 +0,0 @@ -var Showdown = require('./showdown'); -var cli = require('cli'); -var fs = require('fs'); - -var converter = new Showdown.converter(); - -/* -If an argument is given, treat it as the file to be read. -Otherwise, read from stdin. -*/ -if(process.argv.length > 2) { - fs.readFile(process.argv[2], function(err, data) { - if(err) { - console.error("Error: Invalid file"); - } else { - console.log(converter.makeHtml(data.toString())); - } - }) -} else { - cli.withStdin(function(data) { - this.output(converter.makeHtml(data.toString())); - }) -} diff --git a/src/cli/cli.js b/src/cli/cli.js new file mode 100644 index 0000000..7cd8dc4 --- /dev/null +++ b/src/cli/cli.js @@ -0,0 +1,30 @@ +'use strict'; + +var version = require('../../package.json').version, + yargs = require('yargs'); + +yargs + .version(version, 'v') + .alias('v', 'version') + .option('h', { + alias: 'help', + description: 'Show help' + }) + .usage('Usage: showdown [options]') + .demand(1, 'You must provide a valid command') + .command('makehtml', 'Converts markdown into html') + .example('showdown makehtml -i foo.md -o bar.html', 'Converts \'foo.md\' to \'bar.html\'') + .wrap(yargs.terminalWidth()); + +var argv = yargs.argv, + command = argv._[0]; +if (command === 'makehtml') { + require('./makehtml.cmd.js').run(); +} else { + yargs.showHelp(); +} + +if (argv.help) { + yargs.showHelp(); +} +process.exit(0); diff --git a/src/cli/errorexit.js b/src/cli/errorexit.js new file mode 100644 index 0000000..ea25eff --- /dev/null +++ b/src/cli/errorexit.js @@ -0,0 +1,6 @@ +module.exports = exports = function errorExit(e) { + 'use strict'; + console.error('ERROR: ' + e.message); + console.error('Run \'showdown -h\' for help'); + process.exit(1); +}; diff --git a/src/cli/makehtml.cmd.js b/src/cli/makehtml.cmd.js new file mode 100644 index 0000000..acaf359 --- /dev/null +++ b/src/cli/makehtml.cmd.js @@ -0,0 +1,123 @@ +var yargs = require('yargs'), + fs = require('fs'), + errorExit = require('./errorexit.js'), + showdown = require('../../dist/showdown'); + +yargs.reset() + .usage('Usage: showdown makehtml [options]') + .example('showdown makehtml -i', 'Reads from stdin and outputs to stdout') + .example('showdown makehtml -i foo.md -o bar.html', 'Reads \'foo.md\' and writes to \'bar.html\'') + //.demand(['i']) + .option('i', { + alias : 'input', + describe: 'Input source. Usually a md file. If omitted or empty, reads from stdin', + type: 'string' + }) + .option('o', { + alias : 'output', + describe: 'Output target. Usually a html file. If omitted or empty, writes to stdout', + type: 'string', + default: false + }) + .option('u', { + alias : 'encoding', + describe: 'Input encoding', + type: 'string' + }) + .option('a', { + alias : 'append', + describe: 'Append data to output instead of overwriting', + type: 'string' + }) + .option('e', { + alias : 'extensions', + describe: 'Load the specified extensions. Should be valid paths to node compatible extensions', + type: 'array' + }) + .config('c') + .alias('c', 'config') + .help('h') + .alias('h', 'help'); + +yargs.options(showdown.getDefaultOptions(false)); +argv = yargs.argv; + +function run() { + 'use strict'; + var input = '', + enc = 'utf8', + output; + + if (argv.encoding) { + enc = argv.encoding; + } + + // to avoid passing extensions to converter + delete argv.extensions; + var converter = new showdown.Converter(argv); + + // Load extensions + if (argv.e) { + for (var i = 0; i < argv.e.length; ++i) { + loadExtension(argv.e[i], converter); + } + } + + if (!argv.i || argv.i === '') { + // 'i' is undefined or empty, read from stdin + try { + var size = fs.fstatSync(process.stdin.fd).size; + input = size > 0 ? fs.readSync(process.stdin.fd, size)[0] : ''; + } catch (e) { + var err = new Error('Could not read from stdin, reason: ' + e.message); + errorExit(err); + } + } else { + // 'i' has a value, read from file + try { + input = fs.readFileSync(argv.i, enc); + } catch (err) { + errorExit(err); + } + } + + // parse and convert file + output = converter.makeHtml(input); + + // Write output + if (!argv.o || argv.o === '') { + // o is undefined or empty, write to stdout + process.stdout.write(output); + // we won't print anything since it would conspurcate stdout and, + // consequently, the outputted file + } else { + // o is has a value, presumably a file, write to it. + + // If a flag is passed, it means we should append instead of overwriting. + // Only works with files, obviously + var write = (argv.a) ? fs.appendFileSync : fs.writeFileSync; + + try { + write(argv.o, output); + } catch (err) { + errorExit(err); + } + console.error('DONE!'); + } +} + +function loadExtension(path, converter) { + 'use strict'; + var ext; + try { + ext = require(path); + converter.addExtension(ext, path); + } catch (e) { + console.error('Could not load extension ' + path + '. Reason:'); + console.error(e.message); + } +} + +module.exports = exports = { + run: run +}; diff --git a/src/converter.js b/src/converter.js index 551aeb2..55ecb44 100644 --- a/src/converter.js +++ b/src/converter.js @@ -86,13 +86,16 @@ showdown.Converter = function (converterOptions) { /** * Parse extension * @param {*} ext + * @param {string} [name=''] * @private */ - function _parseExtension(ext) { + function _parseExtension(ext, name) { + name = name || null; // If it's a string, the extension was previously loaded if (showdown.helper.isString(ext)) { ext = showdown.helper.stdExtName(ext); + name = ext; // LEGACY_SUPPORT CODE if (showdown.extensions[ext]) { @@ -118,8 +121,9 @@ showdown.Converter = function (converterOptions) { ext = [ext]; } - if (!showdown.validateExtension(ext)) { - return; + var validExt = validate(ext, name); + if (!validExt.valid) { + throw Error(validExt.error); } for (var i = 0; i < ext.length; ++i) { @@ -272,9 +276,11 @@ showdown.Converter = function (converterOptions) { /** * Add extension to THIS converter * @param {{}} extension + * @param {string} [name=null] */ - this.addExtension = function (extension) { - _parseExtension(extension); + this.addExtension = function (extension, name) { + name = name || null; + _parseExtension(extension, name); }; /** diff --git a/src/options.js b/src/options.js new file mode 100644 index 0000000..0f11c72 --- /dev/null +++ b/src/options.js @@ -0,0 +1,80 @@ +/** + * Created by Tivie on 13-07-2015. + */ + +function getDefaultOpts(simple) { + 'use strict'; + + var defaultOptions = { + omitExtraWLInCodeBlocks: { + default: false, + describe: 'Omit the default extra whiteline added to code blocks', + type: 'boolean' + }, + noHeaderId: { + default: false, + describe: 'Turn on/off generated header id', + type: 'boolean' + }, + prefixHeaderId: { + default: false, + describe: 'Specify a prefix to generated header ids', + type: 'string' + }, + headerLevelStart: { + default: false, + describe: 'The header blocks level start', + type: 'integer' + }, + parseImgDimensions: { + default: false, + describe: 'Turn on/off image dimension parsing', + type: 'boolean' + }, + simplifiedAutoLink: { + default: false, + describe: 'Turn on/off GFM autolink style', + type: 'boolean' + }, + literalMidWordUnderscores: { + default: false, + describe: 'Parse midword underscores as literal underscores', + type: 'boolean' + }, + strikethrough: { + default: false, + describe: 'Turn on/off strikethrough support', + type: 'boolean' + }, + tables: { + default: false, + describe: 'Turn on/off tables support', + type: 'boolean' + }, + tablesHeaderId: { + default: false, + describe: 'Add an id to table headers', + type: 'boolean' + }, + ghCodeBlocks: { + default: true, + describe: 'Turn on/off GFM fenced code blocks support', + type: 'boolean' + }, + tasklists: { + default: false, + describe: 'Turn on/off GFM tasklist support', + type: 'boolean' + } + }; + if (simple === false) { + return JSON.parse(JSON.stringify(defaultOptions)); + } + var ret = {}; + for (var opt in defaultOptions) { + if (defaultOptions.hasOwnProperty(opt)) { + ret[opt] = defaultOptions[opt].default; + } + } + return ret; +} diff --git a/src/showdown.js b/src/showdown.js index 9d1880c..1ee2ee0 100644 --- a/src/showdown.js +++ b/src/showdown.js @@ -6,21 +6,7 @@ var showdown = {}, parsers = {}, extensions = {}, - defaultOptions = { - omitExtraWLInCodeBlocks: false, - prefixHeaderId: false, - noHeaderId: false, - headerLevelStart: 1, - parseImgDimensions: false, - simplifiedAutoLink: false, - literalMidWordUnderscores: false, - strikethrough: false, - tables: false, - tablesHeaderId: false, - ghCodeBlocks: true, // true due to historical reasons - tasklists: false - }, - globalOptions = JSON.parse(JSON.stringify(defaultOptions)), + globalOptions = getDefaultOpts(true), flavor = { github: { omitExtraWLInCodeBlocks: true, @@ -33,7 +19,7 @@ var showdown = {}, ghCodeBlocks: true, tasklists: true }, - vanilla: JSON.parse(JSON.stringify(defaultOptions)) + vanilla: getDefaultOpts(true) }; /** @@ -88,7 +74,7 @@ showdown.getOptions = function () { */ showdown.resetOptions = function () { 'use strict'; - globalOptions = JSON.parse(JSON.stringify(defaultOptions)); + globalOptions = getDefaultOpts(true); }; /** @@ -110,11 +96,12 @@ showdown.setFlavor = function (name) { /** * Get the default options * @static + * @param {boolean} [simple=true] * @returns {{}} */ -showdown.getDefaultOptions = function () { +showdown.getDefaultOptions = function (simple) { 'use strict'; - return defaultOptions; + return getDefaultOpts(simple); }; /** @@ -233,7 +220,7 @@ function validate(extension, name) { } for (var i = 0; i < extension.length; ++i) { - var baseMsg = errMsg + 'sub-extension ' + i + ': ', + var baseMsg = errMsg + ' sub-extension ' + i + ': ', ext = extension[i]; if (typeof ext !== 'object') { ret.valid = false; diff --git a/src/subParsers/headers.js b/src/subParsers/headers.js index a564d1c..811a493 100644 --- a/src/subParsers/headers.js +++ b/src/subParsers/headers.js @@ -1,7 +1,8 @@ showdown.subParser('headers', function (text, options, globals) { 'use strict'; - var prefixHeader = options.prefixHeaderId; + var prefixHeader = options.prefixHeaderId, + headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart); // Set text-style headers: // Header 1 @@ -14,7 +15,7 @@ showdown.subParser('headers', function (text, options, globals) { var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', - hLevel = parseInt(options.headerLevelStart), + hLevel = headerLevelStart, hashBlock = '' + spanGamut + ''; return showdown.subParser('hashBlock')(hashBlock, options, globals); }); @@ -22,7 +23,7 @@ showdown.subParser('headers', function (text, options, globals) { text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, function (matchFound, m1) { var spanGamut = showdown.subParser('spanGamut')(m1, options, globals), hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"', - hLevel = parseInt(options.headerLevelStart) + 1, + hLevel = headerLevelStart + 1, hashBlock = '' + spanGamut + ''; return showdown.subParser('hashBlock')(hashBlock, options, globals); }); @@ -49,7 +50,7 @@ showdown.subParser('headers', function (text, options, globals) { text = text.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm, function (wholeMatch, m1, m2) { var span = showdown.subParser('spanGamut')(m2, options, globals), hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"', - hLevel = parseInt(options.headerLevelStart) - 1 + m1.length, + hLevel = headerLevelStart - 1 + m1.length, header = '' + span + ''; return showdown.subParser('hashBlock')(header, options, globals); diff --git a/test/cli/basic.html b/test/cli/basic.html new file mode 100644 index 0000000..a014504 --- /dev/null +++ b/test/cli/basic.html @@ -0,0 +1,3 @@ +

    some title

    + +

    Test bold and italic

    diff --git a/test/cli/basic.md b/test/cli/basic.md new file mode 100644 index 0000000..a5256ad --- /dev/null +++ b/test/cli/basic.md @@ -0,0 +1,3 @@ +# some title + +Test **bold** and _italic_ diff --git a/test/node/cli.js b/test/node/cli.js new file mode 100644 index 0000000..84bae88 --- /dev/null +++ b/test/node/cli.js @@ -0,0 +1,13 @@ +var execSync = require('child_process').execSync; + +describe('showdown cli', function () { + 'use strict'; + it('basic stdin stdout', function () { + var otp = execSync('showdown makehtml', { + encoding: 'utf8', + input: '**foo**' + }); + otp.trim().should.equal('

    foo

    '); + }); +}); + diff --git a/test/node/showdown.js b/test/node/showdown.js index db28ea7..3d89766 100644 --- a/test/node/showdown.js +++ b/test/node/showdown.js @@ -17,6 +17,8 @@ describe('showdown.options', function () { describe('getDefaultOptions()', function () { it('should get default options', function () { + var opts = require('../optionswp').getDefaultOpts(true); + /* var opts = { omitExtraWLInCodeBlocks: false, prefixHeaderId: false, @@ -31,6 +33,7 @@ describe('showdown.options', function () { ghCodeBlocks: true, tasklists: false }; + */ expect(showdown.getDefaultOptions()).to.be.eql(opts); }); }); diff --git a/test/optionswp.js b/test/optionswp.js new file mode 100644 index 0000000..dd20264 --- /dev/null +++ b/test/optionswp.js @@ -0,0 +1,9 @@ +/* jshint ignore:start */ +var fs = require('fs'), + filedata; +filedata = fs.readFileSync('src/options.js', 'utf8'); +eval(filedata); +module.exports = { + getDefaultOpts: getDefaultOpts +}; +/* jshint ignore:end */ diff --git a/test/single.test.wrapper.js b/test/single.test.wrapper.js deleted file mode 100644 index 7a6a418..0000000 --- a/test/single.test.wrapper.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Created by Estevao on 10-07-2015. - */ -/* -var showdown = require('../dist/showdown.js'), - bootstrap = require('./bootstrap.js'), - assertion = bootstrap.assertion, - testsuite = bootstrap.getTestSuite('test/features/'); - -describe('makeHtml() single test', function () { - 'use strict'; -}); -*/