diff --git a/config.json b/config.json index 991805e..1aae0f9 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,5 @@ { - "title": "KaliWiki" + "title": "KaliWiki", "useSideMenu": true, "additionalFooterText": "All content and images © by Pwn Wiki Team", } diff --git a/index.html b/index.html index 24e873f..bc67701 100644 --- a/index.html +++ b/index.html @@ -1,20 +1,26 @@ + MDwiki + @@ -187,8 +195,8 @@ var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/< - + @@ -199,11 +207,6 @@ var c=a(b);c.css("position","relative"),c.css("margin-top","1em"),a("#md-all").a
-
-
-
-
-
diff --git a/mdwiki-0.5.5/GPLv3.txt b/mdwiki-0.6.1/GPLv3.txt similarity index 100% rename from mdwiki-0.5.5/GPLv3.txt rename to mdwiki-0.6.1/GPLv3.txt diff --git a/mdwiki-0.5.5/LICENSE.txt b/mdwiki-0.6.1/LICENSE.txt similarity index 100% rename from mdwiki-0.5.5/LICENSE.txt rename to mdwiki-0.6.1/LICENSE.txt diff --git a/mdwiki-0.5.5/README.md b/mdwiki-0.6.1/README.md similarity index 100% rename from mdwiki-0.5.5/README.md rename to mdwiki-0.6.1/README.md diff --git a/mdwiki-0.5.5/mdwiki-debug.html b/mdwiki-0.6.1/mdwiki-debug.html similarity index 94% rename from mdwiki-0.5.5/mdwiki-debug.html rename to mdwiki-0.6.1/mdwiki-debug.html index deb9b5d..e2e4db1 100644 --- a/mdwiki-0.5.5/mdwiki-debug.html +++ b/mdwiki-0.6.1/mdwiki-debug.html @@ -1,20 +1,26 @@ + MDwiki + @@ -1329,15 +1337,16 @@ if (typeof exports === 'object') { // default config $.md.config = { title: null, - useSideNav: true, - /* can be: gfm, original */ + useSideMenu: true, lineBreaks: 'gfm', + additionalFooterText: '', + anchorCharacter: '¶', + tocAnchor: '[ ↑ ]' }; $.md.gimmicks = []; $.md.stages = []; - $.md.debug = true; // the location of the main markdown file we display $.md.mainHref = ''; @@ -1406,7 +1415,7 @@ if (typeof exports === 'object') { self.subscribe = function(fn) { if (self.started) { - $.error('Can not subscribe to stage which already started!'); + $.error('Subscribing to stage which already started!'); } self.events.push(fn); }; @@ -1414,24 +1423,29 @@ if (typeof exports === 'object') { self.events.remove(fn); }; + self.executeSubscribedFn = function (fn) { + var d = $.Deferred(); + self.outstanding.push(d); + + // display an error if our done() callback is not called + $.md.util.wait(2500).done(function() { + if(d.state() !== 'resolved') { + log.fatal('Timeout reached for done callback in stage: ' + self.name + + '. Did you forget a done() call in a .subscribe() ?'); + log.fatal('stage ' + name + ' failed running subscribed function: ' + fn ); + } + }); + + var done = function() { + d.resolve(); + }; + fn(done); + }; + self.run = function() { self.started = true; $(self.events).each(function (i,fn) { - var d = $.Deferred(); - self.outstanding.push(d); - - // display an error if our done() callback is not called - $.md.util.wait(2500).done(function() { - if(d.state() !== 'resolved') { - log.fatal('Timeout reached for done callback in stage: ' + self.name + - '. Did you forget a done() call in a .subscribe() ?'); - } - }); - - var done = function() { - d.resolve(); - }; - fn(done); + self.executeSubscribedFn(fn); }); // if no events are in our queue, we resolve immediately @@ -1492,7 +1506,10 @@ if (typeof exports === 'object') { // postprocess $.Stage('postgimmick'), - $.Stage('all_ready') + $.Stage('all_ready'), + + // used for integration tests, not intended to use in MDwiki itself + $.Stage('final_tests') ]; $.md.stage = function(name) { @@ -1519,24 +1536,26 @@ if (typeof exports === 'object') { var publicMethods = {}; $.md.publicMethods = $.extend ({}, $.md.publicMethods, publicMethods); - function registerFetchMarkdown() { - var transformMarkdown = function(markdown) { - var options = { - gfm: true, - tables: true, - breaks: true - }; - if ($.md.config.lineBreaks === 'original') - options.breaks = false; - else if ($.md.config.lineBreaks === 'gfm') - options.breaks = true; - - marked.setOptions(options); - - // get sample markdown - var uglyHtml = marked(markdown); - return uglyHtml; + function transformMarkdown (markdown) { + var options = { + gfm: true, + tables: true, + breaks: true }; + if ($.md.config.lineBreaks === 'original') + options.breaks = false; + else if ($.md.config.lineBreaks === 'gfm') + options.breaks = true; + + marked.setOptions(options); + + // get sample markdown + var uglyHtml = marked(markdown); + return uglyHtml; + } + + function registerFetchMarkdown() { + var md = ''; $.md.stage('init').subscribe(function(done) { @@ -1555,6 +1574,7 @@ if (typeof exports === 'object') { }); }); + // find baseUrl $.md.stage('transform').subscribe(function(done) { var len = $.md.mainHref.lastIndexOf('/'); var baseUrl = $.md.mainHref.substring(0, len+1); @@ -1562,33 +1582,116 @@ if (typeof exports === 'object') { done(); }); - $.md.stage('ready').subscribe(function(done) { + $.md.stage('transform').subscribe(function(done) { var uglyHtml = transformMarkdown(md); $('#md-content').html(uglyHtml); md = ''; - done(); + var dfd = $.Deferred(); + loadExternalIncludes(dfd); + dfd.always(function () { + done(); + }); }); } + // load [include](/foo/bar.md) external links + function loadExternalIncludes(parent_dfd) { + + function findExternalIncludes () { + return $('a').filter (function () { + var href = $(this).attr('href'); + var text = $(this).toptext(); + var isMarkdown = $.md.util.hasMarkdownFileExtension(href); + var isInclude = text === 'include'; + var isPreview = text.startsWith('preview:'); + return (isInclude || isPreview) && isMarkdown; + }); + } + + function selectPreviewElements ($jqcol, num_elements) { + function isTextNode(node) { + return node.nodeType === 3; + } + var count = 0; + var elements = []; + $jqcol.each(function (i,e) { + if (count < num_elements) { + elements.push(e); + if (!isTextNode(e)) count++; + } + }); + return $(elements); + } + + var external_links = findExternalIncludes (); + // continue execution when all external resources are fully loaded + var latch = $.md.util.countDownLatch (external_links.length); + latch.always (function () { + parent_dfd.resolve(); + }); + + external_links.each(function (i,e) { + var $el = $(e); + var href = $el.attr('href'); + var text = $el.toptext(); + + $.ajax({ + url: href, + dataType: 'text' + }) + .done(function (data) { + var $html = $(transformMarkdown(data)); + if (text.startsWith('preview:')) { + // only insert the selected number of paragraphs; default 3 + var num_preview_elements = parseInt(text.substring(8), 10) ||3; + var $preview = selectPreviewElements ($html, num_preview_elements); + $preview.last().append(' ...read more ➜'); + $preview.insertBefore($el.parent('p').eq(0)); + $el.remove(); + } else { + $html.insertAfter($el.parents('p')); + $el.remove(); + } + }).always(function () { + latch.countDown(); + }); + }); + } + + function isSpecialLink(href) { + if (!href) return false; + + if (href.lastIndexOf('data:') >= 0) + return true; + + if (href.startsWith('mailto:')) + return true; + + if (href.startsWith('file:')) + return true; + + if (href.startsWith('ftp:')) + return true; + + // TODO capture more special links: every non-http link with : like + // torrent:// etc. + } // modify internal links so we load them through our engine function processPageLinks(domElement, baseUrl) { - - function hasMarkdownFileExtension (str) { - var markdownExtensions = [ '.md', '.markdown', '.mdown' ]; - var result = false; - $(markdownExtensions).each(function (i,ext) { - if (str.toLowerCase().endsWith (ext)) { - result = true; - } - }); - return result; - } - var html = $(domElement); if (baseUrl === undefined) { baseUrl = ''; } + // HACK against marked: empty links will have empy href attribute + // we remove the href attribute from the a tag + html.find('a').not('#md-menu a').filter(function () { + var $this = $(this); + var attr = $this.attr('href'); + if (!attr || attr.length === 0) + $this.removeAttr('href'); + }); + html.find('a, img').each(function(i,e) { var link = $(e); // link must be jquery collection @@ -1601,38 +1704,63 @@ if (typeof exports === 'object') { } var href = link.attr(hrefAttribute); + if (href && href.lastIndexOf ('#!') >= 0) + return; + + if (isSpecialLink(href)) + return; + + if (!isImage && href.startsWith ('#') && !href.startsWith('#!')) { + // in-page link + link.click(function(ev) { + ev.preventDefault(); + $.md.scrollToInPageAnchor (href); + }); + } + + if (! $.md.util.isRelativeUrl(href)) + return; + + if (isImage && ! $.md.util.isRelativePath(href)) + return; + if (!isImage && $.md.util.isGimmickLink(link)) return; - if ($.md.util.isRelativeUrl(href)) { - var newHref = baseUrl + href; - if (!hasMarkdownFileExtension(newHref)) - return; - if (!isImage) - link.attr(hrefAttribute, '#!' + newHref); + function build_link (url) { + if ($.md.util.hasMarkdownFileExtension (url)) + return '#!' + url; else - link.attr(hrefAttribute, newHref); + return url; } + + var newHref = baseUrl + href; + if (isImage) + link.attr(hrefAttribute, newHref); + else if ($.md.util.isRelativePath (href)) + link.attr(hrefAttribute, build_link(newHref)); + else + link.attr(hrefAttribute, build_link(href)); }); } var navMD = ''; - $.md.NavgiationDfd = $.Deferred(); + $.md.NavigationDfd = $.Deferred(); var ajaxReq = { url: 'navigation.md', dataType: 'text' }; $.ajax(ajaxReq).done(function(data) { navMD = data; - $.md.NavgiationDfd.resolve(); + $.md.NavigationDfd.resolve(); }).fail(function() { - $.md.NavgiationDfd.reject(); + $.md.NavigationDfd.reject(); }); function registerBuildNavigation() { $.md.stage('init').subscribe(function(done) { - $.md.NavgiationDfd.done(function() { + $.md.NavigationDfd.done(function() { done(); }) .fail(function() { @@ -1649,13 +1777,23 @@ if (typeof exports === 'object') { } var navHtml = marked(navMD); - var h = $('
' + navHtml + '
'); - // TODO .html() is evil!!! - h.find('p').each(function(i,e) { - var el = $(e); - el.replaceWith(el.html()); + // TODO why are - +
-
-
-
-
-
diff --git a/mdwiki-0.5.5/mdwiki-slim.html b/mdwiki-0.6.1/mdwiki-slim.html similarity index 54% rename from mdwiki-0.5.5/mdwiki-slim.html rename to mdwiki-0.6.1/mdwiki-slim.html index e324dbe..f580df2 100644 --- a/mdwiki-0.5.5/mdwiki-slim.html +++ b/mdwiki-0.6.1/mdwiki-slim.html @@ -1,20 +1,26 @@ + MDwiki + @@ -162,8 +170,8 @@ - + @@ -174,11 +182,6 @@ var c=a(b);c.css("position","relative"),c.css("margin-top","1em"),a("#md-all").a
-
-
-
-
-
diff --git a/mdwiki-0.5.5/mdwiki.html b/mdwiki-0.6.1/mdwiki.html similarity index 88% rename from mdwiki-0.5.5/mdwiki.html rename to mdwiki-0.6.1/mdwiki.html index 24e873f..bc67701 100644 --- a/mdwiki-0.5.5/mdwiki.html +++ b/mdwiki-0.6.1/mdwiki.html @@ -1,20 +1,26 @@ + MDwiki + @@ -187,8 +195,8 @@ var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/< - + @@ -199,11 +207,6 @@ var c=a(b);c.css("position","relative"),c.css("margin-top","1em"),a("#md-all").a
-
-
-
-
-