13

私のHTMLソースコードには、次のようなコードブロックがあります(このページではshowdownとhighlight.jsを使用しています)。

<pre><code class="cpp">
double myNumber = (double)4;
</code></pre>

私の問題は、最初の改行が「コード」ブロックの一部のままであるということです。これはおそらく「pre」ブロックを囲んでいるためですが、highlight.jsがそれを期待しているので、そこに必要です(HTML5標準でも推奨されているようです)。コードは次のようにレンダリングされます(先頭の改行に注意してください)。

ここに画像の説明を入力してください

だから私の質問は、css、javascript、またはjqueryを使用して、このような「コード」ブロックから先頭または末尾の改行を削除するにはどうすればよいですか?

4

6 に答える 6

16

このハックを使用できます:

pre:first-line {
    line-height: 0;
}
于 2013-02-19T01:59:34.697 に答える
4

これも問題を解決するJavascriptを使用した別のアプローチです。

<script>
    window.onload = function (){
        // remove leading linebreaks from code blocks.
        var pre = document.getElementsByTagName("code");
        for (var i = 0, len = pre.length; i < len; i++) {
            var text = pre[i].firstChild.nodeValue;
            pre[i].firstChild.nodeValue = text.replace(/^\n+|\n+$/g, "");
        }
    }
</script>

他の誰かがこれを投稿し、彼らの答えを削除しましたが、私はそれを保存する価値があると思いました。

于 2013-02-20T22:31:33.073 に答える
3

これpreがデフォルトで機能する方法です。改行と空白を尊重します。改行をレンダリングしたくない場合は、改行を削除する必要があります。ソースから完全に削除するか、ソースの外観が気になる場合はコメントアウトしてください。

http://jsfiddle.net/VL8tG/

<pre><code class="cpp"><!--
-->double myNumber = (double)4;<!--
--></code></pre>
于 2013-02-19T01:06:55.000 に答える
3

蛍光ペンが起動する前に、手動で削除します。

const trimLine = node => 
  node.firstChild.nodeValue = node.firstChild.nodeValue.replace(/^\n+|\n+$/g, "");



window.onload = function () {

  Array.prototype.slice
      .call(document.getElementsByTagName("code"), 0)
      .map(trimLine);

  hljs.initHighlightingOnLoad();

}

于 2016-07-12T22:03:14.523 に答える
2

デモ: http: //jsfiddle.net/WjVVs/4/

PCでChromeとFFを使用してテストしました。プラグインが要素に適用されている場合、IE 9では機能しませcode(要素に適用されている場合は正常に機能しているように見えますpre)。適切な回避策が見つかりませんが、コメント/更新してください。

これは別の回答からの修正版です。このプラグインは、ドキュメントの自然な流れによって引き起こされる余分なインデントを削除しようとします。空白をリードすることについてよりスマートになるように変更しました。

正しく機能する場合は、次のように表示されます。

ここに画像の説明を入力してください

使用法

$("code").prettyPre(); // any selector here

先頭の空白と余分なインデントを含むHTML

<div>
        <pre><code class="cpp">
           double myNumber = (double)4;

           // another line

           // another line

                // this is purposely indented further
                for( var i = 0; i < 100; i++ ){

                }            

        </code></pre>
</div>

プラグイン

(function( $ ) {
    $.fn.prettyPre = function( method ) {

        var defaults = {
            ignoreExpression: /\s/ // what should be ignored?
        };

        var methods = {
            init: function( options ) {
                this.each( function() {
                    var context = $.extend( {}, defaults, options );
                    var $obj = $( this );
                    var usingInnerText = true;
                    var text = $obj.get( 0 ).innerText;

                    // some browsers support innerText...some don't...some ONLY work with innerText.
                    if ( typeof text == "undefined" ) {
                        text = $obj.html();
                        usingInnerText = false;
                    }

                    // use the first line as a baseline for how many unwanted leading whitespace characters are present
                    var superfluousSpaceCount = 0;
                    var pos = 0;
                    var currentChar = text.substring( 0, 1 );

                    while ( context.ignoreExpression.test( currentChar ) ) {
                        if(currentChar !== "\n"){
                            superfluousSpaceCount++;
                        }else{
                            superfluousSpaceCount = 0;
                        }

                        currentChar = text.substring( ++pos, pos + 1 );
                    }

                    // split
                    var parts = text.split( "\n" );
                    var reformattedText = "";

                    // reconstruct
                    var length = parts.length;
                    for ( var i = 0; i < length; i++ ) {

                        // remove leading whitespace (represented by an empty string)
                        if(i === 0 && parts[0]=== ""){
                            continue;   
                        }

                        // cleanup, and don't append a trailing newline if we are on the last line
                        reformattedText += parts[i].substring( superfluousSpaceCount ) + ( i == length - 1 ? "" : "\n" );
                    }

                    // modify original
                    if ( usingInnerText ) {
                        $obj.get( 0 ).innerText = reformattedText;
                    }
                    else {
                        // This does not appear to execute code in any browser but the onus is on the developer to not 
                        // put raw input from a user anywhere on a page, even if it doesn't execute!
                        $obj.html( reformattedText );
                    }
                } );
            }
        }

        if ( methods[method] ) {
            return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ) );
        }
        else if ( typeof method === "object" || !method ) {
            return methods.init.apply( this, arguments );
        }
        else {
            $.error( "Method " + method + " does not exist on jQuery.prettyPre." );
        }
    }
} )( jQuery );
于 2013-02-18T23:21:06.037 に答える
1

これらの関数は、クラス(に追加pre)を使用して、先頭と末尾の空白を削除します

function removeWhitespace(indent) {
  // Get a list of all elements that need whitespace removed by indent value (will have class `indent-X`)
  // List may be 0 long - loop simply doesn't run
  var preElements = document.getElementsByClassName('indent-'+indent);
  for (i = 0; i < preElements.length; i++) {
    preElements[i].innerHTML = preElements[i].innerHTML.split('\n'+' '.repeat(indent)).join('\n').split('\n'+' '.repeat(indent-2)+'</code>').join('</code>').split("\n").slice(1,-1).join("\n");
    //split('\n'+' '.repeat(indent)).join('\n') -- Split at every newline followed by X spaces. Then join together with the newlines.
    // .split('\n'+' '.repeat(indent-2)+'</code>').join('</code>') -- The lastline will have 2 less spaces, so remove those, and the newline at the end. Add the tag back in.
    //.split("\n").slice(1,-2).join("\n"); -- Remove the first and last lines.
  }
}

function removeWhitespaces() {
  // Loop over all indents, 2 to 40
  for (indent = 2; indent <= 40; indent+=2) {
    removeWhitespace(indent);
  }
}

削除する空白の量でindent-Xあるクラスをに追加するだけです。Xpre

JSFiddle

function removeWhitespace(indent) {
  // Get a list of all elements that need indent removed by indent value (will have class `indent-X`)
  // List may be 0 long - loop simply doesn't run
  var preElements = document.getElementsByClassName('indent-' + indent);

  for (i = 0; i < preElements.length; i++) {
    preElements[i].innerHTML = preElements[i].innerHTML.split('\n' + ' '.repeat(indent)).join('\n').split('\n' + ' '.repeat(indent - 2) + '</code>').join('</code>').split("\n").slice(1, -2).join("\n");
    //split('\n'+' '.repeat(indent)).join('\n') -- Split at every newline followed by X spaces. Then join together with the newlines.
    // .split('\n'+' '.repeat(indent-2)+'</code>').join('</code>') -- The lastline will have 2 less spaces, so remove those, and the newline at the end. Add the tag back in.
    //.split("\n").slice(1,-1).join("\n"); -- Remove the first and last lines.

    // Remove the clickme element.
    document.getElementById('clickme').innerHTML = '';
  }
}

function removeWhitespaces() {
  // Loop over all indents, 2 to 40
  for (indent = 2; indent <= 40; indent += 2) {
    removeWhitespace(indent);
  }
}
.indent-14 {
  background-color: #ccc;
}
<body>
  <div id="clickme" onclick="removeWhitespaces()">
    Click Me
  </div>
  <pre class="indent-14">
    <code>
              function createCORSRequest(method, url) {
                var request = new XMLHttpRequest();
                if ('withCredentials' in request) {
                  request.open(method, url, true);
                } else if (typeof XDomainRequest != 'undefined') {
                  request = new XDomainRequest();
                  request.open(method, url);
                } else {
                  request = null;
                }
                return request;
              }
    </code>
  </pre>
</body>

于 2016-06-11T16:04:21.710 に答える