使用JavaScript突出显示和格式化代码段

使用JavaScript突出显示和格式化代码段,javascript,formatting,syntax-highlighting,highlight,prettify,Javascript,Formatting,Syntax Highlighting,Highlight,Prettify,我正在寻找一种方法来突出显示并格式化作为字符串传递的代码片段,以用于实时样式指南。我在玩highlighj和prettify。它们真的很有帮助,也很容易突出显示,但我似乎不知道如何格式化,或者它们是否真的可以这样做 所谓格式,我指的是制表符和换行符,以使代码易读。我需要将代码作为字符串传递,以自动输出用于样式指南的dust模板 也就是说,我想通过: "<table><tr><td class="title">Name</td><td clas

我正在寻找一种方法来突出显示并格式化作为字符串传递的代码片段,以用于实时样式指南。我在玩highlighj和prettify。它们真的很有帮助,也很容易突出显示,但我似乎不知道如何格式化,或者它们是否真的可以这样做

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

也就是说,我想通过:

"<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>
关于如何实现这一点有什么想法吗?
谢谢

您可以将其作为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);