您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add some js buttons to diffs
当前为
- // ==UserScript==
- // @name GitHub - Make PRs easier to diff
- // @namespace https://github.com/drKnoxy/
- // @version 1.1
- // @description Add some js buttons to diffs
- // @author DrKnoxy
- // @include https://github.com/*
- // @grant none
- // ==/UserScript==
- /**
- * Internal Application Logic
- */
- var tool = (function() {
- // Globals and exports
- ////////////////////////////////////
- // Prep global variables
- var isWhitespaceVisible = _isWhitespaceVisible();
- /**
- * The collapse headers feature
- */
- var collapse = (function(){
- var toggleId = 'js-blob-toggle';
- var blobSelector = '.blob-wrapper, .render-wrapper, .file-header + .empty';
- var isAllVisible = true;
- return {
- addElement: addElement,
- monitor: monitor
- };
- //////////////////////
- function monitor() {
- _monitorHeader();
- _monitorToggle();
- }
- function _monitorHeader() {
- $(document).on('click', '.file-header', function(e) {
- $(this).next(blobSelector).toggle();
- });
- }
- function _monitorToggle() {
- $(document).on('click', '#' + toggleId, function(e) {
- e.preventDefault();
- // can't use toggle, because we need to obey our state
- // not the items state
- if (isAllVisible) {
- $(this).addClass('selected');
- $(blobSelector).hide();
- } else {
- $(this).removeClass('selected');
- $(blobSelector).show();
- }
- isAllVisible = !isAllVisible;
- });
- }
- function addElement() {
- var toggle = {
- id: toggleId,
- label: 'Collapse'
- };
- _addToggle(toggle);
- }
- })();
- /**
- * The hide whitespace features
- */
- var whitespace = (function(isWhitespaceVisible){
- var toggleId = 'js-whitespace-toggle';
- var isWhitespaceVisible = isWhitespaceVisible;
- return {
- addElement: addElement,
- monitor: monitor
- };
- //////////////////////
- function monitor() {
- $(document).on('click', '#' + toggleId, function(e) {
- e.preventDefault();
- // blow away the whole search query...
- window.location.search = isWhitespaceVisible ? '' : 'w=1';
- });
- }
- function addElement() {
- var toggle = {
- id: toggleId,
- label: 'Ignore Whitespace',
- isSelected: isWhitespaceVisible
- };
- _addToggle(toggle);
- }
- })(isWhitespaceVisible);
- var betterTextarea = (function(){
- var tabInsertCharacter = " ";
- return {
- init: init
- };
- //////////////////////////
- function init() {
- useTabForIndenting();
- }
- function useTabForIndenting() {
- $(document).on('keydown', 'textarea', function(e) {
- // tab was pressed
- if (e.keyCode === 9) {
- // get caret position/selection
- var start = this.selectionStart;
- var end = this.selectionEnd;
- var $this = $(this);
- var value = $this.val();
- var newVal = [
- value.substring(0, start),
- tabInsertCharacter,
- value.substring(end)
- ].join('');
- $this.val(newVal);
- // put caret at right position
- this.selectionStart = this.selectionEnd = start + tabInsertCharacter.length;
- // prevent the focus loss
- e.preventDefault();
- }
- });
- }
- })();
- /**
- * Public methods
- */
- return {
- init: init,
- addElements: addElements
- }
- // Implementation logic
- /////////////////////
- /**
- * call me once
- */
- function init() {
- // Watch for events
- collapse.monitor();
- whitespace.monitor();
- betterTextarea.init();
- }
- /**
- * call me on pjax route change,
- * or if you are nervous that ajax happened
- */
- function addElements() {
- collapse.addElement();
- whitespace.addElement();
- }
- /**
- * Add a button to the page
- * @param options {id, label, isSelected}
- */
- function _addToggle(options) {
- var toggleTemplate = '<a id="{{id}}" class="{{cssClass}}" style="margin-left: 4px;">{{label}}</a>';
- // Make sure it isn't on the page already
- if (!$('#' + options.id).length) {
- options.cssClass = 'btn btn-sm right';
- if (options.isSelected) {
- options.cssClass += ' selected';
- }
- tmpl = _render(toggleTemplate, options);
- $('#toc .btn-group').before(tmpl);
- }
- }
- function _isWhitespaceVisible() {
- var search = _getSearchObject();
- return (search.w && parseInt(search.w, 10) == 1);
- function _getSearchObject() {
- var search = {};
- if (window.location.search) {
- window.location.search.replace('?', '').split('&').forEach(function(el) {
- var group = el.split('=');
- var prop = group[0];
- var val = group[1] || '';
- search[prop] = val;
- });
- }
- return search;
- }
- }
- /**
- * Simple template rendering
- * double curly brace syntax {{id}} or {{ id }}
- *
- * @param {string} tmpl
- * @param {obj} data [description]
- * @return {string}
- */
- function _render(tmpl, data) {
- var curlyBraceRegex = /{{([^}}]+)}}/g
- var finds = tmpl.match(curlyBraceRegex);
- finds.forEach(function(curlyProp) {
- var prop = curlyProp.replace('{{', '').replace('}}','').trim();
- if (data[prop]){
- tmpl = tmpl.split(curlyProp).join(data[prop]);
- }
- });
- return tmpl;
- }
- })();
- /**
- * Applying our tool to github
- */
- $(function() {
- tool.init();
- tool.addElements();
- // Add elements on page change
- $(document).on('pjax:complete pjax:popstate', function(e) {
- tool.addElements();
- });
- });
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址