Как динамически добавлять белье в Google Prettify? - PullRequest
2 голосов
/ 02 мая 2020

У меня эта скрипка . Я пытаюсь отформатировать некоторый код, и у меня возникают проблемы с динамическим добавлением и удалением номеров строк. Кажется, на первой странице загрузки появляются номера строк, но как только я нажимаю «запустить», я не могу получить их обратно. На моем сайте они вообще не отображаются. Я бы хотел, чтобы пользователи нажимали кнопку и динамически включали / выключали номера строк:

<code><body>
  <pre id="pre">
    &lt;script type=&quot;text/javascript&quot;&gt;
    // Say hello world until the user starts questioning
    // the meaningfulness of their existence.
    function helloWorld(world) {
      for (var i = 42; --i &gt;= 0;) {
        alert('Hello ' + String(world));
      }
    }
    &lt;/script&gt;
    &lt;style&gt;
    p { color: pink }
    b { color: blue }
    u { color: &quot;umber&quot; }
    &lt;/style&gt;
Моя кнопка
$(document).ready(function(){
  $("#button").on("click", function(){
         $("#pre").addClass("prettyprint").addClass("linenums").addClass("lang-js");
     $("#pre").html(PR.prettyPrintOne($("#pre").html()));
  });
});

Спасибо!

РЕДАКТИРОВАТЬ: обратите внимание, что это отличается от Как добавить номера строк для всех строк в Google Prettify? . В моем случае номера строк сначала отображаются, если я добавлю класс linenums к тегу pre вручную. Проблема в том, что их включение / выключение с jquery не работает.

1 Ответ

2 голосов
/ 05 мая 2020

Вызывая prettyPrintOne, вы по существу обходите инициализацию на основе классов. Этот метод имеет аргументы, которые сообщают prettify, как вести себя.

Вы пытаетесь изменить, как prettify ведет себя с классами, но prettify игнорирует это, потому что он заботится только о аргументах, которые являются нулевыми, поэтому они возвращаются к внутренним значениям по умолчанию.

См. Источник, документирующий метод:

    /**
     * Pretty print a chunk of code.
     * @param {string} sourceCodeHtml The HTML to pretty print.
     * @param {string} opt_langExtension The language name to use.
     *     Typically, a filename extension like 'cpp' or 'java'.
     * @param {number|boolean} opt_numberLines True to number lines,
     *     or the 1-indexed number of the first line in sourceCodeHtml.
     * @return {string} code as html, but prettier
     */

prettyPrintOne по сути для анализа некоторого кода, переданного ему в виде строки, и возврата результата с параметрами, контролируемыми этими аргументами , И наоборот, prettyPrint будет проходить через DOM в поисках добавляемых вами классов и вести себя в соответствии с найденными классами. Поскольку вы хотите переключаться, вы должны будете продолжать использовать prettyPrintOne, чтобы мы могли контролировать, когда показывать предварительно подтвержденный вывод, а когда показывать оригинал - подробнее об этом позже.

В качестве отступления вы говорите prettify в формате JS, когда у вас есть HTML, включая JS в тегах скрипта и CSS в тегах стиля. Таким образом, вы захотите использовать HTML в качестве расширения lang, а не JS.

В любом случае, все, что вам нужно сделать, это настроить ваш вызов на следующее, дополнительно добавив класс prettify исключительно так Ваша тема прертификации CSS применяется:

$("#pre").html( PR.prettyPrintOne($("#pre").html(), "html", true) )
    .addClass("prettyprint");

Et voila:

Showing line numbers in action

Что касается переключения, вам просто нужно настроить логика c, так что вы сохраняете оригинал HTML где-то при предварительном кодировании и восстанавливаете его при следующем нажатии кнопки:

  $("#button").on("click", function() {
    // Cache jquery object
    var $pre = $("#pre");
    // If the element has a prettyprint class, it's already been manually
    // prettified
    if (!$pre.hasClass("prettyprint")) {
      // Element hasn't been prettified, store the html in jQuery data
      $pre.data("original-html", $pre.html());
      // Manually prettify
      $pre.html(PR.prettyPrintOne($pre.html(), "html", true))
        .addClass("prettyprint");
    } else {
      // Element has been prettified, restore the orginal html stored in jQuery
      // data and remove the prettyprint class, back to where we started
      $pre.html($pre.data("original-html"))
        .removeClass("prettyprint");
      // Remove the jQuery data entry for our original HTML, so next time we
      // start fresh
      $pre.data("original-html", null);
    }
  });

Вот jsfiddle, показывающий, что в действии: https://jsfiddle.net/joshdavenport/68thqus1/27/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...