【问题标题】:Highlighting and formatting code snippets using JavaScript使用 JavaScript 突出显示和格式化代码片段
【发布时间】:2015-03-01 04:15:24
【问题描述】:

我正在寻找一种方法来突出显示和 format 代码 sn-ps 作为字符串传递以用于现场风格指南。我正在玩 highlighjs 和美化。它们非常有用且易于突出显示,但我似乎无法找到一种格式化方法或它们是否真的可以这样做。

我所说的格式化是指制表符和换行符,以使代码清晰易读。我需要将代码作为字符串传递,以自动输出我用于样式指南的灰尘模板。

也就是说,我想通过:

"<table><tr><td class="title">Name</td><td class="title">Category</td><td class="title">Results</td></tr></table>"

得到类似的东西:

<table>
        <tr>
            <td class="title">Name</td>
            <td class="title">Category</td>
            <td class="title">Results</td>
        </tr>
</table>

关于如何做到这一点的任何想法? 谢谢!

【问题讨论】:

    标签: javascript formatting syntax-highlighting highlight prettify


    【解决方案1】:

    您可以将其作为 HTML 解析为 DOM,然后遍历每个元素,将其写出并在每次迭代时缩进。

    此代码将完成这项工作。随意使用它,并肯定会改进它。它的版本是 0.0.0.1。

    var htmlString = '<table><tr><td class="title">Name</td><td class="title">Category</td><td class="title">Results</td></tr></table>';
    
    //create a containing element to parse the DOM.
    var documentDOM = document.createElement("div");
    //append the html to the DOM element.
    documentDOM.insertAdjacentHTML('afterbegin', htmlString);
    
    //create a special HTML element, this shows html as normal text.
    var documentDOMConsole = document.createElement("xmp");
    documentDOMConsole.style.display = "block";
    
    //append the code display block.
    document.body.appendChild(documentDOMConsole);
    
    function indentor(multiplier)
    {
        //indentor handles the indenting. The multiplier adds \t (tab) to the string per multiplication.
        var indentor = "";
        for (var i = 0; i < multiplier; ++i)
        {
            indentor += "\t";
        }
        return indentor;
    }
    
    function recursiveWalker(element, indent)
    {
        //recursiveWalker walks through the called DOM recursively.
        var elementLength = element.children.length; //get the length of the children in the parent element.
    
        //iterate over all children.
        for (var i = 0; i < elementLength; ++i)
        {
            var indenting = indentor(indent); //set indenting for this iteration. Starts with 1.
            var elements = element.children[i].outerHTML.match(/<[^>]*>/g); //retrieve the various tags in the outerHTML.
            var elementTag = elements[0]; //this will be opening tag of this element including all attributes.
            var elementEndTag = elements[elements.length-1]; //get the last tag.
    
            //write the opening tag with proper indenting to the console. end with new line \n
            documentDOMConsole.innerHTML += indenting + elementTag + "\n"; 
    
            //get the innerText of the top element, not the childs using the function getElementText
            var elementText = getElementText(element.children[i]);
    
            //if the texts length is greater than 0 put the text on the page, else skip.
            if (elementText.length > 0)
            {
                //indent the text one more tab, end with new line.
                documentDOMConsole.innerHTML += (indenting + indentor(1) ) + elementText+ "\n";
            }
    
            if (element.children[i].children.length > 0)
            {
                //when the element has children call function recursiveWalker.
                recursiveWalker(element.children[i], (indent+1));
            }
    
            //if the start tag matches the end tag, write the end tag to the console.
            if ("<"+element.children[i].nodeName.toLowerCase()+">" == elementEndTag.replace(/\//, ""))
            {
                documentDOMConsole.innerHTML += indenting + elementEndTag + "\n";
            }
        }
    }
    
    function getElementText(el)
    {
            child = el.firstChild,
            texts = [];
    
        while (child) {
            if (child.nodeType == 3) {
                texts.push(child.data);
            }
            child = child.nextSibling;
        }
    
        return texts.join("");
    }
    
        recursiveWalker(documentDOM, 1);
    

    http://jsfiddle.net/f2L82m8h/

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2014-10-21
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多