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.
- data/LICENSE +3 -3
- data/NEWS.markdown +9 -5
- data/README.markdown +38 -41
- data/Rakefile +49 -3
- data/TODO.markdown +20 -0
- data/bin/nasldoc +27 -1
- data/lib/nasldoc.rb +27 -1
- data/lib/nasldoc/assets/css/bootstrap.css +6004 -0
- data/lib/nasldoc/assets/css/bootstrap.min.css +859 -0
- data/lib/nasldoc/assets/css/shCore.css +226 -0
- data/lib/nasldoc/assets/css/shThemeDefault.css +117 -0
- data/lib/nasldoc/assets/{stylesheet.css → css/stylesheet.css} +37 -15
- data/lib/nasldoc/assets/img/glyphicons-halflings-white.png +0 -0
- data/lib/nasldoc/assets/img/glyphicons-halflings.png +0 -0
- data/lib/nasldoc/assets/{nessus.jpg → img/nessus.jpg} +0 -0
- data/lib/nasldoc/assets/js/bootstrap.js +2036 -0
- data/lib/nasldoc/assets/js/bootstrap.min.js +7 -0
- data/lib/nasldoc/assets/js/jquery-1.8.2.js +9440 -0
- data/lib/nasldoc/assets/js/shBrushNasl.js +33 -0
- data/lib/nasldoc/assets/js/shCore.js +17 -0
- data/lib/nasldoc/cli.rb +26 -0
- data/lib/nasldoc/cli/application.rb +150 -222
- data/lib/nasldoc/cli/comment.rb +317 -0
- data/lib/nasldoc/templates/file.erb +362 -154
- data/lib/nasldoc/templates/index.erb +93 -9
- data/lib/nasldoc/templates/old/file.erb +332 -0
- data/lib/nasldoc/templates/old/xfile.erb +267 -0
- data/lib/nasldoc/templates/old/xindex.erb +16 -0
- data/lib/nasldoc/templates/old/xoverview.erb +26 -0
- data/lib/nasldoc/templates/old/xsidebar.erb +21 -0
- data/lib/nasldoc/templates/xindex.erb +16 -0
- data/nasldoc.gemspec +45 -18
- metadata +45 -13
- data/lib/nasldoc/templates/overview.erb +0 -27
- 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,{}))
|
data/lib/nasldoc/cli.rb
CHANGED
@@ -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
|
-
@
|
15
|
-
|
49
|
+
@globals = Array.new
|
16
50
|
@includes = Array.new
|
17
|
-
|
18
|
-
@
|
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
|
-
|
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
|
53
|
-
|
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
|
68
|
-
|
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
|
-
|
98
|
-
regex = '^include\([\'|\"](.*)[\'|\"]\);\n'
|
80
|
+
# Compiles a template for each file
|
81
|
+
def build_template name, path=nil
|
82
|
+
path ||= name
|
99
83
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
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
|
-
|
89
|
+
File.open("#{@options[:output_directory]}/#{dest}", 'w+') do |f|
|
90
|
+
f.puts html
|
107
91
|
end
|
108
92
|
end
|
109
93
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
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
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
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
|
-
|
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
|
-
|
229
|
-
|
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
|
-
|
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
|
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",
|
264
|
-
"
|
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 =
|
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.
|
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(
|
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,
|
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
|
|