Giter Club home page Giter Club logo

platform's Introduction

Платформа Доки

Статус линтера W3C Validator Статус деплоя Статус Docker

⚠️ Если сайт Доки медленно загружается или не работает совсем

Дока — это добрая энциклопедия для веб-разработчиков. Наша цель — сделать документацию по веб-разработке практичной, понятной и не унылой.

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

Этот репозиторий содержит платформу для сайта «Дока». Платформа собирает статьи из отдельного репозитория.

Как устроен сайт

Сайт «Доки» работает на базе Eleventy. При помощи Nunjucks-темплейтов Eleventy превращает статьи в формате Markdown в HTML-страницы.

Проект собирается с помощью GitHub Actions и хостится на сервере, читайте подробнее про деплой.

Как работать

Для работы с платформой вам потребуется Node.js и npm.

Чтобы запустить Доку локально, нужно:

  1. Скачать репозиторий.
  2. Сделать копию файла .env.example и назвать его .env. Задать в нём нужные переменные окружения.
  3. Установить зависимости командой npm i.
  4. Запустить локальный веб-сервер командой npm start.

Больше вариантов локального запуска Доки — в руководстве по запуску.


Код распространяется по лицензии MIT, шрифты имеют собственные лицензии, подробнее читайте в документации.

Как запускать тесты

Мы используем Jest. Добавьте свои тесты. Для этого добавьте файлы тестов в папку __tests__. Файл с тестом лучше называть также, как файл, который тестируется.

Запустите тесты командой npm test. Чтобы запустить тесты в watch режиме, используйте дополнительный флаг --watch: npm test -- --watch.

Как дебажить?

Запустите команду npm run debug и откройте в Chrome кладку chrome:://inspect.

Найдите нужную сессию в списке. Нажимайте inspect и запускайте отладку.

По-умолчанию отладчик сразу остановится. Чтобы добавить больше точек остановки добавьте в ваш код debugger; или найдите нужный файл и поставьте точку прямо в интерфейсе отладчика.

platform's People

Contributors

cergmin avatar cherrynik avatar denisputnov avatar dependabot-preview[bot] avatar dependabot[bot] avatar devcustrom avatar edbond88 avatar fpetrakov avatar furtivite avatar golubevds avatar hcz avatar hellsquirrel avatar igsekor avatar inventoris avatar lehano-a avatar lex111 avatar monochromer avatar nlopin avatar nulladdict avatar pepelsbey avatar reddeniels avatar saimon398 avatar skorobaeus avatar solarrust avatar tachisis avatar tatianafokina avatar teleginzhenya avatar vaiil avatar vitya-ne avatar xxtereshko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

platform's Issues

Реализовать возможность копирования кода из сниппета

В статьях мы приводим много сниппетов кода. Было бы круто дать возможность одной кнопкой скопировать этот код чтобы вставить потом куда-то в другое место: текстовы йредактор или песочницу.

  1. Кнопка должна появляться при наведении курсора на блок кода.
  2. Код должен копироваться с соблюдением форматирования.

image

Преобразование картинок

Для уменьшения веса и большей поддержки картинок, а так же для оборачивания их в тег <figure> (чтобы иметь возможность добавить подпись при необходимости), предлагается использовать плагин Image из eleventy.

Пример работы плагина можно посмотреть в репозитории.

Возможные проблемы, которые надо исследовать:

  • приём src при сборке из другого репозитория
  • работа с *.gif и *.svg без преобразования в *.webp и *.jpeg
  • работа с *.png там где необходим прозрачный фон

P.S. Я помню, что от *.gif планировали отказаться.

Рефакторинг слоёв

Итоговая версия

Было:

  • Архитектура «матрёшка», где было много зависимых слоёв, которые встраивались друг в друга.
  • Из-за наличия множества встраиваний через {{ content | safe }} происходила деформация контента и было невозможно встроить необходимые плагины (например Images #3)
  • Если необходимо создать страницу с боковой панелью, нужно дописывать недостающие модули в *.njk-файлах для каждой конкретной страницы.

Сделать:

  • Упрощённую систему слоёв, где при создании нового контента выбираются нужные независимые элементы.
  • Организовать реиспользуемые блоки в качестве инклюдов.

Добавить стили для заголовков 4-го уровня

Сейчас трудно понять, что «Бесшовность» или «Быстродействие» — это заголовки, а это нужно для быстрого «сканирования» содержания по заголовкам, особенно в лонгридах.

«Screenshot» 2020-11-25 at 11 38 37

Я бы предложил как минимум выделить их жирным, но нужно мнение дизайнеров.

P.S. Технически мы можем в лонгридах убрать заголовок «Как понять» второго уровня и поднять всю иерарихю подзаголовков повыше, но это несистемное решение 🙂

Исправить ошибки linthtml

В репозитории появился htmllint (#433). Сейчас он показывает 243 ошибки (96 в шаблонах и 147 в статьях). Нужно их исправить.

Запустить скрипт проверки можно командой:

  • npm run linthtml:templates для проверки шаблонов
  • npm run linthtml:content для статей

Возможно, что часть ошибок не получиться исправить из-за того, что мы валидируем html у шаблонов. Это может вводить линтер в ступор. Такие ошибки обсуждаем отдельно и принимаем решение разово игнорировать ошибку или отключать правило.

Научить маркдаун работать с picture и вложенными в него source

О чем это?

Необходимо дать возможность при помощи makdown добавлять новые источники изображений

Сейчас картинка вставляется так

![Дока](/assets/images/logo/logo.png)

результат получаем такой

<img src="/assets/images/logo/logo.png" alt="Дока">

Что должно получиться

  1. Автоматически добавлять обёртку в виде <picture>
<picture>
    <img src="/assets/images/logo/logo.png" alt="Дока">
</picture>
  1. Добавлять внутрь тега <picture> нужные источники изображений

пишем:

![Дока](/assets/images/logo/logo.png|(/assets/images/logo/logo.svg|type:image/svg+xml))

получаем:

<picture>
    <source srcset="/assets/images/logo/logo.svg" type="image/svg+xml">
    <img src="/assets/images/logo/logo.png" alt="Дока">
</picture>
  1. Добавлять внутрь тега размеры для retina

пишем:

![Дока](/assets/images/logo/logo.png|:(/assets/images/logo/logo.png|2x)|(/assets/images/logo/logo.svg|type:image/svg+xml))

получаем:

<picture>
    <source srcset="/assets/images/logo/logo.svg" type="image/svg+xml">
    <img srcset="/assets/images/logo/[email protected] 2x, /assets/images/logo/logo.png" src="/assets/images/logo/logo.png" alt="Дока">
</picture>
  1. Добавлять media-источники

пишем:

![Дока](/assets/images/logo/logo.png|:(/assets/images/logo/logo.png|2x)|(https://y-doka.site/assets/images/logo/logo.svg|type:image/svg+xml)|(/assets/images/logo/logo.png|2x)|(/assets/images/logo/logo-small.png|media:max-width:600px))

получаем:

<picture>
    <source srcset="/assets/images/logo/logo.svg" type="image/svg+xml">
    <source srcset="/assets/images/logo/logo-small.png" media="(max-width: 600px)">
    <img srcset="/assets/images/logo/[email protected] 2x, /assets/images/logo/logo.png" src="/assets/images/logo/logo.png" alt="Дока">
</picture>

Обозначить строки в терминале

Строки для примеров из терминала традиционно начинают с символа $, чтобы показать, что это именно команда терминала.

Пример вывода:

$ git add .
$ git commit -m 'Добавляет коммит'

При этом в терминале символ $ не пишется. Значит для удобства пользователей он не должен копироваться.

Применяться в тексте должно стандартно с указанием языка

Наш пример

    ```bash
    git add .
    git commit -m 'Добавляет коммит'
    ```

Необходимо придумать решение на CSS, как этот функционал реализовать.

Для подсветки кода используется prism (существующая настройка плагина scss, js).

Поиск по контенту

В текущей версии доки реализован базовый поиск:

  • при сборке собирается json с метаданными, доступный по https://y-doka.site/search-data.json
  • когда пользователь начинает печатать, платформа запрашивает файл и ищет совпадение простым case-insensitive вхождением

В новой модной платформе хочется вариант покруче. Проработан вариант работы с помощью ElasticSearch, но хочется поискать другие варианты.

Требования:

  • полнотекстовый нечёткий поиск или что-то сравнимое
  • толерантность к опечаткам
  • возможность использовать синонимы (например, promise, промис)
  • быстрый ответ и нерастущие со временем runtime расходы на запрос (с двухкратным увеличением количества контента, поиск не должен стать в два раза медленнее)

Транспиляция JS: Babel

Предлагается использовать для поддержки большего количества браузеров и для сборки JS-модулей Babel.

Его поддержка есть в eleventy (вот тут ссылка), устанавливается в виде зависимости eleventy-plugin-babel.

Можно не тянуть целый webpack, если он нам не нужен, и использовать только на deploy- или build-сборках.

Организовать оглавление

  • Оглавление должно быть разбито на статьи и доку
  • Оглавление должно подключаться на страницу с оглавлением

Платформа не запускается локально

Всё работало нормально, но сегодня я сделала git pull :) И вот что происходит:

$ npm start

> start
> eleventy --serve --quiet

Eleventy fatal error: (more in DEBUG output)
> Error in your Eleventy config file 'T:/Doka/new-site/platform/.eleventy.js'. You may need to run `npm install`.

`EleventyConfigError` was thrown
> Cannot find module 'markdown-it-anchor'
Require stack:
- T:\Doka\new-site\platform\.eleventy.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateConfig.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\Config.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateEngineManager.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\EleventyExtensionMap.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateRender.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateData.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\Eleventy.js
- T:\Doka\new-site\platform\node_modules\@11ty\eleventy\cmd.js

`Error` was thrown:
    Error: Cannot find module 'markdown-it-anchor'
    Require stack:
    - T:\Doka\new-site\platform\.eleventy.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateConfig.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\Config.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateEngineManager.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\EleventyExtensionMap.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateRender.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\TemplateData.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\src\Eleventy.js
    - T:\Doka\new-site\platform\node_modules\@11ty\eleventy\cmd.js
        at Function.Module._resolveFilename (internal/modules/cjs/loader.js:885:15)
        at Function.Module._load (internal/modules/cjs/loader.js:730:27)
        at Module.require (internal/modules/cjs/loader.js:957:19)
        at require (internal/modules/cjs/helpers.js:88:18)
        at Object.<anonymous> (T:\Doka\new-site\platform\.eleventy.js:10:26)
        at Module._compile (internal/modules/cjs/loader.js:1068:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
        at Module.load (internal/modules/cjs/loader.js:933:32)
        at Function.Module._load (internal/modules/cjs/loader.js:774:14)
        at Module.require (internal/modules/cjs/loader.js:957:19)

Делаю npm install, как он и предлагает:

$ npm install
npm ERR! code EBADENGINE
npm ERR! engine Unsupported engine
npm ERR! engine Not compatible with your version of node/npm: undefined
npm ERR! notsup Not compatible with your version of node/npm: undefined
npm ERR! notsup Required: {"node":"14.x","npm":"6.x"}
npm ERR! notsup Actual:   {"npm":"7.14.0","node":"v14.17.0"}

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\wizzz\AppData\Local\npm-cache\_logs\2021-05-21T09_35_32_972Z-debug.log

Версии такие:

$ node -v
v14.17.0

$ npm -v
7.14.0

Ось вин 10.

Не собирается сборка, проблема с модулем

Не запускается сборка командой npm run build. Выводится ошибка:

Error: Cannot find module 'esbuild'

Ниже логи:

0 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'run', 'build' ]
1 info using [email protected]
2 info using [email protected]
3 timing npm:load:whichnode Completed in 1ms
4 timing config:load:defaults Completed in 3ms
5 timing config:load:file:/usr/local/lib/node_modules/npm/npmrc Completed in 2ms
6 timing config:load:builtin Completed in 2ms
7 timing config:load:cli Completed in 1ms
8 timing config:load:env Completed in 0ms
9 timing config:load:file:/Users/furtivite/Developer/platform/.npmrc Completed in 0ms
10 timing config:load:project Completed in 1ms
11 timing config:load:file:/Users/furtivite/.npmrc Completed in 0ms
12 timing config:load:user Completed in 0ms
13 timing config:load:file:/usr/local/etc/npmrc Completed in 0ms
14 timing config:load:global Completed in 0ms
15 timing config:load:validate Completed in 0ms
16 timing config:load:setEnvs Completed in 1ms
17 timing config:load Completed in 8ms
18 timing npm:load:configload Completed in 8ms
19 timing npm:load:setTitle Completed in 0ms
20 timing npm:load:setupLog Completed in 1ms
21 timing npm:load:cleanupLog Completed in 2ms
22 timing npm:load:configScope Completed in 0ms
23 timing npm:load:projectScope Completed in 1ms
24 timing npm:load Completed in 13ms
25 timing config:load:flatten Completed in 2ms
26 timing command:run Completed in 5011ms
27 verbose stack Error: command failed
27 verbose stack     at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/@npmcli/promise-spawn/index.js:64:27)
27 verbose stack     at ChildProcess.emit (events.js:315:20)
27 verbose stack     at maybeClose (internal/child_process.js:1048:16)
27 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)
28 verbose cwd /Users/furtivite/Developer/platform
29 verbose Darwin 20.3.0
30 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "build"
31 verbose node v14.16.0
32 verbose npm  v7.7.0
33 error code 1
34 error path /Users/furtivite/Developer/platform
35 error command failed
36 error command sh -c eleventy && gulp
37 verbose exit 1

Не собирается сборка на хайзенберге

12:39:15 PM: Build ready to start
12:39:17 PM: build-image version: 7b53c5fc4445e3ec99d3949e5d1174a8c5be4f16
12:39:17 PM: build-image tag: v3.7.2
12:39:17 PM: buildbot version: a8df6d1263bb5bcc16f7b4ebb8e9a6cb904cfa8a
12:39:17 PM: Fetching cached dependencies
12:39:17 PM: Starting to download cache of 104.6MB
12:39:18 PM: Finished downloading cache in 880.277457ms
12:39:18 PM: Starting to extract cache
12:39:21 PM: Finished extracting cache in 3.289289359s
12:39:21 PM: Finished fetching cache in 4.195293628s
12:39:21 PM: Starting to prepare the repo for build
12:39:21 PM: git ref refs/heads/platform-build-script does not exist or you do not have permission
12:39:21 PM: Creating deploy upload records
12:39:22 PM: Failing build: Failed to prepare repo
12:39:22 PM: Failed during stage 'preparing repo': git ref refs/heads/platform-build-script does not exist
12:39:22 PM: Finished processing build request in 4.906709418s

Создать конфигурационный файл доки

Создать конфигурационынй файл .doka.json или аналогичный. Поместить в него первое свойство конфигурации — массив папок с контентом, которые мы забираем из репозитория content

Зачем

В платформе есть одинаковые значения, которые появляются в различных файлах, но обозначают одно и то же. Пример на поверхности — название папок внутри репозитория content, которые содержат материалы: js, css, html, tools. Они указаны и в make-links.js, в Dockerfile и появляются в пул реквестах

Уменьшение количества слоев Dockerfile

Согласно рекомендациям команды Docker (https://docs.docker.com/develop/dev-best-practices/#how-to-keep-your-images-small), число слоев предлагается уменьшать, если это возможно. Рекомендация способствует уменьшению образа и кэша от образа. Поэтому есть предложение изменить Dockerfile на следующий вариант:

FROM node:lts-alpine

WORKDIR /platform
COPY . .

RUN npm install \
&& ln -sf ../content/css src/css \
&& ln -sf ../content/js src/js \
&& ln -sf ../content/html src/html

VOLUME /platform/content
EXPOSE 8080

ENTRYPOINT ["npm", "start"]

У меня образ собрался без проблем.

Получается четыре слоя вместо семи. Уменьшение слоев будет способствовать оптимизации хранения образов. Это особенно важно, если образ будет усложняться.

Добавить якоря на имена авторов в блок «В работе»

Сейчас на заголовки внутри блока «В работе» (имена авторов) не вешаются якоря. Это происходит потому, что ссылки проставляются только заголовкам внутри лейаута articles.njk, а мнения находятся отдельно в practices.njk.

Придумать уникальные aria-label в якорях

В #116 были введены якоря с одинаковым 'aria-label': 'Этот заголовок',, это необходимо, чтобы не имеющий значения символ был понятен людям, которые пользуются скринридером.

Тем не менее, возможно неправильно указывать везде одинаковый aria-label — нужно продумать этот момент.

Поправить favicons

У текущих фавиконок закруглённые углы. Нужно сделать их квадратными. Закругления сделает ОС.

Завести тестовый контент

Необходимо завести тестовую страницу с тестовым контентом, где упомянуть все варианты отображения текста со снипетами.

Добавить к сборке валидатор W3C

Чтобы при пулреквесте финальная сборка платформы проверялась на валидность.

Что это даёт:

  1. Ловит ошибки вложенности или незакрытые блоки
  2. Показывает атрибуты в неправильных местах
  3. Помогает совместимости вёрстки
  4. Улучшает итоговую доступность разметки

Есть несколько вариантов добавить, можно здесь поразмышлять.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.