From 4a0879e81c30804512f56920f18c166a03b1b26d Mon Sep 17 00:00:00 2001 From: Gregory Bednov Date: Sat, 15 Feb 2025 02:42:21 +0300 Subject: [PATCH] lua major update --- .github/workflows/pylint.yml | 23 --- .gitignore | 3 +- Readme.md | 20 ++- filter.py | 257 +++++++++------------------------ filter2.lua | 267 +++++++++++++++++++++++++++++++++++ отчёт.docx | Bin 0 -> 31483 bytes отчёт.md | 43 +++++- 7 files changed, 389 insertions(+), 224 deletions(-) delete mode 100644 .github/workflows/pylint.yml create mode 100644 filter2.lua create mode 100644 отчёт.docx diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml deleted file mode 100644 index c73e032..0000000 --- a/.github/workflows/pylint.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Pylint - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.8", "3.9", "3.10"] - steps: - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install pylint - - name: Analysing the code with pylint - run: | - pylint $(git ls-files '*.py') diff --git a/.gitignore b/.gitignore index 68bc17f..44bbb13 100644 --- a/.gitignore +++ b/.gitignore @@ -157,4 +157,5 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ +.vscode/ diff --git a/Readme.md b/Readme.md index 0519ecb..ff772e8 100644 --- a/Readme.md +++ b/Readme.md @@ -1 +1,19 @@ - \ No newline at end of file +1. Требуется установить Pandoc + +Pandoc - универсальный конвертер документов между различными форматами и разметками. + +2. Для того чтобы воспользоваться скриптом, скачайте репозиторий и введите команду: + +``` + pandoc --lua-filter=filter2.lua --from markdown --to docx --reference-doc=custom-reference3.docx < отчёт.md > отчёт.docx + ``` + + *Уточнение*. Установка Lua не требуется, так как интерпретатор этого языка программирования "зашит" внутрь Pandoc, хотя сам Pandoc написан на Haskell. + + Программа должна работать в Linux, macOS. По идее, она будет работать и в Windows, но важно сохранить файл .md в кодировке UTF-8. + + 3. Есть файл "правила оформления", он частично видоизменен, он неполный, там больший упор на то чего НЕ удалось реализовать в скрипте в автоматическом виде, но на что нужно обратить внимание (odg был создан в libreoffice draw, спокойно конвертируется в PDF). + +__ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ__. Программа является всего лишь ИНСТРУМЕНТОМ, и не заменяет голову на плечах, она предоставляется в том виде, в котором она была создана, она гарантированно многого все ещё *не* умеет (например, пока не придумал способ уместить в pandoc создание титульников) + +Часть первоначальной версии программы доступна в прошлых ревизиях Git и написана на Python. Текущая версия не требует установки Python в систему (и вообще никаких программ, кроме Pandoc), но была переписана на Lua, возможны регрессии функциональности. \ No newline at end of file diff --git a/filter.py b/filter.py index 8aa0bb4..15bbdbb 100755 --- a/filter.py +++ b/filter.py @@ -1,213 +1,82 @@ -#!/usr/bin/env python3 +# import json +# import sys +# import re -import json -import sys -import re +# body = json.loads(input()) +# blocks = body['blocks'] -sys.stdin.reconfigure(encoding='utf-8') # for windows +# def eprint(*args, **kwargs): +# print(*args, file=sys.stderr, **kwargs) -image, formula, table, code, section = 0, 0, 0, 0, [0, 0, 0] -E, W = "ОШИБКА: ", "ПРЕДУПРЕЖДЕНИЕ: " -SP = [{'t' : 'Space'}] - -unnumbered = True -HEADERSEP = ' ' - -hdlis = [ 'АННОТАЦИЯ', 'ВВЕДЕНИЕ', 'ЗАКЛЮЧЕНИЕ', 'ВЫВОДЫ', 'СПИСОК-ИСПОЛЬЗОВАННЫХ-ИСТОЧНИКОВ' ] - -body = json.loads(input()) -blocks = body['blocks'] - -def eprint(*args, **kwargs): - print(*args, file=sys.stderr, **kwargs) +# def str2pd(str_to_pandoc): +# def intersperse(lst, item): +# result = [item] * (len(lst) * 2 - 1) +# result[0::2] = lst +# return result +# return intersperse(list(map( +# lambda x: {'t': 'Str', 'c': x}, +# list(filter(lambda x: x != '', re.split('[\t\n\r ]', str_to_pandoc))))), +# {'t': 'Space'}) -def str2pd(str_to_pandoc): - def intersperse(lst, item): - result = [item] * (len(lst) * 2 - 1) - result[0::2] = lst - return result - return intersperse(list(map( - lambda x: {'t': 'Str', 'c': x}, - list(filter(lambda x: x != '', re.split('[\t\n\r ]', str_to_pandoc))))), - {'t': 'Space'}) +# def upper_first_token(tokens): +# for token in tokens: +# if token['t'] == 'Str': +# token['c'] = token['c'][0].upper() + token['c'][1:] +# break +# return tokens -def section_inc (index): - if index <= 1: - global image, formula, table, code - image, formula, table, code = 0, 0, 0, 0 - global section - section[index-1] += 1 - section[index:] = [0]*len(section[index:]) +# def append_reference (mb_text_block, name, section0, num): +# if mb_text_block['t'] == 'Div': +# mb_text_block = mb_text_block['c'][-1][0] +# if mb_text_block['t'] == 'Para': +# for token in mb_text_block['c'][::-1]: +# if token['t'] == 'Str': +# token['c'] = token['c'].rstrip('.?!…\t ') +# break -def section_str (index): - return str(section[0]) if index <= 1 else section_str(index-1)+"."+str(section[index-1]) - -def phrase_list (phrase, listtype, islast): - if listtype == 'OrderedList': - inl, start = 'в нумерованном списке ', 'большой (заглавной) ' - else: - inl, start = 'в маркированном списке ', 'маленькой (строчной) ' - endswith = "пункт заканчивается знаком " - - ender, subender = '.', ';' - if not islast and listtype != 'OrderedList': - ender, subender = subender, ender - - if phrase[0]['t'] == 'Plain': - if phrase[0]['c'][0]['c'][0].islower() and (listtype == 'OrderedList'): - phrase[0]['c'][0]['c'] = phrase[0]['c'][0]['c'][0].upper() + phrase[0]['c'][0]['c'][1:] - if phrase[0]['c'][0]['c'][0].isupper() != (listtype == 'OrderedList'): - eprint(W+inl+'текст должен начинаться с ' + start + 'буквы') - - if phrase[0]['c'][-1]['c'][-1] == subender: - if islast: - eprint(W + inl + "последний " + endswith + ender, - ", хотя остальных пунктах используется ", subender) - else: - eprint(W+inl+"каждый" + endswith + ender, - " , а не знаком ", subender) - elif phrase[0]['c'][-1]['c'][-1] != ender: - phrase[0]['c'][-1]['c'] += ender - return phrase - -def text_ref (prev, caption, section, figure): - return str2pd(f'{caption} {section}.{figure} —') + SP + prev - -def delete_end_marks (tokens, chars='.?!…\t '): - for token in tokens[::-1]: - if token['t'] == 'Str': - token['c'] = token['c'].rstrip(chars) - break - return tokens - -def upper_first_token(tokens): - for token in tokens: - if token['t'] == 'Str': - token['c'] = token['c'][0].upper() + token['c'][1:] - break - return tokens - -def append_reference (mb_text_block, name, section0, num): - if mb_text_block['t'] == 'Div': - mb_text_block = mb_text_block['c'][-1][0] - if mb_text_block['t'] == 'Para': - delete_end_marks(mb_text_block['c']) - mb_text_block['c'] += SP + upper_first_token(str2pd(f'({name} {section0}.{num}):')) - return True - return False +# mb_text_block['c'] += [{'t' : 'Space'}] # a space after a paragraph and... +# + upper_first_token(str2pd(f'({name} {section0}.{num}):')) +# return True +# return False -#for i, b in enumerate(blocks): -i = 0 -while i < len(blocks): - b = blocks[i] +# #for i, b in enumerate(blocks): +# i = 0 +# image, formula, table, code, section = 0, 0, 0, 0, [0, 0, 0] +# E, W = "ОШИБКА: ", "ПРЕДУПРЕЖДЕНИЕ: " +# while i < len(blocks): +# b = blocks[i] +# btype = b['t'] - btype = b['t'] - if btype == 'Header': - order = b['c'][0] - refname = b['c'][1][0] - headerTokens = b['c'][2] - - delete_end_marks(headerTokens) +# if btype == 'Table': +# if not append_reference(blocks[i-1], 'Таблица', section[0], table): +# eprint(E+"перед таблицей", b['c'],"нет абзаца, в который можно встроить ссылку на таблицу!") - if btype == 'Header' and order == 1: - unnumbered = (refname.strip()).upper() in hdlis - if not unnumbered: - section_inc(order) - headerTokens.insert(0, {'t': 'Str', 'c': str(section_str(order)+HEADERSEP)}) +# blocks[i+1] = {'t':'Div', 'c': [["",[],[['custom-style', 'aftertable']]], [blocks[i+1]]]} - for token in headerTokens: - if token['t'] == 'Str': - token['c'] = token['c'].upper() +# if btype == 'Figure': +# if not append_reference(blocks[i-1], 'Рисунок', section[0], image): +# eprint(E+"перед рисунком", b['c'], "нет абзаца, в который можно встроить ссылку на рисунок!") - if btype == 'Header' and order != 1: - if unnumbered: - eprint(E+ - "Используется заголовок 2 и ниже уровней", - b['c'][1], - "в ненумерованном разделе (или вовсе вне разделов). \ - Проверьте структуру разделов.") - sys.exit(1) +# if btype == 'CodeBlock': +# if len(b['c'][0][2]) == 0: +# eprint(E+"нет подписи у листинга:\n", b['c'][1], "\nЧТОБЫ ДОБАВИТЬ ПОДПИСЬ, используйте ключ caption:\n~~~{.lang caption=\"Hello world\"}") - upper_first_token(headerTokens) +# if not('caption' in dict(b['c'][0][2])): +# eprint(E+"нет подписи у листинга:\n", b['c'][1], "\nЧТОБЫ ДОБАВИТЬ ПОДПИСЬ, используйте ключ caption:\n~~~{.lang caption=\"Hello world\"}") - section_inc(order) - headerTokens.insert(0, {'t': 'Str', 'c': str(section_str(order)+HEADERSEP)}) +# code += 1 +# caption = f'Листинг {section[0]}.{code} — ' + dict(b['c'][0][2])['caption'] +# if not append_reference(blocks[i-1], 'Листинг', section[0], code): +# eprint(E+"перед листингом", b['c'], "нет абзаца, в который можно встроить ссылку на листинг!") - if btype == 'Para': -# if unnumbered: -# eprint(E+"Текст или картинка вне раздела \ -# или в ненумерованном разделе", -# b['c'][1], -# ". Проверьте структуру разделов.") -# sys.exit(1) +# blocks.insert(i, {"t":"Div","c":[["",[],[["custom-style","Code Caption"]]], [{"t":"Para","c":str2pd(caption)}]]}) +# i += 1 +# blocks[i+1] = {'t':'Div', 'c': [["",[],[['custom-style', 'aftertable']]], [blocks[i+1]]]} - for bb in b['c']: - bbtype = bb['t'] - if bbtype == 'Image': - image += 1 - b['c'][0]['c'][1] = text_ref(b['c'][0]['c'][1], 'Рисунок', section[0], image) # TODO error if fail - delete_end_marks(blocks[i-1]['c']) - blocks[i-1]['c'] += SP + str2pd(f'(Рисунок {section[0]}.{image}):') +# i += 1 - if btype == 'Table': - if unnumbered: - eprint(E+"Таблица вне раздела или в ненумерованном разделе:\n", b['c'], "\nПровертье структуру разделов.") - sys.exit(1) - table += 1 - b['c'][1][1][0]['c'] = str2pd(f'Таблица {section[0]}.{table} —') + SP + b['c'][1][1][0]['c'] - if not append_reference(blocks[i-1], 'Таблица', section[0], table): - eprint(E+"перед таблицей", b['c'],"нет абзаца, в который можно встроить ссылку на таблицу!") - sys.exit(1) - - blocks[i+1] = {'t':'Div', 'c': [["",[],[['custom-style', 'aftertable']]], [blocks[i+1]]]} - - if btype == 'Figure': - if unnumbered: - eprint(E+"Рисунок вне раздела или в ненумерованном разделе:\n", b['c'], "\nПровертье структуру разделов.") - sys.exit(1) - image += 1 - b['c'][1][1][0]['c'] = str2pd(f'Рисунок {section[0]}.{image} —') + SP + b['c'][1][1][0]['c'] - - if not append_reference(blocks[i-1], 'Рисунок', section[0], image): - eprint(E+"перед рисунком", b['c'], "нет абзаца, в который можно встроить ссылку на рисунок!") - sys.exit(1) - - if btype == 'CodeBlock': - if unnumbered: - eprint(E+"Листинг вне раздела или в ненумерованном разделе:\n", b['c'], "\nПровертье структуру разделов.") - sys.exit(1) - if len(b['c'][0][2]) == 0: - eprint(E+"нет подписи у листинга:\n", b['c'][1], "\nЧТОБЫ ДОБАВИТЬ ПОДПИСЬ, используйте ключ caption:\n~~~{.lang caption=\"Hello world\"}") - sys.exit(1) - - if not('caption' in dict(b['c'][0][2])): - eprint(E+"нет подписи у листинга:\n", b['c'][1], "\nЧТОБЫ ДОБАВИТЬ ПОДПИСЬ, используйте ключ caption:\n~~~{.lang caption=\"Hello world\"}") - sys.exit(1) - - code += 1 - caption = f'Листинг {section[0]}.{code} — ' + dict(b['c'][0][2])['caption'] - if not append_reference(blocks[i-1], 'Листинг', section[0], code): - eprint(E+"перед листингом", b['c'], "нет абзаца, в который можно встроить ссылку на листинг!") - sys.exit(1) - - blocks.insert(i, {"t":"Div","c":[["",[],[["custom-style","Code Caption"]]], [{"t":"Para","c":str2pd(caption)}]]}) - i += 1 - blocks[i+1] = {'t':'Div', 'c': [["",[],[['custom-style', 'aftertable']]], [blocks[i+1]]]} - # eprint(blocks[i+1]) - # .insert(i, {"t":"Div","c":[["",[],[["custom-style","Code Caption"]]], [{"t":"Para","c":str2pd(caption)}]]}) - - if btype == 'BulletList': - for j, phrase in enumerate(b['c']): - phrase = phrase_list(phrase, btype, j == (len(b['c']) - 1)) - - if btype == 'OrderedList': - for phrase in b['c'][1]: - phrase = phrase_list(phrase, btype, False) - - i += 1 - -body['blocks'] = blocks -print(json.dumps(body)) +# body['blocks'] = blocks +# print(json.dumps(body)) diff --git a/filter2.lua b/filter2.lua new file mode 100644 index 0000000..6a40b83 --- /dev/null +++ b/filter2.lua @@ -0,0 +1,267 @@ +IMAGE, FORMULA, TABLE, CODE = 0, 0, 0, 0 +UNNUMBERED = true +local hdlis = { + ['АННОТАЦИЯ'] = true, + ['ВВЕДЕНИЕ'] = true, + ['ЗАКЛЮЧЕНИЕ'] = true, + ['ВЫВОДЫ'] = true, + ['СПИСОК-ИСПОЛЬЗОВАННЫХ-ИСТОЧНИКОВ'] = true + } + + local section = {0, 0, 0} + + local function remove_trailing_punctuation(text) + return text:gsub("[,;%.!?]+$", "") + end + + local function capitalize_first_letter(text) + local first_char = pandoc.text.sub(text, 1, 1) + local rest = pandoc.text.sub(text, 2) + return pandoc.text.upper(first_char) .. rest + end + + local function is_unnumbered(header_text) + return hdlis[pandoc.text.upper(header_text)] ~= nil + end + + local function get_section_number(level) + if level == 1 then + section[1] = section[1] + 1 + section[2] = 0 + section[3] = 0 + IMAGE = 0 + + return tostring(section[1]) + elseif level == 2 then + if section[1] == 0 then + io.stderr:write("Ошибка: Второй уровень без первого запрещен\n") + return nil + end + section[2] = section[2] + 1 + section[3] = 0 + return section[1] .. "." .. section[2] + elseif level >= 3 then + if section[1] == 0 or section[2] == 0 then + io.stderr:write("Ошибка: Третий уровень без первого или второго запрещен\n") + return nil + end + section[3] = section[3] + 1 + return section[1] .. "." .. section[2] .. "." .. section[3] + end + end + + function Header(el) + local cleaned_text = capitalize_first_letter(remove_trailing_punctuation(pandoc.utils.stringify(el.content))) + local is_unnumbered_section = is_unnumbered(cleaned_text) + UNNUMBERED = is_unnumbered_section + local level = math.min(el.level, 3) -- Принудительно ограничиваем вложенность до 3 + + if level > 1 and section[1] == 0 then + io.stderr:write("Ошибка: Заголовки 2 и ниже без нумерованного заголовка 1 уровня\n") + return el + end + + if not is_unnumbered_section then + local section_number = get_section_number(level) + cleaned_text = section_number .. " " .. capitalize_first_letter(cleaned_text) + elseif level > 1 then + io.stderr:write("Ошибка: В ненумеруемом разделе не должно быть вложенных заголовков\n") + return el + end + + el.content = pandoc.Inlines(cleaned_text) + return el + end + + + +function Figure(el) + IMAGE = IMAGE + 1 + local str = pandoc.utils.stringify(el.caption) + str = capitalize_first_letter(str) + str = remove_trailing_punctuation(str) + if UNNUMBERED then + io.stderr:write("Ошибка: Рисунок " .. str .. " в ненумерованном разделе!") + return el + end + str = "Рисунок " .. section[1] .. "." .. IMAGE .. " — " .. str + + el.caption = pandoc.Blocks(str) + return el +end + +function Table(el) + TABLE = TABLE + 1 + local str = pandoc.utils.stringify(el.caption) + str = capitalize_first_letter(str) + str = remove_trailing_punctuation(str) + if UNNUMBERED then + io.stderr:write("Ошибка: Таблица " .. str .. " в ненумерованном разделе!") + return el + end + str = "Таблица " .. section[1] .. "." .. IMAGE .. " — " .. str + el.caption = pandoc.Blocks(str) + return el +end + +--[[ + Предполагается, что ранее в фильтре уже определены: + IMAGE, FORMULA, TABLE, CODE = 0, 0, 0, 0 + UNNUMBERED, hdlis, section + функции Header, Figure, Table (обрабатывающие подписи и прочее) + Этот блок добавляет модификацию соседних блоков (предыдущего Para для ссылки, + а также оборачивание следующего блока для Table и CodeBlock). +--]] + +-- Функция для приведения первой буквы строки к заглавной +function capitalize_first_letter(text) + local first = pandoc.text.sub(text, 1, 1) + local rest = pandoc.text.sub(text, 2) + return pandoc.text.upper(first) .. rest +end + +-- Функция оборачивает блок в Div с кастомным стилем "aftertable" +function wrap_aftertable(block) + return pandoc.Div(block, pandoc.Attr("", {}, {["custom-style"] = "aftertable"})) +end + +-- Функция, которая ищет в списке блоков блок по индексу index и, если это Para (или вложенный Para в Div), +-- удаляет завершающую пунктуацию у последнего текстового элемента и дописывает ссылку в виде: +-- " (Тип section.num):" +function append_reference_to_block(blocks, index, ref_name, section_num, num) + if index < 1 or index > #blocks then + return false + end + local blk = blocks[index] + -- Если блок – Div, пробуем взять последний вложенный блок из его содержимого + if blk.t == "Div" then + if blk.c and #blk.c >= 2 and type(blk.c[2]) == "table" and #blk.c[2] > 0 then + blk = blk.c[2][#blk.c[2]] + else + return false + end + end + if blk.t ~= "Para" then + return false + end + -- Удаляем завершающую пунктуацию у последнего Str + local inlines = blk.c + for j = #inlines, 1, -1 do + if inlines[j].t == "Str" then + inlines[j].text = inlines[j].text:gsub("[%.?!…%s]+$", "") + break + end + end + -- Формируем текст ссылки, например: "(Рисунок 1.2):" + local ref_text = "(" .. ref_name .. " " .. section_num .. "." .. num .. "):" + ref_text = capitalize_first_letter(ref_text) + table.insert(inlines, pandoc.Space()) + table.insert(inlines, pandoc.Str(ref_text)) + return true +end + +-- Главная функция фильтра, которая проходит по всем блокам документа и в нужных местах +-- модифицирует соседние блоки. +function Pandoc(doc) + local blocks = doc.blocks + local i = 1 + while i <= #blocks do + local blk = blocks[i] + if blk.t == "Table" then + -- Для таблиц: добавляем ссылку в предыдущий абзац и оборачиваем следующий блок + if not append_reference_to_block(blocks, i - 1, "Таблица", section[1], TABLE) then + io.stderr:write("ОШИБКА: перед таблицей нет абзаца для ссылки\n") + end + if i + 1 <= #blocks then + blocks[i + 1] = wrap_aftertable(blocks[i + 1]) + end + elseif blk.t == "Figure" then + -- Для рисунков: добавляем ссылку в предыдущий абзац + if not append_reference_to_block(blocks, i - 1, "Рисунок", section[1], IMAGE) then + io.stderr:write("ОШИБКА: перед рисунком нет абзаца для ссылки\n") + end + elseif blk.t == "CodeBlock" then + -- Для листингов: проверяем наличие подписи (caption) в атрибутах + local attr = blk.attr or {"", {}, {}} + local attributes = attr[3] or {} + local caption = attributes.caption + if not caption then + io.stderr:write("ОШИБКА: Листинг без подписи!\nИспользуйте ключ caption в CodeBlock\n") + else + CODE = CODE + 1 + local ref_text = "Листинг " .. section[1] .. "." .. CODE .. " — " .. caption + if not append_reference_to_block(blocks, i - 1, "Листинг", section[1], CODE) then + io.stderr:write("ОШИБКА: перед листингом нет абзаца для ссылки\n") + end + -- Вставляем блок с подписью перед текущим CodeBlock. + local caption_block = pandoc.Div( + pandoc.Para({ pandoc.Str(capitalize_first_letter(ref_text)) }), + pandoc.Attr("", {}, {["custom-style"] = "Code Caption"}) + ) + table.insert(blocks, i, caption_block) + i = i + 1 -- пропускаем вставленный блок + if i + 1 <= #blocks then + blocks[i + 1] = wrap_aftertable(blocks[i + 1]) + end + end + end + i = i + 1 + end + return pandoc.Pandoc(blocks, doc.meta) +end + +function Meta(m) + if m.date == nil then + m.date = os.date("%e «%m» %Y") + end + return m +end + +local function remove_trailing_punctuation_li (li) + return pandoc.Blocks(remove_trailing_punctuation(pandoc.utils.stringify(li))) +end + +local function add_trailing_semicolon_li (li) + return pandoc.Blocks(pandoc.utils.stringify(li) .. ";") +end + +local function add_trailing_stop_li (li) + return pandoc.Blocks(pandoc.utils.stringify(li) .. ".") +end + +local function capitalize_first_letter_li (li) + return pandoc.Blocks(capitalize_first_letter(pandoc.utils.stringify(li))) +end + +local function warnCapitalizedStart (li) + local str = pandoc.utils.stringify(li) + local capitalized = capitalize_first_letter(str) + if str == capitalized + then + io.stderr:write("Предупреждение: необходимо исправить вручную. В маркированном списке предложение должно начинаться со строчной (маленькой) буквы. Если текст пункта стартует с аббревиатуры, проигнорируйте данное предупреждение, иначе - исправьте вручную. Текст пункта:\n" .. str) + end + + return li +end + +function BulletList(el) + local li = el.content + li = pandoc.List.map(li, remove_trailing_punctuation_li) + li = pandoc.List.map(li, add_trailing_semicolon_li) + local ending = pandoc.List.at(el.content, -1) + pandoc.List.remove(li) + ending = add_trailing_stop_li(remove_trailing_punctuation_li(ending)) + pandoc.List.insert(li, ending) + li = pandoc.List.map(li, warnCapitalizedStart); + el.content = li + return el +end + +function OrderedList(el) + local li = el.content + li = pandoc.List.map(li, remove_trailing_punctuation_li) + li = pandoc.List.map(li, add_trailing_stop_li) + li = pandoc.List.map(li, capitalize_first_letter_li) + el.content = li + return el +end \ No newline at end of file diff --git a/отчёт.docx b/отчёт.docx new file mode 100644 index 0000000000000000000000000000000000000000..19d1f3ce89028897676028bf1cc58b2e0bb2db93 GIT binary patch literal 31483 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 literal 0 HcmV?d00001 diff --git a/отчёт.md b/отчёт.md index c2d6dfb..7fb4366 100644 --- a/отчёт.md +++ b/отчёт.md @@ -2,21 +2,54 @@ title: Методика кодирования информации author: Студентов У.M. teacher: Беднов Г.А. +type: Курсовая --- -# введение +# введение. - + + Привет мир. -# Практическая работа -Здесь должен быть азбац с текстом -![Тебя что, в Гугле забанили](./google.png) +# практическая работа! +## очень маленький заголовок + + +## подраздельчик + +1. f +1. 2 +1. 2 +1. 4 + +* Ф; +* b, + +Здесь обязан быть абзац с текстом, так как он предваряет картинку + +![Тебя что, в Гугле забанили?](./google.png) Формулы оно тоже *может* поддерживать, но их обязательно надо доделывать! $$E=mc^2$$ +: пример таблички + + Right Left Center Default +------- ------ ---------- ------- + 12 12 12 12 + 123 123 123 123 + 1 1 1 1 + + +```cpp + +int main(void) { + std::cout << "Hello world"; + return 0; +} + +``` \ No newline at end of file