1. Alex

    21.06.2008 16:39

    Здравствуйте.

    Спасибо за скрипт... Немножко поизучал, добавил общую подсветку операторов [COLOR=#0000FF]+ - = | , ?[/COLOR]и т.п., стало заметно приятнее. В общем, стилизовал под подсветку FrontPage 2003, оставил только web-языки. Очень доволен, ещё раз спасибо.
    Но появилась небольшая проблемка. Я истользую в JavaScript-е названия функций, начинающиеся на "$", и, при парсинге JavaScript, происходит неверное присвоение класса code, присваивается php. Подскажите пожалуйста, где добавить условие, для исключения такого поведения?
    Одно дело, разобраться с добавлением режимов, но разбираться с прсингом языков совсем не хочется. Буду очень признателен, если просто подскажете строчку где происходит проверка на принадлежность к php.
  2. Иван Сагалаев

    24.06.2008 15:37

    Такой проверки нет. Просто фрагмент кода расцвечивается разными языками, и в каком нашлось больше подходящих конструкций, тот и выбирается.

    Улучшить эту эвристику можно несколькими способами:

    • передав в hljs.initHighlightingOnLoad только нужные языки
    • явно указав у фрагмента кода язык (<code class="javascript">)

    Плюс, если забросите кусочек кода сюда, то я попробую посмотреть, можно ли улучшить эвристику в принципе. Иногда бывает, что ошибка достаточно явная.

  3. Alex

    24.06.2008 23:05

    Такой проверки нет. Просто фрагмент кода расцвечивается разными языками, и в каком нашлось больше подходящих конструкций, тот и выбирается.

    Понятно. Тогда всё понятно, виноват сам... Такое происходит не только при наличии $, а практически всегда. Я добавил парсинг операторов, как Вы пишете, в "мясо", потому, происходит расцветка каждой угловой скобки, и соответственно, если в коде присутствует html, то получается бардак. А в случае с чистым JavaScript, имеющим функции с названиями, начинающимися на $, количество операторов было бы равным, если бы $ не перетягивал в сторону php. Я пробовал подключать правила локально в отдельно взятом языке, но у меня, что то не получилось... Иван, может Вы найдете минутку, и покажете на примере, как это делается? Что и где следует прописать...

    Спасибо.
  4. Alex

    24.06.2008 23:26

    Я сделал так:

    В highlight.js добавил регулярку

    this.OPERATOR_RE = '[\\!\\%\\&\\*\\-\\+\\=\\|\\:\\?]';

    и объект

    this.OPERATOR_MODE = {
    className: 'operator',
    begin: this.OPERATOR_RE, end: '^',
    relevance: 0
    };

    В javascript.js прописал:

    contains: ['string', 'comment', 'number', 'regexp', 'function', 'operator'],

    и такой объект

    {
    className: 'operator',
    begin: '[\\!\\%\\&\\*\\-\\+\\=\\|\\:\\?\\<\\>\\,]', end: '^'
    },

    Аналогично в http://www.js для html и в dinamic.js для php.
  5. Alex

    24.06.2008 23:32

    Да... Ещё это в модах прописал

    modes: [
    hljs.OPERATOR_MODE,
  6. Иван Сагалаев

    25.06.2008 00:30

    Не совсем понял. Сначала вы пишете, что определили this.OPERATORRE и this.OPERATORMODE, а потом говорите, что в javascript.js в modes прописали их почти полные аналоги заново. Как так?

    По идее, всю эту проблему должен решать как раз relevance: 0, который полностью устраняет влияние этого нового режима на эвристику. И вот в том объекте, который вы пишете вторым:

    {
    className: 'operator',
    begin: '[\\!\\%\\&\\*\\-\\+\\=\\|\\:\\?\\<\\>\\,]', end: '^'
    },
    

    этого relevance'а как раз нет. Может в этом дело?

  7. Alex

    25.06.2008 05:50

    Не совсем понял.
    Без определения в основной функции, у меня не получилось создать объект в языковом файле, вернее, он создается, но не работает. Единственное, что получалось, это парсить уже определенные классы. Например "title", т.е., находить внутри title совпадающие с моим шаблоном подстроки, через задание "contains:". А искать по всему блоку, получается только, если определяю объект в основной функции. И... не зная, как сделать правильно, я нашел такую лазейку :-), Задаю не полный шаблон в основной функции, а уже в языковых/групповых файлах уточняю этот шаблон, потому, что нужно небольшое отличие поиска операторов для разных языков. Подозреваю, что в главной функции можно просто создавать объект, не прописывая свойства, но я не пробовал.
    Про relevance: 0 понял, спасибо, попробую. А так то, я уже отказался от автоматического определения языка, действительно, маленькие отрывки кода практически не распознаются. А для моей задачи это нужно. Потому, сделал, как Вы предложили - с явным указанием класса. В общем, сейчас всё работает, чуть позже выложу ссылочку на ресурс.

    Замечательный скрипт!
  8. Alex

    27.06.2008 05:53

    Вот, как и обещал, ссылка на ресурс.

    Вчера открыл этот форум. Начал написание библиотеки анимации, полюбопытствуйте.

bbcode