imported>=海豚= |
imported>=海豚= |
第1行: |
第1行: |
| /**
| | (function($, mw) { |
| * @name highlight.js
| | if (mw.config.get('wgPageName').match(/\.js$/)) $('.mw-code').addClass('prettyprint linenums lang-js'); |
| * @description 为页面内的代码块提供语法高亮
| | if (mw.config.get('wgPageName').match(/\.css$/)) $('.mw-code').addClass('prettyprint linenums lang-css'); |
| */
| | var acceptsLangs = { |
| !(function() {
| | "js": "js", |
| // 为代码页面添加 class
| | "javascript": "js", |
| var pageName = mw.config.get('wgPageName')
| | "css": "css", |
| if (pageName.substr(pageName.length - 3, 3) === '.js') {
| | "html": "html", |
| $('#mw-content-text pre').addClass('lang-js highlight linenums')
| | "scribunto": "lua", |
| } else if (pageName.substr(pageName.length - 4, 4) === '.css') {
| | "lua": "lua" |
| $('#mw-content-text pre').addClass('lang-css highlight linenums')
| | }; |
| } else if (
| | var wgPageContentModel = mw.config.get("wgPageContentModel", "").toLowerCase(); |
| // Lua | | if (wgPageContentModel in acceptsLangs) { |
| mw.config.get('wgNamespaceNumber') === 828 && | | $('.mw-code').addClass('prettyprint linenums lang-' + acceptsLangs[wgPageContentModel]); |
| pageName.substr(pageName.length - 4, 4) !== '/doc'
| | } |
| ) {
| | $('pre[lang]').each(function() { |
| $('#mw-content-text pre').addClass('lang-lua highlight linenums')
| | var self = $(this); |
| }
| | var lang = self.attr("lang").toLowerCase(); |
| | | if (lang in acceptsLangs) { |
| // 兼容站内现有写法
| | self.addClass("prettyprint linenums lang-" + acceptsLangs[lang]); |
| $('pre.prettyprint')
| | } |
| .addClass('highlight')
| | }); |
| .removeClass('prettyprint')
| | if ($('.prettyprint').length > 0) { |
| | | $.ajax({ |
| // 定死表格内pre的宽度,防止table的宽度异常导致抑郁
| | url: mw.config.get("wgServer") + mw.config.get("wgScriptPath") + '/index.php?title=MediaWiki:Gadget-code-prettify-core.js&action=raw&ctype=text/javascript', |
| $('#mw-content-text table pre.highlight').css('width', function() {
| | dataType: 'script', |
| return $(this).width()
| | cache: true, |
| })
| | success: function() { |
| | | prettyPrint(); |
| // 加载主题
| | if (mw.config.get('wgPageName').match(/\.(js|css)$/)) { |
| mw.loader.load(
| | $(window).on("hashchange", function() { |
| | | var frag = new mw.Uri().fragment; |
| 'text/css'
| | if (/^L\d+$/.test(frag)) { |
| )
| | var firstCode = $("#" + frag)[0] || $(".prettyprint.prettyprinted > .linenums").first().children().eq(+frag.substring(1) - 1)[0]; |
| | | if (firstCode) { |
| // 加载脚本
| | $('html, body').animate({ |
| $.ajax({
| | scrollTop: $(firstCode).offset().top, |
| url:
| | }); |
| 'https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.3.1/build/highlight.min.js',
| | } |
| dataType: 'script',
| | } |
| cache: true
| | }).trigger("hashchange"); |
| }).then(function() {
| | } |
| // 初始化高亮
| |
| $('#mw-content-text pre.highlight').each(function(_, block) {
| |
| var $block = $(block)
| |
| | |
| // 高亮当前块
| |
| if ($block.attr('data-hljs') !== 'done') {
| |
| hljs.highlightBlock(block)
| |
| $block.attr('data-hljs', 'done')
| |
| }
| |
| | |
| // 行号显示
| |
| if (
| |
| $block.data('line-from') !== undefined ||
| |
| $block.data('line-ping') !== undefined
| |
| )
| |
| $block.addClass('linenums')
| |
| if ($block.hasClass('linenums')) {
| |
| // 起始行号
| |
| var lineNumFrom = Number($block.data('line-from'))
| |
| if (isNaN(lineNumFrom) || lineNumFrom < 1) lineNumFrom = 1
| |
| lineNumFrom = Number(lineNumFrom.toFixed(0))
| |
| | |
| // 高亮行号
| |
| var pingLine = $block.data('line-emphatic') || $block.data('line-ping')
| |
| if (typeof pingLine === 'number') pingLine = [pingLine]
| |
| if (typeof pingLine === 'string')
| |
| pingLine = pingLine.replace(/\s/g, '').split(',')
| |
| if (typeof pingLine !== 'object') pingLine = []
| |
| | |
| $block.html(function() {
| |
| var $thisBlock = $(this)
| |
| | |
| // 创建 jQuery 对象
| |
| var $html = $('<div>', { class: 'line-container' }).append(
| |
| $('<div>', { class: 'line-content' }),
| |
| $('<div>', { class: 'line-numbers' })
| |
| )
| |
| | |
| // 处理内部有换行的span标签
| |
| $thisBlock.find('span').html(function() {
| |
| var $span = $(this)
| |
| var html = $span.html()
| |
| var openTag = $span.prop('outerHTML').split('>')[0] + '>'
| |
| html = html.replace(/\n/g, '</span>\n' + openTag)
| |
| return html
| |
| })
| |
| | |
| // 拆开每一行
| |
| var splitHtml = $thisBlock.html().split('\n')
| |
| $.each(splitHtml, function(lineNum, lineContent) {
| |
| // 防止最后一行后被添加一行空行
| |
| if (lineNum + 1 === splitHtml.length) return
| |
| | |
| // 显示行号为起始行号加当前行号
| |
| displayLineNum = lineNum + lineNumFrom
| |
| | |
| // 是否高亮显示
| |
| var isPing = ''
| |
| if (pingLine.includes(lineNum + 1)) {
| |
| isPing = ' line-ping'
| |
| } | | } |
| | | }); |
| // 添加行号
| | } |
| $html.find('.line-numbers').append(
| | })(jQuery, mediaWiki); |
| $('<div>', {
| |
| class: 'line-number-block' + isPing,
| |
| text: displayLineNum
| |
| })
| |
| )
| |
| | |
| // 添加内容
| |
| $html
| |
| .find('.line-content')
| |
| .append(
| |
| $('<div>', { class: 'line-row' + isPing, html: lineContent })
| |
| )
| |
| })
| |
| | |
| return $html
| |
| }) | |
| }
| |
| }) | |
| })
| |
| })() | |