BeWithYou

胡搞的技术博客

  1. 首页
  2. web前端/Javascript
  3. 为Ueditor添加新的语言语法高亮支持

为Ueditor添加新的语言语法高亮支持


之前日志里的lua代码高亮,都是用Erlang的语法高亮代替的。刚刚找了一下为syntaxhighlighter添加新的语言语法高亮支持的方法,记录一下。

ueditor里面集成的应该是2.x版本,而且是开发团队自己修改过的。所以不能直接用网上添加新语言的方法直接添加。但是道理是一样的,只要找到添加的位置即可。

这里我们直接全盘搜"erlang",定位到在shCore.js内部有一系列各种语言的语法高亮刷子。于是直接把网上搜到的代码插入进去即可。

Lua用到的刷子如下:

;(function()
{
    // CommonJS
    typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
    function Brush()
    {
        var keywords = 'and break do else elseif end false for function if in ' +
            'local nil not or repeat return then true until while';
        var functions = '_G _VERSION assert collectgarbage dofile error getfenv ' +
            'getmetatable ipairs load module next pairs pcall print ' +
            ' rawequal rawget rawset require select setfenv setmetatable ' +
            'tonumber tostring type unpack xpcall ' +
            'coroutine.create coroutine.resume coroutine.running ' +
            'coroutine.status coroutine.wrap coroutine.yield ' +
            'debug.debug debug.getfenv debug.gethook debug.getinfo ' +
            'debug.getlocal debug.getmetatable debug.getregistry ' +
            'debug.getupvalue debug.setfenv debug.sethook debug.setlocal ' +
            'debug.setmetatable debug.setupvalue debug.traceback ' +
            'file:close file:flush file:lines file:read file:seek ' +
            'file:setvbuf file:write' +
            'io.close io.flush io.input io.lines io.open io.output ' +
            'io.popen io.read io.stderr io.stdin io.stdout io.tmpfile ' +
            'io.type io.write ' +
            'math.abs math.acos math.asin math.atan math.atan2 math.ceil ' +
            'math.cos math.cosh math.deg math.exp math.floor math.fmod ' +
            'math.frexp math.huge math.ldexp math.log math.log10 math.max ' +
            'math.min math.modf math.pi math.pow math.rad math.random ' +
            'math.randomseed math.sin math.sinh math.sqrt math.tan math.tanh ' +
            'os.clock os.date os.difftime os.execute os.exit os.getenv os.remove ' +
            'os.rename os.setlocale os.time os.tmpname ' +
            'package.cpath package.loaded package.loaders package.loadlib ' +
            'package.path package.preload package.seeall ' +
            'string.byte string.char string.dump string.find string.format ' +
            'string.gmatch string.gsub string.len string.lower string.match ' +
            'string.rep string.reverse string.sub string.upper table.concat ' +
            'table.insert table.maxn table.remove table.sort';
        this.regexList = [
            { regex: /--.*/gm,                                                  css: 'comments' },  // one line comments
            { regex: /--\[\[[\S\s]*\]\]/gm,                                     css: 'comments' },  // multi line comments
            { regex: SyntaxHighlighter.regexLib.doubleQuotedString,             css: 'string' },    // strings
            { regex: SyntaxHighlighter.regexLib.singleQuotedString,             css: 'string' },    // strings
            { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,    css: 'string' },    // strings
            { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,    css: 'string' },    // strings
            { regex: new RegExp(this.getKeywords(keywords), 'gm'),              css: 'keyword' },   // keywords
            { regex: new RegExp(this.getKeywords(functions), 'gm'),             css: 'functions' }  // functions
        ];
    }
    Brush.prototype = new SyntaxHighlighter.Highlighter();
    Brush.aliases   = ['lua'];
    SyntaxHighlighter.brushes.Lua = Brush;
    // CommonJS
    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
})();

粗略的一看,原来语法高亮主要是区分这几个元素:关键词(keywords),函数(functions),单行注释,多行注释,字符串界定。

之后再把ueditor的前端界面里添加上Lua的选项。只需修改ueditor.min.js即可,加上'lua':'Lua'。

看下效果:

function test()
    local arr = {
            [1]="xiaoming",
            [2]="xiaohong",
            "str"="hehe",
            "number"=2333
            }
    for index,value in pairs(arr) do
        print("index:"..index,"value:"..value)
    end
end

local utility = {}
package.cpath = "luaclib/?.so;"..package.cpath

function utility.print_r ( t )  
    local print_r_cache={}
    local function sub_print_r(t,indent)
        if (print_r_cache[tostring(t)]) then
            print(indent.."*"..tostring(t))
        else
            print_r_cache[tostring(t)]=true
            if (type(t)=="table") then
                for pos,val in pairs(t) do
                    if (type(val)=="table") then
                        print(indent.."["..pos.."] => "..tostring(t).." {")
                        sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
                        print(indent..string.rep(" ",string.len(pos)+6).."}")
                    elseif (type(val)=="string") then
                        print(indent.."["..pos..'] => "'..val..'"')
                    else
                        print(indent.."["..pos.."] => "..tostring(val))
                    end
                end
            else
                print(indent..tostring(t))
            end
        end
    end
    if (type(t)=="table") then
        print(tostring(t).." {")
        sub_print_r(t,"  ")
        print("}")
    else
        sub_print_r(t,"  ")
    end
    print()
end


回到顶部