diff --git a/CHANGELOG.md b/CHANGELOG.md index aa2a167..e9646d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,12 +23,31 @@ once the version tag exists. - A zip file opens and lists what is inside. Tapping an entry shows it. - Photos and text files the reader used to refuse now open. +- Rich text files open. +- Markdown files are shown as prose: a heading is a heading, and the hashes and + stars are gone. ### Changed +- The engine is odrcore 6.11.0, up from 6.10.1. - A file that will not open says so, and offers to write to us when something went wrong on our side. - The app no longer offers itself for music and films. +- A link out of a document opens in the browser, rather than leading nowhere. +- Slides show their colours: text, highlights and the fill behind a shape. +- Text in a PDF no longer runs over the page in giant type, and can be selected, + searched and copied where it came out as Chinese, Japanese or Korean. +- A PDF opens faster and zooms without stalling. +- A tall spreadsheet keeps many more rows before it stops; a very wide one keeps + fewer. +- A single-file OpenDocument shows the document, not its source. + +### Fixed + +- A file saved by the reader opens in LibreOffice again. +- A presentation exported from Google Slides opens. +- A Photoshop or JPEG 2000 file says it will not open, instead of showing a + blank page. ## [1.42] diff --git a/OpenDocumentReader.xcodeproj/project.pbxproj b/OpenDocumentReader.xcodeproj/project.pbxproj index 7e28a5a..43cd480 100644 --- a/OpenDocumentReader.xcodeproj/project.pbxproj +++ b/OpenDocumentReader.xcodeproj/project.pbxproj @@ -830,7 +830,7 @@ repositoryURL = "https://github.com/opendocument-app/OpenDocument.core.git"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 6.10.1; + minimumVersion = 6.11.0; }; }; AD584FCD41577C8CDEE974AA /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */ = { diff --git a/OpenDocumentReader.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/OpenDocumentReader.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index ddb8c64..56895ca 100644 --- a/OpenDocumentReader.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/OpenDocumentReader.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/opendocument-app/OpenDocument.core.git", "state" : { - "revision" : "d1573b0cb8c9fd172b59ce785d40ba9ddb745ba2", - "version" : "6.10.1" + "revision" : "3fa5603c9093ac2df3ca0596d612ad11390e7f95", + "version" : "6.11.0" } }, { diff --git a/OpenDocumentReader/CoreWrapper.swift b/OpenDocumentReader/CoreWrapper.swift index 334658b..57c63c8 100644 --- a/OpenDocumentReader/CoreWrapper.swift +++ b/OpenDocumentReader/CoreWrapper.swift @@ -91,6 +91,37 @@ private func selectViews(_ views: [HtmlView], _ documentType: DocumentType) -> [ private var document: OdrCoreObjC.Document? private let lock = NSRecursiveLock() + /// The largest sheet region translated, as on OpenDocument.droid. The + /// encoding is written out because Swift has no `@encode`. + private static let spreadsheetLimit: NSValue = withUnsafeBytes( + of: TableDimensions(rows: 100_000, columns: 500) + ) { NSValue(bytes: $0.baseAddress!, objCType: "{ODRTableDimensions=II}") } + + /// Bounds the rows by the sheet's width: the wider, the fewer it keeps. + private static let spreadsheetCellLimit: UInt64 = 500_000 + + /// As odrcore reads the bytes, or as the name says where that reading is + /// text. Markdown has no signature, so only the name can name it. + private func openFile(_ inputPath: String) throws -> DecodedFile { + let detected = try DecodedFile.decode(path: inputPath) + let declared = Odr.fileType(extension: URL(fileURLWithPath: inputPath).pathExtension) + + guard declared != .unknown, declared != detected.fileType, detected.isTextFile, + nameOutranksText(declared) + else { + return detected + } + + return (try? DecodedFile.decode(path: inputPath, as: declared)) ?? detected + } + + /// A document, or a format odrcore cannot detect from its bytes. Csv is + /// neither: odrcore reads that out of the text itself. + private func nameOutranksText(_ declared: FileType) -> Bool { + Odr.fileCategory(fileType: declared) == .document + || !Odr.capabilities(fileType: declared).detectByContent + } + @objc func translate( _ inputPath: String, cache cachePath: String, @@ -111,7 +142,7 @@ private func selectViews(_ views: [HtmlView], _ documentType: DocumentType) -> [ throw coreWrapperError(.unsupportedFileType, "odrcore does not recognise this file type") } - var file = try DecodedFile.decode(path: inputPath) + var file = try openFile(inputPath) if file.isPasswordEncrypted { do { file = try file.decrypt(withPassword: password ?? "") @@ -130,12 +161,6 @@ private func selectViews(_ views: [HtmlView], _ documentType: DocumentType) -> [ throw coreWrapperError(.unsupportedFileType, "odrcore does not render this file type") } - // odrcore calls a file it recognises as nothing else text, so an unnamed - // charset means the bytes are not text at all - if file.isTextFile, (try? file.asTextFile())?.charset == nil { - throw coreWrapperError(.unsupportedFileType, "odrcore could not name a charset") - } - // the same answers OpenDocument.droid gives odrcore, so a document is // the same document on both — the viewport meta each page carries is // decided from these @@ -157,6 +182,10 @@ private func selectViews(_ views: [HtmlView], _ documentType: DocumentType) -> [ // odrcore's own css and js go into the page: there is no output // directory to put them beside config.embedShippedResources = true + // stated rather than inherited: a sheet past the limit is cut off silently + config.spreadsheetLimit = Self.spreadsheetLimit + config.spreadsheetCellLimit = NSNumber(value: Self.spreadsheetCellLimit) + config.spreadsheetLimitByContent = true let documentType: DocumentType let openedDocument: OdrCoreObjC.Document? diff --git a/OpenDocumentReader/DocumentViewController.swift b/OpenDocumentReader/DocumentViewController.swift index f1ec09f..351e3aa 100644 --- a/OpenDocumentReader/DocumentViewController.swift +++ b/OpenDocumentReader/DocumentViewController.swift @@ -246,17 +246,20 @@ class DocumentViewController: UIViewController, DocumentDelegate, UISearchBarDel ]) } - /// odrcore writes every link with `target="_blank"`, and this app has no - /// second window: what odrcore serves opens in the web view that asked. + /// Only a link that leaves the page carries `target="_blank"`, and this app + /// has no second window: the web goes to the browser, and what odrcore + /// serves — should any of it arrive here — to the web view that asked. func webView( _ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures ) -> WKWebView? { - guard let url = navigationAction.request.url, CoreWrapper.isServedURL(url) else { - return nil - } + guard let url = navigationAction.request.url else { return nil } - webView.load(navigationAction.request) + if CoreWrapper.isServedURL(url) { + webView.load(navigationAction.request) + } else if UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) + } return nil } @@ -278,12 +281,12 @@ class DocumentViewController: UIViewController, DocumentDelegate, UISearchBarDel if !navigationResponse.canShowMIMEType { decisionHandler(.cancel) - // the system could not draw it after all, so fall back to the listing - if let listing = listingInReserve { - listingInReserve = nil + // the system could not draw it after all, so fall back to odrcore's + if let page = corePageInReserve { + corePageInReserve = nil - installFitToWidth(for: listing) - documentNavigation = webview.load(URLRequest(url: listing)) + installFitToWidth(for: page) + documentNavigation = webview.load(URLRequest(url: page)) return } @@ -293,7 +296,7 @@ class DocumentViewController: UIViewController, DocumentDelegate, UISearchBarDel return } - listingInReserve = nil + corePageInReserve = nil guard let response = navigationResponse.response as? HTTPURLResponse, response.statusCode >= 400, @@ -875,10 +878,9 @@ class DocumentViewController: UIViewController, DocumentDelegate, UISearchBarDel return } - // only a container to odrcore, but a document to the system: it gets - // the first go, with the listing kept in reserve - if doc.isArchive, systemKnowsItAsADocument(doc.fileURL) { - listingInReserve = url + // the system gets the first go, with odrcore's page kept in reserve + if systemDrawsItBetter(doc) { + corePageInReserve = url canEdit = false canSearch = false @@ -892,16 +894,28 @@ class DocumentViewController: UIViewController, DocumentDelegate, UISearchBarDel documentNavigation = self.webview.load(URLRequest(url: url)) } - /// Whether the system's type for this file says document rather than - /// container: a `.pages` is composite content, a `.zip` is not. - private func systemKnowsItAsADocument(_ url: URL) -> Bool { - guard let type = UTType(filenameExtension: url.pathExtension) else { return false } + /// Three the system draws better, all falling back to `corePageInReserve`: + /// html, which odrcore has no type for and reads as its own source, iWork, + /// whose styles and pictures it does not read, and a container it knows as a + /// document (`.epub` is composite content, `.zip` is not). + private func systemDrawsItBetter(_ doc: Document) -> Bool { + let ext = doc.fileURL.pathExtension.lowercased() + + guard let type = UTType(filenameExtension: ext), !type.isDynamic else { return false } - return !type.isDynamic && type.conforms(to: .compositeContent) + return Self.webPageTypes.contains(where: type.conforms(to:)) + || Self.iWorkExtensions.contains(ext) + || (doc.isArchive && type.conforms(to: .compositeContent)) } - /// odrcore's listing, held back while the system has the first go. - private var listingInReserve: URL? + /// Both, because `public.xhtml` conforms to xml rather than to html — and + /// xml is what a flat ODF is, which odrcore does render. + private static let webPageTypes: [UTType] = [.html, UTType("public.xhtml")].compactMap { $0 } + + private static let iWorkExtensions: Set = ["pages", "numbers", "key"] + + /// odrcore's page, held back while the system has the first go. + private var corePageInReserve: URL? func documentEncrypted(_ doc: Document) { // the document is opened before this controller is presented, so the diff --git a/OpenDocumentReaderTests/ArchiveDocumentTests.swift b/OpenDocumentReaderTests/ArchiveDocumentTests.swift index 9986f57..9673e9f 100644 --- a/OpenDocumentReaderTests/ArchiveDocumentTests.swift +++ b/OpenDocumentReaderTests/ArchiveDocumentTests.swift @@ -97,8 +97,7 @@ class ArchiveDocumentTests: XCTestCase { XCTAssertFalse(shown.contains(NSLocalizedString("toast_error_generic", comment: "")), shown) } - /// A `.pages` is a zip to odrcore, but a document to the system, which gets - /// the first go. + /// odrcore reads a `.pages`, but only its text: the system gets the first go. func testADocumentTheSystemKnowsIsLeftToTheSystem() throws { try present(try copyFixture(ofType: "pages")) @@ -112,6 +111,34 @@ class ArchiveDocumentTests: XCTestCase { XCTAssertNil(controller.presentedViewController, "it said the file would not open") } + /// odrcore has no html type, so it reads the page's own source as text. The + /// system draws the page, as it did before the reader asked the core. + func testHtmlIsLeftToTheSystem() throws { + for pathExtension in ["html", "htm", "xhtml"] { + try present(try writeHtml(ofType: pathExtension)) + + let opened = expectation(description: "opened " + pathExtension) + document.open { _ in opened.fulfill() } + wait(for: [opened], timeout: 60) + + let shown = try XCTUnwrap(waitForURL { $0.isFileURL }, pathExtension) + + XCTAssertEqual(shown.lastPathComponent, "test." + pathExtension, shown.absoluteString) + XCTAssertNil(controller.presentedViewController, "it said the file would not open") + } + } + + private func writeHtml(ofType pathExtension: String) throws -> URL { + let documentsURL = try FileManager.default.url( + for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) + + let url = documentsURL.appendingPathComponent("test." + pathExtension) + try? FileManager.default.removeItem(at: url) + try "

Heading

".write(to: url, atomically: true, encoding: .utf8) + + return url + } + /// And when the system cannot draw it after all, the listing takes over /// rather than a message. func testAnArchiveTheSystemCannotDrawFallsBackToTheListing() throws { diff --git a/OpenDocumentReaderTests/OpenDocumentReaderTests.swift b/OpenDocumentReaderTests/OpenDocumentReaderTests.swift index 86d056e..1000dd5 100644 --- a/OpenDocumentReaderTests/OpenDocumentReaderTests.swift +++ b/OpenDocumentReaderTests/OpenDocumentReaderTests.swift @@ -391,6 +391,41 @@ class OpenDocumentReaderTests: XCTestCase { XCTAssertEqual(wrapper.pageNames, ["text"]) } + /// A text file comes back as `text`; a markdown one as a document, with the + /// hashes and stars turned into a heading and a bold run. + func testMarkdownIsReadAsProse() throws { + let wrapper = CoreWrapper() + + let notes = URL(fileURLWithPath: temporaryDirectory).appendingPathComponent("notes.md") + try "# Heading\n\nSome **bold** prose.\n".write(to: notes, atomically: true, encoding: .utf8) + + try wrapper.translate( + notes.path, cache: temporaryDirectory, into: temporaryDirectory, with: nil, editable: false) + + XCTAssertEqual(wrapper.pageNames, ["document"]) + + let (data, _) = try fetch(try XCTUnwrap(wrapper.pageURLs.first)) + let html = try XCTUnwrap(String(data: data, encoding: .utf8)) + + XCTAssertTrue(html.contains("font-size:2em"), "the heading is not one") + XCTAssertTrue(html.contains("font-weight:bold"), "the bold run is not bold") + XCTAssertFalse(html.contains("# Heading"), "the hashes are still in it") + XCTAssertFalse(html.contains("**bold**"), "the stars are still in it") + } + + /// A `.csv` is odrcore's decision from the text; the name must not take it. + func testCsvIsStillOdrcoresDecision() throws { + let wrapper = CoreWrapper() + + let rows = URL(fileURLWithPath: temporaryDirectory).appendingPathComponent("rows.csv") + try "a,b\n1,2\n".write(to: rows, atomically: true, encoding: .utf8) + + try wrapper.translate( + rows.path, cache: temporaryDirectory, into: temporaryDirectory, with: nil, editable: false) + + XCTAssertFalse(wrapper.pageNames.isEmpty) + } + func testTranslatePerformance() throws { let wrapper = CoreWrapper() let path = documentURL.path diff --git a/fastlane/metadata/de-DE/description.txt b/fastlane/metadata/de-DE/description.txt index d5cfb84..54110bb 100644 --- a/fastlane/metadata/de-DE/description.txt +++ b/fastlane/metadata/de-DE/description.txt @@ -24,13 +24,10 @@ Darüber hinaus unterstützt der Dokumentenbetrachter viele weitere Dateiformate - Bilder: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG, etc - Videos: MP4, WEBM, etc - Audio: MP3, OGG, etc -- Textdateien: CSV, TXT, HTML, RTF +- Textdateien: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office und Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office und Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Diese App ist Open Source. Wir stehen in keiner Verbindung zu OpenOffice, LibreOffice oder ähnlichen Projekten. Made in Austria. ${ads} Über Rückmeldungen jeder Art per E-Mail freuen wir uns sehr. diff --git a/fastlane/metadata/en-US/description.txt b/fastlane/metadata/en-US/description.txt index a4e1711..7dee3c7 100644 --- a/fastlane/metadata/en-US/description.txt +++ b/fastlane/metadata/en-US/description.txt @@ -24,13 +24,10 @@ In addition to that, the document reader aims to support various other file form - Images: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG, etc - Videos: MP4, WEBM, etc - Audio: MP3, OGG, etc -- Text files: CSV, TXT, HTML, RTF +- Text files: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office and Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office and Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) This app is open source. We are not affiliated with OpenOffice, LibreOffice or similar. Made in Austria. ${ads} We highly appreciate all kinds of feedback via email. diff --git a/fastlane/metadata/es-ES/description.txt b/fastlane/metadata/es-ES/description.txt index d7d2790..c0c2a94 100644 --- a/fastlane/metadata/es-ES/description.txt +++ b/fastlane/metadata/es-ES/description.txt @@ -24,13 +24,10 @@ Además, el lector de documentos procura admitir lo mejor posible muchos otros f - Imágenes: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG, etc. - Vídeos: MP4, WEBM, etc. - Audio: MP3, OGG, etc. -- Archivos de texto: CSV, TXT, HTML, RTF +- Archivos de texto: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office y Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office y Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Esta aplicación es de código abierto. No estamos afiliados con OpenOffice, LibreOffice ni programas similares. Desarrollada en Austria. ${ads} Agradecemos muchísimo cualquier comentario por correo electrónico. diff --git a/fastlane/metadata/fr-FR/description.txt b/fastlane/metadata/fr-FR/description.txt index 9248131..6d9ca40 100644 --- a/fastlane/metadata/fr-FR/description.txt +++ b/fastlane/metadata/fr-FR/description.txt @@ -24,13 +24,10 @@ Par ailleurs, la visionneuse de documents a pour objectif de prendre en charge a - Images : JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG, etc - Vidéos : MP4, WEBM, etc - Audio : MP3, OGG, etc -- Fichiers texte : CSV, TXT, HTML, RTF +- Fichiers texte : CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML) : Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork : Pages, Numbers, Keynote -- Libre Office et Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office et Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Cette application est open source. Nous ne sommes affiliés ni à OpenOffice, ni à LibreOffice, ni à aucun projet similaire. Fabriquée en Autriche. ${ads} Tous vos retours par e-mail sont les bienvenus. diff --git a/fastlane/metadata/hi/description.txt b/fastlane/metadata/hi/description.txt index 88c1b0e..204a21e 100644 --- a/fastlane/metadata/hi/description.txt +++ b/fastlane/metadata/hi/description.txt @@ -24,13 +24,10 @@ LibreOffice या OpenOffice में बनी ODF फाइलें (ODT, O - इमेज: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG आदि - वीडियो: MP4, WEBM आदि - ऑडियो: MP3, OGG आदि -- टेक्स्ट फाइलें: CSV, TXT, HTML, RTF +- टेक्स्ट फाइलें: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office और Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office और Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) यह ऐप ओपन सोर्स है। OpenOffice, LibreOffice या इनसे मिलते-जुलते किसी भी संगठन से हमारा कोई संबंध नहीं है। ऑस्ट्रिया में बना। ${ads} हर तरह की राय ईमेल से भेजें, हमें बहुत अच्छा लगेगा। diff --git a/fastlane/metadata/it/description.txt b/fastlane/metadata/it/description.txt index ac0e5e3..b175e7f 100644 --- a/fastlane/metadata/it/description.txt +++ b/fastlane/metadata/it/description.txt @@ -24,13 +24,10 @@ Oltre a questo, il lettore di documenti punta a supportare al meglio anche molti - Immagini: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG, ecc. - Video: MP4, WEBM, ecc. - Audio: MP3, OGG, ecc. -- File di testo: CSV, TXT, HTML, RTF +- File di testo: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office e Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office e Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Questa app è open source. Non siamo affiliati a OpenOffice, LibreOffice o simili. Made in Austria. ${ads} Ogni tuo commento via email è sempre benvenuto. diff --git a/fastlane/metadata/pl/description.txt b/fastlane/metadata/pl/description.txt index 53dcb3e..341d539 100644 --- a/fastlane/metadata/pl/description.txt +++ b/fastlane/metadata/pl/description.txt @@ -24,13 +24,10 @@ Poza tym przeglądarka dokumentów stara się jak najlepiej obsługiwać równie - Obrazy: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG i inne - Filmy: MP4, WEBM i inne - Dźwięk: MP3, OGG i inne -- Pliki tekstowe: CSV, TXT, HTML, RTF +- Pliki tekstowe: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office i Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office i Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Ta aplikacja jest oprogramowaniem open source. Nie jesteśmy powiązani z OpenOffice, LibreOffice ani podobnymi projektami. Made in Austria. ${ads} Bardzo cenimy sobie każdą opinię przesłaną e-mailem. diff --git a/fastlane/metadata/pt-BR/description.txt b/fastlane/metadata/pt-BR/description.txt index a2ad7e1..e888272 100644 --- a/fastlane/metadata/pt-BR/description.txt +++ b/fastlane/metadata/pt-BR/description.txt @@ -24,13 +24,10 @@ Além disso, o leitor de documentos procura abrir da melhor forma possível vár - Imagens: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG etc - Vídeos: MP4, WEBM etc - Áudio: MP3, OGG etc -- Arquivos de texto: CSV, TXT, HTML, RTF +- Arquivos de texto: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office e Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office e Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Este app é de código aberto. Não temos vínculo com o OpenOffice, o LibreOffice ou similares. Feito na Áustria. ${ads} Adoramos receber todo tipo de feedback por e-mail. diff --git a/fastlane/metadata/ru/description.txt b/fastlane/metadata/ru/description.txt index 8169823..093582f 100644 --- a/fastlane/metadata/ru/description.txt +++ b/fastlane/metadata/ru/description.txt @@ -24,13 +24,10 @@ - Изображения: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG и др. - Видео: MP4, WEBM и др. - Аудио: MP3, OGG и др. -- Текстовые файлы: CSV, TXT, HTML, RTF +- Текстовые файлы: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office и Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office и Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Это приложение с открытым исходным кодом. Мы никак не связаны с OpenOffice, LibreOffice или подобными проектами. Сделано в Австрии. ${ads} Будем рады любым отзывам по электронной почте. diff --git a/fastlane/metadata/sv/description.txt b/fastlane/metadata/sv/description.txt index 1a81c2b..e1abd78 100644 --- a/fastlane/metadata/sv/description.txt +++ b/fastlane/metadata/sv/description.txt @@ -24,13 +24,10 @@ Dessutom stöder dokumentläsaren så många andra filformat som möjligt: - Bilder: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG med flera - Video: MP4, WEBM med flera - Ljud: MP3, OGG med flera -- Textfiler: CSV, TXT, HTML, RTF +- Textfiler: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office och Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office och Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Appen är öppen källkod. Vi har ingen koppling till OpenOffice, LibreOffice eller liknande. Tillverkad i Österrike. ${ads} Vi uppskattar all form av återkoppling via e-post. diff --git a/fastlane/metadata/tr/description.txt b/fastlane/metadata/tr/description.txt index 837b5b8..e21eadb 100644 --- a/fastlane/metadata/tr/description.txt +++ b/fastlane/metadata/tr/description.txt @@ -24,13 +24,10 @@ Bunlara ek olarak belge okuyucu, diğer birçok dosya biçimini de elinden geldi - Resimler: JPG, JPEG, GIF, PNG, WEBP, TIFF, BMP, SVG vb. - Videolar: MP4, WEBM vb. - Ses: MP3, OGG vb. -- Metin dosyaları: CSV, TXT, HTML, RTF +- Metin dosyaları: CSV, TXT, HTML, MD, RTF - Microsoft Office (OOXML): Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX) - Apple iWork: Pages, Numbers, Keynote -- Libre Office ve Open Office ODF (ODT, ODS, ODP, ODG) -- PostScript (EPS) -- AutoCAD (DXF) -- Photoshop (PSD) +- Libre Office ve Open Office ODF (ODT, ODS, ODP, ODG, FODT, FODS, FODP, FODG) Bu uygulama açık kaynaklıdır. OpenOffice, LibreOffice veya benzeri programlarla herhangi bir bağlantımız yoktur. Avusturya'da üretilmiştir. ${ads} Her türlü geri bildiriminizi e-posta ile bize iletmenizden memnuniyet duyarız.