Page 1 of 3

Cтруктура файла по in-line комментариям

Posted: 19.08.2023 19:03
by bb.slipers
Цель плагина простая - построить структуру кода или документа с разметкой
используя однострочные in-line комментарии и отступы форматирования.

1. Многострочные коментарии при построении структуры пропускаются

Code: Select all

lua
--[[
Это многострочный
коментарий
]]
python
'''
Это многострочный
коментарий
'''
javascript
/*
Это многострочный
коментарийthe winner
*/
и так далее
2. Строки, которые начинаются с однострочного коментария выводятся в зависимости
от режима в настройках: пропускать/выводить_первую/выводить_все

lua

Code: Select all

-- Первая строка
-- Вторая строка
-- Третья строка
Будут или пропущены все или выведена только первая, или все

3. Строки с однострочными in-line коментариями выводяться с учетом отступов в коде (разметки)
lua

Code: Select all

term.clear() -- Очищаем экран терминала

local function str2tab(str) -- Функция преобразования строки в таблицу из символов
    tab = {} -- Создание пустой таблицы результата
    string.gsub(str,'.', function(s) tab[#tab+1]=s end) -- Заполнение таблицы результата
    return tab -- Возврат результата
end
Выведет:

Code: Select all

Очищаем экран терминала
Функция преобразования строки в таблицу из символов
    Создание пустой таблицы результата
    Заполнение таблицы результата
    Возврат результата
yaml

Code: Select all

- dialog-box: classic # Показ области диалога
  area: false # Отключение областей сенсора
  next: true # Переход далее

- $: "<div style='text-align: justify'> # Реплика автора
  План побега - история о разведчике внедренном в состав высшего военного
  руководства США, в результате действий которого срывается план нанесения
  ядерного удара по территории России. В ходе расследования агентами ЦРУ он
  попадает под подозрение и его арестовывают. Cвязной сообщает ему, что уже
  разработан план его спасения. Ему нужно только сбежать с корабля, во
  время стоянки не далеко от берега острова Куба.
  </div>"
  scene: false # Очистка сцены
  
- audio: false # Отключение фоновой музыки
  jump: story2.part1 # Переход к первой главе
Выведет:

Code: Select all

Показ области диалога
  Отключение областей сенсора
  Переход далее
Реплика автора
  Очистка сцены
Отключение фоновой музыки
  Переход к первой главе
При клике на элементе структуры переход к данной строке.
Если возможно реализовать отбор (фильтр) строк по правилам: Содержит, Начинается с, Регулярное выражение

З.Ы. Нам нужна поддержка Lua, Python, JavaScript, Yaml. Возможно кому-то потребуется и для других лексеров.

Posted: 20.08.2023 10:57
by main Alexey
тут вы предложили новую задачу. это очень хорошо решать своим tree helper (у нас есть примеры в аддонах и есть доки в https://wiki.freepascal.org/CudaText_API ). просто идеальная задача для tree helper. чтобы он показал не код и функции, а только коменты.
за эту новую задачу я не готов браться.
но она не такая трудная!

а я хотел предложить (сделать мне) другое.
в codetree показать (по опции) колонку однострочных коментов которые касаются строки, уже выведенной в "дереве".
дать опцию
"tree_comments_column": 50
которая задаст ширину колонки. если 0 - не делать ничего.

вам такая опция поможет? или не будем тратить силы на нее?

Posted: 20.08.2023 11:11
by bb.slipers
У нас есть примеры в аддонах
Можно ссылку на что-то похожее (хотя бы отдаленно)
Не будем тратить силы на нее?
Наверное нет.
Я попробую разобраться и реализовать задачу полностью.

Posted: 20.08.2023 11:32
by main Alexey
похожего нет. вот какие есть
https://sourceforge.net/projects/cudate ... eehelpers/

но там не сложно. задача хелпера- дать список. вот что делает хелпер для PHP

Code: Select all

def get_headers(filename, lines):
    '''
    gets list of tuples in format:
    ( (x1,y1,x2,y2), level, title, icon)
    '''
    r = []
    items = pyphptree.get_headers(filename, lines)

    # todo
    # post processing: merge nodes of namespaces with same names

    for v in items:
        name = v['name'] or '??'
        kind = _icon(v['kind'])
        y = v['line']
        x = v['col']
        lev = v['level']+1 

        r += [ ( 
            (x, y, x+len(name), y),
            lev,
            name,
            kind,
            ) ]
    return r
счанала он парсит PHP и находит список ф-ций и классов. в items. потом он это items переводит в список. элемент списка -

- (x1, y1, x2, y2)
- level (для вложеноости)
- имя
- тип узла (int)

Posted: 20.08.2023 15:31
by bb.slipers
счанала он парсит PHP
Но что бы распарсить yaml мне надо установить pyyaml
Но я не могу выполнить pip install pyyaml
Как мне добавить библиотеку что бы распарсить yaml?

Posted: 20.08.2023 15:38
by main Alexey
0. в каталог плагина добавьте модуль pyyaml (это может быть и папка 'pyyaml' c __init__.py и просто файл pyyaml.py).

потом 1 или 2.

1. импортируете его из плагина из __init__.py так -

Code: Select all

from . import pyyaml
2. добавляете в sys.path папку плагина.

Code: Select all

import sys
_mydir = os.path.dirname(__file__)
sys.path.append(_mydir)
и потом делаем просто обычный 'import pyyaml'


но.
вы можете для _этой задачи_ не юзать pyyaml. просто универсальным кодом подсчитайте indent строки и на основе этого сами вложите один блок в другой.

Posted: 20.08.2023 16:25
by bb.slipers
Строки, которые начинаются с однострочного коментария выводятся в зависимости
от режима в настройках: пропускать/выводить_первую/выводить_все
Как мне создать элемент настройки (значение целое: 0 или 1 или 2)?

Posted: 20.08.2023 16:51
by main Alexey
сказать юзеру чтобы использовал опцию, для вас лучше всего в settings/user.json. пример чтения опции по имени

Code: Select all

from cudax_lib import get_opt
# ...
v = get_opt('my_option', 0)
print('my opt:', v)
user.json:

Code: Select all

{
  "minimap_sel_always" : true,
  "my_option": 2,
}

Posted: 20.08.2023 16:54
by main Alexey
для ваших 4х лексеров (yaml, lua, python, ...), вам надо иметь 4 секции в py/cuda_tree_XXXX/install.inf, по секции на лексер. и по 1 методу на лексер.

Posted: 20.08.2023 16:55
by bb.slipers
Еще глупый вопрос когда я вношу изменения в файл __init__.py могу я его как-то "перечитать" не перезапуская редактор?