var ditto = { // page element ids content_id: "#content", sidebar_id: "#sidebar", edit_id: "#edit", back_to_top_id: "#back_to_top", loading_id: "#loading", error_id: "#error", // display elements sidebar: true, edit_button: true, back_to_top_button: true, // initialize function run: initialize }; var disqusCode = '

留言

'; function initialize() { // initialize sidebar and buttons if (ditto.sidebar) { init_sidebar_section(); } if (ditto.back_to_top_button) { init_back_to_top_button(); } if (ditto.edit_button) { init_edit_button(); } // page router router(); $(window).on('hashchange', router); var flip = document.querySelector('#flip'); var hasTouch = 'ontouchstart' in window; if (!hasTouch) { Veil(flip, { prop: 'bottom' }); } } function init_sidebar_section() { $.get(ditto.sidebar_file, function(data) { $(ditto.sidebar_id).html(marked(data)); }, "text").fail(function() { alert("Opps! can't find the sidebar file to display!"); }); } function init_back_to_top_button() { $(ditto.back_to_top_id).show(); $(ditto.back_to_top_id).on("click", function() { $("html body").animate({ scrollTop: 0 }, 200); }); } function init_edit_button() { if (ditto.base_url === null) { alert("Error! You didn't set 'base_url' when calling ditto.run()!"); } else { $(ditto.edit_id).show(); $(ditto.edit_id).on("click", function() { var hash = location.hash.replace("#", "/"); if (hash === "") { hash = "/" + ditto.index.replace(".md", ""); } window.open(ditto.base_url + hash + ".md"); // open is better than redirecting, as the previous page history // with redirect is a bit messed up }); } } function replace_symbols(text) { // replace symbols with underscore return text.replace(/[&\/\\#,+=()$~%.'":*?<>{}\ \]\[]/g, "_"); } function li_create_linkage(li_tag, header_level) { // add custom id and class attributes html_safe_tag = replace_symbols(li_tag.text()); li_tag.attr("id", html_safe_tag); li_tag.attr("class", "link"); // add click listener - on click scroll to relevant header section $(ditto.content_id + " li#" + li_tag.attr("id")).click(function() { // scroll to relevant section var header = $( ditto.content_id + " h" + header_level + "." + li_tag.attr("id") ); $('html, body').animate({ scrollTop: header.offset().top }, 200); // highlight the relevant section original_color = header.css("color"); header.animate({ color: "#ED1C24", }, 500, function() { // revert back to orig color $(this).animate({color: original_color}, 2500); }); }); } function create_page_anchors() { // create page anchors by matching li's to headers // if there is a match, create click listeners // and scroll to relevant sections // go through header level 1 to 3 for (var i = 1; i <= 4; i++) { // parse all headers var headers = []; $('#content h' + i).map(function() { headers.push($(this).text()); $(this).addClass(replace_symbols($(this).text())); this.id = 'h'+i+'-'+replace_symbols($(this).text()); }); if ((i === 2) && headers.length !== 0){ var ul_tag = $('
    ') .insertAfter('#content h1') .addClass("content-toc") .attr('id','content-toc'); for (var j = 0; j < headers.length; j++) { var li_tag = $('
  1. ').text(headers[j]); ul_tag.append(li_tag); li_create_linkage(li_tag, i); } } } } function normalize_paths() { // images $(ditto.content_id + " img").map(function() { var src = $(this).attr("src").replace("./", ""); if ($(this).attr("src").slice(0, 5) !== "http") { var url = location.hash.replace("#", ""); // split and extract base dir url = url.split("/"); var base_dir = url.slice(0, url.length - 1).toString(); // normalize the path (i.e. make it absolute) $(this).attr("src", base_dir + "/" + src); } }); } function show_error() { console.log("SHOW ERORR!"); $(ditto.error_id).show(); } function show_loading() { $(ditto.loading_id).show(); $(ditto.content_id).html(""); // clear content // infinite loop until clearInterval() is called on loading var loading = setInterval(function() { $(ditto.loading_id).fadeIn(1000).fadeOut(1000); }, 2000); return loading; } function router() { var path = location.hash.replace("#", "./"); // default page if hash is empty if (location.pathname === "/index.html") { path = location.pathname.replace("index.html", ditto.index); normalize_paths(); } else if (path === "") { path = window.location + ditto.index; normalize_paths(); } else { path = path + ".md"; } // otherwise get the markdown and render it var loading = show_loading(); $.get(path , function(data) { $(ditto.error_id).hide(); $(ditto.content_id).html(marked(data)+disqusCode); if ($(ditto.content_id+" h1").text() === ditto.document_title){ document.title = ditto.document_title; } else { document.title = $(ditto.content_id+" h1").text() + " - " + ditto.document_title; } normalize_paths(); create_page_anchors(); // 完成代码高亮 $('#content code').map(function() { Prism.highlightElement(this); }); // 加载disqus (function () { // http://docs.disqus.com/help/2/ window.disqus_shortname = 'es6'; window.disqus_identifier = (location.hash?location.hash.replace("#", ""):'READEME'); window.disqus_title =$(ditto.content_id+" h1").text(); window.disqus_url = 'http://es6.ruanyifeng.com/' + (location.hash?location.hash.replace("#", ""):'README'); // http://docs.disqus.com/developers/universal/ (function() { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = 'http://'+window.disqus_shortname+'.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })(); })(); if(location.hash !== ''){ $('html, body').animate({ scrollTop: $('#content').offset().top }, 200); } }).fail(function() { show_error(); }).always(function() { clearInterval(loading); $(ditto.loading_id).hide(); }); } // veil.js (function (window, document, $) { window.Veil = function (elem, options) { var defaults = { offset: 0, prop: 'top', onScroll: function (elem, threshold) {}, isHidden: function (elem, threshold) {}, isVisible: function (elem, threshold) {} }; var lastScroll = 0; var treshold = 0; // merge the defaults with the passed options for (var key in options) { defaults[key] = options[key]; } // if the defaults.prop is 'top' or 'bottom' // we need the height, otherwise the width var sizeProp = /to/i.test(defaults.prop) ? 'offsetHeight' : 'offsetWidth'; Veil.scroll = function () { var scrollOffset = document.documentElement.scrollTop || document.body.scrollTop, elemSize = elem[sizeProp] + defaults.offset, diff = scrollOffset - lastScroll; treshold = (treshold + diff > elemSize) ? elemSize : (scrollOffset < 0) ? 0 : treshold + diff; treshold = (treshold < 0) ? 0 : treshold; elem.style[defaults.prop] = (-treshold) + 'px'; defaults.onScroll(elem, treshold); if (!treshold) defaults.isVisible(elem, treshold); if (treshold === elemSize) defaults.isHidden(elem, treshold); lastScroll = scrollOffset; }; Veil.scroll(); // modern browsers if (window.addEventListener) return window.addEventListener('scroll', Veil.scroll); // ie8 and below window.attachEvent('onscroll', Veil.scroll); }; // if jquery or zepto is present, // add a function to their prototype if ($) $.fn.veil = function (options) { return this.each(function () { Veil(this, options); }); }; }(this, document, this.jQuery || this.Zepto));