Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
johnd0e opened this issue May 11, 2024 · 28 comments · Fixed by #152

Comments

@johnd0e
Copy link

johnd0e commented May 11, 2024

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

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

@nightroman

@nightroman
Copy link
Contributor

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

Пример: так я подлючу 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
Copy link
Member

ctapmex commented May 12, 2024

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

@johnd0e
Copy link
Author

johnd0e commented May 12, 2024

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

@ctapmex
Copy link
Member

ctapmex commented May 12, 2024

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

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

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

@nightroman
Copy link
Contributor

nightroman commented May 12, 2024

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

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

@nightroman
Copy link
Contributor

nightroman commented May 12, 2024

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

@ctapmex
Copy link
Member

ctapmex commented May 12, 2024

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

Может ли схема сделать что-то типа "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
Copy link
Contributor

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

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

@ctapmex
Copy link
Member

ctapmex commented May 12, 2024

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

<inherit scheme="user:markdown" />

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

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

@nightroman
Copy link
Contributor

nightroman commented May 12, 2024

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

Еще есть подобная идея с использованием 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
Copy link
Member

ctapmex commented May 12, 2024

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

@nightroman
Copy link
Contributor

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

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

@nightroman
Copy link
Contributor

nightroman commented May 12, 2024

Что-то типа

  <!ENTITY custom-blah SYSTEM "%CUSTOM_BLAH%">

@nightroman
Copy link
Contributor

nightroman commented May 12, 2024

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

<!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
Copy link
Contributor

nightroman commented May 12, 2024

<inherit scheme="user:markdown" />

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

@ctapmex
Copy link
Member

ctapmex commented May 12, 2024

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

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

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

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

@nightroman
Copy link
Contributor

nightroman commented May 12, 2024

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

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

@nightroman
Copy link
Contributor

План такой. Фантазии на имена у меня хватило на 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
Copy link
Author

johnd0e commented May 12, 2024

@nightroman

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

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

@nightroman
Copy link
Contributor

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

@nightroman
Copy link
Contributor

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

@ctapmex
Copy link
Member

ctapmex commented May 12, 2024

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

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

@nightroman
Copy link
Contributor

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

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

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

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

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

@nightroman
Copy link
Contributor

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

@nightroman
Copy link
Contributor

nightroman commented May 13, 2024

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

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

@ctapmex ctapmex reopened this May 16, 2024
@ctapmex
Copy link
Member

ctapmex commented May 16, 2024

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

@johnd0e
Copy link
Author

johnd0e commented May 16, 2024

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

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

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

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

@johnd0e
Copy link
Author

johnd0e commented May 18, 2024

@nightroman
Я не совсем понял как это должно работать после PR, но описанное выше (#151 (comment)) вполне функционирует.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging a pull request may close this issue.

3 participants