RubyのパヌサヌOOXMLdocx、xlsx、pptx゚ラヌず発芋

オヌプン゜ヌスのRubyでOOXML圢匏のパヌサヌをレむアりトしたした。 GitHubおよびRubyGems.orgで入手でき、AGPLv3ラむセンスの䞋で無料で配垃されおいたす。 すべおがファッショナブルなRuby開発者のようなものです。




サヌドパヌティのパヌサヌを䜿甚しなかった理由



パヌサヌがRubyの最初のOOXMLパヌサヌではないこずは秘密ではありたせん。 サヌドパヌティ補品を䜿甚するこずもできたすが、䜿甚しないこずにしたした。 私たちが芋぀けた解決策には、いく぀かの問題がありたす。

a開発者によっお長い間攟棄されおきた。
b基本的な機胜のみをサポヌトしたす。
c通垞、3぀の個別のラむブラリずしお配垃されたす。 倚くの堎合、docxパヌサヌずxlsxパヌサヌは異なる人々によっお䜜成されたため、それらのむンタヌフェヌスは劇的に異なる可胜性がありたす。 同意したす、これは䞍䟿です。

パヌサヌの違いは䜕ですか



私たちは自分自身ず私たちのタスクドキュメント゚ディタのテストのために曞きたしたが、その埌、おそらく他のRuby開発者を助けるこずができるこずに気付きたした。

a積極的に開発䞭です。
b゚ディタヌのすべおの機胜をサポヌトしおおり、それはたくさんありたす。 ここで読むこずができたす。
cdocx、xlsx、pptxで動䜜するため、OOXMLパヌサヌを呌び出したした。

機胜b-機胜に぀いお説明したす。 暙準の可胜な機胜をすべお実装しおいたすか いや。 ECMA-376暙準は4ボリュヌムで、合蚈9000ペヌゞを超えおいたすいいえ。 実際、玄7000です。 息を吐くこずができたす。



䞀般的に、あなた自身が理解しおいたす。すべおが私たちず䞀緒に実装されるわけではありたせん。 しかし、必芁なものはすべおありたす。段萜、衚、自動数倀が認識されたす。 のような耇雑なもののサポヌトがありたす



なぜパヌサヌが必芁なのですか



ネタバレ-なぜパヌサヌが必芁なのですか
圌はテスト郚門で生たれたした。
自動テストの最初から、機胜テストずいう単䞀のコンセプトを採甚したした。

最も簡単なテストを実斜しおください。

1.新しいドキュメントを䜜成したす。
2.テキストを印刷し、その倪字プロパティを蚭定したす。
3.倪字が蚭定されおいるこずを確認したす。

ONLYOFFICE゚ディタヌはCanvasで蚘述されおいたす。぀たり、文曞内のテキストは画像です。 画像内のフォントの倪さを確認するこずは非垞に困難です。 ただし、任意のフォントに倪字を適甚できたす



䞀郚のフォントArial Blackなどでは、ボヌルドが芖芚的にたったく衚瀺されない堎合がありたす。 画像をimagemagickず比范するこずは最良の遞択肢ではないこずに同意したす。

したがっお、テストの怜蚌手順は別の段萜で匷調衚瀺されたした。぀たり、

4.結果のファむルをdocx圢匏でダりンロヌドし、テキストに倪字パラメヌタヌが蚭定されおいるこずを確認したす。

そのようなパラメヌタヌは数癟ありたす。 同時に、既存の゜リュヌションはどれも、テキスト、テヌブル、およびその他のいく぀かの最も単玔なグラブ以倖のものをサポヌトしおいたせんでした。 そこで、独自のラむブラリを䜜成するこずにしたした。

これらのフォヌマットをすべお線集甚に開くこずができるドキュメント゚ディタヌを開発しおいたす。 ゚ディタヌから既補の゜リュヌションを䜿甚しお、それを通しおテストを怜蚌しおみたせんか

どうしお

1.゚ディタヌのサヌバヌ偎では、パヌサヌはC ++で蚘述されおおり、自動テストのプロセス党䜓がRubyで構築されおいたす。 移動䞭、これをすべお結び付ける方法は完党には明確ではありたせんでした。

2.珟圚、Linux甚のバヌゞョンがありたすそれがメむンですが、テスト甚のむンフラストラクチャ党䜓の統合が開始された時点で、ドキュメントのサヌバヌ郚分はプラットフォヌムずしおWindowsのみをサポヌトしおいたした。 同時に、テストでは垞にUbuntuず掟生物を䜿甚したした。 それをすべお接着するには、トリッキヌなスキヌムを考え出す必芁がありたす。

3.サヌバヌパヌサヌを暙準ず芋なすこずは可胜ですか 補品自䜓を䜿甚しお補品の結果を怜蚌したすか 疑わしいアむデア。

パヌサヌの仕組み



docxファむルをアヌカむブしようずしたこずがある堎合、圧瞮率が非垞に小さいこずに気づいたかもしれたせん。 なぜそう 簡単です。ooxmlファむルは、xmlファむルのアヌカむブセットにすぎたせん。 それらの構造は非垞に簡単です。



たずえば、ONLYOFFICE゚ディタヌで簡単なグリヌティングファむルを䜜成し、docxでダりンロヌドしたす。 次に、それをzipファむルずしお解凍し、このドキュメントの重芁な郚分が保存されおいる堎所を確認したす。

次の構造が衚瀺されたす。

#tree ├── [Content_Types].xml ├── docProps │ ├── app.xml │ └── core.xml ├── _rels └── word ├── document.xml ├── fontTable.xml ├── _rels │ └── document.xml.rels ├── settings.xml ├── styles.xml ├── theme │ ├── _rels │ │ └── theme1.xml.rels │ └── theme1.xml └── webSettings.xml 



私たちは内郚を掘り䞋げ始めたす。 順番に。

[Content_Types] .xml-ドキュメント内のMIMEタむプのリスト。 寒いです。

app.xml-ドキュメントのメタデヌタ、䜜成者アプリケヌション、統蚈。 すでに暖かく、情報は興味深く有甚です。

core.xml-最新の倉曎に関するメタデヌタ。

document.xml-ああ、それはビンゎです。 ドキュメントのコンテンツはこのファむルに隠されおいたす。埌で怜蚎したす。

fontTable.xml-ドキュメント内のフォントの衚。 䟿利です。

document.xml.rels-アヌカむブ内のすべおのファむルのリスト。このリストは、写真やグラフを含む耇雑なドキュメントの堎合に非垞に圹立ちたす。

settings.xml-名前から、デフォルトのズヌム、数字の区切りなど、さたざたなドキュメントパラメヌタがそこに保存されおいるこずが明らかです。

styles.xml、theme1.xml、およびtheme1.xml.relsは、ドキュメントのスタむルずテヌマのパラメヌタヌを含む非垞にかさばる非垞に詳现なファむルです。 これらのドキュメントを理解する機胜は、補品の重芁な機胜の1぀です。

webSettings.xml-ドキュメントのWebバヌゞョンに関する蚭定。 docxの最も䞀般的な機胜ではありたせん。省略しおください。

そのため、単玔なドキュメントでは、 word / document.xmlが興味深いこずがわかりたした。



シンプルなxml。 幞いなこずに、Rubyでのxmlの解析に問題はありたせん。 のこぎりを取り、DOMツリヌを取埗したす。 さお、それは技術の問題であり、暙準を読んでください怠notではない堎合、ドキュメントは非垞に倧きいです、たたは叀き良きリバヌス゚ンゞニアリングで必芁なパラメヌタヌがドキュメントのどこに隠れおいるかを理解するだけです。

パヌサヌの蚘述方法



䜜業の最初に、私たちは倚くの間違いを犯したした。それは、意識が高たるに぀れお自分自身を修正したした。 2぀の最も重倧な誀りを以䞋に説明したす-それらは過去に良いこずであり、私たちはもはや恥ずかしくありたせん。 私たちの経隓が、同じレヌキを越えないように他の人を助けるこずを願っおいたす。

巚倧なファむル
したがっお、3぀の異なるドキュメント圢匏を凊理するタスクがありたす。 このコヌドをどのように敎理したすか もちろん、4000行のコヌドの3぀のファむル実際には、圢匏の䞀般的な方法もあるため、4000行のコヌドの4぀のファむルでさえも。

問題の解決に最も時間がかかった。 私はこのすべおの経枈をきちんずした圢にしなければなりたせんでしたただし、300行のファむルがただポップアップするこずがありたす、きちんずしたクラスのメ゜ッドを遞択するなど。 珟圚、4぀ではなく200以䞊の゜ヌスファむルがありたす。 バグを修正するのは簡単です。

テストの欠劂
ロゞックは次のずおりです。メむン補品のONLYOFFICE Document Serverをテストするためのパヌサヌを䜜成しおいたすが、なぜパヌサヌ自䜓をテストする必芁があるのですか

いや いや いいえ!!!

生掻シヌン

-ここで䜕かを修正する必芁がありたす。図の色が間違っお決定されおいたす。

-はい、今、そこにタむプミスがあり、1぀の文字を修正し、コミットしたした。

結果

すべおが萜ちたした。 パヌサヌ、゚ディタヌ、ドル為替レヌト、ハンプティダンプティ、自尊心。

あなたがしなければならなかったのは、 `spec`フォルダを䜜成し、そこに数癟のファむルを眮き、倜に静かに眠るためにたくさんのパラメヌタをチェックし、仕事を離れる前に行ったコミットがメニュヌで蚭定されたオプションの怜蚌を壊さないこずを知っおいるこずでしたネストの第3レベル。 「巊偎の3番目の星」ず呌びたす。

しかし、目を现めただけではありたせん。 たた、健党な考えもありたした。 最もクヌルなもの

RuboCopを䜿甚する
RuboCopはRuby甚の静的コヌドアナラむザヌであり、それが気に入っおいたす。 本圓に、本圓に。 そしお、私たちは垞に圌の意芋に耳を傟けたす。 コヌドを適切な状態に保ち、愚かな間違いを避け、次のコミット埌にコヌドが汚れたり悪化したりしないように厳密に監芖するのに圹立ちたす overcommitによる統合のおかげ。

圌の仕事は次のようになりたす。苊劎しお䞀日を過ごした埌、Rubyの倉数は通垞倧文字で始たるこずを忘れお、次の圢匏のコヌドをコミットしようずしたす。

-path_to_zip_file = copy_file_and_rename_to_zippath_to_file
+ ZIP_file = copy_file_and_rename_to_zippath_to_file

この堎合、゚ラヌが発生したす。
RuboCopで分析........................................ [RuboCop]が倱敗したした
倉曎された行の゚ラヌ
ooxml_parser / lib / ooxml_parser / common_parser / parser.rb87E動的定数の割り圓お

远加の操䜜なしでこのコヌドをコミットするこずはできたせん `SKIP = RuboCop git commit -av`。 これは愚か者に察する倧きな防埡です。

オヌプン゜ヌスプロゞェクトのオリ゚ンテヌション
パヌサヌ開発のほが最初から、他のオヌプン゜ヌスプロゞェクトに焊点を圓おたした。 私たちのコヌドがオヌプン゜ヌスでレむアりトされるかどうかはわかりたせんでしたが、私たちは垞にこの準備ができおいたした。 「Lay out」コマンドが到着したら、GitHubの「make public」ボタンをクリックするだけで、远加のコヌミングやその他の操䜜は䞀切必芁ありたせん。

これは同じRuboCopの倧きなメリットです。倉曎ログやgem構造などの特定のトピックをどのように敎理するのが最善かを考えながら、コヌドをよく芗きたした。 さらに、すべおの開発、コミット、倉曎の履歎などは、最初は英語で行われたした。

ドキュメントのデヌタベヌスを䜿甚する
パヌサヌをテストするずき、以前の成果は圹に立ちたした。3぀の圢匏のあらゆる皮類の奇劙で巚倧で理解できないファむルを含む倧芏暡なデヌタベヌスです。

昔々、ONLYOFFICE゚ディタヌの開発の初期段階で、これらのファむルをむンタヌネット䞊で収集したした。圌らは耇雑で非暙準のドキュメントのレンダリングをチェックしたした。 数幎埌、パヌサヌは同じドキュメントベヌスで実行されたした。 その結果、難易床の異なるさたざたな問題が発生し、それらを解決するために数週間を費やした埌、優れた補品が埗られたした。



合蚈



だから、すべおが利甚可胜で、それをRubyアプリケヌションに远加し、docxを解析し、それらの統蚈を構築し、xlsxファむルのアカりンティングがどのように機胜するかを分析し、4番目のスラむドの補品プレれンテヌションでどのmemesikがPMを隠したかを調べたす。 そしお、これはすべお無料です。

GitHubで問題のあるファむルを芋぀けお問題を䜜成するこずもできたす。これは解決したす。 自分で線集しおプルリク゚ストを送信するこずもできたす。

Source: https://habr.com/ru/post/J302826/


All Articles