MediaWiki:Gadget-code-prettify.js:修订间差异

H萌娘,万物皆可H的百科全书!
跳到导航 跳到搜索
imported>=海豚=
(以“//<nowiki> // 由ResourceLoader直接调用,不可使用ES6语法 /** * @Function: 高亮JavaScript、CSS、HTML和Lua,按行号跳转,并添加行号和指示色块…”替换内容)
imported>=海豚=
无编辑摘要
 
(未显示同一用户的8个中间版本)
第1行: 第1行:
//<nowiki>
mw.loader.load('https://cdn.jsdelivr.net/gh/bhsd-harry/LLWiki@2.4/js/gadget-code-prettify.min.js','text/javascript');
// 由ResourceLoader直接调用,不可使用ES6语法
/**
* @Function: 高亮JavaScript、CSS、HTML和Lua,按行号跳转,并添加行号和指示色块
* @Dependencies: ext.gadget.site-lib
* @Source: [[moegirl:mediawiki:gadget-code-prettify.js]]和[[moegirl:user:机智的小鱼君/gadget/Highlight.js]]
* @EditedBy: [[User:Bhsd]]
*/
"use strict";
/*global hljs */
const acceptLangs = {js: "javascript", javascript: "javascript", json: "json", css: "css", html: "xml",
   scribunto: "lua", lua: "lua"},
   contentModel = mw.config.get( "wgPageContentModel" ).toLowerCase();
 
mw.hook( 'wikipage.content' ).add(function($content) {
   if (contentModel in acceptLangs) {
     $content.find( '.mw-code' ).addClass('hljs linenums ' + acceptLangs[contentModel]);
   }
   $content.find('pre[lang], code[lang]').addClass(function() {
     const $self = $(this),
       lang = $self.attr( "lang" ).toLowerCase();
     if (lang in acceptLangs) { return "hljs " + acceptLangs[lang] + ($self.is('pre') ? " linenums" : ""); }
   });
   const $block = $content.find( '.hljs:not(.highlighted)' ); // 不重复高亮
   if ($block.length === 0) { return; }
   console.log('Hook: wikipage.content, 开始执行语法高亮');
   const path = '//cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.5.0/build/highlight.min.js';
   (window.hljs ? Promise.resolve() : mw.loader.getScript( path )).then(function() { // 不重复下载脚本
     $block.each(function() { hljs.highlightBlock( this ); }).addClass( 'highlighted' ).filter( '.linenums' )
       .html(function() { // 添加行号。这里不使用<table>排版,而是使用<ol>
       const $this = $(this);
       $this.children( ':contains(\n)' ).replaceWith(function() { // 先处理跨行元素
         const $self = $(this);
         return $self.html().split( '\n' ).map(function(ele) {
           return $self.clone().html( ele ).prop( 'outerHTML' );
         }).join('\n');
       });
       var lines = $this.html().replace(/\n$/, '').split('\n');
       if (mw.config.get( 'wgNamespaceNumber' ) == 274) { lines = lines.slice(1, -1); } // 扔掉首尾的Wikitext注释
       return $('<ol>', {html: lines.map(function(ele, i) { return $('<li>', {html: ele, id: 'L' + (i + 1)}); })})
         .css('padding-left', lines.length.toString().length + 2.5 + 'ch');
     });
     mw.hook( 'code.prettify' ).fire( $block );
     const $cssblock = $block.filter( '.css' ); // 对CSS代码添加指示色块
     if ($cssblock.length === 0) { return; }
     const $color = $('<span>', {class: 'hljs-color'});
     $cssblock.find( '.hljs-number:contains(#)' ).before(function() { // 16进制颜色
       const color = this.textContent,
         n = color.length,
         alpha = n == 5 ? color[4].repeat(2) : color.slice(7);
       return $color.clone().css({ color: color.slice(0, n > 5 ? 7 : 4),
         opacity: alpha ? parseInt(alpha, 16) / 255 : undefined });
     });
     $cssblock.find( '.hljs-built_in:contains(rgb), .hljs-built_in:contains(hsl)' ).before(function() { // RGB颜色
       const $siblings = $(this).parent().contents(), // 标点符号都是text节点,所以需要使用contents
         index = $siblings.index( this ),
         n = this.textContent.length == 4 ? 9 : 7, // rgba/hsla或rgb/hsl
         // 右半括号那一项可能有分号
         color = $siblings.slice(index, index + n).map(function() { return this.textContent; }).toArray();
       return $color.clone().css({ color: color[0].slice(0, 3) + color.slice(1, 7).join('') + ')',
         opacity: color[8] });
     });
     // 手动跳转
     const fragment = decodeURIComponent( location.hash.slice(1) ),
       target = document.getElementById( fragment ); // 用户输入内容,禁止使用$()
     if (/^L\d+$/.test( fragment ) && target) { target.scrollIntoView({ behavior: 'smooth' }); }
   }, function(reason) { mw.apiFailure(reason, 'highlight.js'); });
});
//</nowiki>
// [[category:作为模块的小工具]] [[category:阅读工具]] [[category:默认开启的小工具]] [[category:桌面版小工具]] [[category:手机版小工具]]
// {{DEFAULTSORT:code-prettify.js}}

2021年6月8日 (二) 20:36的最新版本

mw.loader.load('https://cdn.jsdelivr.net/gh/bhsd-harry/[email protected]/js/gadget-code-prettify.min.js','text/javascript');