您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically reinterpret comments as markdown.
// ==UserScript== // @name fogbugz-markdown // @version 1.4 // @namespace ohnopub.net // @description Automatically reinterpret comments as markdown. // @include http://*.fogbugz.com/* // @include https://*.fogbugz.com/* // @require https://code.jquery.com/jquery-1.10.2.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.1/marked.min.js // ==/UserScript== this.jQuery = jQuery.noConflict(true); (function (jQuery) { /* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions */ /* Also http://imgur.com/MzceH02 */ var stringEscapeForRegExp = function (string){ return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } jQuery(document).ready(function () { var markedOptions = { renderer: new marked.Renderer() }; var markedRendererLink = markedOptions.renderer.link; var linkBugRegExp = new RegExp('^([a-z0-9]{1,12}://' + stringEscapeForRegExp(window.location.hostname) + '/)?/?(default\\.asp)?\\?([0-9]+)$'); markedOptions.renderer.link = function (href, title, text) { /* Add back the onmouseover="b1(ix, this);" to each bug link */ var matches = linkBugRegExp.exec(href); if (matches) return jQuery('<span/>').append(jQuery('<a/>', {'class': 'markdown-bugref', href: matches[0], onmouseover: 'b1(' + JSON.stringify(matches[3]|0) + ', this);', text: text, title: title})).html(); return markedRendererLink.apply(this, arguments); }; jQuery('.bugevent.detailed .body, .pseudobugevent.detailed .body').each(function (i, elem) { var obj = jQuery(elem); /* * Detect preformatted (rich text) by text nodes with only * whitespace followed by an element containing text nodes * (empty or not, e.g. <p></p>). */ var c = obj.contents(); while (c.length && c[0].data && /^\s*$/.test(c[0].data)) c.pop(); /* * We have skipped the whitespace text nodes, now to see * if the first element is empty or not. Rich text is * mostly in <p/> elements and would have <span/>s * probably for formatting. Plain text only has <br/> if * anything. In plain text, we might thus encounter an * empty element *or* a non-empty text node but in rich * text that can never happen. Thus, if it’s not a text * node and not an empty element, assume it’s preformatted * rich text and abort. */ if (c.length && !c[0].data && !jQuery(c[0]).is(':empty')) return; /* * Make buglinks into something that will survive the * markdown. */ obj.find('a').each(function (i, elem) { var obj = jQuery(elem); if (linkBugRegExp.exec(obj.attr('href'))) obj.text('[' + obj.text() + '](' + obj.attr('href') + ')'); }); obj.html(marked(obj.text(), markedOptions)); }); /* style blockquote */ jQuery('head').append( jQuery('<style/>', { text: 'blockquote {margin-left: 0; border-left: 0.25em solid #aaaaaa; border-left-color: rgba(127, 127, 127, 0.5); padding-left: 1.75em;}', type: 'text/css' })); }); })(jQuery);