Rendering Plaintext as HTML maintaining whitespace – without

前端 未结 4 1728
情深已故
情深已故 2021-02-14 08:02

Given any arbitrary text file full of printable characters, how can this be converted to HTML that would be rendered exactly the same (with the following requirements)?

4条回答
  •  盖世英雄少女心
    2021-02-14 08:02

    While this doesn't quite meet all your requirements — for one thing it doesn't handle tabs, I've used the following gem, which adds a wordWrap() method to Javascript Strings, on a couple of occasions to do something similar to what you're describing — so it might be a good starting point to come up with something that also does the additional things you want.

    //+ Jonas Raoni Soares Silva
    //@ http://jsfromhell.com/string/wordwrap [rev. #2]
    
    // String.wordWrap(maxLength: Integer,
    //                 [breakWith: String = "\n"],
    //                 [cutType: Integer = 0]): String
    //
    //   Returns an string with the extra characters/words "broken".
    //
    //     maxLength  maximum amount of characters per line
    //     breakWith  string that will be added whenever one is needed to
    //                break the line
    //     cutType    0 = words longer than "maxLength" will not be broken
    //                1 = words will be broken when needed
    //                2 = any word that trespasses the limit will be broken
    
    String.prototype.wordWrap = function(m, b, c){
        var i, j, l, s, r;
        if(m < 1)
            return this;
        for(i = -1, l = (r = this.split("\n")).length; ++i < l; r[i] += s)
            for(s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s = s.slice(j)).length ? b : ""))
                j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m : j.input.length - j[0].length
                || c == 1 && m || j.input.length + (j = s.slice(m).match(/^\S*/)).input.length;
        return r.join("\n");
    };
    

    I'd also like to comment that it seems to me as though, in general, you'd want to use a monospaced font if tabs are involved because the width of words would vary with the proportional font used (making the results of using of tab stops very font dependent).

    Update: Here's a slightly more readable version courtesy of an online javascript beautifier:

    String.prototype.wordWrap = function(m, b, c) {
        var i, j, l, s, r;
        if (m < 1)
            return this;
        for (i = -1, l = (r = this.split("\n")).length; ++i < l; r[i] += s)
            for (s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s =
                    s.slice(j)).length ? b : ""))
                j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m :
                j.input.length - j[0].length || c == 1 && m || j.input.length +
                (j = s.slice(m).match(/^\S*/)).input.length;
        return r.join("\n");
    };
    

提交回复
热议问题