2025-02 ПСКОВ 2 готов на 50% | PSKOV 2 is 50% ready

This commit is contained in:
2025-02-11 22:37:37 +03:00
parent 37dbf82d7f
commit 3869d5b841
23 changed files with 743 additions and 263 deletions

View File

@@ -0,0 +1,82 @@
Title: ПСКОВ 2 на JVM
Date: 2025-02-11 00:00
Category: News
Slug: psk-jvm-item
Lang: ru
![splash][splash]
# Генерация отдельных страниц
В январе сделал половину функциональности оригинального ПСКОВа на Kotlin для JVM,
а именно: генерацию отдельных страниц HTML из Markdown.
И ПСКОВ 1, и ПСКОВ 2 генерируют файлы HTML, которые отображаются идентично
в веб-браузерах. Тем не менее, содержимое этих сгенерированных файлов отличается,
т.к. ПСКОВ 1 использует [Showdown][showdown] для конвертации Markdown в HTML,
а ПСКОВ 2 - [intellij-markdown][intellij-markdown].
Взглянем на описываемую разницу. Допустим, у нас есть следующая страница Markdown:
```
Simple page in **Markdown** to convert to **HTML**.
| № | Parser | Language |
|---|--- |--- |
| 1 | [Showdown][showdown] | JavaScript |
| 2 | [intellij-markdown][intellij-markdown] | Kotlin |
[intellij-markdown]: https://github.com/JetBrains/markdown
[showdown]: https://github.com/showdownjs/showdown
```
ПСКОВ 1 генерирует следующий файл HTML:
```
<p>Simple page in <strong>Markdown</strong> to convert to <strong>HTML</strong>.</p>
<table>
<thead>
<tr>
<th>№</th>
<th>Parser</th>
<th>Language</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="https://github.com/showdownjs/showdown">Showdown</a></td>
<td>JavaScript</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://github.com/JetBrains/markdown">intellij-markdown</a></td>
<td>Kotlin</td>
</tr>
</tbody>
</table>
```
ПСКОВ 2:
```
<body><p>Simple page in <strong>Markdown</strong> to convert to <strong>HTML</strong>.</p><table><thead><tr><th>№</th><th>Parser</th><th>Language</th></tr></thead><tbody><tr><td>1</td><td><a href="https://github.com/showdownjs/showdown">Showdown</a></td><td>JavaScript</td></tr><tr class="intellij-row-even"><td>2</td><td><a href="https://github.com/JetBrains/markdown">intellij-markdown</a></td><td>Kotlin</td></tr></tbody></table></body>
```
А вот как оба файла отображаются в веб-браузере:
![result][result]
Идентичное отображение двух различающихся файлов.
Мой внутренний перфекционист, конечно, возмущён несоответствием, но мой
внутренний прагматик считает эту разницу несущественной.
# Февраль
В феврале доведу конвертер межъязыкового диалекта до генерации Context.
[intellij-markdown]: https://github.com/JetBrains/markdown
[result]: ../../images/2025_psk-jvm-item_result.png
[showdown]: https://github.com/showdownjs/showdown
[splash]: ../../images/2025_psk-jvm-item.png

View File

@@ -25,6 +25,27 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="psk-jvm-item.html">ПСКОВ 2 на JVM</a>
</h2>
<p class="news_item_date">
2025-02-11 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2025_psk-jvm-item.png" alt="splash" /></p>
<h1 id="">Генерация отдельных страниц</h1>
<p>В январе сделал половину функциональности оригинального ПСКОВа на Kotlin для JVM,
а именно: генерацию отдельных страниц HTML из Markdown.</p>
<p>И ПСКОВ 1, и ПСКОВ 2 генерируют файлы HTML, которые отображаются идентично
в веб-браузерах. Тем не менее, содержимое этих сгенерированных файлов отличается,
т.к. ПСКОВ 1 использует <a href="https://github.com/showdownjs/showdown">Showdown</a> для конвертации Markdown в HTML,
а ПСКОВ 2 - <a href="https://github.com/JetBrains/markdown">intellij-markdown</a>.</p>
<p>Взглянем на описываемую разницу. Допустим, у нас есть следующая страница Markdown:. . .</p>
</div>
<div class="news_item_more">
<a href="psk-jvm-item.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="year24.html">Итоги 2024-го года</a>
</h2>
@@ -202,31 +223,6 @@ Python в JavaScript. Этого не произошло, потому что п
<div class="news_item_more">
<a href="memory-text-ui.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="memory-logic.html">Игровая логика «Памяти»</a>
</h2>
<p class="news_item_date">
2024-05-03 00:00
</p>
<div class="news_item_contents">
<h1 id="">Игровая логика «Памяти»</h1>
<p>В апреле реализовал игровую логику игры «Память» на Python в виде модели ограниченного языка и успешно перевёл её инструментом в C++.</p>
<p>Модель ограниченного языка предполагает следующую архитектуру из двух частей:</p>
<ol>
<li>контекст состояния</li>
<li>чистые функции без побочных эффектов, работающие лишь с контекстом</li>
</ol>
<p>Контекст состояния игровой логики на Python получился следующим (<a href="https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory_Context.h">C++</a>):</p>
<p>```python
class memory_Context:
def <strong>init</strong>(self):
self.hiddenItems = []
self.mismatchedItems = []. . .</p>
</div>
<div class="news_item_more">
<a href="memory-logic.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 1 из 8</p>
<p>

View File

@@ -25,6 +25,31 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="memory-logic.html">Игровая логика «Памяти»</a>
</h2>
<p class="news_item_date">
2024-05-03 00:00
</p>
<div class="news_item_contents">
<h1 id="">Игровая логика «Памяти»</h1>
<p>В апреле реализовал игровую логику игры «Память» на Python в виде модели ограниченного языка и успешно перевёл её инструментом в C++.</p>
<p>Модель ограниченного языка предполагает следующую архитектуру из двух частей:</p>
<ol>
<li>контекст состояния</li>
<li>чистые функции без побочных эффектов, работающие лишь с контекстом</li>
</ol>
<p>Контекст состояния игровой логики на Python получился следующим (<a href="https://git.opengamestudio.org/kornerr/research-portable-memory/src/commit/6fcd542daa6242c8c23dddb88d04cda74a730328/v3/memory_Context.h">C++</a>):</p>
<p>```python
class memory_Context:
def <strong>init</strong>(self):
self.hiddenItems = []
self.mismatchedItems = []. . .</p>
</div>
<div class="news_item_more">
<a href="memory-logic.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="llm-first-py-cxx.html">Первый пример портируемого кода</a>
</h2>
@@ -189,22 +214,6 @@ Ubuntu Edge</a>. Особенностью продукта должна была
<div class="news_item_more">
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="on-the-way-to-durable-applications.html">На пути к долговечным приложениям</a>
</h2>
<p class="news_item_date">
2019-08-05 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2019-08-05_on-the-way-to-durable-applications.jpg" alt="Псковское вече" /></p>
<p>В этой статье мы расскажем о нашем первом долговечном приложении для настольных ПК - генераторе статических сайтов ПСКОВ.</p>
<p><strong>Долговечность</strong></p>
<p>Под долговечным приложением мы понимаем такое приложение, которое работает без единого изменения на операционных системах, выпущенных в период 2010-2030 годов. Иными словами, долговечное приложение обладает 10-летней обратной совместимостью и 10-летней прочностью. Впрочем, <a href="http://opengamestudio.org/pskov/ru">ПСКОВ</a> работает даже на Windows 2000, так что у него 19-летняя обратная совместимость.. . .</p>
</div>
<div class="news_item_more">
<a href="on-the-way-to-durable-applications.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 2 из 8</p>
<p>

View File

@@ -25,6 +25,22 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="on-the-way-to-durable-applications.html">На пути к долговечным приложениям</a>
</h2>
<p class="news_item_date">
2019-08-05 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2019-08-05_on-the-way-to-durable-applications.jpg" alt="Псковское вече" /></p>
<p>В этой статье мы расскажем о нашем первом долговечном приложении для настольных ПК - генераторе статических сайтов ПСКОВ.</p>
<p><strong>Долговечность</strong></p>
<p>Под долговечным приложением мы понимаем такое приложение, которое работает без единого изменения на операционных системах, выпущенных в период 2010-2030 годов. Иными словами, долговечное приложение обладает 10-летней обратной совместимостью и 10-летней прочностью. Впрочем, <a href="http://opengamestudio.org/pskov/ru">ПСКОВ</a> работает даже на Windows 2000, так что у него 19-летняя обратная совместимость.. . .</p>
</div>
<div class="news_item_more">
<a href="on-the-way-to-durable-applications.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="defending-availability.html">Защита доступности</a>
</h2>
@@ -170,29 +186,6 @@
<div class="news_item_more">
<a href="openscenegraph-examples.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="mahjong-techdemo1-gameplay.html">Первая технодемка OGS Mahjong 2: Игровая механика</a>
</h2>
<p class="news_item_date">
2018-02-16 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2018-02-16-mahjong-techdemo1-gameplay.png" alt="Конец партии Маджонг" /></p>
<p>Мы ради сообщить о выпуске первой технической демонастрации OGS Mahjong 2. Её цель была в проверке игровой механики на всех поддерживаемых платформах.</p>
<p>Проверьте технодемку на своей платформе:</p>
<ul>
<li>Запустить <a href="https://ogstudio.github.io/game-mahjong/versions/013/mjin-player.html">версию для веба</a> в браузере</li>
<li>Получить <a href="https://drive.google.com/open?id=1KW8IEN8Dpz8ODeg8BctVSJyzj9-AL9hR">версию для Android</a></li>
<li>Получить <a href="https://drive.google.com/open?id=1oj0-OXSmEatttzn86u2vgP9SRAIC0ozB">версию для Windows</a></li>
<li>Получить <a href="https://drive.google.com/open?id=1EX7kLIThLiMz9_W7VmBPySms3mlrF-i6">версию для Linux</a></li>
<li>Получить <a href="https://drive.google.com/open?id=1KWnvbHzan8MpMcZPG2QC-7KWoEYbqrM2">версию для macOS</a></li>
</ul>
<p>Замечания:. . .</p>
</div>
<div class="news_item_more">
<a href="mahjong-techdemo1-gameplay.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 3 из 8</p>
<p>

View File

@@ -25,6 +25,29 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="mahjong-techdemo1-gameplay.html">Первая технодемка OGS Mahjong 2: Игровая механика</a>
</h2>
<p class="news_item_date">
2018-02-16 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2018-02-16-mahjong-techdemo1-gameplay.png" alt="Конец партии Маджонг" /></p>
<p>Мы ради сообщить о выпуске первой технической демонастрации OGS Mahjong 2. Её цель была в проверке игровой механики на всех поддерживаемых платформах.</p>
<p>Проверьте технодемку на своей платформе:</p>
<ul>
<li>Запустить <a href="https://ogstudio.github.io/game-mahjong/versions/013/mjin-player.html">версию для веба</a> в браузере</li>
<li>Получить <a href="https://drive.google.com/open?id=1KW8IEN8Dpz8ODeg8BctVSJyzj9-AL9hR">версию для Android</a></li>
<li>Получить <a href="https://drive.google.com/open?id=1oj0-OXSmEatttzn86u2vgP9SRAIC0ozB">версию для Windows</a></li>
<li>Получить <a href="https://drive.google.com/open?id=1EX7kLIThLiMz9_W7VmBPySms3mlrF-i6">версию для Linux</a></li>
<li>Получить <a href="https://drive.google.com/open?id=1KWnvbHzan8MpMcZPG2QC-7KWoEYbqrM2">версию для macOS</a></li>
</ul>
<p>Замечания:. . .</p>
</div>
<div class="news_item_more">
<a href="mahjong-techdemo1-gameplay.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="mahjong-recreation-start.html">Начало воссоздания Маджонга</a>
</h2>
@@ -163,21 +186,6 @@
<div class="news_item_more">
<a href="ios-tutorial.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="osg-sample.html">Приложение OpenSceneGraph</a>
</h2>
<p class="news_item_date">
2017-05-12 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2017-05_osg-sample.png" alt="Ракета в дали" /></p>
<p>Эта статья описывает создание самоучителей по сборке приложения OpenSceneGraph на Linux, macOS, Windows и Android в апреле 2017.</p>
<p>Предыдущие самоучители описывали установку OpenSceneGraph на Linux, macOS, Windows и отображение модели с помощью стандартного инструмента <strong>osgviewer</strong>. На этот раз результатом нашей работы стало <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide-application">приложение OpenSceneGraph</a>, которое работает на Linux, macOS, Windows и Android.. . .</p>
</div>
<div class="news_item_more">
<a href="osg-sample.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 4 из 8</p>
<p>

View File

@@ -25,6 +25,21 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="osg-sample.html">Приложение OpenSceneGraph</a>
</h2>
<p class="news_item_date">
2017-05-12 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2017-05_osg-sample.png" alt="Ракета в дали" /></p>
<p>Эта статья описывает создание самоучителей по сборке приложения OpenSceneGraph на Linux, macOS, Windows и Android в апреле 2017.</p>
<p>Предыдущие самоучители описывали установку OpenSceneGraph на Linux, macOS, Windows и отображение модели с помощью стандартного инструмента <strong>osgviewer</strong>. На этот раз результатом нашей работы стало <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide-application">приложение OpenSceneGraph</a>, которое работает на Linux, macOS, Windows и Android.. . .</p>
</div>
<div class="news_item_more">
<a href="osg-sample.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="its-all-fine.html">Всё проходит хорошо</a>
</h2>
@@ -169,24 +184,6 @@
<div class="news_item_more">
<a href="2016-september-recap.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="ogs-editor-0.10.html">OGS Editor 0.10 и материалы прямого эфира</a>
</h2>
<p class="news_item_date">
2016-10-03 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2016-10-03_ogs-editor-0.10.png" alt="Редактор с игрой Маджонг" /></p>
<p>Внимание: мы не выпустим версию 0.10 для macOS из-за технических проблем с системой сборки. Поддержку macOS вернём к 0.11.</p>
<ul>
<li><strong>OGS Editor 0.10</strong> <a href="https://sourceforge.net/projects/osrpgcreation/files/Editor/jenkins/51_2016-10-01_06-39-48_0.10.0/">доступен на SourceForge</a>. Просто распакуйте архив и запустите скрипт run.</li>
<li><strong>Пасьянс маджонг</strong> тоже <a href="https://sourceforge.net/projects/osrpgcreation/files/Games/MahjongSolitaire/">доступен на SourceForge</a>. Просто распакуйте архив и запустите скрипт run.. . .</li>
</ul>
</div>
<div class="news_item_more">
<a href="ogs-editor-0.10.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 5 из 8</p>
<p>

View File

@@ -25,6 +25,24 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="ogs-editor-0.10.html">OGS Editor 0.10 и материалы прямого эфира</a>
</h2>
<p class="news_item_date">
2016-10-03 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2016-10-03_ogs-editor-0.10.png" alt="Редактор с игрой Маджонг" /></p>
<p>Внимание: мы не выпустим версию 0.10 для macOS из-за технических проблем с системой сборки. Поддержку macOS вернём к 0.11.</p>
<ul>
<li><strong>OGS Editor 0.10</strong> <a href="https://sourceforge.net/projects/osrpgcreation/files/Editor/jenkins/51_2016-10-01_06-39-48_0.10.0/">доступен на SourceForge</a>. Просто распакуйте архив и запустите скрипт run.</li>
<li><strong>Пасьянс маджонг</strong> тоже <a href="https://sourceforge.net/projects/osrpgcreation/files/Games/MahjongSolitaire/">доступен на SourceForge</a>. Просто распакуйте архив и запустите скрипт run.. . .</li>
</ul>
</div>
<div class="news_item_more">
<a href="ogs-editor-0.10.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="yesterdays-live-session-short-overview.html">Пара слов о вчерашнем прямом эфире</a>
</h2>
@@ -154,23 +172,6 @@
<div class="news_item_more">
<a href="may-live-session-announcement.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="may-live-session-decision.html">Майский прямой эфир (Редактор 0.9)</a>
</h2>
<p class="news_item_date">
2016-04-24 00:00
</p>
<div class="news_item_contents">
<p>Как вы знаете, ранее опубликованная дорожная карта предполагала, что в апреле будет прямой эфир, в котором с помощью Редактора 0.9 мы создадим игру пинг-понг.</p>
<p>Мы должны признать, что наши способности к планированию всё ещё недостаточно высоки, поэтому следующий прямой эфир состоится в конце мая. Точную дату мы объявим позже.</p>
<p>Вот пара моментов из будущей игры:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/V3EvCVPc6kg" frameborder="0" allowfullscreen></iframe>
<p>. . .</p>
</div>
<div class="news_item_more">
<a href="may-live-session-decision.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 6 из 8</p>
<p>

View File

@@ -25,6 +25,23 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="may-live-session-decision.html">Майский прямой эфир (Редактор 0.9)</a>
</h2>
<p class="news_item_date">
2016-04-24 00:00
</p>
<div class="news_item_contents">
<p>Как вы знаете, ранее опубликованная дорожная карта предполагала, что в апреле будет прямой эфир, в котором с помощью Редактора 0.9 мы создадим игру пинг-понг.</p>
<p>Мы должны признать, что наши способности к планированию всё ещё недостаточно высоки, поэтому следующий прямой эфир состоится в конце мая. Точную дату мы объявим позже.</p>
<p>Вот пара моментов из будущей игры:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/V3EvCVPc6kg" frameborder="0" allowfullscreen></iframe>
<p>. . .</p>
</div>
<div class="news_item_more">
<a href="may-live-session-decision.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="rolling-ball.html">Запись прямого эфира "Катящийся мяч" и материалы</a>
</h2>
@@ -150,23 +167,6 @@
<div class="news_item_more">
<a href="soon-game-creation-editor-07.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="bye-desura-hello-humblebundle.html">Прощай, Desura. Здравствуй, Humble Bundle Widget</a>
</h2>
<p class="news_item_date">
2015-07-23 00:00
</p>
<div class="news_item_contents">
<p>После недавнего банкротства родительской компании сервиса Desura мы пришли к выводу, что нам необходима новая площадка для распространения Deluxe-версии игры. Более современная, удобная, надежная.
Наш выбор пал на Humble Widget, благодаря которому вы можете приобрести Deluxe-версию игры прямо у нас на сайте.</p>
<p>Вот он:</p>
<iframe src="https://www.humblebundle.com/widget/v2/product/ogsmahjong/ySGF3h34?theme=transparent-light" width="526" height="325" style="border: none;" scrolling="no" frameborder="0"></iframe>
<p>. . .</p>
</div>
<div class="news_item_more">
<a href="bye-desura-hello-humblebundle.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 7 из 8</p>
<p>

View File

@@ -25,6 +25,23 @@
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="bye-desura-hello-humblebundle.html">Прощай, Desura. Здравствуй, Humble Bundle Widget</a>
</h2>
<p class="news_item_date">
2015-07-23 00:00
</p>
<div class="news_item_contents">
<p>После недавнего банкротства родительской компании сервиса Desura мы пришли к выводу, что нам необходима новая площадка для распространения Deluxe-версии игры. Более современная, удобная, надежная.
Наш выбор пал на Humble Widget, благодаря которому вы можете приобрести Deluxe-версию игры прямо у нас на сайте.</p>
<p>Вот он:</p>
<iframe src="https://www.humblebundle.com/widget/v2/product/ogsmahjong/ySGF3h34?theme=transparent-light" width="526" height="325" style="border: none;" scrolling="no" frameborder="0"></iframe>
<p>. . .</p>
</div>
<div class="news_item_more">
<a href="bye-desura-hello-humblebundle.html">Читать далее</a>
</div>
</div><div class="news_item">
<h2 class="news_item_title">
<a href="test-chamber-for-everyone.html">Тестовый цех каждому (Редактор 0.7.0)</a>
</h2>

55
ru/news/index9.html Normal file
View File

@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
<link rel="stylesheet" href="../../style.css">
</head>
<body>
<script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script>
<div id="header">
<div class="header2">
<div class="menu">
<a href="../../ru/news/index.html">Новости</a>
<a href="../../ru/game/index.html">Игры</a>
<a href="../../ru/tool/index.html">Инструменты</a>
<a href="../../ru/page/about.html">О нас</a>
</div>
<div id="lang">
<a href="../../en/news/index9.html">EN</a>
<a href="../../ru/news/index9.html">RU</a>
</div>
<div class="clear"></div>
</div>
</div>
<center>
<h1>Новости</h1>
<div class="news_item">
<h2 class="news_item_title">
<a href="2014-another-year-passed.html">И вот прошел еще один год</a>
</h2>
<p class="news_item_date">
2014-12-31 12:00
</p>
<div class="news_item_contents">
<p>Привет.</p>
<p>Подходит к концу год, в течение которого мы разместили на сайте рекордно малое количество новостей. Мы не прекратили разработку, однако пока она находится в фазе "показывать нечего", а свободного времени, которое можно уделять проекту, у каждого из его участников сейчас найдется редко больше чем 30-40 часов в месяц.</p>
<p>Но работа продвигается, и подробнее о ней расскажет <a href="exaggerated-expectations.html">статья нашего программиста Михаила Капелько</a>.</p>
<p>. . .</p>
</div>
<div class="news_item_more">
<a href="2014-another-year-passed.html">Читать далее</a>
</div>
</div>
<p class="pagination_title">Страница 9 из 9</p>
<p>
<a href="index8.html">« Новее</a>
</p>
<div id="footer">
Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
</div>
</center>
</body>
</html>

109
ru/news/psk-jvm-item.html Normal file
View File

@@ -0,0 +1,109 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
<link rel="stylesheet" href="../../style.css">
</head>
<body>
<script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script>
<div id="header">
<div class="header2">
<div class="menu">
<a href="../../ru/news/index.html">Новости</a>
<a href="../../ru/game/index.html">Игры</a>
<a href="../../ru/tool/index.html">Инструменты</a>
<a href="../../ru/page/about.html">О нас</a>
</div>
<div id="lang">
<a href="../../en/news/psk-jvm-item.html">EN</a>
<a href="../../ru/news/psk-jvm-item.html">RU</a>
</div>
<div class="clear"></div>
</div>
</div>
<h3 class="left_item_title">В новостях...</h3>
<center>
<div class="news_item">
<h2 class="news_item_title">
<a href="psk-jvm-item.html">ПСКОВ 2 на JVM</a>
</h2>
<p class="news_item_date">
2025-02-11 00:00
</p>
<div class="news_item_contents">
<p><img src="../../images/2025_psk-jvm-item.png" alt="splash" /></p>
<h1 id="">Генерация отдельных страниц</h1>
<p>В январе сделал половину функциональности оригинального ПСКОВа на Kotlin для JVM,
а именно: генерацию отдельных страниц HTML из Markdown.</p>
<p>И ПСКОВ 1, и ПСКОВ 2 генерируют файлы HTML, которые отображаются идентично
в веб-браузерах. Тем не менее, содержимое этих сгенерированных файлов отличается,
т.к. ПСКОВ 1 использует <a href="https://github.com/showdownjs/showdown">Showdown</a> для конвертации Markdown в HTML,
а ПСКОВ 2 - <a href="https://github.com/JetBrains/markdown">intellij-markdown</a>.</p>
<p>Взглянем на описываемую разницу. Допустим, у нас есть следующая страница Markdown:</p>
<pre><code>Simple page in **Markdown** to convert to **HTML**.
| № | Parser | Language |
|---|--- |--- |
| 1 | [Showdown][showdown] | JavaScript |
| 2 | [intellij-markdown][intellij-markdown] | Kotlin |
[intellij-markdown]: https://github.com/JetBrains/markdown
[showdown]: https://github.com/showdownjs/showdown
</code></pre>
<p>ПСКОВ 1 генерирует следующий файл HTML:</p>
<pre><code>&lt;p&gt;Simple page in &lt;strong&gt;Markdown&lt;/strong&gt; to convert to &lt;strong&gt;HTML&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Parser&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/showdownjs/showdown"&gt;Showdown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/JetBrains/markdown"&gt;intellij-markdown&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</code></pre>
<p>ПСКОВ 2:</p>
<pre><code>&lt;body&gt;&lt;p&gt;Simple page in &lt;strong&gt;Markdown&lt;/strong&gt; to convert to &lt;strong&gt;HTML&lt;/strong&gt;.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Parser&lt;/th&gt;&lt;th&gt;Language&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;a href="https://github.com/showdownjs/showdown"&gt;Showdown&lt;/a&gt;&lt;/td&gt;&lt;td&gt;JavaScript&lt;/td&gt;&lt;/tr&gt;&lt;tr class="intellij-row-even"&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;a href="https://github.com/JetBrains/markdown"&gt;intellij-markdown&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Kotlin&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/body&gt;
</code></pre>
<p>А вот как оба файла отображаются в веб-браузере:</p>
<p><img src="../../images/2025_psk-jvm-item_result.png" alt="result" /></p>
<p>Идентичное отображение двух различающихся файлов.
Мой внутренний перфекционист, конечно, возмущён несоответствием, но мой
внутренний прагматик считает эту разницу несущественной.</p>
<h1 id="-1">Февраль</h1>
<p>В феврале доведу конвертер межъязыкового диалекта до генерации Context.</p>
</div>
</div>
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = "https://opengamestudio.org/ru/news/psk-jvm-item.html";
this.page.identifier = "psk-jvm-item.html";
};
(function() { // DON'T EDIT BELOW THIS LINE
var d = document, s = d.createElement('script');
s.src = 'https://opengamestudio.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript>
<div id="footer">
Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
</div>
</center>
</body>
</html>