Templates and snippets for export
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,531 @@
|
||||
// bigblow.js --- BigBlow JS file
|
||||
//
|
||||
// Copyright (C) 2011-2016 All Right Reserved, Fabrice Niessen
|
||||
//
|
||||
// This file is free software: you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// This file is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// Author: Fabrice Niessen <(concat "fniessen" at-sign "pirilampo.org")>
|
||||
// URL: https://github.com/fniessen/org-html-themes/
|
||||
// Version: 20140515.1841
|
||||
|
||||
$(function() {
|
||||
$('p').
|
||||
html(function(index, old) {
|
||||
return old.replace('FIXME',
|
||||
'<span class="fixme">FIXME</span>');
|
||||
});
|
||||
$('p').
|
||||
html(function(index, old) {
|
||||
return old.replace('XXX',
|
||||
'<span class="fixme">XXX</span>');
|
||||
});
|
||||
});
|
||||
|
||||
// Remove leading section number
|
||||
$(function() {
|
||||
$('.section-number-2').text("");
|
||||
for (var i = 3; i <= 5; i++) {
|
||||
$('.section-number-' + i).each(function() {
|
||||
$(this).text($(this).text().replace(/^[0-9]+\./g, ""));
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('<div id="minitoc" class="dontprint"></div>').prependTo('body');
|
||||
});
|
||||
|
||||
// generate contents of minitoc
|
||||
function generateMiniToc(divId) {
|
||||
$('#minitoc').empty().append('<h2>In this section</h2>');
|
||||
$('#' + divId).find('h3').each(function(i) {
|
||||
let pos = $(this).text().search(" ");
|
||||
let text = $(this).text().substring(0, pos);
|
||||
$("#minitoc").append("<a href='#" + $(this).attr("id") + "'>"
|
||||
+ text + "</a>");
|
||||
});
|
||||
// Ensure that the target is expanded (hideShow)
|
||||
$('#minitoc a[href^="#"]').click(function() {
|
||||
var href = $(this).attr('href');
|
||||
hsExpandAnchor(href);
|
||||
});
|
||||
}
|
||||
|
||||
// display tabs
|
||||
function tabifySections() {
|
||||
|
||||
// hide TOC (if present)
|
||||
$('#table-of-contents').hide();
|
||||
|
||||
// grab the list of `h2' from the page
|
||||
var allSections = [];
|
||||
$('h2')
|
||||
.each(function() {
|
||||
// Remove TODO keywords and tags (contained in spans)
|
||||
var tabText = $(this).clone().find('span').remove().end()
|
||||
.text().trim();
|
||||
var tabId = $(this).parent().attr('id');
|
||||
if (tabText) {
|
||||
// - remove heading number (all leading digits)
|
||||
// - remove progress logging (between square brackets)
|
||||
// - remove leading and trailing spaces
|
||||
tabText = tabText.replace(/^\d+\s+/, '').replace(/\[[\d/%]+\]/, '').trim();
|
||||
|
||||
allSections.push({
|
||||
text: tabText,
|
||||
id: tabId
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// create the tab links
|
||||
var tabs = $('<ul id="tabs"></ul>');
|
||||
for (i = 0; i < allSections.length; i++) {
|
||||
var item = allSections[i];
|
||||
html = $('<li><a href="#' + item.id + '">' + item.text + '</a></li>');
|
||||
tabs.append(html);
|
||||
}
|
||||
|
||||
// insert tabs menu after title (`h1'), or at the beginning of the content
|
||||
if($('.title').length !== 0) {
|
||||
$('.title').after(tabs);
|
||||
}
|
||||
else {
|
||||
$('#content').prepend(tabs);
|
||||
}
|
||||
}
|
||||
|
||||
function selectTabAndScroll(href) {
|
||||
// At this point we assume that href is local (starts with #)
|
||||
// alert(href);
|
||||
|
||||
// Find the tab to activate
|
||||
var targetTab = $(href).closest('.ui-tabs-panel');
|
||||
var targetTabId = targetTab.attr('id');
|
||||
var targetTabAriaLabel = targetTab.attr('aria-labelledby');
|
||||
|
||||
var targetTabIndex = $("#content ul li")
|
||||
.index($('[aria-labelledby="' + targetTabAriaLabel + '"]'));
|
||||
|
||||
// Activate target tab
|
||||
$('#content').tabs('option', 'active', targetTabIndex);
|
||||
|
||||
// Rebuild minitoc
|
||||
generateMiniToc(targetTabId);
|
||||
|
||||
// Set the location hash
|
||||
// document.location.hash = href;
|
||||
|
||||
// Scroll to top if href was a tab
|
||||
if (href == '#' + targetTabId) {
|
||||
// alert(targetTabId);
|
||||
$.scrollTo(0);
|
||||
}
|
||||
// Scroll to href if href was not a tab
|
||||
else {
|
||||
$.scrollTo(href);
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#preamble').remove();
|
||||
$('#table-of-contents').remove();
|
||||
|
||||
// Prepare for tabs
|
||||
tabifySections();
|
||||
|
||||
// Build the tabs from the #content div
|
||||
$('#content').tabs();
|
||||
|
||||
// Set default animation
|
||||
$('#content').tabs('option', 'show', true);
|
||||
|
||||
// Rebuild minitoc when a tab is activated
|
||||
$('#content').tabs({
|
||||
activate: function(event, ui) {
|
||||
var divId = ui.newTab.attr('aria-controls');
|
||||
generateMiniToc(divId);
|
||||
}
|
||||
});
|
||||
|
||||
// Required to get the link of the tab in URL
|
||||
$('#content ul').localScroll({
|
||||
target: '#content',
|
||||
duration: 0,
|
||||
hash: true
|
||||
});
|
||||
|
||||
// Handle hash in URL
|
||||
if ($('#content') && document.location.hash) {
|
||||
hsExpandAnchor(document.location.hash);
|
||||
selectTabAndScroll(document.location.hash);
|
||||
}
|
||||
// If no hash, build the minitoc anyway for selected tab
|
||||
else {
|
||||
var divId = $('#content div[aria-expanded=true]').attr('id');
|
||||
generateMiniToc(divId);
|
||||
}
|
||||
|
||||
// Handle click on internal links
|
||||
$('.ui-tabs-panel a[href^="#"]').click(function(e) {
|
||||
var href = $(this).attr('href');
|
||||
hsExpandAnchor(href);
|
||||
selectTabAndScroll(href);
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
// Initialize hideShow
|
||||
hsInit();
|
||||
|
||||
// add sticky headers to tables
|
||||
$('table').stickyTableHeaders();
|
||||
});
|
||||
|
||||
function copyToClipboard(text)
|
||||
{
|
||||
if (window.clipboardData && window.clipboardData.setData) { // Internet Explorer
|
||||
window.clipboardData.setData("Text", text);
|
||||
}
|
||||
else { // Fallback solution
|
||||
window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// Assuming that the ZeroClipboard swf file is in the same folder than bigblow,
|
||||
// get the path to it (it will be relative to the current page location).
|
||||
var bbScriptPath = $('script[src$="bigblow.js"]').attr('src'); // the js file path
|
||||
var bbPathToZeroClipboardSwf = bbScriptPath.replace('bigblow.js', 'ZeroClipboard.swf');
|
||||
|
||||
// Add copy to clipboard snippets
|
||||
$('.org-src-container').prepend('<div class="snippet-copy-to-clipboard"><span class="copy-to-clipboard-button">[copy]</span></div>');
|
||||
|
||||
// Display/hide snippets on source block mouseenter/mouseleave
|
||||
$(document).on('mouseenter', '.org-src-container', function () {
|
||||
$(this).find('.snippet-copy-to-clipboard').show();
|
||||
|
||||
// Need to call zclip here, once the button is visible.
|
||||
// Beacause when the button is not visible, zclip does nothing.
|
||||
if ((window.location.protocol != 'file:') && ($(this).find('.zclip').length == 0)) {
|
||||
$(this).find('.copy-to-clipboard-button').zclip({
|
||||
//path: 'http://www.steamdev.com/zclip/js/ZeroClipboard.swf',
|
||||
//path: 'src/bigblow_theme/js/ZeroClipboard.swf',
|
||||
path: bbPathToZeroClipboardSwf,
|
||||
copy: function() {
|
||||
return $(this).parent().parent().find('.src').text();
|
||||
}
|
||||
});
|
||||
}
|
||||
}).on('mouseleave', '.org-src-container', function () {
|
||||
$(this).find('.snippet-copy-to-clipboard').hide();
|
||||
});
|
||||
|
||||
// Handle copy to clipboard (here, for a local file only 'file://...'
|
||||
if (window.location.protocol == 'file:') { // if local file use browser-specific code
|
||||
$('.copy-to-clipboard-button').click(function() {
|
||||
// Get the text to be copied
|
||||
var text = $(this).parent().parent().find('.src').text();
|
||||
text = text.replace(/\n/g, "\r\n");
|
||||
// alert(text);
|
||||
copyToClipboard(text);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('li > code :contains("[X]")')
|
||||
.parent()
|
||||
.addClass('checked')
|
||||
.end()
|
||||
.remove();
|
||||
$('li > code :contains("[-]")')
|
||||
.parent()
|
||||
.addClass('halfchecked')
|
||||
.end()
|
||||
.remove();
|
||||
$('li > code :contains("[ ]")')
|
||||
.parent()
|
||||
.addClass('unchecked')
|
||||
.end()
|
||||
.remove();
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('i :contains("[#A]")')
|
||||
.replaceWith('<i><span style="color: #F67777;">[#A]</span></i>');
|
||||
$('i :contains("[#B]")')
|
||||
.replaceWith('<i><span style="color: #B6E864;">[#B]</span></i>');
|
||||
$('i :contains("[#C]")')
|
||||
.replaceWith('<i><span style="color: #C3DCFF;">[#C]</span></i>');
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('<div id="toTop" class="dontprint"><span>^ Back to Top</span></div>').appendTo('body');
|
||||
|
||||
$(window).scroll(function() {
|
||||
if ($(this).scrollTop() != 0) {
|
||||
$('#toTop').fadeIn();
|
||||
} else {
|
||||
$('#toTop').fadeOut();
|
||||
}
|
||||
});
|
||||
|
||||
$('#toTop').click(function(e) {
|
||||
$('html, body').animate({scrollTop: 0}, 800);
|
||||
e.preventDefault(); // Disable default browser behavior
|
||||
});
|
||||
});
|
||||
|
||||
function togglePanel(e) {
|
||||
e.preventDefault();
|
||||
|
||||
$("#left-panel-contents").toggleClass('active').toggle(200);
|
||||
$("#right-panel-contents").toggleClass('active').toggle(200);
|
||||
|
||||
var slidePos =
|
||||
$("#left-panel-button").css("left") == "-23px"? '182px': '-23px';
|
||||
|
||||
$("#left-panel-button").
|
||||
animate({"left": slidePos, "opacity": 0.9}, {duration: "200" });
|
||||
|
||||
// if ($("#left-panel-contents").hasClass('active')) {
|
||||
// hsHideTodoKeyword('done');
|
||||
// } else {
|
||||
// hsShowTodoKeyword('done');
|
||||
// }
|
||||
|
||||
// return false;
|
||||
}
|
||||
|
||||
$(function() {
|
||||
$('<div id="left-panel-wrapper" class="dontprint"><div id="left-panel-contents" style="opacity: 0.9"></div><div id="left-panel-button" class="dontprint"><a href="#">Dashboard</a></div></div>')
|
||||
.appendTo('body');
|
||||
|
||||
$('<div id="right-panel-wrapper" class="dontprint"><div id="right-panel-contents" style="opacity: 0.9"></div></div>')
|
||||
.appendTo('body');
|
||||
|
||||
$('#left-panel-button').click(togglePanel);
|
||||
});
|
||||
|
||||
$(function() {
|
||||
var ul = $('<ul id="listOfTodo"></ul>').appendTo('#left-panel-contents');
|
||||
var countOfTodo = {}, listOfTodo = [], totalOfTodo = 0;
|
||||
|
||||
// assign the counts (avoid double-counting elements from the ToC)
|
||||
$('span.todo').not($('#table-of-contents span.todo')).each(function() {
|
||||
var $thisTodo = $(this).text().trim();
|
||||
|
||||
if ($.inArray($thisTodo, listOfTodo) == -1) {
|
||||
countOfTodo[$thisTodo] = 1;
|
||||
listOfTodo.push($thisTodo);
|
||||
}
|
||||
else
|
||||
countOfTodo[$thisTodo] += 1;
|
||||
totalOfTodo += 1;
|
||||
});
|
||||
|
||||
function scoreTodo(t) {
|
||||
switch (t) {
|
||||
case 'NEW': return 1;
|
||||
case 'TODO': return 2;
|
||||
case 'STRT': return 3;
|
||||
case 'WAIT': return 4;
|
||||
case 'DLGT': return 5;
|
||||
case 'SDAY': return 6;
|
||||
case 'DFRD': return 7;
|
||||
case 'DONE': return 8;
|
||||
case 'CANX': return 9;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function compareTodo(a, b) {
|
||||
if (scoreTodo(a) < scoreTodo(b)) return -1;
|
||||
if (scoreTodo(a) > scoreTodo(b)) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
listOfTodo.sort(compareTodo);
|
||||
|
||||
// display
|
||||
for (i = 0; i < listOfTodo.length; i++) {
|
||||
var $thisTodo = listOfTodo[i];
|
||||
$(ul).append('<li><span class="todo ' + $thisTodo + '">'+ $thisTodo + '</span>'
|
||||
+ ' <small>(' + countOfTodo[$thisTodo] + ')</small></li>');
|
||||
}
|
||||
|
||||
$('#listOfTodo')
|
||||
.before('<b>Next Actions</b> <small>(' + totalOfTodo + ')</small>:<br>');
|
||||
});
|
||||
|
||||
$(function() {
|
||||
var ul = $('<ul id="listOfDone"></ul>').appendTo('#left-panel-contents');
|
||||
var countOfDone = {}, listOfDone = [], totalOfDone = 0;
|
||||
|
||||
// assign the counts (avoid double-counting elements from the ToC)
|
||||
$('span.done').not($('#table-of-contents span.done')).each(function() {
|
||||
var $thisDone = $(this).text().trim();
|
||||
|
||||
if ($.inArray($thisDone, listOfDone) == -1) {
|
||||
countOfDone[$thisDone] = 1;
|
||||
listOfDone.push($thisDone);
|
||||
}
|
||||
else
|
||||
countOfDone[$thisDone] += 1;
|
||||
totalOfDone += 1;
|
||||
});
|
||||
|
||||
// display
|
||||
for (i = 0; i < listOfDone.length; i++) {
|
||||
var $thisDone = listOfDone[i];
|
||||
$(ul).append('<li><span class="done ' + $thisDone + '">'+ $thisDone + '</span>'
|
||||
+ ' <small>(' + countOfDone[$thisDone] + ')</small></li>');
|
||||
}
|
||||
|
||||
$('#listOfDone')
|
||||
.before('<b>Done Actions</b> <small>(' + totalOfDone + '):</small><br>');
|
||||
});
|
||||
|
||||
$(function() {
|
||||
var ul = $('<ul id="listOfTags"></ul>').appendTo('#right-panel-contents');
|
||||
var countOfTags = {}, listOfTags = [], totalOfTags = 0;
|
||||
|
||||
// assign the counts (avoid double-counting elements from the ToC)
|
||||
$('span.tag').not($('#table-of-contents span.tag')).each(function() {
|
||||
var $thisTagGroup = $(this).text().trim().split(/\s/);
|
||||
// \s matches spaces, tabs, new lines, etc.
|
||||
|
||||
for (tag in $thisTagGroup) {
|
||||
if ($.inArray($thisTagGroup[tag], listOfTags) == -1) {
|
||||
countOfTags[$thisTagGroup[tag]] = 1;
|
||||
listOfTags.push($thisTagGroup[tag]);
|
||||
}
|
||||
else
|
||||
countOfTags[$thisTagGroup[tag]] += 1;
|
||||
totalOfTags += 1;
|
||||
}
|
||||
});
|
||||
|
||||
listOfTags.sort();
|
||||
|
||||
// display
|
||||
for (i = 0; i < listOfTags.length; i++) {
|
||||
var $thisTag = listOfTags[i];
|
||||
// $(ul).append('<li><span class="tag ' + $thisTag + '">'+
|
||||
// $thisTag + '</span> <small>(' + countOfTags[$thisTag] + ')</small></li>');
|
||||
$(ul).append('<li><span class="tag"><span class="' + $thisTag + '">' + $thisTag
|
||||
+ '</span></span>'
|
||||
+ ' <small>(' + countOfTags[$thisTag] + ')</small></li>');
|
||||
}
|
||||
|
||||
$('#listOfTags')
|
||||
.before('<b>Contexts</b> <small>(' + totalOfTags + '):</small><br>');
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('.done').parent(':header').parent().find(':header').addClass('DONEheader');
|
||||
$('.done').parent(':header').parent().css({color: '#999999'});
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('span.todo').click(function(e) {
|
||||
var orgKeyword = $(this).text().trim();
|
||||
$('.' + orgKeyword).toggleClass('selected');
|
||||
$('#content .' + orgKeyword).parent().parent()
|
||||
.toggleClass('match' + orgKeyword);
|
||||
$('#left-panel-wrapper .' + orgKeyword).parent()
|
||||
.toggleClass('match' + orgKeyword);
|
||||
e.preventDefault();
|
||||
})
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$('.tag span').click(function(e) {
|
||||
var orgTag = $(this).text().trim();
|
||||
$('.' + orgTag).toggleClass('selected');
|
||||
$('#content .' + orgTag).parent().parent().parent()
|
||||
.toggleClass('matchtag');
|
||||
$('#right-panel-wrapper .' + orgTag).parent().parent()
|
||||
.toggleClass('matchtag');
|
||||
e.preventDefault();
|
||||
})
|
||||
});
|
||||
|
||||
function clickPreviousTab() {
|
||||
var active = $('#content').tabs('option', 'active');
|
||||
// Avoid going back to last tab
|
||||
if (active == 0) return;
|
||||
|
||||
$('#content').tabs('option', 'active', active - 1);
|
||||
|
||||
// Set the location href
|
||||
var href = $('#content div[aria-expanded=true]').attr('id');
|
||||
document.location.hash = href;
|
||||
$.scrollTo(0);
|
||||
}
|
||||
|
||||
function clickNextTab() {
|
||||
var active = $('#content').tabs('option', 'active');
|
||||
$('#content').tabs('option', 'active', active + 1);
|
||||
|
||||
// Set the location href
|
||||
var href = $('#content div[aria-expanded=true]').attr('id');
|
||||
document.location.hash = href;
|
||||
$.scrollTo(0);
|
||||
}
|
||||
|
||||
function orgDefkey(e) {
|
||||
if (!e)
|
||||
var e = window.event;
|
||||
var keycode = (e.keyCode) ? e.keyCode : e.which;
|
||||
var actualkey = String.fromCharCode(keycode);
|
||||
switch (actualkey) {
|
||||
case "?": // help (dashboard)
|
||||
case "h":
|
||||
togglePanel(e);
|
||||
break;
|
||||
case "n": // next
|
||||
clickNextTab();
|
||||
break;
|
||||
case "p": // previous
|
||||
clickPreviousTab();
|
||||
break;
|
||||
// case "b": // scroll down - should be mapped to Shift-SPC
|
||||
// $(window).scrollTop($(window).scrollTop()-$(window).height());
|
||||
// break;
|
||||
case "<": // scroll to top
|
||||
$(window).scrollTop(0);
|
||||
break;
|
||||
case ">": // scroll to bottom
|
||||
$(window).scrollTop($(document).height());
|
||||
break;
|
||||
case "-": // collapse all
|
||||
hsCollapseAll();
|
||||
break;
|
||||
case "+": // expand all
|
||||
hsExpandAll();
|
||||
break;
|
||||
case "r": // go to next task
|
||||
hsReviewTaskNext();
|
||||
break;
|
||||
case "R": // go to previous task
|
||||
hsReviewTaskPrev();
|
||||
break;
|
||||
case "q": // quit reviewing
|
||||
hsReviewTaskQuit();
|
||||
break;
|
||||
case "g": // refresh the page (from the server, rather than the cache)
|
||||
location.reload(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
document.onkeypress = orgDefkey;
|
||||
@@ -0,0 +1,334 @@
|
||||
// hideshow.js --- HideShow JS file
|
||||
//
|
||||
// Copyright (C) 2014-2020 All Right Reserved, Fabrice Niessen
|
||||
//
|
||||
// This file is free software: you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// This file is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// Author: Fabrice Niessen <(concat "fniessen" at-sign "pirilampo.org")>
|
||||
// URL: https://github.com/fniessen/hide-show/
|
||||
// Version: 20140912.1722
|
||||
|
||||
// var HS_COLLAPSIBLE_HEADERS = $('h3, h4, h5'); // collapsible headers
|
||||
|
||||
if (typeof HS_STARTUP_FOLDED === 'undefined') {
|
||||
var HS_STARTUP_FOLDED = false; // Show just the overview, or show all.
|
||||
}
|
||||
|
||||
if (typeof HS_SHOW_ALL_TEXT === 'undefined') {
|
||||
var HS_SHOW_ALL_TEXT = '[Expand all]';
|
||||
}
|
||||
if (typeof HS_HIDE_ALL_TEXT === 'undefined') {
|
||||
var HS_HIDE_ALL_TEXT = '[Collapse all]';
|
||||
}
|
||||
|
||||
if (typeof HS_ALWAYS_DISPLAY_ICON === 'undefined') {
|
||||
var HS_ALWAYS_DISPLAY_ICON = false; // Display an icon for all states, or
|
||||
// just when closed.
|
||||
}
|
||||
|
||||
if (typeof HS_ICON_CLOSED === 'undefined') {
|
||||
var HS_ICON_CLOSED = '►'; // black right-pointing pointer
|
||||
}
|
||||
if (typeof HS_ICON_OPEN === 'undefined') {
|
||||
var HS_ICON_OPEN = '▼'; // black down-pointing triangle
|
||||
}
|
||||
if (typeof HS_ICON_EMPTY === 'undefined') {
|
||||
var HS_ICON_EMPTY = '■'; // black square
|
||||
}
|
||||
|
||||
if (typeof HS_SHOW_ALL_OPEN_DONE_TREES === 'undefined') {
|
||||
var HS_SHOW_ALL_OPEN_DONE_TREES = false; // Expand all will open DONE trees.
|
||||
}
|
||||
|
||||
if (typeof HS_CLASS === 'undefined') {
|
||||
var HS_CLASS = 'hsCollapsible';
|
||||
}
|
||||
|
||||
// Expand a header
|
||||
function hsExpand(header) {
|
||||
hsExpand2(header, true);
|
||||
}
|
||||
|
||||
// Expand a header
|
||||
function hsExpand2(header, expandDoneHeader) {
|
||||
// Ignore non collapsible entries
|
||||
if (!header.parent().hasClass(HS_CLASS)) return;
|
||||
|
||||
// Do not expand DONE node if not required
|
||||
if (hsIsDoneHeader(header) && !expandDoneHeader) return;
|
||||
|
||||
header.children('span[class="ellipsis"]').remove();
|
||||
if (HS_ALWAYS_DISPLAY_ICON == true) {
|
||||
header.append('<span class="ellipsis"> ' + HS_ICON_OPEN + '</span>');
|
||||
}
|
||||
header.parent().removeClass('hsCollapsed').addClass('hsExpanded');
|
||||
header.nextAll().show();
|
||||
}
|
||||
|
||||
// Expand a header and all its parents
|
||||
function hsExpandParents(header) {
|
||||
hsExpand(header);
|
||||
header.parents('.hsCollapsed').each(function() {
|
||||
hsExpand($(this).children(':header'));
|
||||
});
|
||||
}
|
||||
|
||||
// Collapse a header and all its parents
|
||||
function hsCollapseParents(header) {
|
||||
hsCollapse(header);
|
||||
header.parents('.hsExpanded').each(function() {
|
||||
hsCollapse($(this).children(':header'));
|
||||
});
|
||||
}
|
||||
|
||||
// Collapse a header
|
||||
function hsCollapse(header) {
|
||||
// Ignore non collapsible entries
|
||||
if (!header.parent().hasClass(HS_CLASS)) return;
|
||||
|
||||
header.children('span[class="ellipsis"]').remove();
|
||||
header.append('<span class="ellipsis"> ' + HS_ICON_CLOSED + '</span>');
|
||||
header.parent().removeClass('hsExpanded').addClass('hsCollapsed');
|
||||
// header.nextAll().hide('fast');
|
||||
header.nextAll().hide();
|
||||
}
|
||||
|
||||
// Toggle a header
|
||||
function hsToggleCollapsing(header) {
|
||||
if (header.parent().hasClass('hsCollapsed'))
|
||||
hsExpand(header);
|
||||
else if (header.parent().hasClass('hsExpanded'))
|
||||
hsCollapse(header);
|
||||
}
|
||||
|
||||
// Expand all headers
|
||||
function hsExpandAll() {
|
||||
$('#content .hsCollapsed').each(function() {
|
||||
hsExpand2($(this).children(':header'), HS_SHOW_ALL_OPEN_DONE_TREES);
|
||||
});
|
||||
}
|
||||
|
||||
// Collapse all headers
|
||||
function hsCollapseAll() {
|
||||
$('#content .hsExpanded').each(function() {
|
||||
hsCollapse($(this).children(':header'));
|
||||
});
|
||||
}
|
||||
|
||||
// Collapse all visible headers
|
||||
function hsCollapseAllVisible() {
|
||||
$('#content .hsExpanded:visible').each(function() {
|
||||
hsCollapse($(this).children(':header'));
|
||||
});
|
||||
}
|
||||
|
||||
// Add click events to H3/H4/H5 headers which have contents.
|
||||
function hsInit() {
|
||||
for (var i = 3; i <= 5; i++) {
|
||||
$('#content .outline-' + i).each(function() {
|
||||
var header = $(this).children(':header');
|
||||
if (header.siblings().length > 0) {
|
||||
$(this).addClass(HS_CLASS);
|
||||
header.css({cursor: 'pointer'});
|
||||
header.click(function() {
|
||||
hsToggleCollapsing($(this)); });
|
||||
|
||||
// Allow to override global Collapse/Expand default on an entry
|
||||
// basis (see property `:HTML_CONTAINER_CLASS:')
|
||||
if (header.parent().hasClass('hsCollapsed')) {
|
||||
hsCollapse(header);
|
||||
} else if (header.parent().hasClass('hsExpanded')) {
|
||||
hsExpand(header);
|
||||
} else {
|
||||
hsSetDefaultVisibility(header);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (HS_ALWAYS_DISPLAY_ICON == true) {
|
||||
header.append('<span class="ellipsis"> ' + HS_ICON_EMPTY
|
||||
+ '</span>');
|
||||
}
|
||||
$(this).addClass('hsEmpty');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add buttons
|
||||
$('.title').after($('<div class="buttons dontprint"></div>'));
|
||||
$('.buttons').append($('<span>' + HS_SHOW_ALL_TEXT + '</span>')
|
||||
.addClass('hsButton')
|
||||
.click(hsExpandAll));
|
||||
$('.buttons').append($('<span>' + HS_HIDE_ALL_TEXT + '</span>')
|
||||
.addClass('hsButton')
|
||||
.click(hsCollapseAll));
|
||||
}
|
||||
|
||||
// Returns true if a header is a DONE header
|
||||
function hsIsDoneHeader(header) {
|
||||
return $('span.done', header).length;
|
||||
}
|
||||
|
||||
// Sets the default visibility state to a header
|
||||
function hsSetDefaultVisibility(header) {
|
||||
if (HS_STARTUP_FOLDED) {
|
||||
hsCollapse(header);
|
||||
}
|
||||
else {
|
||||
if (!hsIsDoneHeader(header) | HS_SHOW_ALL_OPEN_DONE_TREES) {
|
||||
hsExpand(header);
|
||||
}
|
||||
else {
|
||||
hsCollapse(header);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Expands an anchor, i.e. expand all parent headers
|
||||
function hsExpandAnchor(id) {
|
||||
// alert(id);
|
||||
if (id) {
|
||||
// alert($(id + '.hsNode').length);
|
||||
$(id).parents('.hsCollapsed').each(function() {
|
||||
hsExpand2($(this).children(':header'), true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Search for next task to review, starting from beginning of current tab.
|
||||
// If BACKWARD is true, search in the reverse direction.
|
||||
function hsReviewTaskNext(backward) {
|
||||
// If no tasks to review at all, do nothing.
|
||||
if ($('.outline-2 span.todo').length == 0) return;
|
||||
|
||||
if ($('.hsReviewing').length == 0) { // reviewing is starting
|
||||
$('body').addClass('hsReviewing');
|
||||
$('.hsReviewPanel').addClass('hsReviewing');
|
||||
$('body').prepend('<div id="hsOverlay"></div>');
|
||||
hsAddReviewingPanels();
|
||||
|
||||
hsCollapseAll();
|
||||
// Get first task to review on each tab and expand it
|
||||
$('.outline-2').each(function(){
|
||||
var firstTodo = $(this).find('span.todo:first').parent().parent();
|
||||
firstTodo.addClass('hsReview');
|
||||
hsExpandParents($(firstTodo).children(':header'));
|
||||
});
|
||||
}
|
||||
else {
|
||||
// Get all todos
|
||||
var todosElements = $('.outline-2:visible span.todo').parent().parent();
|
||||
// alert(todosElements.length);
|
||||
var todos = jQuery.makeArray(todosElements);
|
||||
if (backward) {
|
||||
todos = todos.reverse();
|
||||
}
|
||||
|
||||
// Find current review item and review the next one
|
||||
var foundReview = false;
|
||||
var index;
|
||||
for (index = 0; index < todos.length; ++index) {
|
||||
var todo = todos[index];
|
||||
if (foundReview) {
|
||||
$(todo).addClass('hsReview');
|
||||
hsExpandParents($(todo).children(':header'));
|
||||
break;
|
||||
}
|
||||
if ($(todo).hasClass('hsReview')) {
|
||||
foundReview = true;
|
||||
if (index < todos.length - 1) {
|
||||
$(todo).removeClass('hsReview');
|
||||
hsCollapseParents($(todo).children(':header'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update reviewing panel
|
||||
if (index < todos.length) {
|
||||
var reviewItem = index + 1;
|
||||
if (backward) {
|
||||
reviewItem = todos.length - index;
|
||||
}
|
||||
|
||||
$('.outline-2:visible .hsReviewingPanel .hsReviewItem').text(reviewItem);
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll to the current review item
|
||||
$('html, body').animate({
|
||||
scrollTop: $(".hsReview:visible").offset().top
|
||||
}, 200);
|
||||
}
|
||||
|
||||
// go to previous task to review
|
||||
function hsReviewTaskPrev() {
|
||||
hsReviewTaskNext(true);
|
||||
}
|
||||
|
||||
// stop reviewing tasks
|
||||
function hsReviewTaskQuit() {
|
||||
$('body').removeClass('hsReviewing');
|
||||
$('.hsReviewPanel').removeClass('hsReviewing');
|
||||
$('.hsReview').removeClass('hsReview');
|
||||
$('#hsOverlay').remove();
|
||||
$('.hsReviewingPanel').remove();
|
||||
}
|
||||
|
||||
function hsHideTodoKeyword(kw) {
|
||||
$('span.' + kw).addClass('hsHidden').parent().parent().hide();
|
||||
}
|
||||
|
||||
function hsShowTodoKeyword(kw) {
|
||||
$('span.' + kw).removeClass('hsHidden').parent().parent().show();
|
||||
// XXX Show if parent is not collapsed!
|
||||
}
|
||||
|
||||
function hsAddReviewPanels() {
|
||||
$('.outline-2').each(function(e) {
|
||||
var nbItems = $(this).find('span.todo').length;
|
||||
if (nbItems > 0) {
|
||||
$(this).prepend('<div class="hsReviewPanel hsUnselectable" onclick="hsReviewTaskNext()">'
|
||||
+ 'Press r or click here<br>'
|
||||
+ 'to review ' + nbItems + ' tasks<br>'
|
||||
+ '(out of ' + nbReviewTotalTasks + ' tasks)</div>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function hsAddReviewingPanels() {
|
||||
$('.outline-2').each(function(e) {
|
||||
var nbItems = $(this).find('span.todo').length;
|
||||
if (nbItems > 0) {
|
||||
$(this).prepend('<div class="hsReviewingPanel hsUnselectable">Reviewing task <span class="hsReviewItem">1</span> / ' + nbItems + '<br>'
|
||||
+ '(out of ' + nbReviewTotalTasks + ' tasks)<br>'
|
||||
+ 'Shortcuts: '
|
||||
+ '<span class="hsReviewButton" onclick="hsReviewTaskNext()">r (next)</span> - '
|
||||
+ '<span class="hsReviewButton" onclick="hsReviewTaskPrev()">R (previous)</span><br>'
|
||||
+ '<span class="hsReviewButton" onclick="hsReviewTaskPrev()">q (quit)</span>'
|
||||
+ '</div>');
|
||||
}
|
||||
else {
|
||||
$(this).prepend('<div class="hsReviewingPanel hsUnselectable">No task to review<br>'
|
||||
+ '(out of ' + nbReviewTotalTasks + ' tasks)<br>'
|
||||
+ 'Shortcuts: '
|
||||
+ '<span class="hsReviewButton" onclick="hsReviewTaskNext()">r (next)</span> - '
|
||||
+ '<span class="hsReviewButton" onclick="hsReviewTaskPrev()">R (previous)</span><br>'
|
||||
+ '<span class="hsReviewButton" onclick="hsReviewTaskPrev()">q (quit)</span>'
|
||||
+ '</div>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var nbReviewTotalTasks;
|
||||
|
||||
$(document).ready(function() {
|
||||
nbReviewTotalTasks = $('.outline-2 span.todo').length;
|
||||
hsAddReviewPanels();
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* jQuery.LocalScroll - Animated scrolling navigation, using anchors.
|
||||
* Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
* Dual licensed under MIT and GPL.
|
||||
* Date: 3/11/2009
|
||||
* @author Ariel Flesler
|
||||
* @version 1.2.7
|
||||
**/
|
||||
;(function($){var l=location.href.replace(/#.*/,'');var g=$.localScroll=function(a){$('body').localScroll(a)};g.defaults={duration:1e3,axis:'y',event:'click',stop:true,target:window,reset:true};g.hash=function(a){if(location.hash){a=$.extend({},g.defaults,a);a.hash=false;if(a.reset){var e=a.duration;delete a.duration;$(a.target).scrollTo(0,a);a.duration=e}i(0,location,a)}};$.fn.localScroll=function(b){b=$.extend({},g.defaults,b);return b.lazy?this.bind(b.event,function(a){var e=$([a.target,a.target.parentNode]).filter(d)[0];if(e)i(a,e,b)}):this.find('a,area').filter(d).bind(b.event,function(a){i(a,this,b)}).end().end();function d(){return!!this.href&&!!this.hash&&this.href.replace(this.hash,'')==l&&(!b.filter||$(this).is(b.filter))}};function i(a,e,b){var d=e.hash.slice(1),f=document.getElementById(d)||document.getElementsByName(d)[0];if(!f)return;if(a)a.preventDefault();var h=$(b.target);if(b.lock&&h.is(':animated')||b.onBefore&&b.onBefore.call(b,a,f,h)===false)return;if(b.stop)h.stop(true);if(b.hash){var j=f.id==d?'id':'name',k=$('<a> </a>').attr(j,d).css({position:'absolute',top:$(window).scrollTop(),left:$(window).scrollLeft()});f[j]='';$('body').prepend(k);location=e.hash;k.remove();f[j]=d}h.scrollTo(f,b).trigger('notify.serialScroll',[f])}})(jQuery);
|
||||
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* Copyright (c) 2007-2012 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
|
||||
* Dual licensed under MIT and GPL.
|
||||
* @author Ariel Flesler
|
||||
* @version 1.4.3.1
|
||||
*/
|
||||
;(function($){var h=$.scrollTo=function(a,b,c){$(window).scrollTo(a,b,c)};h.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};h.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(e,f,g){if(typeof f=='object'){g=f;f=0}if(typeof g=='function')g={onAfter:g};if(e=='max')e=9e9;g=$.extend({},h.defaults,g);f=f||g.duration;g.queue=g.queue&&g.axis.length>1;if(g.queue)f/=2;g.offset=both(g.offset);g.over=both(g.over);return this._scrollable().each(function(){if(e==null)return;var d=this,$elem=$(d),targ=e,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}$.each(g.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=h.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(g.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=g.offset[pos]||0;if(g.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*g.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(g.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&g.queue){if(old!=attr[key])animate(g.onAfterFirst);delete attr[key]}});animate(g.onAfter);function animate(a){$elem.animate(attr,f,g.easing,a&&function(){a.call(this,e,g)})}}).end()};h.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user