您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
User Script for Workflowy.com that adds some extra features.
当前为
- // ==UserScript==
- // @name Workflowier
- // @namespace Workflowier
- // @include *
- // @author Nick Busey
- // @description User Script for Workflowy.com that adds some extra features.
- // @match https://workflowy.com/#
- // @version 0.0.1.3
- // ==/UserScript==
- // a function that loads jQuery and calls a callback function when jQuery has finished loading
- function addJQuery(callback) {
- var script = document.createElement("script");
- script.setAttribute("src", "//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js");
- script.addEventListener('load', function() {
- var script = document.createElement("script");
- script.textContent = "window.jQ=jQuery.noConflict(true);(" + callback.toString() + ")();";
- document.body.appendChild(script);
- }, false);
- document.body.appendChild(script);
- }
- searching = false;
- // the guts of this userscript
- function main() {
- // Note, jQ replaces jQ to avoid conflicts.
- // Insert recent links
- jQ('#savedViewHUDButton').after("<div class='showCompletedButton button'><div class='topBarButtonTextContainer'><a href='#' id='recentLink_1wk'>This Week</a></div></div>");
- jQ('#recentLink_1wk').click(function(e) {
- e.preventDefault();
- if (jQ('#searchBox').val()=='last-changed:7d') {
- search.searchProjectTree('');
- } else {
- search.searchProjectTree('last-changed:7d');
- }
- });
- jQ('#savedViewHUDButton').after("<div class='showCompletedButton button'><div class='topBarButtonTextContainer'><a href='#' class='button' id='recentLink_24hrs'>Today</a></div></div>");
- jQ('#recentLink_24hrs').click(function(e) {
- e.preventDefault();
- if (jQ('#searchBox').val()=='last-changed:1d') {
- search.searchProjectTree('');
- } else {
- search.searchProjectTree('last-changed:1d');
- }
- });
- jQ('#savedViewHUDButton').after("<div class='showCompletedButton button'><div class='topBarButtonTextContainer'><a href='#' class='button' id='recentLink_1hr'>Just Now</a></div></div>");
- jQ('#recentLink_1hr').click(function(e) {
- e.preventDefault();
- if (jQ('#searchBox').val()=='last-changed:1h') {
- search.searchProjectTree('');
- } else {
- search.searchProjectTree('last-changed:1h');
- }
- });
- var generateTagsMenu = function() {
- var currentSearch = jQ('#searchBox').val();
- search.searchProjectTree('#');
- var tags = $('.contentTagText');
- // Generate list of all hashtags
- var tagObjs = {};
- tags.each(function(ii, obj) {
- // console.log(obj);
- // console.log(jQ(obj).text());
- var tag = jQ(obj).text();
- var tagObj = tagObjs[tag];
- // console.log(tag,' - ',tagObj);
- if (!tagObj) {
- // console.log("No tag object, make an empty one.")
- tagObj = {'count':1};
- } else {
- tagObj['count']++;
- }
- tagObjs[tag] = tagObj;
- });
- // console.log(tagObjs);
- var tagObjsArray = [];
- for (var tag in tagObjs) {
- var tagObj = tagObjs[tag];
- tagObj['tag'] = tag;
- // console.log(tag,tagObj);
- tagObjsArray.push(tagObj);
- }
- // console.log(tagObjsArray);
- var sortedTagObjsArray = tagObjsArray.sort(function (a, b) {
- return a.count > b.count;
- });
- globTest = sortedTagObjsArray;
- // console.log(sortedTagObjsArray);
- var tagLinkOutput = '';
- for (var ii in sortedTagObjsArray) {
- var count = sortedTagObjsArray[ii]['count'];
- var tag = sortedTagObjsArray[ii]['tag'];
- tagLinkOutput += "<a href='/#/"+tag+"?q=%23"+tag+"'><strong>"+count+"</strong> #"+tag+"</a>";
- }
- // console.log(tagLinkOutput);
- var menu = "<div class='menu-options' id='tagsMenu'>"+tagLinkOutput+"</div>";
- jQ('#savedViewHUDButton').after("<div class='showCompletedButton button'><div class='topBarButtonTextContainer'><a href='#' class='button' id='openTags'>View Tags</a></div></div>"+menu);
- jQ('#openTags').click(function() {jQ('#tagsMenu').slideToggle()});
- search.searchProjectTree(currentSearch);
- };
- // search.searchProjectTree('#daily-teeth');
- // var total = $('.contentMatch').size()/2;
- // search.searchProjectTree('#daily-teeth is:complete');
- // var done = $('.contentMatch').size()/2;
- // console.log(total,done);
- // console.log(done/total);
- // var pct = done/total;
- var attemptTags = function() {
- setTimeout(function() {
- try {
- console.log('Generate tags');
- generateTagsMenu();
- } catch(e) {
- console.log("Got exception",e);
- attemptTags();
- }
- },500);
- };
- attemptTags();
- // Add -rand functionality
- jQ(window).on('hashchange',function(e) {
- if (searching) {
- return false;
- }
- var query = jQ('#searchBox').val();
- var needle=/(%23\w*-rand)+/;
- var match = window.location.href.match(needle);
- if (match) {
- // A tag with -rand on the end has been clicked. Locate another.
- searching = true;
- var tag = match[0]; //matches "2 chapters"
- tag = "#"+tag.slice(3);
- window.location.href='/#';
- search.searchProjectTree(tag);
- var target = null;
- var count = 0;
- var tags = $('.contentMatch');
- var random = $(tags[Math.floor(Math.random()*tags.length)])[0];
- var parent = jQ(random).parents('.name').find('a').first();
- var href = jQ(parent).attr('href');
- window.location.href = href;
- setTimeout(function() {
- searching = false;
- },100);
- }
- });
- // Add styles
- jQ('body').append("<style>#tagsMenu{max-width: 300px; right: 140px;}#tagsMenu a {margin: 0 5px; display: block; float: left;}</style>");
- }
- // load jQuery and execute the main function
- addJQuery(main);