Site Notice

hello, world

Difference between revisions of "MediaWiki:Gadget-Highlight.js"

From Project-EPB Commons
([InPageEdit] 没有编辑摘要)
 
([InPageEdit] 没有编辑摘要)
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
/** highlight.js **/
+
/**
 +
* @name highlight.js
 +
* @description 为页面内的代码块提供语法高亮
 +
*/
 
!(function () {
 
!(function () {
 +
 +
  // 为代码页面添加 class
 
   var pageName = mw.config.get('wgPageName')
 
   var pageName = mw.config.get('wgPageName')
 
   if (pageName.substr(pageName.length - 3, 3) === '.js') {
 
   if (pageName.substr(pageName.length - 3, 3) === '.js') {
     $('#mw-content-text pre').addClass('lang-js hightlight linenums')
+
     $('#mw-content-text pre').addClass('lang-js highlight linenums')
 
   } else if (pageName.substr(pageName.length - 4, 4) === '.css') {
 
   } else if (pageName.substr(pageName.length - 4, 4) === '.css') {
     $('#mw-content-text pre').addClass('lang-css hightlight linenums')
+
     $('#mw-content-text pre').addClass('lang-css highlight linenums')
   } else if (mw.config.get('wgNamespaceNumber') === 828) {
+
   } else if (mw.config.get('wgNamespaceNumber') === 828) { // Lua
     $('#mw-content-text pre').addClass('lang-lua hightlight linenums')
+
     $('#mw-content-text pre').addClass('lang-lua highlight linenums')
 
   }
 
   }
 +
 +
  // 加载主题
 +
  mw.loader.load('https://cdn.jsdelivr.net/npm/[email protected]/styles/solarized-light.css', 'text/css')
 +
 +
  // 加载脚本
 
   $.ajax({
 
   $.ajax({
 
     url: 'https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/highlight.min.js',
 
     url: 'https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/highlight.min.js',
Line 14: Line 24:
 
     cache: true
 
     cache: true
 
   }).then(function () {
 
   }).then(function () {
     $('#mw-content-text .hightlight').each(function (_, item) {
+
 
       hljs.highlightBlock(item)
+
    // 初始化高亮
       if ($(item).hasClass('linenums')) {
+
     $('#mw-content-text pre.highlight').each(function (_, block) {
         $(item).html(function () {
+
      var $block = $(block)
          var html = $(this).html()
+
 
          html = html.split('\n')
+
      if ($block.attr('data-hljs') === 'done') return
           var $content = $('<div>', { class: 'line-all' })
+
 
           $.each(html, function (line, lineContent) {
+
      // 高亮当前块
             $content.append(
+
       hljs.highlightBlock(block)
               $('<div>', { class: 'line-container' }).append(
+
      $block.attr('data-hljs', 'done')
                $('<div>', { class: 'line-num', text: line + 1 }),
+
 
                $('<div>', { class: 'line-content', html: lineContent })
+
      // 行号显示
              )
+
       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 () {
 +
 
 +
          // 创建 jQuery 对象
 +
           var $html = $('<div>', { class: 'line-container' }).append(
 +
            $('<div>', { class: 'line-content' }),
 +
            $('<div>', { class: 'line-numbers' })
 +
          )
 +
 
 +
          // 拆开每一行
 +
          var splitHtml = $(this).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 $content
+
 
 +
           return $html
 
         })
 
         })
 
       }
 
       }
 +
 
     })
 
     })
 
   })
 
   })
  mw.loader.load('https://cdn.jsdelivr.net/npm/[email protected]/styles/solarized-light.css', 'text/css')
 
 
})()
 
})()

Latest revision as of 22:14, 29 October 2020

/**
 * @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 (mw.config.get('wgNamespaceNumber') === 828) { // Lua
    $('#mw-content-text pre').addClass('lang-lua highlight linenums')
  }

  // 加载主题
  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') return

      // 高亮当前块
      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 () {

          // 创建 jQuery 对象
          var $html = $('<div>', { class: 'line-container' }).append(
            $('<div>', { class: 'line-content' }),
            $('<div>', { class: 'line-numbers' })
          )

          // 拆开每一行
          var splitHtml = $(this).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
        })
      }

    })
  })
})()