-
Notifications
You must be signed in to change notification settings - Fork 59
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Добавить версию в PDF #182
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Офигенно, работает 🥳
Спасибо!
Я попробовал предложить идеи, как можно упростить код генератора. Посмотри, пожалуйста, что думаешь об этом?
Возможно, эти идеи уже приходили в голову, и были причины, чтобы их отмести? Тогда расскажи, пожалуйста, что именно вызвало проблемы — чтобы это сохранилось в истории репозитория. Возможно, это понадобится в будущем.
services/BookBuilder/glossary.ts
Outdated
let markdown = '' | ||
const keys = Object.keys(glossary.terms).sort() | ||
|
||
keys.forEach((definite) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А мы можем сделать ненумерованный список? Будет и семантичнее, шаблон «склейки» будет выглядеть лучше, и результат рендера будет больше похож на список.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если у PDF какие-то проблемы с отображением списков, то пофиг.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Теперь глоссарий - это unordered list. Также добавил проверку на наличие аббревиатур. Если ни одна не будет найдена, то глоссарий не будет добавлен в книгу.
.eslintignore
Outdated
@@ -1,2 +1,3 @@ | |||
node_modules | |||
*.d.ts | |||
services/BookBuilder/*.ts |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мне кажется, лучше подправить линтер, если там есть какие-то ошибки. Потому что этот код мы пишем сами, и с одной стороны у нас полный контроль над ним, а с другой лучше все ограничения автоматизировать.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ага, пришлось так сделать из-за того что многие зависимости начали использовать конструкцию "import type {}", которая появилась только в TS 3.8.
Тогда лучше дождусь момента, когда будет вмержен PR и тогда эти игноры больше не понадобятся.
services/BookBuilder/mdx.ts
Outdated
@@ -0,0 +1,54 @@ | |||
import { readFileSync } from 'fs' | |||
|
|||
import { Markdown } from './md' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Кажется, тут есть циклические зависимости? Можно попробовать распилить интерфейс и реализацию, как вариант.
Возможно, стоит подумать в сторону концептуального разделения «работы с файловой системой» и «работой с текстовым содержимым». Тогда можно будет упростить API «сервиса файловой системы», сделав его более универсальным.
Сейчас легко запутаться между “mdx” и “md”, потому что структура и иерархия похожи и реализация во многом повторяется. Разделение, вероятно, может помочь урезать количество кода.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это же, кстати, может помочь избавиться от чрезмерной детализации в index.ts
, где мы руками создаём классы для разделов и подразделов.
Вероятно, может помочь тип данных, в котором будет описываться раздел с соответствующими для него подразделами. (Ну, или если отдаться в пуризм, то два типа, один для работы с FS, другой для работы с данными.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отрефакторил код.
-
Теперь mdx и md наследуются от общего класса.
-
Теперь мы заранее описываем отдельную структуру-объект, и на ее основе наполняем книгу контентом из .mdx-файлов в отдельной функции.
services/BookBuilder/mdxToMd.ts
Outdated
// удаляем лишние элементы из markdown | ||
const changeNode: Test = (el, index, parent) => { | ||
if (invalidTypes.includes(el.type)) { | ||
// исключаем все не-markdown элементы |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я бы, наверное, комментарии заменил на функции, в названиях которых бы выразил намерение:
function isForbiddenElement(el) {
return invalidTypes.includes(el.type)
}
// ...
if (isForibddenElement(el)) { /* ... */ }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ок, заменил на функции
services/BookBuilder/mdTree.ts
Outdated
} | ||
|
||
addTableOfContents = (markdown: Markdown) => { | ||
const treeRoot4 = unified().use(remarkToc, { heading: 'Содержание' }).runSync(this.parse(markdown)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
treeRoot4
: почему 4? :–)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
убрал, спасибо
Я там, кстати, ещё зависимости обновляю, и это может затронуть глоссарий :–( |
Судя по коммитам, глоссарий теперь больше не нужен. И контент, на основе которого он собирался будет удален. Хорошо, тогда уберу логику сборки глоссария из PR. |
Co-authored-by: Alex <bespoyasov@me.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Офигенно! Спасибо большое, от меня жирный лайк :—)
P.S. Я вмёржил PR с обновлением зависимостей, который блокировал линтер, останется только конфликты порезолвить.
services/BookBuilder/markdown.ts
Outdated
} | ||
} | ||
|
||
export abstract class MarkdownTreeMarkdownAdapter { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Единственное только, вероятно, лучше вынести адаптер в отдельный модуль, из-за него сейчас markdown
и markdownTree
в циклической зависимости друг от друга.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Готово! Оказалось что в eslint не было настроено правило для поиска циклических зависимостей в *.ts-файлах, поэтому я их не видел.
Если нужно, могу добавить это правило в этом или в отдельном PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Каеф, спасибо!
Можно в отдельном PR, да.
Я на неделе ещё раз пробегусь по коду, если что-то найду, поправлю и где-то ближе к выходным вмёржу :—)
Мёржу! 🎉 |
Ура! |
Спасибо за помощь и участие ^_^ |
#140
Описание
PR добавляет логику создания PDF на основе уже имеющихся данных из *.mdx файлов.
Данные конвертируются следующим образом: mdx -> md -> pdf
Основная идея была в том, чтобы не менять mdx файлы.
Фичи
Что не получилось сделать:
Нужно описать объект вида [ссылка]: [якорь, ведущий к нужному подразделу книги] и добавить якоря в нужные места
Особенности
Из-за того что remark-плагины отдают только esm-модули, а в next.js падает сборка при установке type: module в -package.json, решено пока что собирать скрипт отдельно с помощью esbuild. (В дальнейшем можно перейти на ts-node, так как он уже поддерживает esm-модули)
Пример получившегося файла:
solid_book.pdf
Скриншоты
Верстка
Структура классов