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

H萌娘,万物皆可H的百科全书!
跳到导航 跳到搜索
imported>=海豚=
(创建页面,内容为“(function($, mw) { if (mw.config.get('wgPageName').match(/\.js$/)) $('.mw-code').addClass('prettyprint linenums lang-js'); if (mw.config.get('wgPageName').ma…”)
 
imported>=海豚=
无编辑摘要
第1行: 第1行:
(function($, mw) {
/**
   if (mw.config.get('wgPageName').match(/\.js$/)) $('.mw-code').addClass('prettyprint linenums lang-js');
* @name highlight.js
   if (mw.config.get('wgPageName').match(/\.css$/)) $('.mw-code').addClass('prettyprint linenums lang-css');
* @description 为页面内的代码块提供语法高亮
   var acceptsLangs = {
*/
     "js": "js",
!(function() {
     "javascript": "js",
  // 为代码页面添加 class
     "css": "css",
  var pageName = mw.config.get('wgPageName')
     "html": "html",
  if (pageName.substr(pageName.length - 3, 3) === '.js') {
     "Scribunto": "lua"
   $('#mw-content-text pre').addClass('lang-js highlight linenums')
    }
  } else if (pageName.substr(pageName.length - 4, 4) === '.css') {
    var wgPageContentModel = mw.config.get("wgPageContentModel");
   $('#mw-content-text pre').addClass('lang-css highlight linenums')
    if (wgPageContentModel in acceptsLangs) $('.mw-code').addClass('prettyprint linenums lang-' + acceptsLangs[wgPageContentModel]);
  } else if (
   $('pre[lang]').each(function() {
    // Lua
     var self = $(this);
    mw.config.get('wgNamespaceNumber') === 828 &&
     var lang = self.attr("lang").toLowerCase();
    pageName.substr(pageName.length - 4, 4) !== '/doc'
     if (lang in acceptsLangs) {
  ) {
       self.addClass("prettyprint linenums lang-" + acceptsLangs[lang]);
   $('#mw-content-text pre').addClass('lang-lua highlight linenums')
     }
  }
   });
 
   if ($('.prettyprint').length > 0) {
  // 兼容站内现有写法
     // mw.loader.load('MediaWiki:Gadget-code-prettify.css', 'text/css');
  $('pre.prettyprint')
     $.ajax({
   .addClass('highlight')
       url: "//zh.moegirl.org/index.php?title=MediaWiki:Gadget-code-prettify-core.js&action=raw&ctype=text/javascript",
   .removeClass('prettyprint')
       dataType: 'script',
 
       cache: true,
  // 定死表格内pre的宽度,防止table的宽度异常导致抑郁
       success: function() {
  $('#mw-content-text table pre.highlight').css('width', function() {
         prettyPrint();
   return $(this).width()
         if (mw.config.get('wgPageName').match(/\.(js|css)$/)) {
  })
           $(window).on("hashchange", function() {
 
             mw.loader.using("mw.Uri").then(function() {
  // 加载主题
               var frag = new mw.Uri().fragment;
  mw.loader.load(
               if (/^L\d+$/.test(frag)) {
   'https://cdn.jsdelivr.net/npm/[email protected]/styles/solarized-light.css',
                 var firstCode = $(".prettyprint.prettyprinted > .linenums").first().children().eq(+frag.substring(1) - 1);
   'text/css'
                 if (firstCode[0]) {
  )
                   $('html, body').animate({
 
                     scrollTop: firstCode.offset().top,
  // 加载脚本
                   });
  $.ajax({
                 }
   url:
               }
    'https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/highlight.min.js',
             });
   dataType: 'script',
           });
   cache: true
           $(window).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'
        }
        }
      });
 
    }
       // 添加行号
})(jQuery, mediaWiki);
       $html.find('.line-numbers').append(
        $('<div>', {
         class: 'line-number-block' + isPing,
         text: displayLineNum
        })
       )
 
       // 添加内容
       $html
        .find('.line-content')
        .append(
         $('<div>', { class: 'line-row' + isPing, html: lineContent })
        )
      })
 
      return $html
      })
    }
    })
  })
})()

2021年3月26日 (五) 23:40的版本

/**
 * @name highlight.js
 * @description 为页面内的代码块提供语法高亮
 */
!(function() {
  // 为代码页面添加 class
  var pageName = mw.config.get('wgPageName')
  if (pageName.substr(pageName.length - 3, 3) === '.js') {
    $('#mw-content-text pre').addClass('lang-js highlight linenums')
  } else if (pageName.substr(pageName.length - 4, 4) === '.css') {
    $('#mw-content-text pre').addClass('lang-css highlight linenums')
  } else if (
    // Lua
    mw.config.get('wgNamespaceNumber') === 828 &&
    pageName.substr(pageName.length - 4, 4) !== '/doc'
  ) {
    $('#mw-content-text pre').addClass('lang-lua highlight linenums')
  }

  // 兼容站内现有写法
  $('pre.prettyprint')
    .addClass('highlight')
    .removeClass('prettyprint')

  // 定死表格内pre的宽度,防止table的宽度异常导致抑郁
  $('#mw-content-text table pre.highlight').css('width', function() {
    return $(this).width()
  })

  // 加载主题
  mw.loader.load(
    'https://cdn.jsdelivr.net/npm/[email protected]/styles/solarized-light.css',
    'text/css'
  )

  // 加载脚本
  $.ajax({
    url:
      'https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/highlight.min.js',
    dataType: 'script',
    cache: true
  }).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(
              $('<div>', {
                class: 'line-number-block' + isPing,
                text: displayLineNum
              })
            )

            // 添加内容
            $html
              .find('.line-content')
              .append(
                $('<div>', { class: 'line-row' + isPing, html: lineContent })
              )
          })

          return $html
        })
      }
    })
  })
})()