あなたに、1 週間以内に新しいドキュメント Web サイトを作成するというタスクが与えられたと想像してください。視覚的に魅力的で、高速で、操作が簡単である必要があります。 「やってください」 という指示とともに、大量の *.docs ファイル、画像、スクリーンショットが渡されます。
Docusaurus、Nextra、VitePress、Docus など、選択できる優れたツールが多数あります。以前、Starlight を使用してドキュメント Web サイトを構築した素晴らしい経験があったため、このタスクには Starlight を選択しました。しかし、ドキュメントから PDF を生成する機能という欠けている機能を発見しました。そしてそれは要件の1つでした。 「素敵なサイドプロジェクトですね」 私は自分で考えました。
最初は簡単そうに思えました。ページを取得し、HTML を解析し、コンテンツをグループ化すれば、出来上がりです!
Starlight を利用した Web サイトには、ドキュメント内を移動するための「次へ」ボタンがあります。 PDF は本質的にページの配列であるため、この「次へ」ボタンを使用してページを 1 つずつ解析するのが合理的であると思われます。 Web サイトは静的ページを生成するため、HTML をフェッチし、必要な部分をクエリして、すべてを組み合わせるスクリプトをすぐに作成しました。ただし、Web サイトのスタイルを保持した PDF を生成することは、より複雑であることが判明しました。ブレーンストーミングを行った結果、Puppeteer が最適なソリューションであることがわかりました。
これでプロセスが明らかになりました:
これが starlight-to-pdf の仕組みです。このパターンに従って、PDF エクスポート機能が欠けている他のドキュメント フレームワーク用に同様のツールを構築できます。
基本的な機能の準備ができたら、いくつかの追加機能を追加します。以下は、最も興味深く、やりがいのある機能です。
ヘッダーまたはフッターにページ番号と追加情報があると便利です。 Puppeteer の Page.pdf() メソッドは、headerTemplate オプションと footerTemplate オプションを受け入れます。これらのオプションは HTML 文字列を受け入れます。 Puppeteer は、特定のユーティリティ クラスを持つ要素に値を自動的に挿入します。
印刷前にすべてのコンテンツを 1 ページに結合するため、タイトルと URL にはあまり意味がありません。挿入された値は常に同じままです。ただし、他のクラスは非常に役立ちます。フッター テンプレートの例を次に示します:
<style> .footer-container { --color: #000; display: flex; align-items: center; justify-content: space-between; border-block-start: 1px solid var(--color); color: var(--color); font-size: 10px; font-family: Arial, Helvetica, sans-serif; margin-inline: 1.5cm 1cm; padding-block: 0.25cm 0.5cm; width: 100%; } </style> <div> <p>To use this, do not forget to set the displayHeaderFooter property to true:<br> </p> <pre class="brush:php;toolbar:false">import puppeteer from 'puppeteer'; const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://someUrl'); const footerTemplateStr = '<style>...<style><div>...</div>' // replace with the HTML string from the example above await page.pdf({ displayHeaderFooter: true, footerTemplate: footerTemplateStr })
心に留めておくべきいくつかの発見事項があります:
すべてが正常に動作し、結果として得られる PDF は見栄えがしますが、端末のメッセージは味気ないように感じられます。細部へのこだわりが良いものと素晴らしいものを分けますね。メッセージをもっとカラフルにして読みやすくしましょう。
ANSI エスケープ シーケンスの魔法がここにあります。この仕事には 4 ビット カラーで十分であると判断しました。赤い背景に白いテキストを表示したいとします (これは、エラー メッセージの前の [ERROR]: プレフィックスに使用したものです)。この外観を実現する方法は次のとおりです:
console.log('\x1b[37;41m', 'White on red message');
詳しく見てみましょう:
すべてが機能していますが、console.log() 出力はすべてこの方法でスタイル設定されます。スタイルをデフォルトにリセットするには、最後にリセット シーケンス x1b[0m:
を追加するだけです。
console.log('\x1b[37;41m', 'White on red message', '\x1b[0m');
ずっと良くなりました。灰色の背景 (4 ビット色の名前では明るい黒) に太字のシアンのテキストが必要な場合はどうすればよいでしょうか?簡単です:
console.log('\x1b[1;36;100m', 'Cyan on gray message in bold', '\x1b[0m');
各部分の機能は次のとおりです:
この知識を使用すると、CLI ツールを視覚的に魅力的なものにすることができます。たとえば、プロジェクトではすべての URL とファイル パスを下線付きの青いテキストとしてスタイル設定しました。
console.log('\x1b[4;34m', './underlined/blue', '\x1b[0m')
このトピックの詳細については、このチートシートを確認してください。
日常的なタスクが、いつやりがいのあるサイド プロジェクトのきっかけとなるかはわかりません。 starlight-to-pdf の開発により、Puppeteer と CLI スタイリングに関する貴重な経験が得られ、オープンソース コミュニティに新しいツールが登場しました。以下に簡単なデモンストレーションを示します:
以上がStarlight の PDF への変換: 経験と洞察の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。