From 95cb401e001018462723f0714f0257060ce43c25 Mon Sep 17 00:00:00 2001 From: Jens Kraemer Date: Wed, 14 Jun 2017 09:53:07 +0800 Subject: [PATCH 2/5] implements fulltext extraction for attachments --- app/controllers/admin_controller.rb | 7 +- config/configuration.yml.example | 33 +++ config/locales/en.yml | 5 + lib/redmine/text_extractor.rb | 295 +++++++++++++++++++++++++++ test/fixtures/files/presentation.odp | Bin 0 -> 15665 bytes test/fixtures/files/presentation.otp | Bin 0 -> 13098 bytes test/fixtures/files/presentation.potm | Bin 0 -> 33735 bytes test/fixtures/files/presentation.ppsx | Bin 0 -> 33736 bytes test/fixtures/files/presentation.pptx | Bin 0 -> 33438 bytes test/fixtures/files/spreadsheet.csv | 2 + test/fixtures/files/spreadsheet.ods | Bin 0 -> 13299 bytes test/fixtures/files/spreadsheet.ots | Bin 0 -> 13602 bytes test/fixtures/files/spreadsheet.xls | Bin 0 -> 14336 bytes test/fixtures/files/spreadsheet.xlsx | Bin 0 -> 4599 bytes test/fixtures/files/text.doc | Bin 0 -> 9728 bytes test/fixtures/files/text.docx | Bin 0 -> 4141 bytes test/fixtures/files/text.odt | Bin 0 -> 9831 bytes test/fixtures/files/text.ott | Bin 0 -> 9823 bytes test/fixtures/files/text.pdf | Bin 0 -> 15379 bytes test/fixtures/files/text.rtf | 22 ++ test/fixtures/files/text.txt | 1 + test/unit/lib/redmine/text_extractor_test.rb | 102 +++++++++ 22 files changed, 466 insertions(+), 1 deletion(-) create mode 100644 lib/redmine/text_extractor.rb create mode 100644 test/fixtures/files/presentation.odp create mode 100644 test/fixtures/files/presentation.otp create mode 100644 test/fixtures/files/presentation.potm create mode 100644 test/fixtures/files/presentation.ppsx create mode 100644 test/fixtures/files/presentation.pptx create mode 100644 test/fixtures/files/spreadsheet.csv create mode 100644 test/fixtures/files/spreadsheet.ods create mode 100644 test/fixtures/files/spreadsheet.ots create mode 100644 test/fixtures/files/spreadsheet.xls create mode 100644 test/fixtures/files/spreadsheet.xlsx create mode 100644 test/fixtures/files/text.doc create mode 100644 test/fixtures/files/text.docx create mode 100644 test/fixtures/files/text.odt create mode 100644 test/fixtures/files/text.ott create mode 100644 test/fixtures/files/text.pdf create mode 100644 test/fixtures/files/text.rtf create mode 100644 test/fixtures/files/text.txt create mode 100644 test/unit/lib/redmine/text_extractor_test.rb diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 3920b74..fd72d70 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -79,7 +79,12 @@ class AdminController < ApplicationController [:text_file_repository_writable, File.writable?(Attachment.storage_path)], ["#{l :text_plugin_assets_writable} (./public/plugin_assets)", File.writable?(Redmine::Plugin.public_directory)], [:text_rmagick_available, Object.const_defined?(:Magick)], - [:text_convert_available, Redmine::Thumbnail.convert_available?] + [:text_convert_available, Redmine::Thumbnail.convert_available?], + [:text_pdftotext_available, Redmine::TextExtractor::PdfHandler.available?], + [:text_unrtf_available, Redmine::TextExtractor::RtfHandler.available?], + [:text_catdoc_available, Redmine::TextExtractor::DocHandler.available?], + [:text_xls2csv_available, Redmine::TextExtractor::XlsHandler.available?], + [:text_catppt_available, Redmine::TextExtractor::PptHandler.available?] ] end end diff --git a/config/configuration.yml.example b/config/configuration.yml.example index 3522ef6..aac978a 100644 --- a/config/configuration.yml.example +++ b/config/configuration.yml.example @@ -212,6 +212,39 @@ default: # allowed values: :memory, :file, :memcache #openid_authentication_store: :memory + # Text extraction helper programs. + # + # commands should write the resulting plain text to STDOUT. Use __FILE__ as + # placeholder for the file path. The values below are the defaults. + text_extractors: + # apt install poppler-utils + # pdftotext: + # - /usr/bin/pdftotext + # - -enc + # - UTF-8 + # - __FILE__ + # - '-' + + # apt install unrtf + # unrtf: + # - /usr/bin/unrtf + # - --text + # - __FILE__ + + # apt install catdoc + # catdoc: + # - /usr/bin/catdoc + # - -dutf-8 + # - __FILE__ + # xls2csv: + # - /usr/bin/xls2csv + # - -dutf-8 + # - __FILE__ + # catppt: + # - /usr/bin/catppt + # - -dutf-8 + # - __FILE__ + # specific configuration options for production environment # that overrides the default ones production: diff --git a/config/locales/en.yml b/config/locales/en.yml index df57a57..e7dc32e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1133,6 +1133,11 @@ en: text_plugin_assets_writable: Plugin assets directory writable text_rmagick_available: RMagick available (optional) text_convert_available: ImageMagick convert available (optional) + text_pdftotext_available: Pdftotext available (optional) + text_unrtf_available: Unrtf available (optional) + text_catdoc_available: Catdoc available (optional) + text_xls2csv_available: Xls2csv available (optional) + text_catppt_available: Catppt available (optional) text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" text_destroy_time_entries: Delete reported hours text_assign_time_entries_to_project: Assign reported hours to the project diff --git a/lib/redmine/text_extractor.rb b/lib/redmine/text_extractor.rb new file mode 100644 index 0000000..33f922f --- /dev/null +++ b/lib/redmine/text_extractor.rb @@ -0,0 +1,295 @@ +module Redmine + class TextExtractor + + MAX_FULLTEXT_LENGTH = 4.megabytes + TEXT_EXTRACTORS = Redmine::Configuration['text_extractors'] || {} + + def initialize(attachment) + @attachment = attachment + end + + # returns the extracted fulltext or nil if no matching handler was found + # for the file type. + def text + if handler = find_handler and text = handler.text(@attachment) + text.gsub! /\s+/m, ' ' + text.strip! + text.mb_chars.compose.limit(MAX_FULLTEXT_LENGTH).to_s + end + rescue Exception => e + Rails.logger.error "error in fulltext extraction: #{e}" + raise e unless e.is_a? StandardError # re-raise Signals / SyntaxErrors etc + end + + private + + def find_handler + @@file_handlers.detect{|h| h.accept? @attachment } + end + + + class FileHandler + def accept?(attachment) + if @content_type + attachment.content_type == @content_type + elsif @content_types + @content_types.include? attachment.content_type + else + false + end + end + end + + class ExternalCommandHandler < FileHandler + include Redmine::Utils::Shell + + FILE_PLACEHOLDER = '__FILE__'.freeze + + def text(attachment) + cmd = @command.dup + cmd[cmd.index(FILE_PLACEHOLDER)] = attachment.diskfile + shellout(cmd){ |io| io.read }.to_s + end + + def accept?(attachment) + super and available? + end + + def available? + @command.present? and File.executable?(@command[0]) + end + + def self.available? + new.available? + end + end + + + class PdfHandler < ExternalCommandHandler + DEFAULT = [ + '/usr/bin/pdftotext', '-enc', 'UTF-8', '__FILE__', '-' + ].freeze + def initialize + @content_type = 'application/pdf' + @command = TEXT_EXTRACTORS['pdftotext'] || DEFAULT + end + end + + + class RtfHandler < ExternalCommandHandler + DEFAULT = [ + '/usr/bin/unrtf', '--text', '__FILE__' + ].freeze + def initialize + @content_type = 'application/rtf' + @command = TEXT_EXTRACTORS['unrtf'] || DEFAULT + end + end + + + # Handler base class for XML based (MS / Open / Libre) office documents. + class ZippedXmlHandler < FileHandler + + class SaxDocument < Nokogiri::XML::SAX::Document + attr_reader :text + + def initialize(text_element, text_namespace) + @element = text_element + @namespace_uri = text_namespace + @text = ''.dup + @is_text = false + end + + # Handle each element, expecting the name and any attributes + def start_element_namespace(name, attrs = [], prefix = nil, uri = nil, ns = []) + if name == @element and uri == @namespace_uri + @is_text = true + end + end + + # Any characters between the start and end element expected as a string + def characters(string) + @text << string if @is_text + end + + # Given the name of an element once its closing tag is reached + def end_element_namespace(name, prefix = nil, uri = nil) + if name == @element and uri == @namespace_uri + @text << ' ' + @is_text = false + end + end + end + + def text(attachment) + Zip::File.open(attachment.diskfile) do |zip_file| + zip_file.each do |entry| + if entry.name == @file + return xml_to_text entry.get_input_stream + end + end + end + end + + private + + def xml_to_text(io) + sax_doc = SaxDocument.new @element, @namespace_uri + Nokogiri::XML::SAX::Parser.new(sax_doc).parse(io) + sax_doc.text + end + end + + + # Base class for extractors for MS Office formats + class OfficeDocumentHandler < ZippedXmlHandler + def initialize + super + @element = 't' + end + end + + + class DocxHandler < OfficeDocumentHandler + def initialize + super + @content_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' + @file = 'word/document.xml' + @namespace_uri = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' + end + end + + + class XlsxHandler < OfficeDocumentHandler + def initialize + super + @content_type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + @file = 'xl/sharedStrings.xml' + @namespace_uri = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main' + end + end + + + + class PptxHandler < OfficeDocumentHandler + CONTENT_TYPES = [ + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'application/vnd.ms-powerpoint.template.macroEnabled.12', + ] + + def initialize + super + @content_types = CONTENT_TYPES + @namespace_uri = 'http://schemas.openxmlformats.org/drawingml/2006/main' + end + + def text(attachment) + slides = [] + Zip::File.open(attachment.diskfile) do |zip_file| + zip_file.each do |entry| + if entry.name =~ /slide(\d+)\.xml/ + slides << [$1, xml_to_text(entry.get_input_stream)] + end + end + end + slides.sort!{|a, b| a.first <=> b.first} + slides.map(&:last).join ' ' + end + end + + + # Extractor for Open / Libre Office formats + class OpendocumentHandler < ZippedXmlHandler + CONTENT_TYPES = [ + 'application/vnd.oasis.opendocument.presentation', + 'application/vnd.oasis.opendocument.presentation-template', + 'application/vnd.oasis.opendocument.text', + 'application/vnd.oasis.opendocument.text-template', + 'application/vnd.oasis.opendocument.spreadsheet', + 'application/vnd.oasis.opendocument.spreadsheet-template' + ] + def initialize + super + @file = 'content.xml' + @content_types = CONTENT_TYPES + @element = 'p' + @namespace_uri = 'urn:oasis:names:tc:opendocument:xmlns:text:1.0' + end + end + + + + class DocHandler < ExternalCommandHandler + CONTENT_TYPES = [ + 'application/vnd.ms-word', + 'application/msword', + ] + DEFAULT = [ + '/usr/bin/catdoc', '-dutf-8', '__FILE__' + ] + def initialize + @content_types = CONTENT_TYPES + @command = TEXT_EXTRACTORS['catdoc'] || DEFAULT + end + end + + class XlsHandler < ExternalCommandHandler + CONTENT_TYPES = [ + 'application/vnd.ms-excel', + 'application/excel', + ] + DEFAULT = [ + '/usr/bin/xls2csv', '-dutf-8', '__FILE__' + ] + def initialize + @content_types = CONTENT_TYPES + @command = TEXT_EXTRACTORS['xls2csv'] || DEFAULT + end + def text(*_) + if str = super + str.delete('"').gsub /,+/, ' ' + end + end + end + + class PptHandler < ExternalCommandHandler + CONTENT_TYPES = [ + 'application/vnd.ms-powerpoint', + 'application/powerpoint', + ] + DEFAULT = [ + '/usr/bin/catppt', '-dutf-8', '__FILE__' + ] + def initialize + @content_types = CONTENT_TYPES + @command = TEXT_EXTRACTORS['catppt'] || DEFAULT + end + end + + + class PlaintextHandler < FileHandler + CONTENT_TYPES = %w(text/csv text/plain) + def initialize + @content_types = CONTENT_TYPES + end + def text(attachment) + Redmine::CodesetUtil.to_utf8 IO.read(attachment.diskfile), 'UTF-8' + end + end + + # the handler chain. List most specific handlers first and more general + # (fallback) handlers later. + @@file_handlers = [ + PdfHandler, + OpendocumentHandler, + DocxHandler, XlsxHandler, PptxHandler, + DocHandler, XlsHandler, PptHandler, + RtfHandler, + PlaintextHandler, + ].map(&:new) + + end + +end + diff --git a/test/fixtures/files/presentation.odp b/test/fixtures/files/presentation.odp new file mode 100644 index 0000000000000000000000000000000000000000..63656dc1b7a38fdf03685ee7abb57422d46c1849 GIT binary patch literal 15665 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%0DBwE`J;C2inSasn1qs;aZ(s_dU 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 Diy*y# literal 0 HcmV?d00001 diff --git a/test/fixtures/files/presentation.otp b/test/fixtures/files/presentation.otp new file mode 100644 index 0000000000000000000000000000000000000000..7a74a1fdf365fb1b3b72e56fe75f168d6ae59217 GIT binary patch literal 13098 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/files/presentation.potm b/test/fixtures/files/presentation.potm new file mode 100644 index 0000000000000000000000000000000000000000..4736e8274fe74c9c84f05c0ab8db866e6225c27a GIT binary patch literal 33735 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 Lx%lSs*!k^$Fg{DU literal 0 HcmV?d00001 diff --git a/test/fixtures/files/presentation.ppsx b/test/fixtures/files/presentation.ppsx new file mode 100644 index 0000000000000000000000000000000000000000..7a4684be803a8ed8903429888888bba7f6decefb GIT binary patch literal 33736 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 V0kq2&i6H7L33b)=(+~aI{{cJJnsNXD literal 0 HcmV?d00001 diff --git a/test/fixtures/files/spreadsheet.csv b/test/fixtures/files/spreadsheet.csv new file mode 100644 index 0000000..bcfaee0 --- /dev/null +++ b/test/fixtures/files/spreadsheet.csv @@ -0,0 +1,2 @@ +lorem,,, +ipsum,fulltext,,find me! diff --git a/test/fixtures/files/spreadsheet.ods b/test/fixtures/files/spreadsheet.ods new file mode 100644 index 0000000000000000000000000000000000000000..2c6c6603b27dad945b0c9ca6647db99b0c78b5fb GIT binary patch literal 13299 zcmbVz1z1$u7w-T9iiDJaGy)O=($Zbh-7P6Fz|h@@2+|VLjdbVGEg(oqcXtiV8@$(x z_g?S+z3(l)Gwfkzt+V%v-&$**jhrOhJuCp=J^=6nspOTv1;;yj003}%LH`7>G_y3a zbGA0px3;!0Gt{>;16naSSiPnP>VwQc^gwGPtJgq7drKoLJ9?0{t&#p~kg1W8o!sAK z_8er-W#RzrGb^cnFWZ!?&px++R7wIPDTs`=?N0_D<~4;!V1ve4bbc6 zJ}mT=mVzJpif17qETH7{X})6F&5oy z5&7E;JXfBQ1uA2oRYxciy~F;XiwZa3Y@ zVvgB{qvtF7Z#yGNgNTC~7!e2rsf2wOm%e2hp=k1*cG};3qRLgPwcGD78LjI0+|Ox$ z-OFILW&0{dxAZbv7dSpT?v_H!wYpY2cC*r~VrVGXuFwqrMQ{mp7|?b_eRuk`6F% z)m^>>M^!q+F3Dy^<&5KESRN0?>$fyD^;hKhO>}q>$aS#?4TtrQHdqp#i5zBUaP^E% zm01lPeGBEQJ*mtZKqcld7(NBb;PDz0{!$(7qj z@N!&k4LG5B^6~vAWmUzi;ESXji>u!9b=~pl@z}o3l`nCF6G=sDGnyK#d36n$nRH_Z z->(ZtD^K9!M&Y(~F1D7LNL^~pZq%^2Jc0>b*zK^q`A-;d8fxTk{eobf>+ur0Hw%8f z7Ff<0m6HsU$=7J&kuMUd;uR?R&3n0{B8Jo&1w3jjN9LE+a@qadyFPB~Yw3>}#)~}~ z6nS<}-r!vCB=WUkbSI2nF6E-!j7Ai_H0l^G1$ut2B?Iq$dU%LE(%N&Vs_hZ$s?Qz1 zhlz@ZWQ!aw=22Qcj~kC3C&tQk;LlVR2K%uFv2+aC7wOAW;o6S-{#e$6@9d+OmwdO; z=-Z^X%hMZhbaidR9hq+YoOi;U%$DJCw6`Qy`jc0Qdb3a7bMK4~dLIwZE#dEGN^X8s zzNvT2*lRrs>tXj7D>oSvx~F@BN>%Iv$}Ii%3`-$ja|IvrJfW{PLYOS6cX`SYgQt$? z!L#In726WEDOcKXaVM2p^0WFyBv)Nj%1^Murtz?=h2Aa6`E$cZ$)UbQtG1WfZ~ZO` zU42=w(u&VUarEJ0vjo8sl#ywUd>si_PV?#v9dd(Ms$%sFCp-n$*L`zS6nwQjA%&o{ z9Lkr30uQwhwbJWTZ2fBl-4K)6B7OGGyprF*>CZdWRXH>4W1YPAcf{nun%%CU+i{(- zJh1h4ee;lehM5iU8R=}LK)SIzipXYRigPwcO~7}pBp-Lth9<^Uizb%mE9dgG>sV&v z<@|_PlJjCmf=Y%VS!7>kL=aArb1k#{;Bd9c8T-d2rZ^> z-AT{a+8w_RCq3i^+V^-mU0(&+hxG5+w9;nvpS84YyaK-8y?}#EId0VSQmUfa7X^1- zlvgt@hOD1elZ-XkUxbz{QpRK;sANywh$(-te?^m!aI$4)VQOy1cjk9SC(Y$?altnx zlgyLrG9F`DM=4D(TV7YfyhtwWuz7O6UbbR!G529T95YMmiRKcWAFx>Mo}|>Cusv2o zJJr~<4McWqg_3Tf3}jMkx3-s>doByPT5o_%Vkn1jC1imQT3SEcnDWx; z$Z2yfT{Yt{xKPACI~b>z#XAF!?6x z3-X_DqYhNEKG$_W&6B9Bn?ZXC`(%D*0Sk=P@(XLPh{t@)_M?mDs6m%yG}zn0%K^qP#djZjWUXJ^S_AjxrKWK8Gu zpu>^A?lOC|eSWeq1M2O6pr2^jNe61vGFa(%O9 zYOtql0#wJO5>z&0eAwBz*GCiQ(JIJogF&6iZgv+tD;q%-*qJ5UTpNK=8Hs9x5!ai+U7NW(g@qAX zydT$dZpuBhCPVwBy8UrF-&0sHxj5Mdn)Nx@mzP&oZcSXT7j|?TqHXrr)rdNj6PsF?S}RaI z6%7IFbw`{puDp+9S+DVI@EmNx^eEdu#-q><2?-H-(~`ilM2FlXR7K;25#RQRlsOhz zC6ZGl_6aDVvaqGCyu#kzz78#5a%%-t({Q0lOVhi#S>@j}h9)5RC?d1BlF)N%JpQR-Tz{UOjoFkZeDf58a~jfSF5@C)6cL-nW*F%} zk>?t#&0HRk-gBeG-k|HNzey5Dh1G^cSsqZ`T{GYAD1SdaFHejzg2GZV0Ag@T% z6M%*1YJsZ<-Y<+-V$Q73SZZSimmY}S>;-Et8V|&C7;oj|M@mI+@tLpWpCA%X52-k` z!)F(1yPDLxjjun{sB}bjKj`*Uuh=-j>+N@(V5`5-zbdg`e3!^svP{7ncqWRK;O0p2 z!oKHdNXgdLQd-$aWLuuqiioC&z@wXW_H3y^+VS#qC%zU>IkR0h#JSIJnNVrOGfKnuwy!IPsDYe$h`3i>W&e1sh^U|_gEm+E0rUK`VhWLahq0ZN>5U9 zr&gua(u$0yl+ZFQG9~ppQd!dFb;#%G!#9PE{X9fmuC-jMCJb~tJ@g!%n&K`HhqbPt z&#Fb%vW>32Xw&Q;Ufv9med{){x66=}oG$C7Z)BR6mh<$zEv_=g)Rq=Y-W1lIybXFf zmC|ioX2oga+d(Hf)6$0WHnf*VW`T%!?9S|S7?Gi-eoZLF^hvPuTu0YoT_kEw2j0}E}JoNA=%eptbHybW?Hx_QudjUjYQL0fC_9N2cLd{04d{M|&xA%8nBCTYrvV}jFYXe` z)HFUN=w_e$D$JxNEwsx>!R_=w5&h{gJ8#XDTbNRFGik&l*{+oVZO_)aj{71v=VY@C zL*l8`3C+zC9hk~VO3PBEKCvHZMA3DxUt#X%vh-bhRzV{XW;T3)|)>*(l&KV^OAXyfMZ7mo- zKU>gGO%|^pd+E7Y-UBm?tJToP=DeqT>J!$;aWscH#$wRI^|8X7`7^O)rMCj`E9hj} zhJJ!bFG<^Ldu$JyDL1eVq~AU|3+QFffK@2rCZV$VilfQ+mnwF8*CsIw)%N{C%%z?P!R&d0k~jSlT|OsF1G@BA?Ifo zC#8kFK8Nw%z1aUl90e&_M}3ZJ4W?W|PxRF{hRA+>cyWV$U)TMF#q{qRCYK~nfnVFubp9A|ov5o!gPbjl2g zqhzk71R;u9(`je}{1(3nVJ%ob8(|cu_dYn26Ak?SShtdqVfks%+YB<_{Qb3=~q6AupP;Wo8l!NhbTsvmc1QC#za7HC={U> zrgX9e9H1PaSdt&0=rbSm@gIiFxB^;OqSIt)#(T+?0qkpWS>%LLK73he)iyf|)9iWGLJ5u{=F%iDf zJ^}21y5-Wz8Na8mo9{7H8-owjV>TL@6hdVTZj7 z2ZjO94^Z$1n+3X{syYy!ch&SlDZaZkIsV^_B0GOb{dwSzFde2Irk)U&PE?3T1DMbK z^xOkYIqsi(3tu4J_cpLLqI$%KsrB}}2eONGr8En_Gf>iflL_fTZR<y|!Oa&j9tPJ65PnP-3$gaw3RnA_{z;HX{2z2q;qnq{Vv zP?`zH(O~`y&`t)zfdG8HS+om}^6;z+4>ei;`z1*Wql!}UN+YVu1*~Smv5y1g+p46Q zf=CNSZ!v{*Hf{f}oU;2A{+b6VKv>iLPQ{gsB#2On_C0wrj7d2Q+SnJALEaJ^@5y*W zy2%5|HFU+dDgE4fmYQR6l*N0LBaM^B;78}Z2*2W_Gh~Gb>q?DV=n%wx{=2{w85lPH zM8U+g5aC2J3sL9@_8QG=SDs3ud_?R`zymlquCX)>b9^{kz)7&#HtI?6K99WKS8uSI zgb#Q;he6b{^)&bznkjCQsIGYiy{{U$@bb8Gd*UeJ{i&7TlYuXPnOpAiUvry5yMNT~ zMYzWSw|Wa1VZcGB7b_yzKOhJa4m&HUYUWt%X;|&~57%pQ8`Mu)iv493KRnMfoqW)t z?yux8SNDh%F@*ua;s<=(hQ9sF(fRW5FXuvfjj@m)S+MHl&UMC!VK3NepsNG!UExDl zca3m`VwsWED1Ym1DUAZ2%*EHD32Ubs{4qp_WSIqolxLCD6t^+(PXo;zQd0!=a2*J~ z`2#y&`<3>o$-=kD_~5sgSuKQkL>Mw=v$#2qsK z9T3hrf^P%n)ndVqPobdH!S{_##cdbQB3;S-^M<%W_?O2x5p2v)@r;cT^6%2-#p-Qd z$lr+i;j3U=DBzrlDid}KQb~5b>l&6E5m!g&7`hZ3GBze}{qn_&^$&A12}1j0f-5NE zkIo|zz4_r-x25WQ-(AVGcZT(cpx(suaS{T?fi# zE0O0YY9$JS^?#%wBEd7!fa#>bZb{{rpRxAMq$nBxjLjuQ%DbFUPhWhiJ-tTU9_b?X$mSoh&8qwbvwFBm6C|)x zKMNWPs_y@hsRg@+=aeF$xq7e>9Of!R)4N=UNAMmBo`%stH-&A%P~FW4$v1~0)ee>x zrM$0WdTxEEu6Fcpw=x9H76ATT8Nm;hk06<~KBF8a?J*a$RN6DBVPC>m8)3}RR>`oe z68hiMxhafnsPC~ogYGJ)%TPM&HDwTpq9=FUmAAY` z2Y(^az$R=mGr*w z6hAg(AOEr;druaX-xF>eT7JF4*rt)VLl>OlCBPE2h*6W(=Mlm0J_?7me@7~ixB#sh zQ5J9E;n5kwnW%I0=zAfu*)ENSD()KJTlW1ggw_8eXf5Ff+=EUA;Vd8wnQE4*4-vq6TWWlrrIPqM`@_AV z#Wdh%l79-oc6&AL?wD?)@+P-HfVfbTPi~v{z0lXwTh&k!+!pjB@Zy9Y2iQP$a&wLH zM>x&a-T^qck>(b>E4P9rddn5lOW|xlIc+G5LE2XAe|Y()+@7?b$p4=KO7KOh;z61J zkMj7o4gm{*Q$tw#*iY+-U_HlL7j|6$UL1QIz7fKc6{dg9&QeGMYAxUE05*&(>2c#D zc7vv?z8k>Ko=he1-hK=8!3#h_L`Jw!P|xR&M?3fL-~aKr==PJJgbW>kjO^^ptV}@k zPL>wianrzw7mu1|A*w0$-vHCKtTa+l1+QoB2qnefSjI=%ZMH35*=`84`WC7%{=yh3-O77k7LR$*2z8`>i5tr2#L_lT37d- zLOq)${$z3QHL+zLiMYkL32qssO-+rAvb0CDnte2y5bHkHXuA$QDlaL<@&kbi)MJw6 zo+oxPTeGCHu)0lJaipHE!mwiL8nmi890~y~u*mw8 zZ7lc=_?1s^{OohoG~LJ~>{y=OV49lwoXA zU-lWL3pQf>T)Y>sX{fC1FrU%FeOS&SWu(-HRoHbjI-8#6z`)sG zW<5=EVvj$w6EVs>M`=#5An9OgMFZyAjZJAHEghjI6+Ia*PhZ9)&p97M`R*$o_S!eu zcGudwEqQIv=Tm`n21TjQ=GLoaT4Kg1%Kia0@Z=P1jU-tf1jvA%%)ghK;ioG)rHD># zmKFbq1zD&P96>UJE)xGC=BXvgf>|=L{v)KY?hY26OzjN}R*s64Gy`^)rx>9+NeVJ; z6Qys`!E40J{?;fR%4?YLCW2$>kNl)Ofis1z;`47`FfjRg5`Ssp`$pkv6m$IxoIQ4a?Id?Ww>{yXX)LZjXg zXk~Z%1Q;6h?P}7XMK#tUv-dK-MJsK!k)QI3no25t z(-ZQxO5n6B6L&bg47a}&yX2L28YmbZYso6}YDn0IsH;+d7JS;}-z``sZY9zxzS^t> zf5vf~*jl^X-w#JHlZ}N`mohP>Fv$q`I2x~CTFG$b!**sJ9FE5-$mi0@cOYR*N zwJ|Jhebi+43Ea9N(o2~7Vpv3`Pj{Nx@L8``dk<-6eGN>CPdQ`Xws5L^Vm7>_crSX6 z$tq{Qc;2@3Es$YmRA|6*H;RCmP-jBGk+Qc?FudPq0k@fw5)tMY&G)-Y9TAZkp#AVD ztK~AuMQS#}X?k@Y=x}urwVBry&-j%bE|dayUPKC^!cLF0P%rn!yZb~s_&G8{1K_*8 zC-IOnvj(P732yP4eVph-t7B`)W2}OQ zXx&+pDDmogW}ab-q5QTT-mjZ7r}N|SW{C&lcatET&W}&^{Eqr{)V&h}e5-wFNM$#d z#8k{Ldf^K>q>SOd5y?8p>5*A$jccfJ@kh1T5ab{l3+M2Im66>!wtuo@v%XHq zKbRO-p_DMJaMD&q!Vz5wORmh{q$MUIQG>UDwUKTvR645vYXnQ1<*Z_6y8j?jB_~&6 z_LH5c=Vh*dDs|SvRujqe`OA%VTvO2FFX5m|xQ0rrLVlsM3YFILDM7mCDxz38HvwMz zxB1-|^CT2O1$OJ{LPbu#s#@oHwR(Xk=Zpid;oA~l32T_VDCy33Whm?Kd2%@ zrTnTg?c+(2)8(u2VC!I<{Yy`ncS9<(xO0d+E74KcV?f(iH}FJhUB*b@#_q){k@jbV z)Sd!(&Gzs&#)p%BA;xDZ>uV`=>s_8?Y@Tqpu+sJUCXVPH0MPU3f5FO+vnNJ&`nQ-8 z5-Is1;RTjIH#esE=rWZR$m6S{>o!KB08+f6w%VszM(PW>wP^}k z)rz}E!V=yBt!rQPvS;oeov@$O#$Sst z9DLE?P3aFrPgEs~x0@wkX=^#@2+T}T$4WWQGYU3FYveywrnt}G`$3N+qqNXN0TEF* zD`erhL~H9#Qq=mu1+fTtpll6kJoyvh>ilyGx*FHD=om&#)IF2e{F`O!nmI8@?gRU&+p$Go;+6XR)6*DiqvH#-pxdsXNA{*%~;Ee9c0v4Jzl ztLVWJNmli;#JcAL^^@DO?9U~{{l*xBdyrR$a1Mk^V!f^DM~!V4qq%jN$=|B2Qneb; zrL)pnTltULA89ZciI$h1AC0LKK6x8p`1e0_Yf$LKd=`K*tD1BzM-~gRYHH(zGV5tPCJQlC5Hwk zaw~p^3AqUNP)mqdbRJQLe1+AC1?j`1kWcOEqb4j(bg=xVPDO$^i#|5% zZ^^#}6RMf4E7(6{=KPdrJ}Rh4)Y%}H0>a~;5F9#n^+Cf4(O|Q>QBDy!K4+yVz7OYb zLk(Er!O={rT_n*rB1$M{?r7?S1*K&@8Zp=m2ykhWI{`$G;3<6jDy~dQZ6X% zW?vPnzCd#~u~eIx7{wODQ* zOC2R6xUiM*(ni#vVQPya?FdyQIk3jQ&vG)9 zAx5mK8Ft1O=vl*Md$2Z9wn|%oQ~&BUpWaPCAmMBhKus)S?iP9xxbw00Lsn{L}Rg-LQx+d|G z2*}ZuyKgc+IfOr3lPJwW`_O&+Yug(HvmN(5iTYIWQGE%#qih@rjFyiYpNDdbHD?R* zi9PimK7o6kV@;aW*;YR6DlB<<+MTY%J6k;`AR<8PdLAwL~%0(bYC(_S{$ z#y$-)yrwjVbhY=b)f_i(&S7R`e;$d&K|u;u{S_*=cn|55PRTxw)+Cn??bYeVJKQ#o zo{j5E;acAaKGX7guY?GzBqInV1afF8l(gR$mEZ<&gsDyY%Ta#^r1e-d%yN-4d$LKmi8rWtgnYFf;!&ro)Yy({=sR;u_qLnOGfeSPmpzsx zT-`8XP|k8efG3mHBeS^;N@(vY*W;@m*6CR03pMANlOZFJ+S+I%z7Lr!+YgX2s@1zIic1_9=K5fd&j~11Bjr zH-VFl(6oYh--Jf&lmP(%@cf_M$n744rM{J!u@T6Q-uAU|Uu2(^?~6x%yWIXp{p0)$ z@bI=&JvHXZO{@WG@C*m>7&G9|NEP{vyp81H#X?c$+0gQYZGD2S;L@CCB^EJ>lqIcwnq5Z?~Be<_sa>37+Q6O({jvuT*FVtRxBd<_~!w)#GR9 zOHeB#+0GnuD9_QHy1me;*YM3ZjazSzHgsTo<}Gs8vd&yX@s5`7tXs6H%Z{Oo{kQi0 z*{4x@pO|)JH|n^YZ&t7A2X62dipm{?E%^J>P0qts%MXZ^#fom#R}L{9f`?{l-@mf- z&lA5;jr~Q$(2)?(%Gk`r-uA~?Ul0?6nWeso5r{$1%+6BZ8U*bOe?2bz7bkS^^{%*(V*>5=Y4GoPfjG(gz+AAx3pdq(-6S}?W%>f0IpoXqcZ_q*kT?DXyIe_6!u_`%Egp4S|U-1Pk%?p$yty)PQ zO|N1-p6vN*tepB%U1{UN5S$#hLzo`_mq!#;453l7%9(j1TPqhch6rkwsLkxIT}xyR z3nIM12wyv9=Es9RY`b32ux+-};M&1G+AJF!=FJG642qB!6AERC2V{KThy`4jN&;SA zHRvSA($9o=WvVg6)6ULumsju+7mWz*gQWu;6XhWMh4X+0W;$X_yOxZlL{_cdVIo&& zjORf6SFiA-WVry3%|oNM3;kqS`Xd+0s4+twGphAOHwijt=+TgEX%hHCZv?4E$6Q9eA{NQnCPh{Ij3 zQ{pjVU3lzI? zzxE2Z9o`+ekwJm`&wlTpT)#s9Z69$*QslpO760V>74!bSz%rV@r-`4Ozl*e6OuVB5 z+J9rizYy~8Hojy210(O=Gd%yduwN1LzvbLw<{g>*M$X?6^bbitEq}}T69#WF^o~-0 zBk4a7^?&K?7G>_}^fyB9@bteId5dv(L{Il`W&Mh;|1Ib5voZdSoIAYzZz+GD&8Oc; z`4xZvTh8BSGyEGlcX<4Vl%Hn%6-aIo`HqmF|E}{}e3p}hht^C006O%?8j3%b47cz8 E5A_Me-v9sr literal 0 HcmV?d00001 diff --git a/test/fixtures/files/spreadsheet.ots b/test/fixtures/files/spreadsheet.ots new file mode 100644 index 0000000000000000000000000000000000000000..115133bd1947c1f08598e400a612af3c732a794f GIT binary patch literal 13602 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 XMd-BDtfksN`2UNgw$+IL-)a9}`Yd0e literal 0 HcmV?d00001 diff --git a/test/fixtures/files/spreadsheet.xlsx b/test/fixtures/files/spreadsheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8f9c66323b029d69edf22efbe47e03187d5b0c37 GIT binary patch literal 4599 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/files/text.doc b/test/fixtures/files/text.doc new file mode 100644 index 0000000000000000000000000000000000000000..6e4787b72106bd3c051a4db70ab2f0038073a0ca GIT binary patch literal 9728 zcmeI2S!`5Q7{||Pr|nEFrJdG_fHIV^V1WXyg%%LIQOZauP!^TVLR+b{GuW1h4<^JV zAx0C755ABX5==}?3@-2TqEBuyA%QoHzL@xc#w8@u`upEIw@eE&9R@-G=QO{$=br8R z&Ue0hmV5id_obIke>(doGbOAsxn^uUVDb~vE%6fXo=6UHrHze`k9)~Pv*8}Hz}2{} z8bcq0mK-t z3s1s2cnX@J8Cswf+F(7j!v^SpjSzvSVH0%1X6S+~uobpJH*AL;uoHH{Gw>`t2fJYp z?1g=xem@_-UK_nTAG2tZ%LFgU`2nry#+-A0O}oagbKu}`Y$Vn{8rl^b?p@jzJA8Dg zFFNY137y?aYl|Ipb_I&paO33HG?+gdKYPh-DAh0i=L$_#C`Dcnk1J#svYQpjYv=&m zl;6j53|H2&&CGAZX2|rILGIkFjJK-01_mrePZ zV`3TNO@LVH-uAsU2b4!WZkzWV!u0C_jnWyXh)^gR3VI%c=9qn{i=G1Z}?R3huSUnM?JTJqP>Yo^oQKa@! zGc?gR?KR5debM~U74c&kKN^%{nE=}RQ9)zq&LWJ1HY1MrYP+%;w1ZK6E#xas(2S#y zqbW;42|T_Oakn=cDo)~w(}(StX$Yl9Pr;6WHtLv6XXB~&~%u3-XMpVu9PysU})M(-KVa6Buyhl*=@8Kqb&_+ zw_^`ksol|c5FL8VL35aLjcK;mPJ4a)d2KPtVkhejVG50s^;u&yLcK&gHipyd-Syh+ zufG*-I zf&%ygG-ICwolCy~olP%*&ZoaX5nKkz_!rdvuUFj(UosUm`QNU%+SeYm362+SbS7lQ zz0l-ExGMfv)z6zwfA^y&-u(8VwVj~=-M$?B(k&}9O{`$WrnM(F*b{AVQ{58r-+-^e zgq`)zP4HH^Nre(_#>Zzmc9n3&Wm_+vP|S&*aDM-e>*-ymmP))=8Fyt)Oidmy#B>_1 ziulzl*~`64!#f>v%*8t`GAl1@fvg4YDhmv< z`PVUL$b>jL9pQL#)QR_V9pq0ZWcSqHPrlCCA@cjod}oJqS9K+;OePj!Lpuu=K{eEZ z-eQ<5=ATTO%htJ@Es(pe+7_+!n|i<9>o4YxN$+}^H~(p{p(v!;ujk4tB_mz`rk#!*Sk8sOG;P%e9AV+SqQtF{ckTH z4`O^CkS2X-FzRNe@jE+%{#Vhi_uee;I>|R@kA@87??-<6J)GVM&cMfirY}AD|F!-D DNz3Va literal 0 HcmV?d00001 diff --git a/test/fixtures/files/text.docx b/test/fixtures/files/text.docx new file mode 100644 index 0000000000000000000000000000000000000000..1cad839582fd31f36ed588530c1aef6d853f8129 GIT binary patch literal 4141 zcmaJ^1z3~&7ak0l#H3NWk&+N3E+L%~BQ7GL#86@|Is|D%dQt+?p@0K~0SZn)q?HtO zARt3Zq`bt4$$z^g*ZaSoJ=^o`dG_x6&igy>Iqxww1d=fUPMtah7zR8s0GtSF!u2&D zsE4nl1o0Dj&&Uv{P7}9*XVzSw_7IEj9o*&9@Z#G6#pHZhA07nBxFU~d)Tvrb6N-AC z2miLoF$x>}R%HAjF;Ts<%2nN4YNSQVEoe$blKc9YWQ&z*+FOGhThXeSm=XsD{nYrb z%U>#GrM(~J@w%9p^(Z^?H9SOkPdDw|55G`UC_O&m)@##B+IXmUBrg}jQZEoAxYB#yO*WGz$nGZoRUqOg zA_(T8onmEA?9EN!v*@+>6W{b)OWsuTY9*mCDP69Ij`U1Un)S zeVsmY?L0fmNq)b-`VlkzqYMy6R4=9I zV)qL8Ue8om(jh85wcuhq0O|au4mrv`;gDOvgsZ~XmkUQ>8`6^3t{tY>4TE6G5#suh z#gL}a3VOJ3^O)e{MEw^%#%8vZ$biT$c1ALkmSG|CY0u#k|(1DMo}6)d886fsHXo(;lBh~t zI(!%k1807HKR4A;z4PYPQSBwQlKTrwXA1Hk#_A7(=2!xWbnHt?wRaJcW&G)pGyFw| zi*DxPhZzzya1MMD>k*jcOG zZLo})HmSS?T4y<5`9;b$F{>zzRZ7r)WZdo#VQOqQMkDSF(`JC{K6<-=YKE;VjM_jm zEuH24_@LRFF!4OYFp!7C+UENU=Nh;x2BNQ}vv23xPOb7L)7XFu1oN5qAC4#5@$WfQ z3)UlVS;4&#EobsKg7bLmw;DBZmnqca+Km+Nwf3AYl{cucms9 z(@s0&D@SP<5Rvvr<+v$%5&&Qs__Hdc{fl;AzhDpO?>g)H6=E_aMR$9)HvY(-fiAZy zA>xWPIm7BO)uncS38ZDujeQP{{hfxfGBw5u7Svk#lMSW9jTeWZpD|tL#U;9R0+5Ga zaKaAsHzRZ2CT6I7Frm<7LCpU$Pj#`(1N=&2u{zMQD6U*XvlTk_B=P!Otz3={MJ;J3x4KmO2N+kgN$}y}^|n zu}E~on@o)VAbMvGqAOE(;Re@Ld$$k}sqy+f0TWE7c8<18jYuxM ze9`uCRCG~>k+>S*3WsOe4X@juM4{&%BB7UC<+^rC8Y8)sU(d|!KIce!*dd#pV*(Qa z$&bOMJgE``2QId@PA-iHCU$dT-QM6@KTHM%fSW@do>|AOx-SbEVq|3v#!>F}YIz|} zDb3lxmKwNRNmf~9v0Tma)gDfRusNY8Bn`6{y8IeWVl~@(y{NuX2%KXycx)t2$~-AonTBs0H=Ujd6NH16X^K)Pt{%oY8>ivl zh8+xVqF@;GweU_4ypEz6KxU`C;`*$P^*edcB|)By{Fu<7_4b3}AfF&w;2QqCN7|6e zo`XqsT%kkgz^KFmNxVJo5V!(Xl=Kj-oU>x>zInd6o8bayy_IuY@c}CJb1I9!Sf4*t zRdQJ4_NfJY)<(cmsYuE*%KBwz%;cURn$^F#;G?T`P~(Ww=xIk)wMjeX{x=)%r8Ih@t4@JOlhN?I49LkSw7j=JAALo;dc1tSH zyk06|u@*78Gdr#|T6(vv@O^;xQX2_T1uJZKeftQFCxhx|D)@Weob1Bo7JZ%s9iaEb zEM{N^Ms!c3$~hcS%f+!It=wwn{C9=r(=wR%Rt??!v9cFGQ#a=XZ@i)D+nI0pI6|KU zHE-hGkT%%>hunwed;*7>-ffb$5x%&by_~s&Hw3prQQ)^Dj^k-|x zp}lobXVTJ>%Cn^{YBjfl^pB{#tQf&ESN+*1txDNcN+?5&nxgJsOFqp!_M#NjoulM` zcc|pv;gkis26H?Yd&qzD0C}%J4Y)_!0n}FK?8nvAk?&cS|!FNGl*Y4DHcYdgt?leFOy=`y>vb?4@9n2)5-%p&47Y=GwT@*~PifP^I z3y@)lX2jU2;W6oG1r?{EfjHl#%x{^W3e9H6-X(n~);+rSpbtyoNWv{yx}^|cSFbh= z@EJAFD>Df)tSZ)OnZ)n1976^Amf#{&sNK~&3*jtpOe*WFd#(cVP|Bk^I9jZ9oG0R3ch=!+kaNXUA!>K!i6`&%mq zlD;V4hD$UTxv3+2+>@5tRE~kf5<`TE?+6e|jECZ9B}PYRw1nz1_3?uHN;<&d#Oaow zs^Z=$#iYIWjf%g1(u~7tlt&DeVI1iKH>NlvZPg`V_e@blMsoV_#rkJa8x_CG^>gv@ z)tn>FzbRDfFA8?KbF26cfrh5fzR$uk3qD0cuMxQl8Gt0M6PSo545t6KMnpOO&6Sgv z&+k?MhEVr<$-~sMamWPTV;NQeyKdEWjb({L8ldu|Lk7PJlb{aPbd}a*w{W;)+!j}@ zZNcSq&JNJ@B-Kb%5zS+d%qIWXraa3RYS!^DMMqF9qJD7^Sx1!_DSZ>2cf2@pk9eK+ zoq_2!8i!{&I~96W&eA7ny=Pj#>ZNtLy!Hv>SKYS}=VFwdfDmDN^7Ytf?8(a|7Csg& z(Owjh_s+6OU3Y3n72yh#KN2G`HDOwndidzqHgWR{(Pl9^zK?snV~b!ZIt>fov98_SeJlwxvTW1FJ5vxR~K!V;9AI zuihvGYo76oTT|$WJ+UqLTfC6s`7M~D#oi&djmT~6y!jL-f!D*Ia?42I)<%=yu?SxC znnf@i>T5?VMRdj+<4!5Mn2oT6UaJfRxY{YfHIlph+jN7y@AF>qeM7v<*j=-3meq)0 zQ>V_>%et|c*NC)8Y-FuxCVM+L@#VR&HN~&Ll*6nV?kvi+IVSEuc9Y|h;zxGn?nocF z4?=dYld%j&m*-EA^Yfk8>_Mjul>l!;va)S|VejZxuAq^tU8g*Qit-TAc+N=S*3Av1 z=}p{*V%`j<-M`2{XXFRY0?@rFMQl337*!~=aJtaLFb46e-HK+#G zNVf1Pk=GD08VYBi6B(lEQVp(u>4}w&|8y)DW*DQR42Bx z!Y4`RQ|KqTKC8ck!nqVlQfo-ueMC(a{kP~!R6{BFZCW-HZ`6ec_Te)Xs&TvF(&4|W zo|TO*`aFSYdop4rlaMk2zAtwtmmK19_s=-7>iq~jxj7I;@I4p^xBAyc^dtPF(qX(Xk)cNcbPSWqOSTe@Tk=@#jhE|C(JkZw>~dExoJ z{`7fXeg1;??B{-V?w$KRGjrz7cV^BRbtPmJVgLXG04N7kJT~s;#bE*f05{k5BY=~g zlNHnxY-I)pJK9;8LG3_5E;pbhC&&z92jK*Pt$>yw3s)yAAe0ko*{0YpG`wM!q!!ggN&2?!Gk=tLQ_Y;1+eD)%ov&<_ zmBl?)7TQ{5@G~TCa|MMllHxbhGbSxOz>WbRg^tMBVRJy;#b)Qo*5C%ObYO}~FR7a| z8E1C}`1odho9EJ}KVUv@1yHx1mC*pcPp%_l`ATQwGk-w}l*}4ICqDO=p;7oYK5K!?12=aifeSbn|>R?b@LO8zl_{%rEOT8554kH}JPp9VvMPNmmb(AgE^=E>U z72{+~ILy>f$~Zv?7y|>HldR!}ZoI&m z3PnqO_QS6o+~m(dsUKI4{H%MJ^5qq_t9Jy7l^0adHXaE# zd#sG4uBl!vxQTx(P|?i?;v-aOE>7q6N0?e9C0C&*$MI=~Fx&mUy!rX@mdm%mweJ$X zTg@T|37K1*E8$*mqO0uZ9E7AM<_J2YNbv1q%4kO8s3mqLTs%FNo|}}!OYC)hf93b> zduR3RidGL$o2tyr(h1_?bE#u&(S&-)jWS-Q{BUJGRa6_ADZ^|Fkzd(-=|b@DTB}D!&v_ zm}}&|-v{59-cS}bbcNVX^=p+T>=9>7O|{r~OWx(6kF=^--+HyqL1$Y$S8k`2P1hJV zT(?%4ETDimA-6ttds1{!>h!^SK*IaP>xuih+cs>mzJ!POQ~s{%e7YUV;?rU7Vf-}e zdgp$(qrjmYC-TzNodNkZQ3b@s2vqZ#)H1p%XDTlTXJ6uA?2sC+!yF%l!BvIGq|SQ= z_oXBM>e<>_n?So`af+yoT~^e=@#xb?0zJ3v5t7o)-n$)E@UhLru#8jbpv9iLE^{9J zn)7AJDa&Fdj$S8S! zdn9?L_tr;M*vRdO{4*l|O+ET}`Bwsix(H5-y(?y`-SOx^mfJm*9`vAzl1y_ld?D=; zF;DgQ-2HVhEBc>?|8F_r{~!K?B>&$a|7MUgiqa+26*2T=)$2(QpeUy*TPkDv{67;a z1_s7ov-3^P55c}pSb%`go2l2s$+1aK1+*-9yXi!?fORBQ#xK`4r+fb4T_h}exzV@M zAncSJM{^cU2A2NsCsdk*9Mg#%#bL&=AxGA$&cZ(QM_=qr_H7jstTow}Hs=WtsHn_Nt$db^j-Vi+uHz)oDVm(j1j*0id~nY}6Z z5?9QuVolk{sMElrk2w2X>E7m9x)ue$uaA%H&?Y8P6dPL?6)Rnci+!9Oe^Y7>o`HJ6 z!!v!y%-DiZ0qr(;8(L<`n|Y__V&-*ZEV$F=cRo?zi5t#)k~B9S74I3CR#EB4p?|@W zKUw~|GKKvHW6-K1K$D=WZ^2G*y}2cR>`4vYAet-GCazb)zS(>IoV8JBKz$-0t_b{G zn(k4n zk+=6Qd2`}@m>ev^8^^39ZHdU1i@aYZ_?@!Pioui+>{f%CdlAcOt&${G2fdw*_-Y7y z`2Ki%Q;rlv^mXGC94UC1S*|h`E-ng%T%z5uw})hbISt7W5HEQppFr)!b6W|aSLbG5 znJQ~LsiVMv>SV9U=lYG?yMPFo?PqkCx7hR|jQqXKi(Y3RZ0l(vQ$YRR1X65|5#=M} z!ndY(rBRoIUvosF5ft-Gt0NtuGK>n0i^@+{U9z%u6@Bh-7REQyl`GSHuc68G_9|hD0%hP~l87llfC1YlW*U!e^~(bC z=agoTOp1kD1p-D;=5`89Zwa%FU5u4gR><9wR{{b>Qute9)}@1Dug0oa*Jb zyd&sAF`Zop=L;~r)9*ZA>z}4D=y<#a*YDtPn`YAN(%Cf;*N6s3WKX}E{@jnn&%PV0 z_dw~fy6hXA*P@4O23TWgni9#%Fj&%p{->(b++NIX)!H6kpZi5sFOwW{U8af4e9?HK zq4H=}pjGU*`8*wL zJu2+xPjE7>XpFINk5ks;&aRYJ;5_puaKUr;dpnPF7;G{wF>|exefy@I#Gli~DtTfwx)u;a(U-(2B1vD#8%Y$Lf6LH!adUY< zr3<#)IF={E!rqhmyhIeKkt5Wo(jdSG_`PnSPtv%i(wWS5jo-N4YxKT3yfm}`u3_#R z8K_b>z&2Ept%TgV;+pRbHos3HO#J2IxIx@azG~HW1kd&}LbcxyNnHsYLq(xYK?4N< zs3Qab{>(%;*GvSlf}B*+!MyyMz$ST!^KW$1AdrnT9f}6<%%!(AdfulSvdEqiwli7 zuECm6TkyGwyD;?;hCPqG{;jbz2kxN6b-r`M&8OebCEv#v-y1iaq*s!jRMzSs{(N3F zvo#@*&+b=w+i++%ppeI|L^FAK4YUeEWTj|v0zn|Q-5oEx7cK)#!EgF>TXX_LDCCX< zeE3wSt!liqd#~_^bW(k+Qu?!+Ydg+QzcwU1zZ@13iq@M=E1{k(nM2R5JZ?8@u6SC$ z*O1wACcpI%)iK1b9A=To(nP?_^q|R0clwU=+bO*82>kkCal!GX=UiN6^YfHUmwfxZ z(5qUm`6fR<4b^kg&?Cvt7d*DA$!Y%cW85;tt(NLStN|{fGnLuk(nYpzb$Z`{7m|9H zp6z20P76KhMu*~W00=_ewqV7K5!7Q~Fd^^k;25^je^|=iIj{0{3FGvRT;EEAy`rVh za!M3RnxszJRGdO>+zb~E0fqlwRP3Cz1vg7*%hs$*dkY=oL&6%|S{7D_mgHtRgLU4^ z`%0hPl*@8op>;p?LUwkm%$l!J3X?cbRsHbWf%gAK ztUj1m1a2P%K5F5I4jSDOYpP@txxXrIq17xTd6I3j@};8nY{SAgn)_Y~`-Fr#!5uQJ zS6dDy1ZQG4@lt3S1P_7%caKzVx1V2qu|H4g@$KBneWZZBsatn_ zB|g~IyXz)%34&MN>K`AFob)O&cZ~&{9?QlWFz>rEF9(^r8=td;p4fnO6s-sg@E=n{C1nbrde?y(Q> zjRt(6ARF;5*Yn7ZtW%+qu88W(Z{&8Xfksz`MDlcIm$(adc)edzb)#7`0n}2Q5{cxo znWF=i)TLDvKTlkdjIuSHIs4ge0~k)k3qOr$%q3El`l2{8hXe{^6GA||WY2^pa9pI$ zK98cJsiLUTvaeF~$qV-v4c*L*ji z>5hMU>DhY9%+g~DiX_hu)o`^WCtf6H0(-c3K|RMOSiHzZJx36(>Nr@lbP3hA$G)?YoDWqZnG~>dMDt$01IrLA3ywlf}O2-YTEjKFVZJ-S{10YKaixJas6n)y^#Gmnf^c~WFh zq0d>e3iE@4K(v;vGV+~gb2JJDF*dIfbf3!baVvY$Zl>mC+-HG*ayVM;gxvDX^^ z4pYm~zy0|Dz7nET&-1s#_pQ7N%A30<`q8`g;6|&V`A@CdYS`Ew=Y7$m)!2jB7Hxv zxV(+lKHH>Q9yLoF&j)U3x$sLu@v4B1D*=IWC8eiZ4zH0~lBj26gpC*bz4O@UWPL$^ z;k+p^%gDez!gF+D8F9cjI(f& zj0zuqd>K){N_A+Eh)Mlr1=I8}B?2Edu;}N3TdNFQS8Ohy>@ZkU(qr=E-i)Mjz^LDi zXNyK4nEQgXGi7~!kavL-ZVwoB2h01)kD(OnH3U_)8T_zAes|MVKyO~i80)s$*fS@x z6BWs44lnXISk)JFU#pz4N1-)Gt+f_0f2HyCNqi$lW9*jNVSR_)|DnSdZX#p2Gm#W* z$C5*a*Xh8dm(ov|tNDa2;XjLj5S_cl#Yg}^2=c%6@Qw2h0`+vX`fCZWW1tZ=D@X|2 zE92JsGH+>6JL%Bid>;L9G)Gw?J26v4NsR@&g zV)!nF`6x99Qcdtssl-h=G1w+GcqtW-4fELPR@|t*eP8iy41sxGbWkL&(RUSv!(E># zkzsr0>fvNTSajsyM%o*fk`l@mKh`p>h}{U)ep{Wc!|4UrP9~AiL+p}oA19vDUbyK@ z#WmZGn^d7SH1S0q`--u#gE!rV^$|np50=xqSlC$Udz0^=Kkh5rvSqTWA&)q|_y(4u z;%%m4=wETkg_pG1g%#PW3a~0EB$>mN!(+{OE2nNLeVCLCbX8&9G7snqW$3KdpUA;i|c$-bBgGVrs|vd zaemu6DT`tOZC7rjH-qWnJykJhJ6R{Xi{7gAt9ar~SZV|+2HpCLbhzMNjN3dgb)fyI zp^B*R;atdasPi;=?1`Fs>rgIkSvtF|aAW)jnL6?QMs;o*(dX*O3Q;r|^H-$lmP1?E z<>Cf_^dRc3oCm;+cQg0MqKNZwDfD7F3lE)Ak0Cm*xG|?#$!{HGx2G`^RVQA%<*U`Zco;qD)FVgP7z!wqpIhz@7JiIv$L!i+t;K}}aTFEiD)&Of^m2R*3*M^PzZp;=J zq{Vmix`SQ$sTq6k--GMI8sn7;yv&&io!MFAWnPl+kuo8Y`dZM^2THSPK77)|Cpn&& zUp6-NeJu!mk~Ea@-pCQ_ic(|oR5MU`Y#?*LR1S;g^;2Fr3T3!u5*c&O1fD+XOeAg( zMyS0Wd+cL2jf4nZRfZB*Sx0hsxNrD7rVXvphWy6zO9zj!2sI&L^Jy1Wd_V}!iv>_FY7TW zw^EYO+vVj*AQk@*hOAFve0Xrx%I8w-j&Z#L|3OZ)tG#l+ijH^RUpO6$xbsG0%l7F} zd6(p?a7t@)xYZ~&+~7fsiM0Bl6}ku!nJ*)?Qe8j`4hTAS z;XF>&d@}__GRazu>OGCZ?T?hKqV6|9U5eK7uY9~Waa6BLm~PsUtJQOU0B%gOPZsHc zFC6ZJBG%6Yr#S=WSCpFi>E0q zMy?{kJr2X_;htkDQ*C#=F|7j#8}I3-`|X16y;}Nnfd_PpTiBRWm~5eusv|gt2N0RV z-cb^q>XmP~psbDirop{#OcNP=-wUNwXtIPo`Yy{XDc=Nb6D%`Pi)^gK^kTouZR*_U z85he{19GjiO5-RXl9Qc|eRZrqBGd+Unk5%Qp1gEp^gffqv)Phnv6<1rXSQEV!U*1& z4+H8stv|HLlj`p8R%6;+B_1z5Ax!NP|xmwlp^?IPWq`bnF z&~rH(5Jvg7{H`9;x3)!w+Lw|@SGivOh6GYiK}{pL2cEoSCWW=CTp!DH^%0OZpm&gC z&0+VFI>18()b#a`P?8c&jjmyfChbuehB92q-NK{`euPp4ucvAVDfc5&greo1B8{T~ zc_ZurR6E&uoaRK}t%3+#Z6$uAVMr32`SbNSPL$MRm}A+=2wG=!Tpj$JbcNy=XDqyg z0wP>nDKWG(II1N8o)4#7*})B)D63txBPtY~3Taj_RB)c0m*wuNuilR|+k-wJH?L&s ziPP;qU~fGb7(Uo0p;R*=>v2bl+`FVi%spS8W?S~4Uhvpm^MGMT?irKyoLpypqeLK{ zFP~j!5iEEtu6a0LXI-QE0X<4mJ^cpYMh|UDCgUI?nwDOUDWhgiw_qe#Ff1roXi=D~ zg*TQ7DV7Nq%QQ@XruCWEg!d&XB}0Fjf z-4vB!9UqBSQymc=&oWuouC2e;7&rFXb@=s%6AjY1+=@F>VTBy*LZa=58EN}cI&y@b z(l#f$Pb-;{y=0q6Radbo)}M~RN*@Istyq$!S-wVn6wk9PE5YKFnCje15Hq?WaQ1EK z`!@5GQJhKN%-Ehxd&JB1_oR@om@x59XLN^mjy%{F~D5cxrpqvA+c(a-)$MLj$ zqsB?}y8twmSJ?O%D};@$VH+|KDolAr@8y8XtB*3|SKP)HGa{Yt79T$E=I=&4_Z$=a z=y(5QI&K(w`-MAc;VZy-&wHyjyGF`_qY0%oM-)`T9nzB8JdFtGSBqwcs^t%=;c2*1 zhgWOKbyvtY>syX`7)|%}^3{j$-&Q|2E)XX(pq;f91j^}RX+0P>2n^u9{bEl%&}wK( znhO=xg}JZZKC@LINDr0kFokfwIWkU1Blpc_=7;4{c|JsBb?S~8<@>P8f;KIF3l@gH zN47N^Y@!XE_3&BInWpOQKtB6TrAcqi+<8W0Dvq#F2xLV`=wh3Y9 zM>yTpkruNx^vZ6gtXeGktL<_SjvCL{Un}Ta;W1dMzU@G^$ zfCf;$Q&sBXOFYsLY0KVO>M?B^56BTW-Dis&o|+HA$y+gAXe!?|3_$oK*m~_+c)5;u z9U$o9P1AUH)ixW%Jg?Tia}HmTEtOTf$vR38y|y`zUaLN&(N-wCF<&gzsTzZ`ES5b z5Xcd12DEbg7aZkpa9|gZjf)ioVs7U0zsTRY-fx2A|E#W=g@u)))phMbE?gF_E-wG; zmPfwc6rtbjegHSI>>K%WLvBLk|5R)32r`3O{iw|EZ1=n7L!f3**Iyd(JKXO|yD{6( zrvDE0yVAfQuq*ib2!QLq82fjn-9Ubp_B%u0xweRkoYn&lMOAsO|BkQgJ!DOM8?b{G zCuq+%G-Qi-$}2^EjGA=^^BuZrr(#U2tm&KM9fdbFz5G`8)w|XfM^~BL>P~7yBnlX# z9>vqxe%7d2#}RF%)_WIqhY3zXMSU#%9I~;KS?@2n=f_gu{$oY9IkGFXkH^MN{39lN zkzz0Bxwus89B-9dr)u+@*L2Gyp9CLG%`rOk8;@pNo2yzHx{Z)(kJSgK6gJn%v-LSG zh2XXTj#!wOgb9e0NRNX*ORAGmpc*}#w-D+uP1}^l`6|abLx<~gMrrc`-GwLq?uI;V zUq>YVT{r2?gKB8)K7O%@gE;>Vl`fOJ1jq4|r=!ZNcDehdfn((CpFf~yKf!3hKLHuL zO9m%_r5Ad^656B#YzNEuQ$DwDJ~%4>BYn#2VJCU*yj531x$%~}pMv;}p1-r_e>DB*`5WX93cTUZ zpF(!s+JDmCAK3KYY<9yiKLz|7r9Zj!&yBp{x1W;t8!f+b>!0=fy*Bf|(esmQ|E%Tj zwIQbczlQpid;hHG@3m3>jh>%e{2whpy6smYxnbj<@|^Y$+^nvIigxoF!SxS(%|DCx HZtngEQHW~w literal 0 HcmV?d00001 diff --git a/test/fixtures/files/text.ott b/test/fixtures/files/text.ott new file mode 100644 index 0000000000000000000000000000000000000000..f926bcb4ca600f0f8074ca8661bcc5f55d7104bf GIT binary patch literal 9823 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/files/text.pdf b/test/fixtures/files/text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..39853ad7ab9c1b56b7cb106e5e34ce0c0ae9de6f GIT binary patch literal 15379 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/files/text.rtf b/test/fixtures/files/text.rtf new file mode 100644 index 0000000..9f35f4c --- /dev/null +++ b/test/fixtures/files/text.rtf @@ -0,0 +1,22 @@ +{\rtf1\ansi\deff3\adeflang1025 +{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\fmodern\fprq1\fcharset0 Liberation Mono{\*\falt Courier New};}{\f6\fnil\fprq2\fcharset0 Droid Sans Fallback;}{\f7\fmodern\fprq1\fcharset0 Courier New;}{\f8\fnil\fprq2\fcharset0 FreeSans;}{\f9\fswiss\fprq0\fcharset128 FreeSans;}} +{\colortbl;\red0\green0\blue0;\red128\green128\blue128;} +{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\dbch\af6\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033 Normal;} +{\s15\sbasedon0\snext16\sb240\sa120\keepn\dbch\af6\dbch\af8\afs28\loch\f4\fs28 Heading;} +{\s16\sbasedon0\snext16\sl288\slmult1\sb0\sa140 Text Body;} +{\s17\sbasedon16\snext17\sl288\slmult1\sb0\sa140\dbch\af9 List;} +{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af9\afs24\ai\fs24 Caption;} +{\s19\sbasedon0\snext19\noline\dbch\af9 Index;} +{\s20\sbasedon0\snext20\sb0\sa0\dbch\af7\dbch\af5\afs20\loch\f5\fs20 Preformatted Text;} +}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2017\mo5\dy17\hr8\min5}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67306242}}\deftab709 +\viewscale100 +{\*\pgdsctbl +{\pgdsc0\pgdscuse451\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}} +\formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc +{\*\ftnsep\chftnsep}\pgndec\pard\plain \s20\sb0\sa0\dbch\af7\dbch\af5\afs20\loch\f5\fs20{\rtlch \ltrch\loch +lorem ipsum }{\i0\b\ai0\ab\rtlch \ltrch\loch +fulltext}{\rtlch \ltrch\loch + }{\ul\ulc0\rtlch \ltrch\loch +find}{\rtlch \ltrch\loch + me!} +\par } \ No newline at end of file diff --git a/test/fixtures/files/text.txt b/test/fixtures/files/text.txt new file mode 100644 index 0000000..0dadaa6 --- /dev/null +++ b/test/fixtures/files/text.txt @@ -0,0 +1 @@ +lorem ipsum fulltext find me! diff --git a/test/unit/lib/redmine/text_extractor_test.rb b/test/unit/lib/redmine/text_extractor_test.rb new file mode 100644 index 0000000..3c5de2b --- /dev/null +++ b/test/unit/lib/redmine/text_extractor_test.rb @@ -0,0 +1,102 @@ +require_relative '../../../test_helper' + +class Redmine::TextExtractorTest < ActiveSupport::TestCase + fixtures :projects, :users, :attachments + + setup do + @project = Project.find_by_identifier 'ecookbook' + set_fixtures_attachments_directory + @dlopper = User.find_by_login 'dlopper' + end + + def attachment_for(filename, content_type = nil) + Attachment.new(container: @project, + file: uploaded_test_file(filename, content_type), + filename: filename, + author: @dlopper).tap do |a| + a.content_type = content_type if content_type + a.save! + end + end + + if Redmine::TextExtractor::PdfHandler.available? + test "should extract text from pdf" do + a = attachment_for "text.pdf" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text + end + end + + if Redmine::TextExtractor::RtfHandler.available? + test "should extract text from rtf" do + a = attachment_for "text.rtf" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text + end + end + + if Redmine::TextExtractor::DocHandler.available? + test "should extract text from doc" do + a = attachment_for "text.doc" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text + end + end + + if Redmine::TextExtractor::XlsHandler.available? + test "should extract text from xls" do + a = attachment_for "spreadsheet.xls" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text + end + end + + + %w(txt docx odt ott).each do |type| + test "should extract text from #{type}" do + a = attachment_for "text.#{type}" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text + end + end + + + %w(xlsx ods ots).each do |type| + test "should extract text from #{type}" do + a = attachment_for "spreadsheet.#{type}" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text + end + end + + + %w(pptx ppsx potm odp otp).each do |type| + test "should extract text from #{type}" do + a = attachment_for "presentation.#{type}" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_equal 'The Title find me Slide two Click To Add Text', text + end + end + + + test "should extract text from csv" do + a = attachment_for "spreadsheet.csv" + te = Redmine::TextExtractor.new a + assert text = te.text + assert_match /lorem ipsum fulltext find me!/, text.gsub(/(,+|\n+\s*)/m, ' ').squeeze(' ') + end + +end + + + + + + -- 2.1.4