colorer / Colorer-schemes

Syntax and color schemes for colorer library
31 stars 25 forks source link

Markdown: раскрашивать fenced code blocks соответственно указанному типу #151

Open johnd0e opened 4 months ago

johnd0e commented 4 months ago

Возможность этого обсуждалась на форуме: https://forum.farmanager.com/viewtopic.php?p=147413#p147413

Суть: если указан тип (~~~lua), и он соответствует какому-либо определённому в базе идентификатору, то было бы здорово подсвечивать синтаксис в этом блоке соответственно.

@nightroman

nightroman commented 4 months ago

Сделать можно. Вопрос, какие схемы поддерживать. Разным разные захочется, а я не уверен, что в колорер схеме можно это как-то грамотно реализовать. Вопрос к разработчикам.

Пример: так я подлючу 2 схемы, powershell и lua. И только эти две. А нельзя ли как-то параметризировать и сделать возможным более полезное и полное покрытие набора имеющихся схем?

  <block scheme="powershell:powershell" content-priority="low"
  start="/(?{start}^%FenceMark;(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>

  <block scheme="lua:lua" content-priority="low"
  start="/(?{start}^%FenceMark;(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
ctapmex commented 4 months ago

параметризировать нельзя.

johnd0e commented 4 months ago

@ctapmex и реализовать это проблематично?

ctapmex commented 4 months ago

мы стоим перед выбором

  1. руками набрать один раз нужное число блоков под конкретное число схем
  2. генерировать автоматически при каждом старте; плюс не ограничивания схемы, загружая все (около 300 штук); и тем самым при любом открытии markdown файла в память будут загружаться все схемы. По памяти, после последних изменений это около 12 мб , до этого было 33 мб.

второе мне пока не нравится.

nightroman commented 4 months ago

А схемы разве не "лениво" грузятся? Просто вопрос для инфы, не критика.

Перефразирую в практическом плане. Если в маркдаун схеме добавим 5 таких "фаворитных" языков, то их схемы все будут грузиться при открытии любого маркдауна, даже если он ничего из этих 5 не упомянул?

nightroman commented 4 months ago

Что если иначе подойти к задаче? Может ли схема сделать что-то типа "include" пользовательского файла/фрагмента, который может быть, где договорились, а может не быть. (Или можно ли так сделать в будущем, конечно)

ctapmex commented 4 months ago

загрузка ленивая на уровне прототипов. Прототипы как список загружаем, не погружаясь внутрь. Но как только выбрали один из типов и хотим с ним работать, то загружается всё его описание и все типы, на которые он ссылается, и ссылаются эти типы.

Может ли схема сделать что-то типа "include" пользовательского файла/фрагмента, который может быть, где договорились, а может не быть.

а фрагмент это кусок hrc схемы ? вроде этого

  <block scheme="powershell:powershell" content-priority="low"
  start="/(?{start}^%FenceMark;(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>

  <block scheme="lua:lua" content-priority="low"
  start="/(?{start}^%FenceMark;(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
nightroman commented 4 months ago

а фрагмент это кусок hrc схемы ? вроде этого

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

ctapmex commented 4 months ago

это можно сделать и сейчас. добавить в место где необходимо "расширение" блок вида

<inherit scheme="user:markdown" />

а далее через auto, настройки в farcolorer, указать путь до своих схем, в списке которых есть прототип user, с схемой markdown. И в ней уже все необходимые блоки.

если такого файла нет, то блок будет игнорироваться

nightroman commented 4 months ago

Надо будет подумать над этим, да.

Еще есть подобная идея с использованием ENTITY. Преимущество, может, в том, что это могут быть фрагменты, а не полностью оформленные схемы. Мой кастомный каталог как-то так делает:

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE catalog PUBLIC "-//Cail Lomecb//DTD Colorer CATALOG take5//EN" "http://colorer.sf.net/2003/catalog.dtd"[
...
  <!ENTITY catalog-console SYSTEM "jar:%FARHOME%/Plugins/FarColorer/base/common.zip!hrd/catalog-console.xml">
]>
<catalog xmlns="http://colorer.sf.net/2003/catalog">
...
  <hrd-sets>
    &catalog-console;
...
  </hrd-sets>
</catalog>

Только не знаю еще, что будет, если путь типа &catalog-console; не будет найден. Может, проблема. И вообще, будут ли ENTITY работать в схемах, может, это только для каталогов и прото работает.

ctapmex commented 4 months ago

ENTITY тяжело направить на некий пользовательский файл . Пусть будет прибит жестко.

nightroman commented 4 months ago

ENTITY тяжело направить на некий пользовательский файл . Пусть будет прибит жестко.

Переменные окружения работают. Как в моем примере (он реальный, просто кусок).

nightroman commented 4 months ago

Что-то типа

  <!ENTITY custom-blah SYSTEM "%CUSTOM_BLAH%">
nightroman commented 4 months ago

Сработало наполовину. А именно в схеме маркдауна объявляю энтити и использую ее

<!DOCTYPE hrc PUBLIC "-//Cail Lomecb//DTD Colorer HRC take5//EN" "http://colorer.sf.net/2003/hrc.dtd"[
  <!ENTITY COLORER_MARKDOWN_FENCE SYSTEM "%COLORER_MARKDOWN_FENCE%">
]>
...
  <block scheme="def:empty" region="Code"
  start="/(?{start}^ {4,}|\t+)\S.*/" end="/(?{end})\M%i3;\S/"/>

  &COLORER_MARKDOWN_FENCE;

  <block scheme="def:empty" region="Code"
  start="/(?{start}^%FenceMark;).*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
...

Работает, если %COLORER_MARKDOWN_FENCE% определена и указывает на файл типа такого (просто кусок xml, а не целая схема), "привлекательно и просто":

  <block scheme="powershell:powershell" content-priority="low"
  start="/(?{start}^%FenceMark;(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>

  <block scheme="lua:lua" content-priority="low"
  start="/(?{start}^%FenceMark;(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>

Но если %COLORER_MARKDOWN_FENCE% не определена, то схема вообще не работает.

Может тут колорер как-то помочь? Какие-то конвенции по разрешению ENTITY, чтобы некоторые уметь игнорировать?

nightroman commented 4 months ago
<inherit scheme="user:markdown" />

Такой вариант работает. И не так уж и страшно выглядит. И может иметь некоторые преимущества. Вопрос - есть примеры такого подхода с другими схемами? Какие имена обычно принято выбирать? user:markdown - это случайный пример или рекомендованный подход именования таких расширений?

ctapmex commented 4 months ago

Может тут колорер как-то помочь?

можно изменить обработку ошибок. Сейчас в случае ошибки загрузки entity падает загрузка всего типа. А порой и тех, что пытались его по цепочке загрузить. Будет - нет файла, игнорируем, загрузка продолжается , но может красить не так как ожидалось - надо смотреть логи на ошибки загрузки. во вложении сборка под x64 плагина, debug, можно попробовать. colorer.zip но мне тут не нравится, что пользователь зависит от переменной окружения. О ней надо знать, как-то выставлять при запуске Far (есть адекватный способ?). В любом случае это оставлю в коде. Такая обработка ошибок более правильная.

Вопрос - есть примеры такого подхода с другими схемами? Какие имена обычно принято выбирать? user:markdown - это случайный пример или рекомендованный подход именования таких расширений?

примеров нет. Пришло на ум случайно. На самом деле в текущих схемах есть ошибки, и долгое время в логи шли сообщения об отсутствии отдельных схем (сейчас только для yml осталось). Но это не мешало работать (https://github.com/colorer/Colorer-schemes/issues/114) . Как раз из принципа: нет схемы - игнорируем. user:markdown - это случайный пример, пытался с одной стороны подчеркнуть что это пользовательский тип. С другой, чтобы не пересекалось с реальными типами.

nightroman commented 4 months ago

@ctapmex Спасибо, все очень полезно. Буду разбираться, пробовать.

@johnd0e Что-нибудь предложу в итоге, но не "из коробки", а чтобы юзер сам мог настроить, что ему надо. Так правильнее. Хотя у кого-то руки никогда не дойдут (селяви).

nightroman commented 4 months ago

План такой. Фантазии на имена у меня хватило на markdown2 :)

В схему markdown добавляю одну строку

  <inherit scheme="markdown2:markdown2" />

И кажется это все, что от меня надо.

Далее пользователь может делать то, что я попробовал и сработало. Надо завести у себя файл markdown2.hrc пример ниже. И как-то его представить колореру, кто как привык.

Я делаю это в своем прото файле так

  <prototype name="markdown2" group="scripts" description="my markdown 2">
    <location link=".\markdown\markdown2.hrc"/>
  </prototype>

(тип файлов не указываю, ибо эта схема вызывается неявно из markdown)

Пример markdown2.hrc с двумя дополнительными языками powershell, lua. По аналогии можно добавить другие языки, сколько и какие душа пожелает. Или что-то другое (что хочется и не конфликтует с базовым markdown).

<?xml version="1.0" encoding="UTF-8"?>
<hrc version="take5"
xmlns="http://colorer.sf.net/2003/hrc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://colorer.sf.net/2003/hrc http://colorer.sf.net/2003/hrc.xsd">

<type name="markdown2">
<import type='markdown'/>

<scheme name="markdown2">
  <block scheme="powershell:powershell" content-priority="low"
  start="/(?{start}^(%FenceMark;)(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y1))\s*$/"/>

  <block scheme="lua:lua" content-priority="low"
  start="/(?{start}^(%FenceMark;)(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y1))\s*$/"/>
</scheme>

</type>
</hrc>
johnd0e commented 4 months ago

@nightroman

Супер. Не скажу что прям правильно, но раз от этого расход памяти зависит..

Предлагаю для примера положить в auto файлик. Или закомментированный, или с одной какой-то схемой.

nightroman commented 4 months ago

Класть ли в авто и в каком виде, это @ctapmex лучше решить, наверное. Можно "закомментированный", либо с двумя предложенными схемами. Ибо lua - это язык автоматизации Фара и не только. И powershell - это язык автоматизации Фара и не только.

nightroman commented 4 months ago

Подожду еще комментов и идей и "посплю на этом". Завтра где-нибудь пул реквест оформлю.

ctapmex commented 4 months ago

можно чуть усложнить

  1. по умолчанию в схему добавить около 10 реально распространенных типов. markdown , по моему мнению, при работе в Far больше используется для кода, для github того же. Выбрать основные языки.
  2. это улучшит поведение по умолчанию
  3. но обернуть этот блок в схему с условием на параметр , типа <scheme name="standard-lang" if="inherit-standard-lang"> . Параметр по умолчанию включен.
  4. если кто-то решит памяти сэкономить, либо сделать свою подборку, то параметр отключает, и заполняет markdown2:markdown2 для себя
nightroman commented 4 months ago

можно чуть усложнить

Душа не лежит к этому, так сказать. Забить схемы по умолчанию можно было уже в 2017, смотри ссылку вначале. Тогда не хотелось так делать и сейчас не хочется. Причины всякие разные.

Непонятно, что забивать по умолчанию. Сколько языков? - у нас уже 3 предложения есть, 1, 2, 10. Какие эти популярные языки? - тема еще та.

Многим, наверное, не нужна эта раскраска в некотором спорном наборе языков по умолчанию. Мне вот нравится, что код не подсвечен, и подсветка не отвлекает от написания остального текста и фокуса на нем. Код редактируется где-то еще, а не в маркдауне, и там он пусть будет подсвечен, а не в маркдауне.

Словом, начнем с простого добавления возможности расширения через markdown2. Это хороший и гибкий подход. Думаю задействовать и в других схемах. Дальше посмотрим. Также, нужно больше вовлеченных людей для других решений.

nightroman commented 4 months ago

Пул реквест готов.

nightroman commented 4 months ago

Добавлю про параметры схем для кастомизации. Пробовал с ними играться. Смешанные чувства. В итоге стараюсь не использовать. Меня отпугивает относительное неудобство в UI, невозможность посмотреть все свои параметры по всем схемам (я же забываю где, какие, когда поставил).

Колорер весь устроен на XML файлах. Наверное, мне бы больше понравилось, если бы и параметры схем задавались в некотором файле. И если бы UI и редактировал этот файл, вообще было бы хорошо. Не предлагаю ничего, так, мысли вслух.

ctapmex commented 4 months ago

описание/пример добавлю позднее

johnd0e commented 4 months ago

невозможность посмотреть все свои параметры по всем схемам (я же забываю где, какие, когда поставил).

Кстати да. Можно подумать как улучшить ситуацию. Например, что если дополнить функционал импортом/экспортом.

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

И таким же образом реализовать импорт.

johnd0e commented 4 months ago

@nightroman Я не совсем понял как это должно работать после PR, но описанное выше (https://github.com/colorer/Colorer-schemes/issues/151#issuecomment-2106319102) вполне функционирует.

Файл я поместил в auto, и прототип добавил в него же.