From 50e771e6a8dd0c0f08a818b0ec2d9cbfe12e8227 Mon Sep 17 00:00:00 2001 From: "qingwei.li" Date: Tue, 16 May 2017 23:11:50 +0800 Subject: [PATCH] bump: 3.7.0 --- CHANGELOG.md | 6 ++++ lib/docsify.js | 87 +++++++++++++++++++++++++++++++++++++++------- lib/docsify.min.js | 4 +-- 3 files changed, 83 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c101df2..479ad72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ + # Changelog +## 3.7.0 / 2017-05-16 + + * feat: add externalLinkTarget, close #149 + * feat: add **{docsify-updated}**, close #158 + ## 3.6.6 / 2017-05-06 * feat: support query string for the search, likes `https://docsify.js.org/#/?s=navbar`, fixed ([#156](https://github.com/QingWei-Li/docsify/issues/156) diff --git a/lib/docsify.js b/lib/docsify.js index 5729c68..e65ce75 100644 --- a/lib/docsify.js +++ b/lib/docsify.js @@ -77,7 +77,9 @@ var config = merge({ executeScript: null, noEmoji: false, ga: '', - mergeNavbar: false + mergeNavbar: false, + formatUpdated: '', + externalLinkTarget: '_blank' }, window.$docsify); var script = document.currentScript || @@ -629,9 +631,10 @@ function get (url, hasBar) { var on = function () { xhr.addEventListener.apply(xhr, arguments); }; + var cached$$1 = cache[url]; - if (cache[url]) { - return { then: function (cb) { return cb(cache[url]); }, abort: noop } + if (cached$$1) { + return { then: function (cb) { return cb(cached$$1.content, cached$$1.opt); }, abort: noop } } xhr.open('GET', url); @@ -660,8 +663,14 @@ function get (url, hasBar) { if (target.status >= 400) { error(target); } else { - cache[url] = target.response; - success(target.response); + var result = cache[url] = { + content: target.response, + opt: { + updatedAt: xhr.getResponseHeader('last-modified') + } + }; + + success(result.content, result.opt); } }); }, @@ -2959,6 +2968,7 @@ function emojify (text) { var markdownCompiler = marked; var contentBase = ''; var currentPath = ''; +var linkTarget = '_blank'; var renderer = new marked.Renderer(); var cacheTree = {}; var toc = []; @@ -2980,11 +2990,13 @@ var markdown = cached(function (text) { markdown.renderer = renderer; -markdown.init = function (config, base) { +markdown.init = function (config, ref) { if ( config === void 0 ) config = {}; - if ( base === void 0 ) base = window.location.pathname; + var base = ref.base; if ( base === void 0 ) base = window.location.pathname; + var externalLinkTarget = ref.externalLinkTarget; contentBase = getBasePath(base); + linkTarget = externalLinkTarget || linkTarget; if (isFn(config)) { markdownCompiler = config(marked, renderer); @@ -3037,7 +3049,7 @@ renderer.link = function (href, title, text) { if (!/:|(\/{2})/.test(href)) { href = toURL(href, null, currentPath); } else { - blank = ' target="_blank"'; + blank = " target=\"" + linkTarget + "\""; } if (title) { title = " title=\"" + title + "\""; @@ -3118,6 +3130,45 @@ var render = Object.freeze({ cover: cover$1 }); +var RGX = /([^{]*?)\w(?=\})/g; + +var dict = { + YYYY: 'getFullYear', + YY: 'getYear', + MM: function (d) { + return d.getMonth() + 1; + }, + DD: 'getDate', + HH: 'getHours', + mm: 'getMinutes', + ss: 'getSeconds' +}; + +var tinydate = function (str) { + var parts=[], offset=0; + str.replace(RGX, function (key, _, idx) { + // save preceding string + parts.push(str.substring(offset, idx - 1)); + offset = idx += key.length + 1; + // save function + parts.push(function(d){ + return ('00' + (typeof dict[key]==='string' ? d[dict[key]]() : dict[key](d))).slice(-key.length); + }); + }); + + if (offset !== str.length) { + parts.push(str.substring(offset)); + } + + return function (arg) { + var out='', i=0, d=arg||new Date(); + for (; iscript') .filter(function (s) { return !/template/.test(s.type); })[0]; @@ -3130,6 +3181,16 @@ function executeScript () { }, 0); } +function formatUpdated (html, updated, fn) { + updated = typeof fn === 'function' + ? fn(updated) + : typeof fn === 'string' + ? tinydate(fn)(new Date(updated)) + : updated; + + return html.replace(/{docsify-updated}/g, updated) +} + function renderMain (html) { if (!html) { // TODO: Custom 404 page @@ -3210,11 +3271,13 @@ function renderMixin (proto) { getAndActive('nav'); }; - proto._renderMain = function (text) { + proto._renderMain = function (text, opt) { var this$1 = this; callHook(this, 'beforeEach', text, function (result) { var html = this$1.isHTML ? result : markdown(result); + html = formatUpdated(html, opt.updatedAt, this$1.config.formatUpdated); + callHook(this$1, 'afterEach', html, function (text) { return renderMain.call(this$1, text); }); }); }; @@ -3262,7 +3325,7 @@ function initRender (vm) { var config = vm.config; // Init markdown compiler - markdown.init(config.markdown, config.basePath); + markdown.init(config.markdown, config); var id = config.el || '#app'; var navEl = find('nav') || create('nav'); @@ -3406,8 +3469,8 @@ function fetchMixin (proto) { this.isHTML = /\.html$/g.test(path); // Load main content - last.then(function (text) { - this$1._renderMain(text); + last.then(function (text, opt) { + this$1._renderMain(text, opt); if (!loadSidebar) { return cb() } var fn = function (result) { this$1._renderSidebar(result); cb(); }; diff --git a/lib/docsify.min.js b/lib/docsify.min.js index 000a20c..3f3ce71 100644 --- a/lib/docsify.min.js +++ b/lib/docsify.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";function e(e){var t=Object.create(null);return function(n){var r=t[n];return r||(t[n]=e(n))}}function t(e){return"string"==typeof e||"number"==typeof e}function n(){}function r(e){return"function"==typeof e}function i(e){var t=["init","mounted","beforeEach","afterEach","doneEach","ready"];e._hooks={},e._lifecycle={},t.forEach(function(t){var n=e._hooks[t]=[];e._lifecycle[t]=function(e){return n.push(e)}})}function a(e,t,r,i){void 0===i&&(i=n);var a=r,o=e._hooks[t],s=function(e){var t=o[e];if(e>=o.length)i(a);else if("function"==typeof t)if(2===t.length)t(r,function(t){a=t,s(e+1)});else{var n=t(r);a=void 0!==n?n:a,s(e+1)}else s(e+1)};s(0)}function o(e,t){if(void 0===t&&(t=!1),"string"==typeof e){if("undefined"!=typeof window.Vue)return s(e);e=t?s(e):be[e]||(be[e]=s(e))}return e}function s(e,t){return t?e.querySelector(t):ye.querySelector(e)}function l(e,t){return[].slice.call(t?e.querySelectorAll(t):ye.querySelectorAll(e))}function c(e,t){return e=ye.createElement(e),t&&(e.innerHTML=t),e}function u(e,t){return e.appendChild(t)}function p(e,t){return e.insertBefore(t,e.children[0])}function h(e,t,n){r(t)?window.addEventListener(e,t):e.addEventListener(t,n)}function d(e,t,n){r(t)?window.removeEventListener(e,t):e.removeEventListener(t,n)}function g(e,t,n){e&&e.classList[n?t:"toggle"](n||t)}function f(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach(function(e){var n=e.replace(/\+/g," ").split("=");t[n[0]]=Ce(n[1])}),t):t}function m(e){var t=[];for(var n in e)t.push(($e(n)+"="+$e(e[n])).toLowerCase());return t.length?"?"+t.join("&"):""}function v(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return je(e.join("/"))}function b(e){var t=window.location.href.indexOf("#");window.location.replace(window.location.href.slice(0,t>=0?t:0)+"#"+e)}function y(){var e=k();return e=Oe(e),"/"===e.charAt(0)?b(e):void b("/"+e)}function k(){var e=window.location.href,t=e.indexOf("#");return t===-1?"":e.slice(t+1)}function w(e){void 0===e&&(e=window.location.href);var t="",n=e.indexOf("?");n>=0&&(t=e.slice(n+1),e=e.slice(0,n));var r=e.indexOf("#");return r&&(e=e.slice(r+1)),{path:e,query:f(t)}}function x(e,t,n){var r=n&&"#"===e[0],i=w(Oe(e));return i.query=pe({},i.query,t),e=i.path+m(i.query),e=e.replace(/\.md(\?)|\.md$/,"$1"),r&&(e=n+e),je("#/"+e)}function _(e){var t=function(e){return ke.classList.toggle("close")};e=o(e),h(e,"click",function(e){e.stopPropagation(),t()});var n=o(".sidebar");Le&&h(ke,"click",function(e){return ke.classList.contains("close")&&t()}),h(n,"click",function(e){return setTimeout(0)})}function S(){var e=o("section.cover");if(e){var t=e.getBoundingClientRect().height;window.pageYOffset>=t||e.classList.contains("hidden")?g(ke,"add","sticky"):g(ke,"remove","sticky")}}function L(e,t,n){e=o(e);var r,i=l(e,"a"),a="#"+k();return i.sort(function(e,t){return t.href.length-e.href.length}).forEach(function(e){var n=e.getAttribute("href"),i=t?e.parentNode:e;0!==a.indexOf(n)||r?g(i,"remove","active"):(r=e,g(i,"add","active"))}),n&&(ye.title=r?r.innerText+" - "+Pe:Pe),r}function C(){for(var e,t=o(".sidebar"),n=l(".anchor"),r=s(t,".sidebar-nav"),i=s(t,"li.active"),a=ke.scrollTop,c=0,u=n.length;ca){e||(e=p);break}e=p}if(e){var h=qe[e.getAttribute("data-id")];if(h&&h!==i&&(i&&i.classList.remove("active"),h.classList.add("active"),i=h,!Ne&&ke.classList.contains("sticky"))){var d=t.clientHeight,g=0,f=i.offsetTop+i.clientHeight+40,m=i.offsetTop>=r.scrollTop&&f<=r.scrollTop+d,v=f-g=400?a(n):(Ie[e]=n.response,r(n.response))})},abort:function(e){return 4!==r.readyState&&r.abort()}})}function O(e,t){e.innerHTML=e.innerHTML.replace(/var\(\s*--theme-color.*?\)/g,t)}function M(e){return e?(/\/\//.test(e)||(e="https://github.com/"+e),e=e.replace(/^git\+/,""),''):""}function P(e){var t='';return(Le?t+"
":"
"+t)+'
'}function q(){var e=", 100%, 85%",t="linear-gradient(to left bottom, hsl("+(Math.floor(255*Math.random())+e)+") 0%,hsl("+(Math.floor(255*Math.random())+e)+") 100%)";return'
'}function N(e,t){return void 0===t&&(t=""),e&&e.length?(e.forEach(function(e){t+='
  • '+e.title+"
  • ",e.children&&(t+='
    • '+N(e.children)+"
    ")}),t):""}function F(e,t){return'

    '+t.slice(5).trim()+"

    "}function H(e){return""}function I(e,t){return t={exports:{}},e(t,t.exports),t.exports}function z(e,t){var n=[],r={};return e.forEach(function(e){var i=e.level||1,a=i-1;i>t||(r[a]?r[a].children=(r[a].children||[]).concat(e):n.push(e),r[i]=e)}),n}function R(e){if("string"!=typeof e)return"";var t=e.toLowerCase().trim().replace(/<[^>\d]+>/g,"").replace(Ue,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),n=De[t];return n=De.hasOwnProperty(t)?n+1:0,De[t]=n,n&&(t=t+"-"+n),t}function W(e,t){return''+t+''}function B(e){return $docsify.noEmoji?e:e.replace(/<(pre|template|code)[^>]*?>[\s\S]+?<\/(pre|template|code)>/g,function(e){return e.replace(/:/g,"__colon__")}).replace(/:(\w+?):/gi,window.emojify||W).replace(/__colon__/g,":")}function D(e,t){var n="";if(e)n=Qe(e),n=n.match(/]*>([\s\S]+)<\/ul>/g)[0];else{var r=Ye[Xe]||z(Je,t);n=N(r,"