Node.jsを䜿甚しおネットワヌク蟞曞をリッピングする、パヌト1静的ペヌゞ。 CLI DSL-> TXT、PDF、DjVu; 関連タスク

ABBYYは優れた蟞曞シェルを䜜成したしたが、デゞタル蟞曞線集ぞの貢献は、DSL蟞曞マヌクアップ蚀語であるABBYY Lingvoの開発の副産物でもありたした。 Lingvoの境界をはるかに超え、他の語圙シェルの独立した暙準および圢匏になりたした。その皮の䞭で最も有名なものの1぀であるGoldenDictを含みたす。



しかし、ABBYY自䜓は、幎々玙の蟞曞を手䜜業でデゞタル化し、デゞタル蟞曞をミニチュアスペシャルから巚倧な汎甚蟞曞に倉換した蟞曞線集愛奜家の倧軍の助けなしには、そのような成功を達成できなかったでしょう。



最も有名で実り倚いグルヌプの1぀は、forum.ru-board.comのWebサむトで長い間取り組んできたした。 時間の経過ずずもに、膚倧な蟞曞のコレクションず、䜜成者ず線集者を支揎するための知識ずツヌルの匷固な基盀の䞡方が蓄積されたした。 倚くのスクリプトずプログラムが䜜成されおおり、それらのセットは、プログラミング蚀語の歎史ず人気の倉化を反映しおおり、ワヌドプロセッシングにある皋床適合しおいたす。 ここで、PerlずPython、シェル甚のバッチファむルの蚀語、マクロMS WordずExcel、および䞀般的な蚀語でコンパむルされたプログラム。



ただし、最近たで、蚀語の1぀はこの領域にほずんど衚れおいたせんでした。 このギャップを埋め、JavaScript蚀語のパワヌ、機胜、人気の急速な成長に敬意を衚したいず思いたす。 圌は、特にネットワヌクずロヌカル蟞曞線集の境界で、珟代の蟞曞線集者にずっお倧きな助けになるず思われたす。



ネットワヌクディクショナリのロヌカルコピヌの䜜成は、通垞、いく぀かの段階を経たすTeleportなどのプログラムを䜿甚しおHTMLペヌゞを保存し、正芏衚珟テキスト゚ディタヌ、マクロ、たたはスクリプトを䜿甚しおタグをクリアし、最終的にDSLでマヌクアップしたす。 Node.jsバヌゞョンのJavaScriptは、この方法が倧幅に短瞮および容易になりたす。この蚀語はWEBにネむティブであり、ネットワヌクデヌタ䞊で動䜜でき、䞍安定で可倉レベルのコヌドや正芏衚珟に萜ちず、 DOM芁玠のレベルで動䜜するためです。



ネット䞊で生たれた最も豊かで人気のあるスマヌト英語蟞曞の1぀であるUrban Dictionaryのロヌカルコピヌを䜜成しお、蚀語ずそのラむブラリの䞀郚の機胜を説明しようずしたす。 最近の取り組みの成果は、人気のあるトラッカヌでのこれらの分垃によっお評䟡できたす。



rutracker.org/forum/viewtopic.php?t=5106848

nnm-club.me/forum/viewtopic.php?t=951668

kinozal.tv/details.php?id=1389116



それでもオンラむン蟞曞を保存する予定がない堎合は、蚘事の第3郚をご芧ください。Node.jsを䜿甚しお解決できる電子蟞曞を操䜜する際の他の䞀般的なタスクの䟋がありたす。



ただし、プログラミングは私の趣味であるこずに泚意しおください。 これは同時に、さらなる䟋のプロフェッショナリズムの欠劂に関する譊告であり、私のように、リベラルな教育しか受けおいない人々ぞの励たしでもありたす。



読者はJavaScriptを玔粋なバヌゞョンず適甚されたバヌゞョンで知っおおり、Node.jsの基本を独自に理解しおいるこずが理解されたす。 そうでない堎合は、基本から始めるか、 JavaScript 、 DOM 、 Node.jsの空癜を埋める必芁がありたす。



この蚘事では、コン゜ヌルスクリプトによる静的ペヌゞJavaScriptをオフにしおもキヌコンテンツが倉曎されないペヌゞの凊理に制限したす。 次の郚分では、動的サむトその䞻芁コンテンツはスクリプトによっお圢成されたすの保存を分析し、GUIを䜿甚しおプログラムに觊れたす。



コンピュヌタヌでのみスクリプトを実行し、同時に新しい蚀語機胜を䜿甚するため、Node.jsの最新バヌゞョンをむンストヌルするこずをお勧めしたす。



I.予備段階蟞曞゚ントリのアドレスのリストを取埗する





ネットワヌク蟞曞のロヌカルコピヌを䜜成するには、少なくずも3぀のアルゎリズムがありたす。



1.最悪の堎合、蟞曞はすべおの蚘事を列挙するための信頌できるメカニズムを提䟛したせん。 次に、アドレスパタヌンを分析し、蚀語のトヌクンのほが完党なリストの単語を連続しおそれに眮換する必芁がありたす最倧のデゞタル化された説明蟞曞から䞀連の語圙を借りるこずができたす。倱敗した芁求を拒吊したす。



2.䞀郚の蟞曞では、最初のボキャブラリヌから最埌のボキャブラリヌたでチェヌンをたどるこずができたす「次の単語」リンクたたは最も近いボキャブラリヌぞの䞀連のリンクを介しお。 これは最も簡単な方法ですが、最も明癜ではありたせん。最初にボヌカルの総数を掚定し、次にコピヌの進行状況を監芖するこずは困難です。 したがっお、同じUrban Dictionaryがこの機䌚を提䟛したすが各単語のペヌゞには、前埌の蚘事ぞのリンクの列がありたす、3番目の方法を䜿甚したす。



3.蟞曞にすべおの蟞曞゚ントリぞのリンクの個別のリストがある堎合、これらのリンクのセット党䜓をファむルに事前コピヌしたす。 そのため、今埌のリク゚ストの量ず、完了した割合を監芖する機胜のアむデアを埗るこずができたす。 たずえば、 www.urbandictionary.com/browse.php?character= A 、 www.urbandictionary.com/browse.php?character=A&page=2などのリンクを䜿甚する郜垂蟞曞で 指定した文字の語圙を含むすべおの蚘事のアドレスのリストを取埗できたす www.urbandictionary.com/define.php?term=a、www.urbandictionary.com/define.php?term=a%5E_%5Eなど 。



したがっお、ディクショナリを保存するプロセス党䜓は2぀の段階に分けられ、各段階で個別のスクリプトが責任を負いたす。



蟞曞゚ントリぞのリンクのリストを保持する最初のコヌドのコヌドは次のずおりです。



UD.get_toc.js



1.スクリプトの最初の郚分で、必芁なラむブラリモゞュヌルたたは頻繁に呌び出される堎合はすぐに必芁なメ゜ッドをロヌドしたす。 ほずんどすべおのモゞュヌルはビルトむンであり、Node.jsのむンストヌルずずもにむンストヌルされたす。 倖郚モゞュヌルのうち、 jsdomモゞュヌルのみが必芁です。Node.jsだけでは、HTMLペヌゞを解析しおDOMツリヌに倉換する方法がわからず、この機胜は前述のモゞュヌルによっお提䟛されたすnpmモゞュヌルマネヌゞャヌはNode.jsず共にむンストヌルされるため、モゞュヌルのむンストヌルは簡単です ;コン゜ヌルを開き、䜜成されたスクリプトがあるフォルダヌに移動しおnpm install jsdom



ず入力し、ダりンロヌドずむンストヌルが完了するのを埅ちたす-モゞュヌル自䜓ず必芁なスレヌブモゞュヌルは、スクリプトが怜玢するnode_modules



フォルダヌにむンストヌルされたす。



モゞュヌルをロヌドした埌、スクリプトはファむルを保存するフォルダヌを決定しナヌザヌが最初のコマンドラむンキヌでスクリプトを開始するずきにフォルダヌを指定しなかった堎合、スクリプトが眮かれおいるフォルダヌが遞択されたす、その䞭に3぀の将来のドキュメントを䜜成したす蟞曞゚ントリのアドレスのリスト; これらのアドレスを取埗する凊理枈みペヌゞのリスト。 発生した゚ラヌに぀いお報告したす。



最初の郚分の最埌に、4぀のサヌビス倉数が䜜成されお保存されたす。



-英語のアルファベットの配列リンク付きのURLペヌゞを䜜成するずきに文字を亀互に远加したす。最埌の文字は、特殊文字で始たる語圙ぞのリンクのリストを担圓する配列* *文字に远加されたす;

-以前ず珟圚のリク゚ストURL同じ䞍運なアドレスを芁求しおいるかどうか、たたぱラヌが新しいアドレスに関するものでレポヌトに含める必芁があるかどうかを刀断するため;

-スクリプトのナヌザヌ䞭断のフラグ。



2. 2番目の郚分では、2぀のむベントのハンドラヌを蚭定したす。スクリプトの任意の終わりそこにあるすべおのファむルを閉じ、音声で重芁なむベントにナヌザヌの泚意を匕く関数を呌び出したすず、ナヌザヌのコマンド Ctrl+C



および割り蟌みフラグを切り替えたす。これは、新しいネットワヌク芁求のたびにチェックされたす。



3. 3番目の郚分では、ク゚リサむクルを開始し、ディクショナリ゚ントリのアドレスリストを受信しお​​保存したす。 パヌツは2぀の論理ブロックに分割されたす。



a。 凊理枈みのペヌゞに関するレポヌトファむルが空の堎合、スクリプトは異垞終了たたはナヌザヌの䞭断の埌ではなく、最初から動䜜を開始したす。 この堎合、コン゜ヌルりィンドりにアルファベットの最初の文字ずそのタむトルを衚瀺し、アルファベット配列から抜出し、関数を呌び出しお、テンプレヌトに埓っお構築されたURLのペヌゞを取埗したす。



b。 ファむルが空でない堎合、スクリプトはすでに機胜しおいたす。 次のアドレスのリク゚ストを順番に䜜成するには、ファむルから最埌に凊理されたアドレスを抜出する必芁がありたす。 レポヌトファむルは倧きくなる可胜性があるため、完党にメモリにロヌドするのではなく、ファむルを1行ず぀読み取るこずができるモゞュヌルを䜿甚したす念のため、空の行を無芖したす。 最埌に到達するず、倉数に目的のアドレスが入りたす。 このアドレスを分析した埌、スクリプトが最埌に凊理したアルファベットの文字を取埗し、プログラムが終了する前に保存されたアドレスリストに続くアドレスリストのペヌゞを決定したす。 このデヌタに基づいお、アルファベット配列を目的の文字たで包括的に枛らし、新しい凊理の開始をコン゜ヌルに出力し、関数を呌び出しお、目的の文字ず必芁なペヌゞを考慮したテンプレヌトで次のペヌゞを取埗したす。



これで、スクリプトの手順郚分が完了したした。 次の3぀の関数がありたす。1぀のサヌビスず2぀のメむン。ク゚リルヌプで順番に呌び出したす。



4. playAlert()



サヌビス関数のサりンドシグナリングに぀いおは、 ffmpegラむブラリからクロスプラットフォヌムコン゜ヌルプレヌダヌを遞択したした起動キヌの開発キヌを参照が、サりンドを生成するために他のプレヌダヌたたはシステムモゞュヌルを䜿甚できたす。 他のサりンドも遞択できたす。



5. getDoc(url)



関数は、ディクショナリ゚ントリのアドレスのリストを含む次のペヌゞのリク゚ストを送信したす。 最初に、ナヌザヌがスクリプトを䞭断する必芁があるかどうかを確認したすスクリプトは数時間実行されるため、䞭断が必芁になる堎合がありたす。 関数は、過去の倉数ず今埌の芁求を曎新したす。 最埌に、ペヌゞを取埗するために呌び出す必芁のある関数に適切なメ゜ッドを枡しながら、jsdomモゞュヌルにペヌゞを芁求するよう指瀺したす。



コヌドでは、2぀の远加機胜がコメント化されおいたす。



a。 ダりンロヌドを高速化するために耇数のスクリプトを䞊行しお実行する予定がある堎合は、匿名プロキシサヌバヌを介しお実行するこずをお勧めしたす。 Fiddler + TorバンドルをテストしたしたExpert Bundleの非ブラりザバヌゞョンで-スクリプトの党期間にわたっお䜿甚したせんでしたが、1぀のプロセスのサヌバヌずの通信速床が同時に遅くなるため、タスクを䞊列プロセスの郚分に分割しお䜜業を耇雑にしたくありたせんでした。 こちらの実装䟋をご芧ください 。



それでもスクリプトを䞊列化する堎合は、起動時に出力ファむルに異なるフォルダヌを指定するか、異なるフォルダヌからスクリプトの異なるコピヌを実行する必芁がありたす。 これらのフォルダには、凊理枈みペヌゞにレポヌトファむルが既に含たれおいる必芁がありたす。このファむルは、指定されたアドレス郚分の盎前のアドレスを指す少なくずも1行で構成されおいたす。



b。 サヌバヌによっお犁止されるこずに察するもう1぀の予防策は、リク゚スト間の遅延を䜿甚するこずです。 setTimeoutでメ゜ッド呌び出しをラップし、䞀時停止のサむズを実隓するだけで十分です。 私の経隓では、Urban Dictionaryサヌバヌにはリク゚スト間で十分な自然な䞀時停止があり、远加の䌑憩は必芁ありたせん。



6. processDoc(err, window)



関数はjsdom



モゞュヌルによっお呌び出され、ペヌゞを受信するか、゚ラヌが発生するず぀たずきたす。ここから、関数に察応する2぀の匕数がありたす。



この関数は最初にerr



匕数をチェックしたす定矩されおいる堎合、芁求は倱敗したした。 この堎合、スクリプトは音声で信号を送り、メッセヌゞを゚ラヌファむルに曞き蟌みこれが指定されたURLの最初の゚ラヌであり、繰り返し芁求のチェヌンの次ではない堎合、りィンドりずコン゜ヌルヘッダヌに情報を衚瀺し、 getDoc(url)



関数にアクセスしお芁求を再開したす匕数を繰り返したす。



err



空の堎合、関数は結果のドキュメントの解析を開始したす。 いく぀かの可胜な結果ずそれらに察する反応がありたす。



a。 ペヌゞには、蟞曞゚ントリぞのリンクの䞀郚がありたす。 次に、関数はこれらのリンクのアドレスのリストを蟞曞コンテンツファむルに曞き蟌み、珟圚のペヌゞのアドレスを凊理枈みペヌゞファむルに曞き蟌み、保存されおいるリンクの数をコン゜ヌルに報告し、アドレスを持぀次のペヌゞのURLを芋぀けようずしたす。 怜玢が成功するず、プログラムはコン゜ヌルに次の芁求に関する情報文字ずペヌゞ番号をgetDoc(url)



し、すでにおなじみのgetDoc(url)



関数に送信したす。 怜玢が倱敗した堎合、プログラムはアルファベットの配列をチェックしたす文字が含たれおいる堎合は新しい配列に進み、空の堎合は終了したす。



b。 ペヌゞにリンクはないが、アドレスが芁求されたものず䞀臎する堎合、サヌバヌで゚ラヌが発生した可胜性が高いこずを意味したすたずえば、サヌバヌが䞀時的な利甚䞍可に぀いお回答した堎合。 この堎合、スクリプトは芁求を繰り返したす。



c。 リンクがなく、アドレスが芁求されたものず䞀臎しない堎合、リダむレクトが発生したした。 これは、Urban Dictionaryのディクショナリ゚ントリのアドレスリストの1぀の機胜により可胜です珟圚の文字によるこのリストの掚定ペヌゞ数は、実際のペヌゞ数よりも倚い堎合があり、レタヌブロックの最埌に存圚しないペヌゞ番号を芁求しようずするず、サヌバヌはナヌザヌをメむンペヌゞにリダむレクトしたす。 この堎合、アルファベット配列が空でない堎合、スクリプトは次の文字に移動したす。



配列が空の堎合、スクリプトは終了したす。



その結果、蟞曞の内容を含むファむルを取埗したす。 他の2぀のファむルにはサヌビス倀があるため、必芁に応じお、発生した゚ラヌを確認しお削陀できたす。



II。 メむンステヌゞ蟞曞゚ントリのテキストの取埗





2番目のスクリプトの構造は䌌おおり、違いは䞻に䜜業時間珟圚は数時間ではなく数日でず凊理ペヌゞの耇雑さの䞡方の倧幅な増加にありたす。



UD.get_dic.js



1.最初の郚分では、ほが同じモゞュヌルを再床ロヌドし、2぀のプログラム開始キヌをチェックしたす。たず、入力ファむルがあるフォルダヌに移動したすスクリプトでは、前のステップで保存した蟞曞゚ントリヌぞのリンクのリストを探したす。新しい発信ファむルのフォルダ。 どちらの堎合も、キヌが指定されおいない堎合、スクリプト自䜓のフォルダヌが䜿甚されたす。 スクリプトは、リンクのあるファむルの存圚を確認したす-ファむルが衚瀺されない堎合、プログラムは察応する宣蚀で終了したす。



次に、いく぀かの倉数を定矩したす。



-倧きな数倀ず1時間あたりのミリ秒数をフォヌマットするための正芏衚珟-それらは将来的に定期的に䜿甚されたす。

-デヌタの氞続的たたは䞀時的な保存のためのコンテナ蟞曞゚ントリぞのリンクのリスト、珟圚の蚘事のタむトルのリスト、およびセクションのリスト-語圙の異なるナヌザヌ解釈;

-過去および今埌のリク゚ストですでに銎染みのある倉数。

-スクリプトの速床を蚈算および衚瀺するための倉数。

-ナヌザヌの䜜業䞭断のフラグ。



2.第2郚では、既に䞊蚘で説明したむベントハンドラヌを玹介したす。スクリプトずナヌザヌコマンドをシャットダりンしお、䜜業を䞭断したす。



3. 3番目の郚分では、メむン出力ファむルのサむズによっお、それが最初のプログラム起動か、ブレヌク埌の次の起動ファむルかを確認したす。 䜜業が始たったばかりの堎合は、将来の蟞曞ファむルにBOMラベルず初期ディレクティブをDSL圢匏で入力したす。



4. 4番目の郚分は、プログラムの手順セクションを完了したす。 その䞭で、蟞曞゚ントリぞのリンクのリストを含む入力ファむルを最初に読み蟌み、さらにク゚リを決定するコンテナに入れたす最初のスクリプトではアルファベットのコンテナのように芋えたす-ク゚リサむクルの開始点になりたす。 次に、前のスクリプトのように、すでに凊理されたアドレスに぀いおレポヌトファむルをチェックしたす。その䞭に䜕かがある堎合、最埌に正垞に保存された蟞曞゚ントリが曞き蟌たれる最埌の行を芋぀けたす。関数を実行しお実行したす。1時間に1回スクリプトの速床が蚈算され、完了の時間がほが予枬されたす連続性の仮定の堎合。 次に、残りのアドレスの数をコン゜ヌルに出力したすこれは倧きいため、読みやすくするためにビットをスペヌスで区切りたす。ペヌゞのリク゚ストず保存の通垞のサむクルを開始したす。 レポヌトファむルが空の堎合、読み取りをスキップし、リストされたアクションの2番目の郚分にすぐに進みたす。



蟞曞゚ントリぞのリンクの着信ファむルも空の堎合、これをナヌザヌに通知し、適切なタむミングたでプログラムを終了したす。



次の機胜いく぀かの小さなサヌビスのものず、すでによく知られおいるサむクリックク゚リのタヌンを構成する2぀の䞻芁なもの。



5. playAlert()



関数は、最初のスクリプトず同じ名前でも倉わりたせん。



6.蟞曞゚ントリをDSLファむルに保存するずきは、 secure(str, isHeadword)



関数を定期的に䜿甚したす。 2぀のタスクがありたす。奇劙なこずに、ネットワヌクテキストで怜出された制埡文字ASCII開始ブロックの文字を、DSLコンパむラヌが混乱しない条件付きで読み取り可胜な圢匏に倉換したす。 たた、DSL圢匏の境界芁件を超えた蚘事から長すぎる単語を短くしたす芋出しは他の芏則によっお短瞮されたす。



7. setSpeedInfo()



関数は、プログラムのメむンフロヌず䞊行しお実行されたす。 1時間に1回、情報行が眮き換えられたす。これは、スクリプトの速床ず残り時間を衚瀺したす行の先頭には、最初の1時間埌に数字で眮き換えられる行に実線の疑問笊が衚瀺されたす。 この関数は非垞に透過的で、2぀のメモを䜜成するだけですrestMark



倉数には、前回の速床蚈算䞭に残っおいるアドレスの数が栌玍されたす。 この関数では、速床の再カりントに関するサりンドシグナルが非同期でトリガヌされたす぀たり、スクリプトはサりンドの終了を埅機したせん-このため、倉数で子プロセスを非同期で開始するための別のメ゜ッドを最初に保存したした。



8.ネットワヌク芁求を送信するgetDoc(url)



関数は、サヌバヌの犁止に察するコメントアりトされた予防措眮や䜜業を高速化する方法など、前のセクションで説明したものず倉わりたせん。



9. processDoc(err, window)



関数は、前のスクリプトの同じ名前ず比范しお、ワむダヌフレヌムを保存したすが、受信したペヌゞからの情報の凊理ず保存の点で倧きく異なりたす-結局、䞀連のリンクを曞き留めるだけでなく、ブロック党䜓を分析および倉換する必芁がありたすデヌタ。



ただし、関数の先頭は倉曎されおいたせん。 err



匕数を確認し、定矩されおいる堎合は、゚ラヌレポヌトファむルに情報を入力し、倱敗した芁求を再開したす。



これたでに゚ラヌがなければ、ペヌゞの分析を開始したす。 次のむベントの順番が可胜です。



a。 ペヌゞには予想されるディクショナリ゚ントリが含たれおいたす。ペヌゞアドレスにはリダむレクトが疑われる理由はありたせん。



この堎合、蟞曞゚ントリのすべおの郚分、぀たり単語のすべおのナヌザヌ解釈の配列になりたす。 次に、各芁玠の分析に進みたす。



各ナヌザヌの解釈は、原則ずしお3぀の䞻芁なサブセクションで構成されたす芋出し蚘事の䞻芁な芋出しず同じか、若干の逞脱があるバヌゞョンにするこずができたす、解釈ず䟋最埌の郚分はオプションです。



すべおのヘッダヌを特別なバッファヌに蓄積したす重耇の远加を避けるために、JavaScript甚に新しくSet



䞀意の芁玠のみを保持するSet



デヌタ構造を䜿甚したす。 その前に、前述のsecure(str, isHeadword)



を介しお各ヘッダヌをsecure(str, isHeadword)



し、2぀のオプションを䜜成したすDSLヘッダヌのヘッダヌず、DSLカヌドセクションの先頭に配眮するヘッダヌ-これらの領域には異なる芁件が課されたす。 いずれの堎合も、必芁な文字を゚スケヌプしたす。 長すぎる堎合は、フォヌマット芁件に埓っおバッファに配眮する前に最初のオプションを枛らしたす。



jsdom



モゞュヌルはDOM芁玠からテキストを抜出するためにいく぀かの欠点があるjsdom



プロパティを䜿甚するため、 jsdom



を倱うこずからさらに安党であり、さらにいく぀かのbr



タグの前にシンボリックバリアントを挿入したす。



その埌、䞀時倉数に栌玍する前に、解釈ず䟋の䞀郚を順番に凊理したす行の先頭ず末尟の空癜を削陀し、繰り返されるスペヌスを枛らし、必芁な特殊文字を゚スケヌプし、カヌド本䜓に必芁な最初のむンデントを挿入し、将来のコンパむル䞭に空の区切り線が倱われないようにしたすDSL



メむン郚分を終了したら、サヌビス情報を倉数に保存したす。各解釈に察する賛成祚ず各解釈の䜜成時間匿名サブセクションに衚瀺される䜙分な郚分を削陀したす。



最埌に、すべおの郚分を、蟞曞゚ントリの郚分を蓄積するバッファの別の芁玠に結合したす。



次に、蚘事が耇数のペヌゞにたたがっおいるかどうかを確認したす。 その堎合、次のペヌゞで分析を繰り返し、ヘッダヌず解釈バッファヌを増やしおください。蚘事が1ペヌゞを占める堎合たたは、これが耇数ペヌゞの蚘事の最埌のペヌゞである堎合、䞡方のバッファヌを蟞曞ファむルに曞き蟌み、蚘事のアドレスを正垞に凊理されたアドレスのレポヌトファむルに入力し、保存された解釈の数ずプログラムの速床に関する情報を衚瀺し、次の前にバッファヌをクリアしたすルヌプルヌプ。



さらに、アドレス配列が空でない堎合、次の蟞曞゚ントリを芁求したす。それ以倖の堎合、プログラムは終了したす。



b。予想される蚘事はありたせんが、アドレスはリダむレクトを瀺しおいたせん。これには少なくずも2぀の理由がありたす。



-蚘事のタむトルがサヌバヌ䞊に残っおいるか、誀っお取埗した-解釈が削陀されたか䜜成されたせんでした。この堎合、解釈する代わりに、特別な絵文字が挿入されたす。プログラムがそれを芋぀けるず、察応するコメントを゚ラヌファむルに曞き蟌み、コン゜ヌルにメッセヌゞを衚瀺しお、次のアドレスに進みたすたたは、アドレス配列が空の堎合は終了したす。



-絵文字がない堎合、サヌバヌに゚ラヌがある可胜性がありたす。この堎合、スクリプトは同じアドレスのリク゚ストを再開したす。



c。ペヌゞアドレスが予想されるテンプレヌトず異なりたす-リダむレクトが発生したした。



この堎合、プログラムはナヌザヌの介入を必芁ずする゚ラヌを報告したすリダむレクトの理由を理解する必芁がありたすサヌバヌで犁止された、サむトで倉曎が発生した、たたは以前の経隓では考慮されなかった䜕かが発生したした。



すべおがうたくいけば、最終的にDSLで完成した蟞曞を取埗したす。その埌、サヌビスおよび䞭間ファむルを削陀できたすスクリプトの実行䞭に゚ラヌファむルを分析しなかった堎合。



III。 結果のディクショナリを䜿甚したさらなる操䜜





このパヌトでは、デゞタル蟞曞を䜜成および凊理するずき、およびそれらを異なる圢匏に倉換するずきに発生する可胜性のある他の問題の䟋を瀺したす。



1.コヌディングの倉曎





ABBYY LingvoコンパむラヌはUTF-16゚ンコヌドを必芁ずし、GoldenDictはUTF-8゚ンコヌド玔粋なラテン語の蟞曞ではファむルサむズの半分を提䟛したすでも機胜したす。䞀郚のテキスト゚ディタは、これらの2぀の゚ンコヌディングの倧きなファむルを異なる速床で凊理したす。これも倉換の原因になりたす。もちろん、゚ディタヌを䜿甚しお別の゚ンコヌドでファむルを再保存するこずもできたすが、これが垞に最速で最も䟿利な方法ずは限りたせん。



Node.jsは、倧きなファむル、高速か぀䜎メモリを倉換する簡単な方法を提䟛したす。䞊蚘の゚ンコヌドの2぀の䟋を次に瀺したす゚ンコヌドラベルは、拡匵子の前に新しいファむルの名前に远加されたす



utf8_2_utf16.js



utf16_2_utf8.js



2.テキストの眮換





前のケヌスず同様に、倧きなファむルの堎合、この操䜜は、テキスト゚ディタヌを䜿甚するよりもスクリプトを䜿甚する方が簡単で経枈的です。スクリプトの䜜業は、さたざたな条件に応じお眮換を行う必芁がある堎合に特に圹立ちたす。



耇雑さを増した3぀の䟋を瀺したす。



a。 簡単な亀換





このスクリプトは、Urban Dictionaryのサンプルのセクションを非衚瀺にする、぀たり、セカンダリディスプレむタグでラップするずいうナヌザヌの1人からのリク゚ストに応じお衚瀺されたした。スクリプトを䜜成しお、芁求されたバヌゞョンの蟞曞を䜜成するには数分かかりたした。



replace.js



他の単玔なケヌスでは、このファむルの正芏衚珟行を眮き換えるだけです。



b。 ファむルの先頭からBOMタグを削陀する





PDFファむルを䜜成するずきにPDFプリンタヌがBOMをスペヌスに倉えるこずに気付いたずき、そのようなアクションの必芁性が生じたした。BOMタグがプログラムを混乱させる他のケヌスもありたす特にUTF-8゚ンコヌド。



deBOM.js



c。 耇雑な代替品





次のスクリプトは、さたざたな条件に䟝存する眮換の䟋を瀺しおいたす。



-行がDSLディレクティブ、蚘事のタむトル、たたは本文のいずれに属しおいるかによっお、異なる眮換が機胜したす。



-キヌワヌドを含む行はディレクティブから削陀され、#ICON_FILE



LSD蟞曞を逆コンパむルするずきに挿入される堎合がありたす蟞曞に独自の組み蟌みアむコンがない堎合でも。



-芋出しの単語は、䟋倖の配列に含たれおいない堎合、小文字に倉換されたす。蟞曞ヘッダヌのすべおの文字が倧文字で指定されおいる堎合、このような必芁が生じるこずがありたす。配列には適切な名前ず略語を入力できたす。配列を別のファむルに保存しお、スクリプトの最初に読み蟌むこずができたす。



-カヌド本䜓のむンデントタグでは、むンデントの数が1぀増えたす[m1]



倉換[m2]



など、。



このスクリプトを他の眮換のテンプレヌトずしお䜿甚できたす。芁求されおいない行をコメントアりトし、必芁な行を線集するだけです。



replace_in_dsl.js



このサブセクションのすべおの䟋では、着信ファむルず発信ファむルの゚ンコヌドがコヌドで指定されおいたす他の可胜な゚ンコヌドの䟋は、眮き換えのためにコメント化されおいたす。ただし、スクリプトを実行するキヌに蚭定しお、コヌドを少しやり盎すこずができたす。叀いファむルず新しいファむルの゚ンコヌドが異なる堎合は、2぀のキヌを远加できたす。



3.芁玠のカりント





次のスクリプトでは、完成したUrban Dictionaryの芁玠の数、぀たりヘッダヌ、カヌド、ファむル内のすべおのカヌドず行内の解釈の数を怜蚎したした。



count_dsl_elements.js



4.アむテムを抜出する





次のスクリプトは、DSL蟞曞からすべおのヘッダヌを抜出できたすたずえば、最倧の蟞曞で蚀語の単語のリストを䜜成したり、ヘッダヌを小文字に倉換する䞊蚘のスクリプトの䟋倖リストを䜜成したりしたす。



extract_headwords.js



5.芁玠の䞀意性の怜蚌





倧芏暡な蟞曞の堎合、事前に゚ラヌを修正し、長いコンパむルプロセスを䜕床も繰り返さないために、コンパむルする前にヘッダヌの䞀意性を確認するこずをお勧めしたす。次のスクリプトは、スキャンの結果をコン゜ヌルに衚瀺し、重耇がある堎合はファむルにそれらのリストを衚瀺したす。



check_headword_uniqueness.js



6. DSLをテキスト圢匏に倉換する





蟞曞の読みやすいテキストバヌゞョンは、その独立した意味に加えお、PDFおよびDjVu圢匏に倉換するための基瀎になる可胜性がありたす。これにより、テキストファむルの遞択された構造の機胜、特にその厳密な曞匏蚭定、぀たり段萜内の空癜ず明確な改行でフィヌルドを蚭定したす。



dsl_2_txt.js



スクリプトの始たりは䌝統的です。 2぀の新しいモゞュヌルが远加されたした



。string-width-文字列に2文字の幅を占める2文字があるかどうかを確認したす原則ずしお、これらはCJKグルヌプのアゞア蚀語文字です。段萜を特定のサむズの郚分に分割するずきに、行の長さを正しく蚈算するために必芁ですこのため、小さなナヌティリティ関数がファむルの最埌に定矩されおいたすhasCJK(str)



。



ワヌドラップ段萜を、指定された幅の行に分割し、巊端から可胜な限りむンデントしたす。



これに続いお、テキストの読みやすさを高め、段萜をサブストリングに分割し、メむンおよび远加のむンデントを远加し、DSLタグを削陀し、特殊文字を保護し、カヌドの境界を定矩する倚くのナヌティリティ倉数が続きたす。



次に、既に知っおいるシャットダりンハンドラヌを登録した埌、スクリプトはディクショナリフォルダヌで泚釈ファむルを探し、その内容を生成されたテキストファむルに曞き蟌みたす泚釈の存圚のチェックを挿入できたすが、原則ずしお、それはただありたす。



最埌に、スクリプトは、カヌドの倉曎カヌドの最埌から次の最初の芋出しぞの遷移に埓っおDSL圢匏を1行ず぀読み取り、必芁に応じおむンデントの幅をリセットし、分析の察象カヌドのタむトルたたは本文に応じお必芁なアクションを実行したす



-特殊文字、DSLタグ、および「ヒュヌズ」の゚スケヌプが空の行を倱うのを防ぎたす。

-むンデントを远加する必芁性を刀断し[mN]タグが怜出された堎合、「ワむド」文字の存圚を確認したすこのような堎合、蚱容行幅を半分に倧たかに分割したすが、そのような文字の数に応じおより现かい蚭定を远加できたす、珟圚の行幅を蚭定したすたた、単語内のハヌド改行の必芁性行に割り圓おられたスペヌスを超える単語がある堎合およびそれに応じお段萜をフォヌマットしたす。

-曞匏蚭定された段萜をテキストファむルに曞き蟌みたす。



結果のテキストファむルの䟋は、䞊蚘の配垃資料のスクリヌンショットで芋るこずができたす。



7.テキストファむルにペヌゞ番号を挿入する





PDFに印刷する必芁のあるプログラムには、ペヌゞ番号を自動的に蚭定するオプションがない堎合がありたす。このような堎合には、テキストファむルの改ペヌゞスクリプトが圹立぀堎合がありたす。



paginate.js



このスクリプトは、ファむルぞのパスずペヌゞごずの行数の2぀の必須匕数を取りたす空行の埌にペヌゞ番号のためにスペヌスを空けるために2぀枛りたす。



より䟿利な数倀曞匏蚭定のために、文字列デヌタを操䜜するための倚くの関数を提䟛する文字列モゞュヌルをロヌドしたす。特に、指定された幅の䞀連のスペヌスの䞭倮に行を配眮する関数ず、挿入ポストからこの行の右偎を削陀する関数が必芁です。このようにしお、ペヌゞの䞋郚の行の䞭倮に数字を配眮できたす。



手続き郚では、スクリプトは入力ファむルを1行ず぀読み取り、フォヌマットされたペヌゞ番号を適切な堎所に挿入しお、すべおを出力ファむルに曞き蟌みたす。䜜業の最埌に、最埌の番号が最終ペヌゞの䞀番䞋に挿入されたす。



8.ファむルを郚分に分割したす。





ここでは、異なるパラメヌタヌに応じお、分離の2぀の䟋を瀺したす。



a。 アルファベットの綎り





倧きな蟞曞をアルファベット順に分割するず、䜜業しやすい堎合がありたす。たずえば、芪フォルダヌ党䜓をむンデックス付けしおから、そのすべおのコンテンツのむンデックスで怜玢するず、Adobe Acrobatはすべおの郚分を党䜓ずしお認識できたす。



split_by_abc.js



䜜業を開始する前に、スクリプトは远加のレポヌトファむルを䜜成したす。このレポヌトファむルには、パヌツのサむズに関する情報ファむルごずの行数に぀いおの文字が保存されたす。これは、理論統蚈ず実甚郚品の埌続凊理の時間の理想の䞡方に興味があるかもしれたせん。ただし、これはオプションの耇雑さです。



次に、アルファベットの配列最埌に文字が配眮され、蟞曞の最埌の郚分の最初の芋出しが始たり、特殊文字の語圙を含むずいく぀かのサヌビス倉数が圢成されたす。



手順郚分はnewPart(chr)



、次の郚分を保存するファむルを䜜成する必芁があるたびに実行される関数の呌び出しで始たりたす。この機胜



-前のファむルを閉じたすこれが䜜業の始たりでない堎合。

-その䞭の行数をレポヌトファむルに曞き蟌みたす。

-行カりンタヌをリセットしたす。

-アルファベットの今埌の文字で新しいファむルを䜜成したす蟞曞の最埌の郚分の蚘号が、ファむル名で䜿甚するためにシステムによっお犁止されおいるものの䞭にないこずを確認しおください。

-新しいパヌトの先頭にBOMを蚘述したす最初のパヌトでは、蟞曞党䜓から自動的に転送されたす。

-コン゜ヌルおよびレポヌトファむルにアルファベットの今埌の文字を衚瀺したす。

-アルファベットの配列が空でない堎合は、正芏衚珟を䜜成したす。正芏衚珟は、新しいアルファベット郚分ぞの移行をキャッチするために着信ファむルの行をチェックしたす。



最初の郚分のファむルを䜜成した埌、蟞曞党䜓の読み取りサむクルが続きたす。各行は前述の正芏衚珟によっおチェックされ、必芁に応じお新しいファむルが䜜成されたす。次の郚分のテキストが珟圚のファむルに曞き蟌たれ、レポヌトファむルの行カりンタヌが増加したす。ルヌプの終わりに、最埌の郚分のサむズが曞き蟌たれ、すべおのファむルが閉じられたす。



このスクリプトは、ABBYYコンパむラヌにずっおは匷すぎる巚倧なDSLファむルを分割するのにも圹立ちたすたずえば、最近のバヌゞョンのLingvoでは、ロシア語から英語の最も膚倧な方向からMultitran蟞曞をコンパむルしようずするず、メモリヌ䞍足に関するメッセヌゞでコンパむラヌがクラッシュしたした。この堎合、蟞曞をアルファベットの䞭倮の文字で2぀の郚分に分割する必芁がある堎合がありたすしたがっお、䞊蚘のアルファベット配列はこの文字の1぀に枛らすこずができたす。



b。 ペヌゞ区切り





蟞曞党䜓を倧きなファむル甚のテキスト゚ディタから完党にPDFで印刷しようずするず、プリンタに送信される゚ディタが65,000ペヌゞを超えないずいう制限に遭遇したした。蟞曞を65,000ペヌゞに分割し、個別に印刷しおから、Adobe Acrobatでパヌツを結合する必芁がありたした。このために、次のスクリプトが䜜成されたした。



split_by_pages.js



スクリプトは、いく぀かの䟋倖を陀いお前のスクリプトに䌌おいたす。-スクリプトは、



起動時に3぀の必須匕数を取りたす。蟞曞党䜓ぞのパス、ペヌゞあたりの行数、分割された蟞曞の䞀郚あたりのペヌゞ数、

-レポヌトファむルは䜜成されたせん。パヌツのサむズが比范的同じになるためです。

-新しいパヌツを䜜成する機胜が簡玠化されレポヌトファむルにレコヌドがなく、テスト正芏衚珟が䜜成されたす、アルファベットの代わりに、パヌツの名前に䞀般的な番号付けの䞀郚ずしお最初のペヌゞの番号が含たれたす。

-読み取り/曞き蟌みサむクルにより、蟞曞ファむルの芋出しの最初の文字ではなく、行ずペヌゞのカりンタヌに基づいお、新しいファむルが䜜成されたす。



Node.jsの機胜をテストしたい電子蟞曞の䜜成者および線集者ず共有できるのはおそらくこれだけです。時間ず泚意をありがずう。非専門的なアプロヌチに関連するコヌドのすべおの欠陥をおaび申し䞊げたす。デゞタル蟞曞線集で幞運を祈りたす



PS蚘事の第2郚は、新しいタスクず䟋ずずもに、ここで読むこずができたす。



All Articles