Сборник документации в виде статичных html страниц размещенных на github pages.
Для добавления и редактирвания страниц используются .md файлы (файлы разметки markdown) и особый билд-скрипт на python3, который конвертирует файлы в html. Все файлы лежат в одном репозитории.
.
|
├── src
│ ├── style.css // Таблица стилей
│ ├── keywords.js // Автогенерируемый файл для поисковика
│ ├── searchWidget.js // Скрипт виджета поиска
│ ├── autocompleter.js // Вспомогательный скрипт поиска (автозаполнение ключевыъ слов)
│ └── searcher.js // Скрипт поиска и фильтрации
|
| // Структура исходных файлов
├── md
│ ├── Section1 // Раздел 1 и страницы раздела
│ │ ├── page1.md
│ │ └── page2.md
│ ├── Section2
| | ├── SubSection1
│ │ │ └── page5.md
│ │ ├── page3.md
│ │ └── page4.md
│ ├── build.py // Билд-скрипт
│ └── validate.py // Скрипт для валидации страницы
|
| // Готовые html-страницы
├── index.html
├── Section1
│ ├── page1.html
│ └── page2.html
├── Section2
| ├── SubSection1
│ │ └── page5.html
│ ├── page3.html
│ └── page4.html
Исходные .md файлы рассортированы в папки, не более 2х уровней глубины. В конфиге билд-скрипте задана структура первого уровня, структуры второго уровня задаются непосредственно в метаданных головной страницы.
Данные хранятся и редактируются в .md страницах, которые затем будут конвертирваны в html страницы билд-скриптом. Страницы должны использовать стандартный markdown syntax с некоторыми расширениями.
Первой строкой должна идти строка метаданных вида
@Meta(key1=value1, key2=value2, key3=value3) NORENDER
пары ключ-значения разделяются запятыми. Ключи:
Position=1...n
- определяет положение страницы в дропдауне, чем меньше значение, тем выше в дропдауне будет отображена страница;Hide=1/0
- при значении 1 - исключает страницу из дропдауна;Title=some text
- имя страницы в дропдауне (если не задано, то берем заголовок первого уровня);Subpages=Name
- имя директории со страницами для второго уровня дропдаунов.~Shift~
— кнопки клавиатуры (тег <kbd></kbd>
)^mark^
— выделение текста серым фоном (тег <mark></mark>
)^^highlight^^
— выделение текста "маркером" (тег <highlight></highlight>
)!warn!
— выделение текста красным (тег <warn></warn>
)^warn^[%color%]
— выделение текста цветом (тег <warn></warn>
)Список секций хардкодится в билд-скрипт - имя дропдауна и папка для страниц. Порядок секций в навигационной панели тоже задается в билд-скрипте.
SECTION_CONFIGURATION = {
"order": ["_docs", "_sop", "_tco", "_mmo", "_srv"], # Порядок следования секций в navbar'е
# Описание секции
"_sop": {
"title": "SOPs", # Отображаемое название секции в navbar'e
"tooltip": "Standard Operation Procedures", # Текст для всплывающего текста при наведении (опционально), html-свойство title
"src": "SOP" # Имя папки первого уровня где хранятся страницы
},
"_docs": {
"title": "Документация",
"src": "Docs"
},
"_tco": {
"title": "TCO",
"tooltip": "Training Center Office",
"src": "TCO"
}
...
};
Все страницы в указанной папке для секции рассматриваются как элементы дропдауна. При этом исходя из метаданныз конкретной страницы задается сам факт добавления страницы в дропдаун (флаг Hide
), положение страницы в дропдауне (ключ Position
) и отображаемое название страницы в дропдауне (ключ Title
).
Если в метаданных страницы имеется не пустой ключ Subpages
, то для данной страницы в дропдауне добавляется дропдаун 2го уровня и наполняется страницами найденными в директории /md/<SomeSection>/<Subpages_Value>/
(например, на странице /md/MMO/tsFramework.md
в метаданных указано Subpages=tSF
, дропдаун 2го уровня будет собран из страниц в /md/MMO/tSF/*.md
).
Дропдаун 2-го уровня может быть двух видов:
Subpages
и ключ Hide=0
(или не имеет ключа Hide
) - то дропдаун второго уровня начинается на кликабельном элементе (шаблон HTML_DROPDOWN_EXTENDED
) (т.е. можно как открыть корневую страницу, так и подстраницы)Subpages
и ключ Hide=1
- то дропдаун второго уровня начинается на некликабельном элементе (шаблон HTML_DROPDOWN_EXTENDED_INACTIVE
) (т.е. корневая страница не доступна, открыть можно только подстраницы)SECTION_CONFIGURATION
и формируется базовая структура navbar'аTitle
, то найти и вычитать заголовок первого уровняSubpages
- считываем все .md файлы в соответствующей суб-директорииPosition
)Title
или заголовок первого уровня)Subpages
)Hide=1
, тем не менее если одновременно есть непустой ключ Subpages
- то добавляем элемент по шаблону HTML_DROPDOWN_EXTENDED_INACTIVE - т.е. не выбираемый элемент с дропдауном второго уровня)Из метаданных берем значение ключа Title (если есть)
Удаляем метаданные (@Meta(...)
)
|...|...|
)Вычлененные заголовки (Mata.Title или заголовок #
) имеют отдельную роль в формировании страницы. Если значение Meta.Title задано, то используем его в HTML-заголовке страницы (чтобы на вкладке браузера было видно что за страница открыта). Если Meta.Title не задан, то везде используется первый найденный заголовок первого уровня - в HTML-заголовке страницы и как название статьи (выделено отдельным элементом, см. шаблоны).
<div class="navbar"> <!-- Собственно панель с разделами -->
<div class="dropdown"> <!-- Блок задающий раздел -->
<button class="dropbtn">SOP</button> <!-- Заголовок раздела - тут SOP -->
<div class="dropdown-content"> <!-- Блок элементов дропдауна -->
<a href="#">Графические меры контроля</a> <!-- Элемент дропдауна, где href = ссылка на соответствующую страницу-->
<a href="#">Формации</a>
</div>
</div>
</div>
</div>
{head}
- шаблон HTML_HEAD
{body}
- шаблон HTML_BODY
HTML_PAGE = '''<!DOCTYPE html>
<html>
<head>
{head}
</head>
<body>
{body}
</body>
</html>'''
{title}
-- заголовок страницы (Meta.Title или первый #
)HTML_HEAD = '''
<meta charset="utf-8"/>
<title>tS Docs - {title}</title>
<link rel="icon" href="src/img/ts_icon.png">
<link rel="stylesheet" href="src/style.css">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
'''
{navbar}
-- навигационная панель{title}
-- заголовок страницы (первый #
){toc}
-- table of content страницы{article}
-- сам текст страницы (распаршенный markdown)HTML_BODY = '''
<div id="header">
<div id="header-title">
<span><a href="https://tacticalshift.github.io" style="text-decoration: none; color: inherit;">tS</a></span> <tt id='header-sans'>Docs</tt>
</div>
{navbar}
</div>
<div id="wrapper">
<div class="title"><h1>{title}</h1></div>
<div class="toc">
{toc}
</div>
<div class="article">
{article}
</div>
</div>
'''
{dropdowns}
-- секции-дропдауныHTML_NAVBAR_SECTION = '''
<div class="navbar">
{dropdowns}
</div>
'''
{title}
-- название секции (из SECTION_CONFIGURATION
){tooltip}
-- подсказка для названия секции (из SECTION_CONFIGURATION[sectionName]["tooltip"]
){elements}
-- элементы спискаHTML_DROPDOWN_SECTION = '''
<div class="dropdown">
<button class="dropbtn" title="{tooltip}">{title}</button>
<div class="dropdown-content">
{elements}
</div>
</div>
'''
{url}
-- относительная ссылка на страницу{title}
-- заголовок страницы (из Meta.Title или первого #
)HTML_DROPDOWN_ELEMENT = '<a href="{url}">{title}</a>'
{url}
-- относительная ссылка на страницу{title}
-- заголовок страницы (из Meta.Title или первого #
){subpages}
-- элементы дропдауна второго уровня (элементы по шаблону HTML_DROPDOWN_ELEMENT
)HTML_DROPDOWN_EXTENDED = '''
<div class="dropdown-2l">
<a href="{url}">{title}<arrow>⇨</arrow></a>
<div class="dropdown-2l-content">
{subpages}
</div>
</div>
'''
{title}
-- заголовок страницы (из Meta.Title или первого #
){subpages}
-- элементы дропдауна второго уровня (элементы по шаблону HTML_DROPDOWN_ELEMENT
)HTML_DROPDOWN_EXTENDED_INACTIVE = '''
<div class="dropdown-2l">
<span>{title}<arrow>⇨</arrow></span>
<div class="dropdown-2l-content">
{subpages}
</div>
</div>
'''