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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%0AwzecaUf?h13-N4=+7 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 G!~+0s!M;2I 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