LINUX.ORG.RU
решено ФорумAdmin

Форматирование текста в markdown согласно шаблону

 , , ,


0

1

Привет!

Дана такая задача, есть выхлоп скриптов в текстовом файле, вида

v-acknowledge-user-notification
Usage: v-acknowledge-user-notification USER NOTIFICATION

v-add-backup-host
Usage: v-add-backup-host TYPE HOST USERNAME PASSWORD [PATH] [PORT]

Как и чем его преобразовать в формат Markdown такого вида? Это сделать реально? Скриптик на Питоне?

★★★★★

Последнее исправление: Twissel (всего исправлений: 2)

Да, реально. Делай. Да, можно на Питоне, хотя если заморочиться, то можно даже и на sed. Для Питона смотри методы .split() и .format().

anonymous
()
Ответ на: комментарий от anonymous

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

Twissel ★★★★★
() автор топика
Ответ на: комментарий от anc

«Космосом» же!

А по теме меня мало прельщает перспектива городить все это на sed'е :-D

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

v-add-backup-host
Usage: v-add-backup-host TYPE HOST USERNAME PASSWORD [PATH] [PORT]

Получить только аргументы, которые прописными буквами. Получилось что-то вроде

(Usage:.*?\s.*?\s)

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

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

«Космосом» же!

Нет «явой»!
upd Хотя нагуглил вариант с «Космосом», видимо есть и такое.

А народ мне предлагает седом не только резать но и форматировать...

Не предлагает, вы сами спросили «Ради интереса дай кусок портянки на sed». Вопрос: Можно ли на sed написать? Ответ: Да. Но вот надоли? если его не знаете? :)

ЗЫ

не я понимаю, что на нем и шахматы писали...

Не только шахматы. Из моих «закладок», получено от одного из лоровцев (емнип его там Flappy Bird)
https://www.youtube.com/playlist?list=PLdvB7n7RN2UCVb7GnKQu_R-fbQ-laLtkZ

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

Решил задачу кучей регулярок в Notepad++

Вот же ж я офтопичное чудовище :-D

WitcherGeralt, а как бы ты по быстрому решил вопрос, используя предложенные выше .split() и .format()?

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

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

Но, если очень хочется сплиты, то так:

def f(txt): 
     b = [] 
     for cmd in txt.split('\n\n'): 
         cmd, args = cmd.split('\n', 1) 
         args = args.split(None, 2)[2] 
         b.append(f'**{cmd}**\n\n<TODO: add description>\n\n**OPTIONS**\n\n\t{args}') 
     return '\n\n\n'.join(b)
WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Ты, если я правильно понял, решил использовать замену?

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

Может твой сниппет сгодится, спасибо.

Twissel ★★★★★
() автор топика

Как и чем его преобразовать в формат Markdown такого вида?

Если всё так просто, то просто

text = '''v-acknowledge-user-notification
Usage: v-acknowledge-user-notification USER NOTIFICATION

v-add-backup-host
Usage: v-add-backup-host TYPE HOST USERNAME PASSWORD [PATH] [PORT]'''


md = '\n'.join(map(
    lambda x: 'Usage:' in x and x.replace('Usage: ', '**Usage:**\n\n    ') or \
              not x and f'\n' or f'**{x}**\n',
    text.split('\n')))
print(md)
**v-acknowledge-user-notification**

**Usage:**

    v-acknowledge-user-notification USER NOTIFICATION


**v-add-backup-host**

**Usage:**

    v-add-backup-host TYPE HOST USERNAME PASSWORD [PATH] [PORT]

P.S. Код ни на что не претендует, просто пользуюсь «реальными» задачками с ЛОРа для тренировок в функциональщину в питоне.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Не то, что требовалось в ОП посте (да и сегодня решили сменить форматирование, см выше), от функциональщины в глазах зарябило. Выхлоп должен быть вида

**v-rebuild-mail-domains**
 
The function rebuilds EXIM configuration files for all mail domains.



**OPTIONS**

    user

Тем не менее спасибо за участие.

P.S. Описание в выхлоп добавлять не обязательно.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от WitcherGeralt
args.split(None, 2)[2]

Это второй элемент списка аргументов, далее делим эту строку на 2 части?

Так?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Да. Но лучше делать:

arg1_nice_name, arg2_nice_name, arg3_nice_name, foo, bar = args.split(None, 5)
Далее уже использовать красивые значения переменных в своём форматировании. Вникать, что там как должно называться, и где именно на сколько частей делиться в ОП-посте — лень (понять задачу — 50+% работы)

anonymous
()
Ответ на: комментарий от Twissel

Делим строку по любому whitespace дважды (т.е. на три части), берём второй по индексу (т.е. третий) элемент.

In [1]: str.split?                                                                                    
Docstring:
S.split(sep=None, maxsplit=-1) -> list of strings

Return a list of the words in S, using sep as the
delimiter string.  If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are
removed from the result.
Type:      method_descriptor

Советую тебе iPython, очень удобно для отладки маленьких кусочков кода. Вообще, в REPL-режиме интерпретатора тоже можно и help, и dir, __doc__ попринтить, но в iPython это удобней.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

ОК.

Подскажи пожалуйста, какой регуляркой сматчить

V-Add-Letsencrypt-Domain User
до первого концевого пробела, а то не могу убрать Capitalize

Т.е. мне нужно оставить обязательные аргументы с прописной буквы, а скрипт сделать строчными.

Зато нашел регулярку, которая матчит прописные буквы вне скобок

[A-Z]+(?![^\[\]]*\])

В общем и целом, я продолжаю извращаться...

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Хотя пока оформил вот так,

(V-..*?\s)
дальше буду фигашить регулярками, в силу того, что правила форматирования «на лету» изменили. Я буду дольше читать документацию на Питон, чем текст будет форматироваться.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

Возврат к sed ? :)

sed -r 's/^(v-.*)$/*********\n\1\n*********/' 
А выравнивание по звездочкам можно и башем запилить :)

anc ★★★★★
()
Ответ на: комментарий от Twissel
>>> import re                                           >>> s='''                                               ... fgh
... 000
...
... hjj
... v-command
...
... v-command with args
... '''
>>> print(re.sub(r'^(v-\S+)$', lambda m: '*********%s*********' % m.group(1), s, flags=re.M|re.I))

fgh
000

hjj
*********v-command*********

v-command with args
WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Переносы строк забыл ты :-)

Но, что sed'ом, что скриптом на Питоне, нам все равно нужна регулярка.

Суть ясна. Благодарю за оперативность.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от anc

Кстати, а как тут сделать inplace редактирование?

Ключ -i просто так не заводится :-)

Twissel ★★★★★
() автор топика
Ответ на: комментарий от anc

А, понял для седа порядок аргументов некоммутативен :-D

ir != ri
Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.