nasldoc 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. data/LICENSE +3 -3
  2. data/NEWS.markdown +9 -5
  3. data/README.markdown +38 -41
  4. data/Rakefile +49 -3
  5. data/TODO.markdown +20 -0
  6. data/bin/nasldoc +27 -1
  7. data/lib/nasldoc.rb +27 -1
  8. data/lib/nasldoc/assets/css/bootstrap.css +6004 -0
  9. data/lib/nasldoc/assets/css/bootstrap.min.css +859 -0
  10. data/lib/nasldoc/assets/css/shCore.css +226 -0
  11. data/lib/nasldoc/assets/css/shThemeDefault.css +117 -0
  12. data/lib/nasldoc/assets/{stylesheet.css → css/stylesheet.css} +37 -15
  13. data/lib/nasldoc/assets/img/glyphicons-halflings-white.png +0 -0
  14. data/lib/nasldoc/assets/img/glyphicons-halflings.png +0 -0
  15. data/lib/nasldoc/assets/{nessus.jpg → img/nessus.jpg} +0 -0
  16. data/lib/nasldoc/assets/js/bootstrap.js +2036 -0
  17. data/lib/nasldoc/assets/js/bootstrap.min.js +7 -0
  18. data/lib/nasldoc/assets/js/jquery-1.8.2.js +9440 -0
  19. data/lib/nasldoc/assets/js/shBrushNasl.js +33 -0
  20. data/lib/nasldoc/assets/js/shCore.js +17 -0
  21. data/lib/nasldoc/cli.rb +26 -0
  22. data/lib/nasldoc/cli/application.rb +150 -222
  23. data/lib/nasldoc/cli/comment.rb +317 -0
  24. data/lib/nasldoc/templates/file.erb +362 -154
  25. data/lib/nasldoc/templates/index.erb +93 -9
  26. data/lib/nasldoc/templates/old/file.erb +332 -0
  27. data/lib/nasldoc/templates/old/xfile.erb +267 -0
  28. data/lib/nasldoc/templates/old/xindex.erb +16 -0
  29. data/lib/nasldoc/templates/old/xoverview.erb +26 -0
  30. data/lib/nasldoc/templates/old/xsidebar.erb +21 -0
  31. data/lib/nasldoc/templates/xindex.erb +16 -0
  32. data/nasldoc.gemspec +45 -18
  33. metadata +45 -13
  34. data/lib/nasldoc/templates/overview.erb +0 -27
  35. data/lib/nasldoc/templates/sidebar.erb +0 -20
@@ -0,0 +1,33 @@
1
+ (function()
2
+ {
3
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
4
+
5
+ function Brush()
6
+ {
7
+ var constants = 'FALSE NULL TRUE';
8
+
9
+ var keywords = 'break continue else export for foreach function global_var if ' +
10
+ 'import include local_var repeat return until while';
11
+
12
+ this.regexList = [
13
+ { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comment' },
14
+
15
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' },
16
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' },
17
+ { regex: new RegExp('\\b[0-9]+\\b', 'gm'), css: 'number' },
18
+
19
+ { regex: new RegExp(this.getKeywords(constants), 'gm'), css: 'constant' },
20
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' },
21
+
22
+ { regex: new RegExp('\\b[A-Za-z_][A-Za-z0-9_]*\\b(?=\\s*\\()', 'gm'), css: 'function' },
23
+ { regex: new RegExp('\\b[A-Za-z_][A-Za-z0-9_]*\\b(?!\\s*\\()', 'gm'), css: 'variable' }
24
+ ];
25
+ };
26
+
27
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
28
+ Brush.aliases = ['nasl'];
29
+
30
+ SyntaxHighlighter.brushes.Nasl = Brush;
31
+
32
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
33
+ })();
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SyntaxHighlighter
3
+ * http://alexgorbatchev.com/SyntaxHighlighter
4
+ *
5
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
6
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
7
+ *
8
+ * @version
9
+ * 3.0.83 (July 02 2010)
10
+ *
11
+ * @copyright
12
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
13
+ *
14
+ * @license
15
+ * Dual licensed under the MIT and GPL licenses.
16
+ */
17
+ eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a<f.L;a++)I(f[a]===e)H a;H-1}M=6(f,e){K a=[],b=M.1B,c=0,d,h;I(M.1R(f)){I(e!==1d)1S 3m("2a\'t 5r 5I 5F 5B 5C 15 5E 5p");H r(f)}I(v)1S 2U("2a\'t W 3l M 59 5m 5g 5x 5i");e=e||"";O(d={2N:11,19:[],2K:6(g){H e.1i(g)>-1},3d:6(g){e+=g}};c<f.L;)I(h=B(f,c,b,d)){a.U(h.3k);c+=h.1C[0].L||1}Y I(h=n.X.W(z[b],f.1a(c))){a.U(h[0]);c+=h[0].L}Y{h=f.3a(c);I(h==="[")b=M.2I;Y I(h==="]")b=M.1B;a.U(h);c++}a=15(a.1K(""),n.Q.W(e,w,""));a.1w={1m:f,19:d.2N?d.19:N};H a};M.3v="1.5.0";M.2I=1;M.1B=2;K C=/\\$(?:(\\d\\d?|[$&`\'])|{([$\\w]+)})/g,w=/[^5h]+|([\\s\\S])(?=[\\s\\S]*\\1)/g,A=/^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,v=11,u=[],n={X:15.Z.X,1A:15.Z.1A,1C:1r.Z.1C,Q:1r.Z.Q,1e:1r.Z.1e},x=n.X.W(/()??/,"")[1]===1d,D=6(){K f=/^/g;n.1A.W(f,"");H!f.12}(),y=6(){K f=/x/g;n.Q.W("x",f,"");H!f.12}(),E=15.Z.3n!==1d,z={};z[M.2I]=/^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S]))/;z[M.1B]=/^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/;M.1h=6(f,e,a,b){u.U({2q:r(f,"g"+(E?"y":"")),2b:e,3r:a||M.1B,2p:b||N})};M.2n=6(f,e){K a=f+"/"+(e||"");H M.2n[a]||(M.2n[a]=M(f,e))};M.3c=6(f){H r(f,"g")};M.5l=6(f){H f.Q(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,"\\\\$&")};M.5e=6(f,e,a,b){e=r(e,"g"+(b&&E?"y":""));e.12=a=a||0;f=e.X(f);H b?f&&f.P===a?f:N:f};M.3q=6(){M.1h=6(){1S 2U("2a\'t 55 1h 54 3q")}};M.1R=6(f){H 53.Z.1q.W(f)==="[2m 15]"};M.3p=6(f,e,a,b){O(K c=r(e,"g"),d=-1,h;h=c.X(f);){a.W(b,h,++d,f,c);c.12===h.P&&c.12++}I(e.1J)e.12=0};M.57=6(f,e){H 6 a(b,c){K d=e[c].1I?e[c]:{1I:e[c]},h=r(d.1I,"g"),g=[],i;O(i=0;i<b.L;i++)M.3p(b[i],h,6(k){g.U(d.3j?k[d.3j]||"":k[0])});H c===e.L-1||!g.L?g:a(g,c+1)}([f],0)};15.Z.1p=6(f,e){H J.X(e[0])};15.Z.W=6(f,e){H J.X(e)};15.Z.X=6(f){K e=n.X.1p(J,14),a;I(e){I(!x&&e.L>1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;b<e.L;b++)I(a=J.1w.19[b-1])e[a]=e[b];!D&&J.1J&&!e[0].L&&J.12>e.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;d<b.L;d++)I(b[d])14[0][b[d]]=14[d+1]}I(a&&f.1J)f.12=14[14.L-2]+14[0].L;H e.1p(N,14)});Y{c=J+"";c=n.Q.W(c,f,6(){K d=14;H n.Q.W(e,C,6(h,g,i){I(g)5b(g){24"$":H"$";24"&":H d[0];24"`":H d[d.L-1].1a(0,d[d.L-2]);24"\'":H d[d.L-1].1a(d[d.L-2]+d[0].L);5a:i="";g=+g;I(!g)H h;O(;g>d.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P<a.L&&3b.Z.U.1p(b,d.1a(1));h=d[0].L;c=f.12;I(b.L>=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a<d.L&&i==N;a++)i=p(d[a],b,c);H i}6 C(a,b){K c={},d;O(d 2g a)c[d]=a[d];O(d 2g b)c[d]=b[d];H c}6 w(a,b,c,d){6 h(g){g=g||1P.5y;I(!g.1F){g.1F=g.52;g.3N=6(){J.5w=11}}c.W(d||1P,g)}a.3g?a.3g("4U"+b,h):a.4y(b,h,11)}6 A(a,b){K c=e.1Y.2j,d=N;I(c==N){c={};O(K h 2g e.1U){K g=e.1U[h];d=g.4x;I(d!=N){g.1V=h.4w();O(g=0;g<d.L;g++)c[d[g]]=h}}e.1Y.2j=c}d=e.1U[c[a]];d==N&&b!=11&&1P.1X(e.13.1x.1X+(e.13.1x.3E+a));H d}6 v(a,b){O(K c=a.1e("\\n"),d=0;d<c.L;d++)c[d]=b(c[d],d);H c.1K("\\n")}6 u(a,b){I(a==N||a.L==0||a=="\\n")H a;a=a.Q(/</g,"&1y;");a=a.Q(/ {2,}/g,6(c){O(K d="",h=0;h<c.L-1;h++)d+=e.13.1W;H d+" "});I(b!=N)a=v(a,6(c){I(c.L==0)H"";K d="";c=c.Q(/^(&2s;| )+/,6(h){d=h;H""});I(c.L==0)H d;H d+\'<17 1g="\'+b+\'">\'+c+"</17>"});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.P<b.P)H-1;Y I(a.P>b.P)H 1;Y I(a.L<b.L)H-1;Y I(a.L>b.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'<a 2h="\'+c+\'">\'+c+"</a>"+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<a.L;c++)a[c].3s=="20"&&b.U(a[c]);H b}6 f(a){a=a.1F;K b=p(a,".20",R);a=p(a,".3O",R);K c=1E.4i("3t");I(!(!a||!b||p(a,"3t"))){B(b.1c);r(b,"1m");O(K d=a.3G,h=[],g=0;g<d.L;g++)h.U(d[g].4z||d[g].4A);h=h.1K("\\r");c.39(1E.4D(h));a.39(c);c.2C();c.4C();w(c,"4u",6(){c.2G.4E(c);b.1l=b.1l.Q("1m","")})}}I(1j 3F!="1d"&&1j M=="1d")M=3F("M").M;K e={2v:{"1g-27":"","2i-1s":1,"2z-1s-2t":11,1M:N,1t:N,"42-45":R,"43-22":4,1u:R,16:R,"3V-17":R,2l:11,"41-40":R,2k:11,"1z-1k":11},13:{1W:"&2s;",2M:R,46:11,44:11,34:"4n",1x:{21:"4o 1m",2P:"?",1X:"1v\\n\\n",3E:"4r\'t 4t 1D O: ",4g:"4m 4B\'t 51 O 1z-1k 4F: ",37:\'<!4T 1z 4S "-//4V//3H 4W 1.0 4Z//4Y" "1Z://2y.3L.3K/4X/3I/3H/3I-4P.4J"><1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v</1t></3J><3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;"><T 1L="2O-3D:3C;3w-32:1.6z;"><T 1L="25-22:6A-6E;">1v</T><T 1L="25-22:.6C;3w-6B:6R;"><T>3v 3.0.76 (72 73 3x)</T><T><a 2h="1Z://3u.2w/1v" 1F="38" 1L="2f:#3y">1Z://3u.2w/1v</a></T><T>70 17 6U 71.</T><T>6T 6X-3x 6Y 6D.</T></T><T>6t 61 60 J 1k, 5Z <a 2h="6u://2y.62.2w/63-66/65?64=5X-5W&5P=5O" 1L="2f:#3y">5R</a> 5V <2R/>5U 5T 5S!</T></T></3B></1z>\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'<T 1g="16">\',d=e.16.2x,h=d.2X,g=0;g<h.L;g++)c+=(d[h[g]].1H||b)(a,h[g]);c+="</T>";H c},2o:6(a,b,c){H\'<2W><a 2h="#" 1g="6e 6h\'+b+" "+b+\'">\'+c+"</a></2W>"},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h<c.L;h++)d.U(c[h]);c=d}c=c;d=[];I(e.13.2M)c=c.1O(z());I(c.L===0)H d;O(h=0;h<c.L;h++){O(K g=c[h],i=a,k=c[h].1l,j=3W 0,l={},m=1f M("^\\\\[(?<2V>(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g<c.L;g++){b=c[g];K i=b.1F,k=b.1n,j=k.1D,l;I(j!=N){I(k["1z-1k"]=="R"||e.2v["1z-1k"]==R){d=1f e.4l(j);j="4O"}Y I(d=A(j))d=1f d;Y 6H;l=i.3X;I(h.2M){l=l;K m=x(l),s=11;I(m.1i("<![6G[")==0){m=m.4h(9);s=R}K o=m.L;I(m.1i("]]\\>")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;m<j.L;m++)j[m].P+=l}K c=A(a),d,h=1f e.1U.5Y,g=J,i="2F 1H 2Q".1e(" ");I(c!=N){d=1f c;O(K k=0;k<i.L;k++)(6(){K j=i[k];g[j]=6(){H h[j].1p(h,14)}})();d.28==N?1P.1X(e.13.1x.1X+(e.13.1x.4g+a)):h.2J.U({1I:d.28.17,2D:6(j){O(K l=j.17,m=[],s=d.2J,o=j.P+j.18.L,F=d.28,q,G=0;G<s.L;G++){q=y(l,s[G]);b(q,o);m=m.1O(q)}I(F.18!=N&&j.18!=N){q=y(j.18,F.18);b(q,j.P);m=m.1O(q)}I(F.1b!=N&&j.1b!=N){q=y(j.1b,F.1b);b(q,j.P+j[0].5Q(j.1b));m=m.1O(q)}O(j=0;j<m.L;j++)m[j].1V=c.1V;H m}})}};e.4j=6(){};e.4j.Z={V:6(a,b){K c=J.1n[a];c=c==N?b:c;K d={"R":R,"11":11}[c];H d==N?c:d},3Y:6(a){H 1E.4i(a)},4c:6(a,b){K c=[];I(a!=N)O(K d=0;d<a.L;d++)I(1j a[d]=="2m")c=c.1O(y(b,a[d]));H J.4e(c.6b(D))},4e:6(a){O(K b=0;b<a.L;b++)I(a[b]!==N)O(K c=a[b],d=c.P+c.L,h=b+1;h<a.L&&a[b]!==N;h++){K g=a[h];I(g!==N)I(g.P>d)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P<d)a[h]=N}H a},4d:6(a){K b=[],c=2u(J.V("2i-1s"));v(a,6(d,h){b.U(h+c)});H b},3U:6(a){K b=J.V("1M",[]);I(1j b!="2m"&&b.U==N)b=[b];a:{a=a.1q();K c=3W 0;O(c=c=1Q.6c(c||0,0);c<b.L;c++)I(b[c]==a){b=c;1N a}b=-1}H b!=-1},2r:6(a,b,c){a=["1s","6i"+b,"P"+a,"6r"+(b%2==0?1:2).1q()];J.3U(b)&&a.U("67");b==0&&a.U("1N");H\'<T 1g="\'+a.1K(" ")+\'">\'+c+"</T>"},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i<d;i++){K k=b?b[i]:h+i,j;I(k==0)j=e.13.1W;Y{j=g;O(K l=k.1q();l.L<j;)l="0"+l;j=l}a=j;c+=J.2r(i,k,a)}H c},49:6(a,b){a=x(a);K c=a.1e("\\n");J.V("2z-1s-2t");K d=2u(J.V("2i-1s"));a="";O(K h=J.V("1D"),g=0;g<c.L;g++){K i=c[g],k=/^(&2s;|\\s)+/.X(i),j=N,l=b?b[g]:d+g;I(k!=N){j=k[0].1q();i=i.1o(j.L);j=j.Q(" ",e.13.1W)}i=x(i);I(i.L==0)i=e.13.1W;a+=J.2r(g,l,(j!=N?\'<17 1g="\'+h+\' 5N">\'+j+"</17>":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"</4a>":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i<b.L;i++){K k=b[i],j;I(!(k===N||k.L===0)){j=c(k);h+=u(a.1o(d,k.P-d),j+"48")+u(k.1T,j+k.23);d=k.P+k.L+(k.75||0)}}h+=u(a.1o(d),c()+"48");H h},1H:6(a){K b="",c=["20"],d;I(J.V("2k")==R)J.1n.16=J.1n.1u=11;1l="20";J.V("2l")==R&&c.U("47");I((1u=J.V("1u"))==11)c.U("6S");c.U(J.V("1g-27"));c.U(J.V("1D"));a=a.Q(/^[ ]*[\\n]+|[\\n]*[ ]*$/g,"").Q(/\\r/g," ");b=J.V("43-22");I(J.V("42-45")==R)a=n(a,b);Y{O(K h="",g=0;g<b;g++)h+=" ";a=a.Q(/\\t/g,h)}a=a;a:{b=a=a;h=/<2R\\s*\\/?>|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i<b.L&&g>0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i<b.L;i++)b[i]=b[i].1o(g);a=b.1K("\\n")}I(1u)d=J.4d(a);b=J.4c(J.2J,a);b=J.4b(a,b);b=J.49(b,d);I(J.V("41-40"))b=E(b);1j 2H!="1d"&&2H.3S&&2H.3S.1C(/5s/)&&c.U("5t");H b=\'<T 1c="\'+t(J.1c)+\'" 1g="\'+c.1K(" ")+\'">\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"</2d>":"")+\'<2d 1g="17"><T 1g="3O">\'+b+"</T></2d></3P></3T></3Z></T>"},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{}))
@@ -1,3 +1,29 @@
1
+ # Copyright (c) 2011-2013 Tenable Network Security.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of the Tenable Network Security nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software
14
+ # without specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL TENABLE NETWORK SECURITY BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
1
27
  module NaslDoc
2
28
  module CLI
3
29
  end
@@ -1,267 +1,191 @@
1
+ # Copyright (c) 2011-2013 Tenable Network Security.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * Neither the name of the Tenable Network Security nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software
14
+ # without specific prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL TENABLE NETWORK SECURITY BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
+ # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ require 'nasldoc/cli/comment'
28
+
1
29
  module NaslDoc
2
30
  module CLI
3
31
  class Application
32
+ attr_accessor :error_count
4
33
 
34
+ # Initializes the Application class
5
35
  #
36
+ # - Sets the default output directory to nasldoc_output/
37
+ # - Sets the template directory to lib/templates
38
+ # - Sets the assets directory to lib/assets
6
39
  #
7
40
  def initialize
8
41
  @file_list = Array.new
42
+ @function_count = 0
43
+ @error_count = 0
9
44
  @options = Hash.new
10
45
 
11
46
  @options[:output_directory] = "nasldoc_ouput/"
12
47
 
13
48
  @functions = Array.new
14
- @function_count = 0
15
-
49
+ @globals = Array.new
16
50
  @includes = Array.new
17
- @overview = Array.new
18
- @overview_includes = Array.new
51
+
52
+ @overview = nil
19
53
 
20
54
  @template_dir = Pathname.new(__FILE__).realpath.to_s.gsub('cli/application.rb', 'templates')
21
55
  @asset_dir = Pathname.new(__FILE__).realpath.to_s.gsub('cli/application.rb', 'assets')
22
- @current_file = ""
23
-
56
+ @current_file = "(unknown)"
24
57
  end
25
58
 
26
59
  # For ERB Support
27
60
  #
61
+ # @return ERB Binding for access to instance variables in templates
28
62
  def get_binding
29
- binding
30
- end
31
-
32
- #
33
- #
34
- def build_template name, file=nil
35
- if file == nil
36
- file = name
37
- end
38
-
39
- puts "[*] Creating #{File.basename file}.html..."
40
- @erb = ERB.new File.new("#{@template_dir}/#{name}.erb").read, nil, "%"
41
- html = @erb.result(get_binding)
42
-
43
- output_file = File.basename(file).gsub(".", "_")
44
-
45
- File.open("#{@options[:output_directory]}/#{output_file}.html", 'w+') do |f|
46
- f.puts html
47
- end
63
+ binding
48
64
  end
49
65
 
66
+ # Generates the base name for a path
50
67
  #
51
- #
52
- def build_file_pages
53
- @file_list.each do |file|
54
- puts "[*] Processing File: #{file}"
55
- @current_file = File.basename(file, ".inc")
56
- contents = File.open(file, 'rb') { |f| f.read } unless file == nil
57
-
58
- contents = process_file_overview contents
59
- process_file_includes contents
60
- process_file contents
61
- build_template "file", file
62
- end
68
+ # @return htmlized file name for .inc file
69
+ def base path
70
+ File.basename(path, '.inc')
63
71
  end
64
72
 
73
+ # Generates the HTML base name for a path
65
74
  #
66
- #
67
- def process_file_overview file
68
- regex = '###((\s*?.*?).*?)###$'
69
-
70
- @overview = Array.new
71
- @overview_includes = Array.new
72
-
73
- file.scan(/#{regex}/m).each do |overview_text|
74
- text = overview_text.first.gsub(/^#/, '')
75
-
76
- text.split("\n").each do |line|
77
- line.strip!
78
- if line.start_with?("@") == false and line.length != 0
79
- @overview << line
80
- else
81
- if line =~ /@include/
82
- @overview_includes << line.gsub("@include", '')
83
- else
84
- @overview << line
85
- end
86
- end
87
- end
88
- end
89
-
90
- @overview = @overview.join("<br />")
91
-
92
- return file.gsub(/#{regex}/m, '')
75
+ # @return htmlized file name for .inc file
76
+ def url path
77
+ base(path).gsub('.', '_') + '.html'
93
78
  end
94
79
 
95
- #
96
- #
97
- def process_file_includes file
98
- regex = '^include\([\'|\"](.*)[\'|\"]\);\n'
80
+ # Compiles a template for each file
81
+ def build_template name, path=nil
82
+ path ||= name
99
83
 
100
- @includes = Array.new
101
-
102
- file.scan(/#{regex}/).each do |include_file|
103
- @include = Hash.new
104
- @include["file"] = include_file
84
+ dest = url(path)
85
+ puts "[**] Creating #{dest}"
86
+ @erb = ERB.new File.new("#{@template_dir}/#{name}.erb").read, nil, "%"
87
+ html = @erb.result(get_binding)
105
88
 
106
- @includes << @include
89
+ File.open("#{@options[:output_directory]}/#{dest}", 'w+') do |f|
90
+ f.puts html
107
91
  end
108
92
  end
109
93
 
110
- def add_nasldoc_stubs file
111
- regex = '[^##((\s*?.*?).*?)##]$.(^\s*)(function)(?:\s+|(\s*&\s*))(?:|([a-zA-Z0-9_]+))\s*(\()(.*?)(\))'
112
- new_file = file.dup
113
-
114
- file.scan(/#{regex}/m).each do |b1, function, b2, name, openpar, args, closepar|
115
- nasldoc = ""
116
- line = "#{function} #{name}#{openpar}#{args}#{closepar}"
117
-
118
- params = args.split(",")
119
-
120
- nasldoc << "\n##\n"
121
- nasldoc << "# <Function description here>\n"
122
- nasldoc << "#\n"
123
- params.each do |arg|
124
- nasldoc << "# @param #{arg.strip}\n"
125
- end unless params.size == 0
126
- nasldoc << "#\n"
127
- nasldoc << "##\n"
128
- nasldoc << "#{function} #{name}#{openpar}#{args}#{closepar}"
129
-
130
- new_file = new_file.gsub(line, nasldoc)
131
-
94
+ # Processes each .inc file and sets instance variables for each template
95
+ def build_file_page path
96
+ puts "[*] Processing file: #{path}"
97
+ @current_file = File.basename(path)
98
+ contents = File.open(path, "rb") { |f| f.read }
99
+
100
+ # Parse the input file.
101
+ tree = Nasl::Parser.new.parse(contents, path)
102
+
103
+ # Collect the functions.
104
+ @functions = Hash.new()
105
+ tree.all(:Function).map do |fn|
106
+ @functions[fn.name.name] = {
107
+ :code => fn.context(nil, false, false),
108
+ :params => fn.params.map(&:name)
109
+ }
110
+ @function_count += 1
132
111
  end
133
112
 
134
- puts new_file
135
- end
136
-
137
- #
138
- #
139
- def process_file file
140
- regex = '##((\s*?.*?).*?)##$.(^\s*)(function)(?:\s+|(\s*&\s*))(?:|([a-zA-Z0-9_]+))\s*(\()(.*?)(\))'
141
-
142
- @functions = Array.new
143
-
144
- file.scan(/#{regex}/m).each do |comments, commentz, mod, function, space, name, openpar, args, closepar|
145
- @function = Hash.new
146
-
147
- @function["name"] = name
148
- @function["args"] = args
149
-
150
- summary = ""
151
-
152
- comments.split("#").each do |line|
153
- line = line.gsub("\n", "<br />")
154
- line.strip!
155
- if line.start_with?("@") == false
156
- summary << " " + line
157
- else
158
- break
159
- end
113
+ @funcs_prv = @functions.select { |n, p| n =~ /^_/ }
114
+ @funcs_pub = @functions.reject { |n, p| @funcs_prv.key? n }
115
+
116
+ # Collect the globals.
117
+ @globals = tree.all(:Global).map(&:idents).flatten.map(&:name).sort
118
+
119
+ @globs_prv = @globals.select { |n| n =~ /^_/ }
120
+ @globs_pub = @globals.reject { |n| @globs_prv.include? n }
121
+
122
+ # Collect the includes.
123
+ @includes = tree.all(:Include).map(&:filename).map(&:text).sort
124
+
125
+ # Parse the comments.
126
+ @comments = tree.all(:Comment)
127
+ puts "[**] #{@comments.size} comment(s) were found"
128
+ @comments.map! do |comm|
129
+ begin
130
+ NaslDoc::CLI::Comment.new(comm, path)
131
+ rescue CommentException => e
132
+ # A short message is okay for format errors.
133
+ puts "[!!!] #{e.class.name} #{e.message}"
134
+ @error_count += 1
135
+ nil
136
+ rescue Exception => e
137
+ # A detailed message is given for programming errors.
138
+ puts "[!!!] #{e.class.name} #{e.message}"
139
+ puts e.backtrace.map{ |l| l.prepend "[!!!!] " }.join("\n")
140
+ nil
160
141
  end
142
+ end
143
+ @comments.compact!
144
+ @comments.keep_if &:valid
145
+ puts "[**] #{@comments.size} nasldoc comment(s) were parsed"
161
146
 
162
- @function["summary"] = summary.strip.gsub("\n", "<br />")
163
-
164
- @function["comments"] = comments = comments.gsub(/^#/, '').gsub("\n", "<br />")
165
- @function["nasl_doc"] = comments.gsub("@", "||@").split("||")
166
-
167
- anon_params = Hash.new
168
- params = Hash.new
169
- returns = Hash.new
170
- deprecated = Hash.new
171
- nessus = Hash.new
172
- category = Hash.new
173
- remark = Hash.new
174
-
175
- @function["nasl_doc"].each do |doc|
176
- if doc =~ /(\[(.*)#(.*)\])/
177
- file_url = $2
178
- function = $3
179
- url = file_url + "_inc.html" + "#" + function
180
- doc = doc.gsub($1, "<a href=\"#{url}\">#{function}</a>")
181
- end
182
-
183
- if doc =~ /(\[(.*)\])/
184
- function = $2
185
- url = @current_file + "_inc.html" + "#" + function
186
- doc = doc.gsub($1, "<a href=\"#{url}\">#{function}</a>")
187
- end
188
-
189
- if doc =~ /@anonparam/
190
- tmp = doc.sub("@anonparam", "").strip
191
- parm = tmp.split(' ')[0]
192
- anon_params[parm] = tmp.sub(parm, "")
193
- end
194
-
195
- if doc =~ /@param/
196
- doc.sub!("@param", "").strip!
197
- parm = doc.split(' ')[0]
198
- desc = doc.sub(parm, "")
199
- params[parm] = desc
200
- end
201
-
202
- if doc =~ /@return/
203
- doc.sub!("@return", "").strip!
204
- returns[doc] = doc
205
- end
206
-
207
- if doc =~ /@deprecated/
208
- doc.sub!("@deprecated", "").strip!
209
- deprecated[doc] = doc
210
- end
211
-
212
- if doc =~ /@nessus/
213
- doc.sub!("@nessus", "").strip!
214
- nessus[doc] = doc
215
- end
216
-
217
- if doc =~ /@category/
218
- doc.sub!("@category", "").strip!
219
- category[doc] = doc
220
- end
221
-
222
- if doc =~ /@remark/
223
- doc.sub!("@remark", "").strip!
224
- remark[doc] = doc
225
- end
226
- end
147
+ # Find the overview comment.
148
+ @overview = @comments.select{ |c| c.type == :file }.shift
227
149
 
228
- @function["anon_params"] = anon_params
229
- @function["params"] = params
230
- @function["returns"] = returns
231
- @function["deprecated"] = deprecated
232
- @function["nessus"] = nessus
233
- @function["category"] = category
234
- @function["remark"] = remark
150
+ build_template "file", path
151
+ end
235
152
 
236
- @functions << @function
153
+ # Builds each page from the file_list
154
+ def build_file_pages
155
+ @file_list.each do |f|
156
+ build_file_page(f)
237
157
  end
238
-
239
- @function_count = @function_count + @functions.size
240
158
  end
241
159
 
242
- #
243
- #
160
+ # Copies required assets to the final build directory
244
161
  def copy_assets
245
- puts "[*] Copying stylesheet.css to output dir"
246
- `cp #{@asset_dir}/stylesheet.css #{@options[:output_directory]}`
247
- puts "[*] Copying nessus.jpg to output dir"
248
- `cp #{@asset_dir}/nessus.jpg #{@options[:output_directory]}`
162
+ puts `cp -vr #{@asset_dir}/* #{@options[:output_directory]}/`
249
163
  end
250
164
 
251
- #
252
- #
165
+ # Prints documentation stats to stdout
253
166
  def print_documentation_stats
254
167
  puts "\n\nDocumentation Statistics"
255
168
  puts "Files: #{@file_list.size}"
256
169
  puts "Functions: #{@function_count}"
170
+ puts "Errors: #{@error_count}"
257
171
  end
258
172
 
259
- #
260
- #
173
+ # Removes blacklisted files from the file list
261
174
  def remove_blacklist file_list
262
175
  blacklist = [
263
- "blacklist_dss.inc", "blacklist_rsa.inc", "blacklist_ssl_rsa1024.inc",
264
- "blacklist_ssl_rsa2048.inc", "daily_badip.inc", "known_CA.inc", "daily_badurl.inc"
176
+ "blacklist_dss.inc",
177
+ "blacklist_rsa.inc",
178
+ "blacklist_ssl_rsa1024.inc",
179
+ "blacklist_ssl_rsa2048.inc",
180
+ "custom_CA.inc",
181
+ "daily_badip.inc",
182
+ "daily_badip2.inc",
183
+ "daily_badurl.inc",
184
+ "known_CA.inc",
185
+ "oui.inc",
186
+ "plugin_feed_info.inc",
187
+ "sc_families.inc",
188
+ "ssl_known_cert.inc"
265
189
  ]
266
190
 
267
191
  new_file_list = file_list.dup
@@ -277,16 +201,16 @@ module NaslDoc
277
201
  return new_file_list
278
202
  end
279
203
 
280
- #
281
- #
204
+ # Parses the command line arguments
282
205
  def parse_args
283
206
  opts = OptionParser.new do |opt|
284
- opt.banner = "#{APP_NAME} v#{VERSION}\nJacob Hammack\njhammack@tenable.com\n\n"
207
+ opt.banner = "#{APP_NAME} v#{VERSION}\nTenable Network Security.\njhammack@tenable.com\n\n"
285
208
  opt.banner << "Usage: #{APP_NAME} [options] [file|directory]"
286
- opt.separator('')
287
- opt.separator("Options")
288
209
 
289
- opt.on('-o','--output DIRECTORY','Directory to output results to, Created if it doesn\'t exist') do |option|
210
+ opt.separator ''
211
+ opt.separator 'Options'
212
+
213
+ opt.on('-o', '--output DIRECTORY', "Directory to output results to, created if it doesn't exit") do |option|
290
214
  @options[:output_directory] = option
291
215
  end
292
216
 
@@ -298,7 +222,7 @@ module NaslDoc
298
222
  exit
299
223
  end
300
224
 
301
- opt.on_tail("-?", "--help", "Show this message") do
225
+ opt.on_tail('-?', '--help', 'Show this message') do
302
226
  puts opt.to_s + "\n"
303
227
  exit
304
228
  end
@@ -312,29 +236,33 @@ module NaslDoc
312
236
  end
313
237
  end
314
238
 
315
- #
316
- #
317
- def main
239
+ # Main function for running nasldoc
240
+ def run
318
241
  parse_args
319
242
 
320
243
  if File.directory?(ARGV.first) == true
321
- pattern = File.join(ARGV.first, "*.inc")
244
+ pattern = File.join(ARGV.first, '**', '*.inc')
322
245
  @file_list = Dir.glob pattern
323
246
  else
324
247
  @file_list << ARGV.first
325
248
  end
326
249
 
250
+ # Ensure the output directory exists.
327
251
  if File.directory?(@options[:output_directory]) == false
328
252
  Dir.mkdir @options[:output_directory]
329
253
  end
330
254
 
255
+ # Get rid of non-NASL files.
331
256
  @file_list = remove_blacklist(@file_list)
332
257
 
258
+ # Ensure we process files in a consistent order.
259
+ @file_list.sort! do |a, b|
260
+ base(a) <=> base(b)
261
+ end
262
+
333
263
  puts "[*] Building documentation..."
334
264
 
335
265
  build_template "index"
336
- build_template "sidebar"
337
- build_template "overview"
338
266
  build_file_pages
339
267
  copy_assets
340
268