From be5d20ba8b6988c6107a6066774f3d7b994c48f5 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 15 Jun 2025 13:21:23 +0900 Subject: fix(blog/nuldoc): do not render closing tag of --- .../blog/content/posts/2025-06-14/baba-is-you.dj | 3 ++ vhosts/blog/nuldoc-src/renderers/html.ts | 14 ++++----- vhosts/blog/public/about/index.html | 1 - .../index.html | 1 - .../posts/2024-12-04/cohackpp-report/index.html | 1 - .../phperkaigi-2023-tokens-q1/index.html | 1 - .../trick-2025-most-ruby-on-ruby-award/index.html | 1 - .../public/posts/2025-06-14/baba-is-you/index.html | 35 ++++------------------ 8 files changed, 16 insertions(+), 41 deletions(-) diff --git a/vhosts/blog/content/posts/2025-06-14/baba-is-you.dj b/vhosts/blog/content/posts/2025-06-14/baba-is-you.dj index 5370b94f..01864679 100644 --- a/vhosts/blog/content/posts/2025-06-14/baba-is-you.dj +++ b/vhosts/blog/content/posts/2025-06-14/baba-is-you.dj @@ -192,6 +192,7 @@ Steam の場合、全実績解除と読み替えてもよい。 #### SUBMERGED RUINS、SUNKEN TEMPLE ![「SUBMERGED RUINS」のスクリーンショット](/posts/2025-06-14/baba-is-you/LEVEL_SUBMERGED_RUINS.jpeg) + ![「SUNKEN TEMPLE」のスクリーンショット](/posts/2025-06-14/baba-is-you/LEVEL_SUNKEN_TEMPLE.jpeg) ここまでスルスル解けていて初めてしばらく止まった面。 @@ -202,6 +203,7 @@ Steam の場合、全実績解除と読み替えてもよい。 #### PRISON、DUNGEON ![「PRISON」のスクリーンショット](/posts/2025-06-14/baba-is-you/LEVEL_PRISON.jpeg) + ![「DUNGEON」のスクリーンショット](/posts/2025-06-14/baba-is-you/LEVEL_DUNGEON.jpeg) 高難易度面で当然のように要求されるテクニックの初出。 @@ -347,6 +349,7 @@ PRISON と DUNGEON で既出のテクニックが肝だが、ちと離れすぎ #### STARDROP、METEOR STRIKE ![「STARDROP」のスクリーンショット](/posts/2025-06-14/baba-is-you/LEVEL_STARDROP.jpeg) + ![「METEOR STRIKE」のスクリーンショット](/posts/2025-06-14/baba-is-you/LEVEL_METEOR_STRIKE.jpeg) 両方とも難しい面ではあったが、単文字のテキストが綺麗に活用された美しい面として印象に残っている。 diff --git a/vhosts/blog/nuldoc-src/renderers/html.ts b/vhosts/blog/nuldoc-src/renderers/html.ts index 6c8170ed..84b3ebaa 100644 --- a/vhosts/blog/nuldoc-src/renderers/html.ts +++ b/vhosts/blog/nuldoc-src/renderers/html.ts @@ -13,7 +13,7 @@ type Context = { isInPre: boolean; }; -type Dtd = { type: "block" | "inline"; auto_closing?: boolean }; +type Dtd = { type: "block" | "inline"; self_closing?: boolean }; function getDtd(name: string): Dtd { switch (name) { @@ -26,7 +26,7 @@ function getDtd(name: string): Dtd { case "body": return { type: "block" }; case "br": - return { type: "block", auto_closing: true }; + return { type: "block", self_closing: true }; case "button": return { type: "block" }; case "canvas": @@ -60,7 +60,7 @@ function getDtd(name: string): Dtd { case "header": return { type: "block" }; case "hr": - return { type: "block", auto_closing: true }; + return { type: "block", self_closing: true }; case "html": return { type: "block" }; case "i": @@ -68,9 +68,9 @@ function getDtd(name: string): Dtd { case "li": return { type: "block" }; case "link": - return { type: "block", auto_closing: true }; + return { type: "block", self_closing: true }; case "img": - return { type: "block" }; + return { type: "inline", self_closing: true }; case "ins": return { type: "block" }; case "main": @@ -78,7 +78,7 @@ function getDtd(name: string): Dtd { case "mark": return { type: "inline" }; case "meta": - return { type: "block", auto_closing: true }; + return { type: "block", self_closing: true }; case "nav": return { type: "block" }; case "noscript": @@ -237,7 +237,7 @@ function elementNodeToHtmlText(e: Element, ctx: Context): string { } ctx.indentLevel -= 1; - if (!dtd.auto_closing) { + if (!dtd.self_closing) { if (e.name !== "pre") { if (isBlockNode(e)) { if (needsLineBreak(prevChild)) { diff --git a/vhosts/blog/public/about/index.html b/vhosts/blog/public/about/index.html index a11b49b6..b19a49ed 100644 --- a/vhosts/blog/public/about/index.html +++ b/vhosts/blog/public/about/index.html @@ -44,7 +44,6 @@
-
diff --git a/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html b/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html index 87bf72ba..392de62d 100644 --- a/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html +++ b/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html @@ -64,7 +64,6 @@

term-banner が動作している様子のスクリーンショット -

コマンドライン引数として渡した文字列をターミナルに大きく表示する。 diff --git a/vhosts/blog/public/posts/2024-12-04/cohackpp-report/index.html b/vhosts/blog/public/posts/2024-12-04/cohackpp-report/index.html index c4f6d334..f8b0bce5 100644 --- a/vhosts/blog/public/posts/2024-12-04/cohackpp-report/index.html +++ b/vhosts/blog/public/posts/2024-12-04/cohackpp-report/index.html @@ -107,7 +107,6 @@

asumikam「いまむらさんおつかれさまです。ぺぱ合戦で、LTタイムあることになり、技術で3人「ぺ」側を選出することになったのですが、いまむらさん、LTやりませんか。「ぺ」陣営で一緒に頂きを目指しませんか。」nsfisis「OKです!」 -

最初は直近のカンファレンスに出して落選したプロポーザルテーマを LT に編集して話そうとしていたのですが、この機会でなければ話せない・この機会で話すことに意味があるテーマにしようとネタ出しをおこない、最終的に次のテーマでの登壇となりました。 diff --git a/vhosts/blog/public/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html b/vhosts/blog/public/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html index 3e030b6d..3a153d33 100644 --- a/vhosts/blog/public/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html +++ b/vhosts/blog/public/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html @@ -118,7 +118,6 @@

全体がQRコードになっており、中央には小さな文字で「Password is one of the PHPer tokens.」と書かれている -

diff --git a/vhosts/blog/public/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html b/vhosts/blog/public/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html index 5e1debc5..14018ff6 100644 --- a/vhosts/blog/public/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html +++ b/vhosts/blog/public/posts/2025-04-20/trick-2025-most-ruby-on-ruby-award/index.html @@ -110,7 +110,6 @@

ブラウザで表示された index.html のレンダリング結果。entry.rb の内容がシンタックスハイライトされて表示されており、英単語や記号に振り仮名が振られている -

自身のソースコードを出力するプログラム、いわゆる quine の亜種になっている。 diff --git a/vhosts/blog/public/posts/2025-06-14/baba-is-you/index.html b/vhosts/blog/public/posts/2025-06-14/baba-is-you/index.html index 1283ee2b..e5409b73 100644 --- a/vhosts/blog/public/posts/2025-06-14/baba-is-you/index.html +++ b/vhosts/blog/public/posts/2025-06-14/baba-is-you/index.html @@ -84,7 +84,6 @@

最初の面「BABA IS YOU」のスクリーンショット -

ここには次のようなルールがある。 @@ -281,10 +280,9 @@

SUBMERGED RUINS、SUNKEN TEMPLE

「SUBMERGED RUINS」のスクリーンショット - - +

+

「SUNKEN TEMPLE」のスクリーンショット -

ここまでスルスル解けていて初めてしばらく止まった面。また、苦戦して解いた次の面がその面の派生で絶望するという経験をした最初の面。この瞬間が苦しくもあり楽しくもある。 @@ -294,10 +292,9 @@

PRISON、DUNGEON

「PRISON」のスクリーンショット - - +

+

「DUNGEON」のスクリーンショット -

高難易度面で当然のように要求されるテクニックの初出。可能な行動が大きく制限されているのでマシだが、それでも初見時には困惑した。 @@ -307,7 +304,6 @@

FURTHER FIELDS

「FURTHER FIELDS」のスクリーンショット -

お気に入りの面。MOVE を活用するのも YOU を一時的に消すのも好きなので、両方出てくるこの面は大好き。 @@ -317,7 +313,6 @@

SCENIC POND

「SCENIC POND」のスクリーンショット -

はい。まあこいつは後で触れることにしよう。 @@ -327,7 +322,6 @@

CONCRETE GOALS

「CONCRETE GOALS」のスクリーンショット -

これも初見時に苦戦した面。PRISON などと同様に一度理解すれば何ということのない面だが、最初に解けたときは偶然だった。FLAG IS WIN がギリギリ取り出せそうに「見える」のが嫌らしい。 @@ -337,7 +331,6 @@

LOCK THE DOOR

「LOCK THE DOOR」のスクリーンショット -

SHIFT 重ねの初出面。このテクニックを再び使うのは終盤になってからであり、私はそのときにはもう SHIFT 重ねを忘れていたので大苦戦した。戯れにスロット2を使って2周目をやっていてこの面まで到達し、そこでようやく SHIFT 重ねが MOVE もどきになることを思い出した。その意味でも印象深い面。 @@ -347,7 +340,6 @@

INSULATION

「INSULATION」のスクリーンショット -

MAP の前半 (~DEEP FOREST) では最も苦戦した面。SWAP の理解が固まっておらず、「こういう状況が作れたら解けそうだ」という勘が働かなかった。正直なところ SWAP は今も苦手意識がある (終盤で強制的に学ばされる SHIFT と違って、それほど高難度面での出番がないのも大きいと思う)。 @@ -357,7 +349,6 @@

BOTTLENECK

「BOTTLENECK」のスクリーンショット -

MAP の中で一番苦しんだ面。実は一度ここで投げて諦めたのだが、EMPTY を理解した今となっては脳内でも瞬殺できるくらい簡単になってしまった。最初に面を見てから解き終わるまでの時間は間違いなく最長で、半年以上かかっている (他は長くとも数日間)。 @@ -367,7 +358,6 @@

HEAVY CLOUD

「HEAVY CLOUD」のスクリーンショット -

難しい面ではあるのだが、それ以上に解法の美しさに感動した面。解き終わった後に思わず「美しい……」と呟いてしまったのはこの面だけだった。Baba Is You の好きな面はと聞かれれば真っ先にこれを挙げる。 @@ -377,7 +367,6 @@

ADVENTURERS

「ADVENTURERS」のスクリーンショット -

難所の多い FLOWER GARDEN の癒し。Hand が MOVESHIFT でガチャガチャ動くのを見るのが楽しい。 @@ -387,7 +376,6 @@

OUT AT SEA

「OUT AT SEA」のスクリーンショット -

MAP の問題児。正攻法がテキスト重ねである最初の面。この面、ICE/LAVA IS PUSH を作ったあと重なった ice と lava を (ICE IS PUSH だけ作るなどして) 分離しないといけないのだが、意気揚々と ice on lava の状態で door に向かって push して push できなかったときの感情はよく覚えている。テキスト同士を重ねて A IS PUSHB IS PUSH を両立させるというぶっ飛んだアイデアを実現してもなお解けないのか、この方針がまさか間違っているなどということがあるのか、いやそんなはずはない……。実際のところそこからのリカバリーはすぐできたが、そのときの絶望はこれまででも最大であった。 @@ -397,7 +385,6 @@

SEEKING ACCEPTANCE

「SEEKING ACCEPTANCE」のスクリーンショット -

ここも好きな面。FURTHER FIELDS の精神的後継のようなものなので当然かもしれない。せっせと働く bird がかわいい。 @@ -407,7 +394,6 @@

FRAGILE EXISTENCE

「FRAGILE EXISTENCE」のスクリーンショット -

MAP の印象的な面と言えば、これを取り上げないわけにはいかない。LEVEL IS A による level の変換がおこなえる初の面である。ここまで Baba Is You を進めたプレイヤーであれば、初出のテキストが現れたらまずはその場の色々なテキストと組み合わせてみて相互作用を確認する。それを見事に利用されたというか、気付かずにはいられないように仕向けられているというか、本当によくできたゲームである。 @@ -429,7 +415,6 @@

VIP AREA

「VIP AREA」のスクリーンショット -

??? で大いに苦戦した面のひとつ。PRISON と DUNGEON で既出のテクニックが肝だが、ちと離れすぎじゃないのか。この面のリメイクもあるが、ここで苦しんだからかそちらはあまり苦戦しなかった。 @@ -439,7 +424,6 @@

ULTIMATE MAZE

「ULTIMATE MAZE」のスクリーンショット -

普通に解くだけなら大したことのない面だが、問題はこれの LEVEL IS TEXT 解である。出現順に書いているのでここに置いたが、解いたのはもっと後、META の後半に差しかかった頃になる。??? コンプリートの実績が取れていないことに気付き、残っているとすればここの LEVEL IS TEXT しかないと考えたまではよかったが、そこからが大変だった。個人的にこのゲームで一番苦しかったのがここの TEXT 変換解である。単純な難しさに加え、実績が取れていない原因がこの面だという確信も持てなかったので、解けるかどうかわからない状態で挑み続けることとなり疲弊した。 @@ -459,10 +443,9 @@

STARDROP、METEOR STRIKE

「STARDROP」のスクリーンショット - - +

+

「METEOR STRIKE」のスクリーンショット -

両方とも難しい面ではあったが、単文字のテキストが綺麗に活用された美しい面として印象に残っている。G R A S S IS H O T をこれほど無駄なく使えるとは! @@ -472,7 +455,6 @@

GETTING TOGETHER

「GETTING TOGETHER」のスクリーンショット -

初見のインパクト大にして難易度も相応に高い良作。この頃はまだ SHIFT理解していなかったので大変だったが、ここを越えたことでむしろこの後の難所が楽になったと言える。 @@ -488,7 +470,6 @@

CRUSHERS

「CRUSHERS」のスクリーンショット -

DEPTHS の序盤で道を塞いでいる必須面であるにもかかわらず圧倒的難易度で立ちはだかる凶悪な面。大苦戦した挙句 LEVEL IS BELT を作ってアレ?となったのは私だけではないはず。 @@ -498,7 +479,6 @@

PARADE

「PARADE」のスクリーンショット -

取れる行動が多いこと、もう少しで解けそうなルートが多いこと、そのどれもが一筋縄ではいかないこと。それらがすべて揃った高難度面。昔のバージョンでは ??? に置いてあったらしい。そんなバカな。 @@ -514,7 +494,6 @@

BOOBY TRAP

「BOOBY TRAP」のスクリーンショット -

難しいとか難しくないとかじゃなくここは触れざるをえない。FLAG/TEXT 解以外はそれほど苦戦しなかったが、とにもかくにもクリアの要求回数が多すぎる。もちろん最短で進められるなら別だが、META での試行錯誤のためにはこいつの形を毎回変えなければならない。しかもどの変換もそれなりにステップ数を要するのが厄介である。印象に残った面であるのは確か。 @@ -524,7 +503,6 @@

THE BOX

「THE BOX」のスクリーンショット -

よくぞこの面を作ってくれた。外の level を参照させるギミックは、LEVEL IS A の変換をやりだした頃からいつかあるはずと思っていたので、そのとおりのパズルが出てきてくれて嬉しい。これぞ Baba Is You。 @@ -534,7 +512,6 @@

THE RETURN OF SCENIC POND

「THE RETURN OF SCENIC POND」のスクリーンショット -

前半のネタバレなし感想にも書いたが、これは SCENIC POND のリメイクであり、ほとんど差異がない。たった1マス窪みが無くなっただけである。それだけでここまで難しくできるのか。 -- cgit v1.2.3-70-g09d2