WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

2020年11月3日20:58:27 發(fā)表評論 3,621 ℃

前端時(shí)間把WordPress使用UEditor編輯器以后,代碼高亮以后不能換行的問題解決了。具體解決辦法可以參考阿湯博客的分享《WordPress中百度編輯器ueditor前臺(tái)代碼語言無法自動(dòng)換行解決辦法

雖然換行問題解決了,但是行號(hào)和代碼沒有對齊,當(dāng)時(shí)沒注意,后面越看越覺得奇怪,手機(jī)訪問效果圖如下:

WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

電腦端訪問效果圖如下:

WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

可以發(fā)現(xiàn)電腦端訪問的時(shí)候,行號(hào)“1”和第一行代碼是沒有對齊的,手機(jī)端雖然沒有這個(gè)問題,但是行號(hào)和實(shí)際的行是不對應(yīng)的,看著非常奇怪。

百度和谷歌找了差不多大半天的解決方案,沒一個(gè)文檔是完全可以解決這個(gè)問題的。

網(wǎng)上的方案總結(jié)為兩種:

1、修改shCoreDefault.css的對齊樣式,修改樣式syntaxhighlighter的padding-top的值,讓代碼對齊。

2、通過jQuery遍歷修改CSS樣式,達(dá)到自動(dòng)對齊的目的。

方案一測試了沒效果;方案二測試了也沒效果。

搞了幾個(gè)小時(shí)以后,都有一種換編輯器的想法了。

但最后令人欣慰的是,功夫不負(fù)有心人,終于讓自己給琢磨好了。

下面分享下我的解決方法:

我在測試了各種方案都不成功以后,想著把行號(hào)取消算了,這樣看著就不會(huì)覺得突兀,但是找了半天,也沒找到解決辦法,就想著把行號(hào)隱藏了,于是去改行號(hào)的樣式gutter,讓我發(fā)現(xiàn)沒對齊的原因是因?yàn)闃邮街械膒adding: 9.5px 0 9.5px 9.5px!important 導(dǎo)致,上內(nèi)邊距9.5px。

.gutter{
  color:#afafaf!important;
  background-color:#f7f7f9!important;
  border-right:1px solid #e1e1e8!important;
  padding:9.5px 0 9.5px 9.5px!important;
  border-top-left-radius:4px!important;
  border-bottom-left-radius:4px!important;
  user-select:none!important;
  -moz-user-select:none!important;
  -webkit-user-select:none!important
}

于是我馬上改成padding: 0 0 9.5px 9.5px!important ,然后清理緩存測試,發(fā)現(xiàn)對齊了。如下圖:

WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

為什么手機(jī)端一開始首行就沒有錯(cuò)位,主要就是因?yàn)闃邮絞utter中的padding: 9.5px 0 9.5px 9.5px!important 參數(shù)對代碼列<td>也生效了,電腦端為什么沒有對代碼列<td>生效,應(yīng)該是因?yàn)閃ordPress模板樣式中沖突導(dǎo)致。

到此以為問題得到了解決,但是去訪問手機(jī)端,發(fā)現(xiàn)行號(hào)和實(shí)際的行號(hào)還是不對應(yīng)。

然后去找了篇代碼比較多的文章訪問http://www.zhongjima.net/atang_4575.html,發(fā)現(xiàn)電腦端雖然第一行沒有錯(cuò)位了,但還是行號(hào)和代碼的實(shí)際行號(hào)不對應(yīng)。如下圖:

WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

此時(shí)我突然發(fā)現(xiàn)我在之前的測試過程中發(fā)現(xiàn)犯了一個(gè)致命錯(cuò)誤,才導(dǎo)致花了差不多大半天時(shí)間都沒解決此問題。

這個(gè)致命的錯(cuò)誤就是:我在測試方案二的時(shí)候,把jQuery代碼添加到的文件是電腦端模板,剛好那測試的那篇文章http://www.zhongjima.net/atang_3727.html沒有多行代碼換行的情況,所以電腦端看不出效果;而我在通過手機(jī)訪問測試的時(shí)候忽略了WordPress手機(jī)端是插件實(shí)現(xiàn)的,插件也有自己的模板,所以當(dāng)時(shí)看著沒效果,就判斷方案二不可行。

發(fā)現(xiàn)了錯(cuò)誤,于是馬上找到插件對應(yīng)的模板目錄/wp-content/plugins/wptouch/themes/bauhaus/default/,然后把之前找到的jQuery代碼添加到single.php,然后進(jìn)行測試。

欣喜的發(fā)現(xiàn)終于正常了:

WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

電腦端訪問效果:

WordPress中百度編輯器UEditor代碼高亮中的行號(hào)與代碼內(nèi)容不能對齊解決辦法

網(wǎng)上相關(guān)的jQuery代碼有三種,經(jīng)過我測試,如下兩種都生效:

jQuery代碼一:

<script type="text/javascript">
//解決百度編輯器UEditor行號(hào)錯(cuò)位問題
$(function(){
    SyntaxHighlighter.highlight();
    $("table.syntaxhighlighter").each(function () {
        if (!$(this).hasClass("nogutter")) {
            var $gutter = $($(this).find(".gutter")[0]);
            var $codeLines = $($(this).find(".code .line"));
            $gutter.find(".line").each(function (i) {
                $(this).height($($codeLines[i]).height());
                $($codeLines[i]).height($($codeLines[i]).height());
            });
        }
    });
});
</script>

因?yàn)榇a量少阿湯博客也是采用此代碼。

jQuery代碼二:

<script type="text/javascript">
//解決百度編輯器UEditor行號(hào)錯(cuò)位問題
$(function() {
    // Line wrap back
    var shLineWrap = function() {
        $('.syntaxhighlighter').each(function() {
            // Fetch
            var $sh = $(this),
            $gutter = $sh.find('td.gutter'),
            $code = $sh.find('td.code');
            // Cycle through lines
            $gutter.children('.line').each(function(i) {
                // Fetch
                var $gutterLine = $(this),
                $codeLine = $code.find('.line:nth-child(' + (i + 1) + ')');
                //alert($gutterLine);
                // Fetch height
                var height = $codeLine.height() || 0;
                if (!height) {
                    height = 'auto';
                } else {
                    height = height += 'px';
                    //alert(height);
                }
                // Copy height over
                $gutterLine.attr('style', 'height: ' + height + ' !important'); // fix by Edi, for JQuery 1.7+ under Firefox 15.0
                console.debug($gutterLine.height(), height, $gutterLine.text(), $codeLine);
            });
        });
    };
    // Line wrap back when syntax highlighter has done it's stuff
    var shLineWrapWhenReady = function() {
        if ($('.syntaxhighlighter').length === 0) {
            setTimeout(shLineWrapWhenReady, 10);
        } else {
            shLineWrap();
        }
    }; // Fire
    shLineWrapWhenReady();
});
</script>

我把代碼一添加到手機(jī)模板以后,訪問會(huì)報(bào)錯(cuò)Uncaught TypeError: $ is not a function 。我網(wǎng)上查了原因是大概是因?yàn)榕c其他庫沖突了。

解決方法是把$(function()改成jQuery(function ($)就可以防止沖突了,改完以后如下:

<script type="text/javascript">
//解決百度編輯器UEditor行號(hào)錯(cuò)位問題
jQuery(function ($){
    SyntaxHighlighter.highlight();
    $("table.syntaxhighlighter").each(function () {
        if (!$(this).hasClass("nogutter")) {
            var $gutter = $($(this).find(".gutter")[0]);
            var $codeLines = $($(this).find(".code .line"));
            $gutter.find(".line").each(function (i) {
                $(this).height($($codeLines[i]).height());
                $($codeLines[i]).height($($codeLines[i]).height());
            });
        }
    });
});
</script>

我在處理的過程中發(fā)現(xiàn)UEditor代碼使用的默認(rèn)行間距是1.1em,這個(gè)間距是比較小的,看著比較緊湊,于是我也改了下間距,主要是修改wp-content/plugins/ueditor/ueditor/third-party/SyntaxHighlighter/shCoreDefault.css文件。

找到文件里面的line-height: 1.1em!important;改成line-height: 2em!important; 就可以了,到此看著就順眼多了。

【騰訊云】云服務(wù)器、云數(shù)據(jù)庫、COS、CDN、短信等云產(chǎn)品特惠熱賣中

發(fā)表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: