Medium — отличная платформа для обмена сообщениями в блоге с более широкой аудиторией, но немного раздражает то, что для того, чтобы иметь фрагменты кода, вам нужно создать GitHub Gist (или другие) и встроить его в сообщение.

Поскольку я пишу много руководств в своем блоге, добавление всех моих фрагментов кода один за другим в GitHub Gist занимает много времени, а я очень ленив, поэтому давайте автоматизируем это.

Фрагменты кода на Гэтсби

Чтобы добавить фрагменты кода в Gatsby, вам нужно только использовать тройную обратную кавычку уценки и язык, который вы используете, как в примере ниже.

```javascript
    console.log('hello world!');
```

При этом Gatsby сгенерирует HTML-код, подобный приведенному ниже. Это будет важно позже.

Проблема

У Medium есть очень полезный инструмент для импорта любого поста из любого места в историю Medium, но, к сожалению, каждый фрагмент кода будет проигнорирован им.

В идеале я мог бы иметь специальный URL-адрес для своих сообщений в блоге, где все мои фрагменты кода были бы заменены URL-адресом GitHub Gist с этим кодом, и это именно то, что я собираюсь сделать дальше 😎.

Создание специального URL для Medium

Я хочу иметь возможность добавлять /medium-import в конец URL-адреса сообщений в блоге и загружать специальную страницу сообщений со всеми фрагментами кода, замененными GitHub Gists.

На файле gatsby-node.js в функции createPages я создам дополнительную страницу с путем /medium-import в конце.

Ко всем моим сообщениям в блоге теперь можно получить доступ через /blog-post-url, а также /blog-post-url/medium-import.

Генерация другого HTML для Medium

Для функции generateMediumHTML я буду использовать querySelectorAll, чтобы найти все узлы HTML с фрагментами кода и заменить их URL-адресами GitHub Gists.

Поскольку весь этот код будет выполняться на Node, мне понадобится jsdom, чтобы иметь возможность манипулировать файлом HTML DOM.

Все фрагменты кода будут заменены на <div class="gatsby-highlight" data-language="javascript">https://gist.github.com/some-gist-id</div>.

Использование API-интерфейса GitHub Gist

Я буду использовать GitHub Gist API для двух целей: получить все мои существующие Gist, чтобы избежать создания одного и того же Gist дважды с запросом GET, и создать новый Gist с запросом POST.

Поскольку код будет выполняться в Node, я буду использовать node-fetch для запросов API.

Для функции generateGistUrlsForPost я снова буду использовать функцию querySelectorAll, чтобы получить код через свойство textContent, а затем отправить его на GitHub через Gist API, для этого мне понадобится GitHub Personal Access Token.

Рендеринг нового HTML

В шаблоне компонента React у меня есть доступ к новому атрибуту с именем mediumHTML внутри pageContext, и это новый HTML со всеми фрагментами кода, замененными на GitHub Gists.

Теперь я могу зайти в Инструмент импорта носителя и импортировать любой пост через файл /blog-post-url/medium-import.

Со всей этой автоматизацией ожидайте увидеть гораздо больше Публикаций в Medium от меня 😊.

Первоначально опубликовано на https://pablo.gg.

Дополнительные материалы на plainenglish.io