diff -Nru foliate-2.6.3ubuntu1/data/com.github.johnfactotum.Foliate.appdata.xml.in foliate-2.6.4/data/com.github.johnfactotum.Foliate.appdata.xml.in --- foliate-2.6.3ubuntu1/data/com.github.johnfactotum.Foliate.appdata.xml.in 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/data/com.github.johnfactotum.Foliate.appdata.xml.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,425 +0,0 @@ - - - com.github.johnfactotum.Foliate - CC0-1.0 - GPL-3.0-or-later - Foliate - A simple and modern eBook viewer - com.github.johnfactotum.Foliate - -

Foliate is a simple and modern GTK eBook viewer.

-

Features include:

- -
- John Factotum - https://johnfactotum.github.io/foliate/ - https://github.com/johnfactotum/foliate/issues - https://github.com/johnfactotum/foliate/wiki - - - https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/view.png - - - https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/dark.png - - - https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/skeuomorphism.png - - - https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/note.png - - - https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/annotations.png - - - https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/lookup.png - - - - - -

Fixed a performance issue with zipped files (including EPUB files)

-
-
- - -

Fix UI when running with libhandy 1.x

-
-
- - -

Fixed automatic layout

-
-
- - -

Changes:

-
    -
  • Added support for opening HTML files
  • -
  • Consistent inner and outer margins
  • -
  • The automatic layout no longer supports 4 columns
  • -
  • Fixed long words overflowing
  • -
  • Fixed custom themes not saved across sessions
  • -
  • Fixed shortcuts for key pads
  • -
  • Fixed opening non-UTF-8 zipped FB2 files
  • -
  • Fixed books not opening on GNOME 40
  • -
-
-
- - -

Changes:

-
    -
  • Improved support for touch screens
  • -
  • OPDS credentials can now be remembered
  • -
  • Various fixes for GNOME 3.38
  • -
  • Fixed Wiktionary internal links
  • -
  • Added Basque, Korean, and Norwegian translations
  • -
-
-
- - -

Fixed unable to open some EPUB files

-
-
- - -

Fixed unable to open Mobipocket files

-
-
- - -

Changes:

-
    -
  • Improved metadata display
  • -
  • Improved FictionBook rendering
  • -
  • Improved UI for acquiring books from OPDS
  • -
  • Fixed unique identifier extraction for EPUB files
  • -
  • Fixed missing window icon
  • -
  • Fixed TTS environment variables not set when using Flatpak
  • -
  • Fixed eSpeak NG voice not selected when testing TTS configuration
  • -
  • Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled
  • -
-
-
- - -

OPDS catalogs:

-
    -
  • Catalogs are now opened in the main library window
  • -
  • View current location
  • -
  • Go to catalog start page
  • -
  • Reload catalog
  • -
  • Add current feed to catalogs
  • -
  • HTTP authentication support
  • -
-

Other changes:

-
    -
  • Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files
  • -
  • Fixed newlines being ignored when copying text
  • -
  • “Turn page on tap” is now disabled in non-paginated layouts
  • -
  • Opening a book from the library view now closes the library window
  • -
  • Language and publication dates in metadata are now parsed and formatted
  • -
  • Export annotations from the library view
  • -
-
-
- - -

Changes:

-
    -
  • Fixed blurry book covers on HiDPI
  • -
  • Fixed OPDS links to Standard Ebooks and Project Gutenberg
  • -
  • Fixed wrong view icon on startup
  • -
-
-
- - -

Library:

-
    -
  • A library view showing recent books and reading progress
  • -
  • Search books by metadata
  • -
  • E-book discovery with OPDS
  • -
-

New supported formats:

-
    -
  • FictionBook (.fb2, .fb2.zip)
  • -
  • Comic book archive (.cbr, .cbz, .cbt, .cb7)
  • -
  • Plain text (.txt)
  • -
  • Unpacked EPUB files
  • -
-

Layout:

-
    -
  • Option to set maximum page width
  • -
  • The "Automatic" layout will now show four columns when the page width is wide
  • -
-

Image viewer:

-
    -
  • Improved image viewer, with new shortcuts and the ability to rotate and invert images
  • -
  • Option to disable image viewer, or to open images on double, middle, or right click
  • -
-

Text-to-speech:

-
    -
  • Improved text-to-speech configuration UI
  • -
  • Ability to set text-to-speech voice based on book language
  • -
-

Annotations

-
    -
  • Import annotations from JSON
  • -
  • Search in annotations
  • -
  • Annotations are now sorted in the same order as they appear in the book
  • -
-

Security:

-
    -
  • "Allow Unsafe Content" now only enables JavaScript; external content will no longer be loaded
  • -
  • WebKit processes are now sandboxed
  • -
-

Other featues and fixes:

-
    -
  • Improved support for vertical and right-to-left books
  • -
  • Support for StarDict dictionaries
  • -
  • Fixed current location not preserved when resizing
  • -
  • Fixed auto-hiding header bar under some themes
  • -
  • Command-line options for showing version and adding books to library
  • -
  • Option to clear or disable cache
  • -
  • When an HTML page contains invalid self-closing anchor tags, it is now parsed as XHTML
  • -
-
-
- - -

Fixes:

-
    -
  • Fixed wrong version number
  • -
  • Fixed dictionary, translation, and Wikipedia not working in the Snap package
  • -
-
-
- - -

New features:

-
    -
  • New and improved icon
  • -
  • Option to disable turn page on tap
  • -
  • A menu on the welcome screen for opening recent files
  • -
  • Restored shortcuts for showing ToC, annotations, and bookmarks
  • -
-

Fixes:

-
    -
  • Fixed application not translated
  • -
-
-
- - -

Interface:

-
    -
  • A redesigned interface that works better for smaller screens
  • -
  • Improved fullscreen mode with an overlaid headerbar
  • -
  • The headerbar and the progress bar now auto-hide, for a distraction-free reading experience
  • -
  • Various location information, as well as a clock, can now be displayed in the footer
  • -
  • A new location popover (Ctrl + L) that shows reading time estimates and allows skipping to locations
  • -
  • E-reader style navigation: go to the previous or next page by tapping on the left or right part of the view; tap on the middle to toggle header bar and progress bar
  • -
  • Annotations, bookmarks, and find results now show chapter titles
  • -
  • When looking up words in dictionaries, the query can now be edited
  • -
  • New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)
  • -
  • A new traditional menubar, which may be displayed depending on the desktop environment
  • -
  • Option to use a traditional titlebar and menubar instead of a headerbar (experimental)
  • -
-

Reading:

-
    -
  • Continuous scrolling layout
  • -
  • Option to show decorative shadows that mimic the appearance of a real book
  • -
  • Ability to zoom in and zoom out
  • -
  • Improved image viewer with "save as" option
  • -
  • Open copies of a book in new windows (Ctrl + N)
  • -
  • Reload book (Ctrl + R)
  • -
  • New built-in themes: Gray, Solarized, Gruvbox, Nord
  • -
-

Text selection:

-
    -
  • Ability to select text across pages
  • -
  • Find selected text in book
  • -
  • Speak selected text or from the selected locatio
  • -
-

Annotations:

-
    -
  • Spellcheck notes
  • -
  • Export annotations to Markdown
  • -
  • Options to use custom colors for highlights
  • -
-

For publishers and developers:

-
    -
  • Support for Apple Books theme attribute, which allows books to detect themes without JavaScript
  • -
  • WebKit's developer tools can be enabled
  • -
-

Breaking changes:

-
    -
  • The settings schemas has been reorganized
  • -
  • The format for custom themes has changed
  • -
  • Locations are now 1024 characters in size
  • -
-

Bug fixes:

-
    -
  • Fixed not restoring exact last location
  • -
  • Fixed navigation not working with scrolled layout
  • -
  • Fixed font size not changing when the book uses absolute-size keywords
  • -
  • Fixed text cut off at margin edge
  • -
  • Fixed unable to open books with "#" or "?" in the file name
  • -
-
-
- - -

Changes:

-
    -
  • Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files
  • -
  • Improved Wiktionary lookup, now with links and example sentences
  • -
  • Improved popover footnote extraction and formatting
  • -
  • Added option to export annotations to BibTeX
  • -
-
-
- - -

Fixes:

-
    -
  • Fixed table of contents navigation not working with some books
  • -
  • Fixed not being able to zoom images with Kindle books
  • -
  • Fixed not being able to open books with .epub3 filename extension
  • -
  • Fixed temporary directory not being cleaned after closing
  • -
-
-
- - -

Changes:

-
    -
  • Fixed F9 shortcut not working
  • -
  • Updated translations
  • -
-
-
- - -

Changes:

-
    -
  • External resources and JavaScript are now blocked by default
  • -
  • Basic text-to-speech support
  • -
  • Export annotations to HTML, plain text, or JSON
  • -
  • Support for viewing .mobi, .azw, and .azw3 files
  • -
-
-
- - -

Changes:

-
    -
  • New alternative sidebar UI
  • -
  • Lookup words in Wikipedia and offline dictionaries
  • -
  • Translate passages with Google Translate
  • -
  • Configure default action when words are selected
  • -
  • Experimental popup footnote support
  • -
  • Ability to find within only the current chapter
  • -
  • Fixed CPU spikes when left open
  • -
  • Fixed highlights not rendering at the correct positions
  • -
-
-
- - -

Changes:

-
    -
  • Fixed crashing when opening files
  • -
  • Updated translations
  • -
-
-
- - -

Changes:

-
    -
  • Customize page margins and brightness
  • -
  • Tweak the theme colors, or add your own custom themes
  • -
  • Ability to zoom and copy images
  • -
  • Option to auto-hide cursor
  • -
  • See reading time left by hovering over the reading progress slider
  • -
-
-
- - -

Fixes:

-
    -
  • Fixed some books not rendering sometimes
  • -
  • Fixed images being too wide in some cases
  • -
-
-
- - -

New features:

-
    -
  • Auto-hyphenation
  • -
  • Option to switch between left and full justification
  • -
  • New layout option: single-column paginated view
  • -
-

Fixed:

-
    -
  • Generated locations are now stored in the cache directory rather than localStorage
  • -
-
-
- - -

Changes:

-
    -
  • Allow font size adjustment when using publisher fonts
  • -
  • Fixed reading progress slider not appearing after localStorage quota is exceeded
  • -
-
-
- - -

New features:

-
    -
  • Touchpad gestures and ability to scroll through pages
  • -
  • Fullscreen mode
  • -
  • Option to hide reading progress bar
  • -
  • Option to disable dictionary
  • -
  • Option to use publisher font
  • -
-

Fixes:

-
    -
  • Restoring reading progress is now smooth and jank-free
  • -
  • Fixed custom styles not applying in some cases
  • -
-
-
- - -

Fixed invalid AppData file

-
-
- - -

Initial release

-
-
-
- - - workstation - mobile - -
diff -Nru foliate-2.6.3ubuntu1/data/com.github.johnfactotum.Foliate.metainfo.xml.in foliate-2.6.4/data/com.github.johnfactotum.Foliate.metainfo.xml.in --- foliate-2.6.3ubuntu1/data/com.github.johnfactotum.Foliate.metainfo.xml.in 1970-01-01 00:00:00.000000000 +0000 +++ foliate-2.6.4/data/com.github.johnfactotum.Foliate.metainfo.xml.in 2022-01-13 19:59:57.000000000 +0000 @@ -0,0 +1,430 @@ + + + com.github.johnfactotum.Foliate + CC0-1.0 + GPL-3.0-or-later + Foliate + A simple and modern eBook viewer + com.github.johnfactotum.Foliate + +

Foliate is a simple and modern GTK eBook viewer.

+

Features include:

+ +
+ John Factotum + https://johnfactotum.github.io/foliate/ + https://github.com/johnfactotum/foliate/issues + https://github.com/johnfactotum/foliate/wiki + + + https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/view.png + + + https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/dark.png + + + https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/skeuomorphism.png + + + https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/note.png + + + https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/annotations.png + + + https://raw.githubusercontent.com/johnfactotum/foliate/master/data/screenshots/lookup.png + + + + + +

Fixed various bugs

+
+
+ + +

Fixed a performance issue with zipped files (including EPUB files)

+
+
+ + +

Fix UI when running with libhandy 1.x

+
+
+ + +

Fixed automatic layout

+
+
+ + +

Changes:

+
    +
  • Added support for opening HTML files
  • +
  • Consistent inner and outer margins
  • +
  • The automatic layout no longer supports 4 columns
  • +
  • Fixed long words overflowing
  • +
  • Fixed custom themes not saved across sessions
  • +
  • Fixed shortcuts for key pads
  • +
  • Fixed opening non-UTF-8 zipped FB2 files
  • +
  • Fixed books not opening on GNOME 40
  • +
+
+
+ + +

Changes:

+
    +
  • Improved support for touch screens
  • +
  • OPDS credentials can now be remembered
  • +
  • Various fixes for GNOME 3.38
  • +
  • Fixed Wiktionary internal links
  • +
  • Added Basque, Korean, and Norwegian translations
  • +
+
+
+ + +

Fixed unable to open some EPUB files

+
+
+ + +

Fixed unable to open Mobipocket files

+
+
+ + +

Changes:

+
    +
  • Improved metadata display
  • +
  • Improved FictionBook rendering
  • +
  • Improved UI for acquiring books from OPDS
  • +
  • Fixed unique identifier extraction for EPUB files
  • +
  • Fixed missing window icon
  • +
  • Fixed TTS environment variables not set when using Flatpak
  • +
  • Fixed eSpeak NG voice not selected when testing TTS configuration
  • +
  • Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled
  • +
+
+
+ + +

OPDS catalogs:

+
    +
  • Catalogs are now opened in the main library window
  • +
  • View current location
  • +
  • Go to catalog start page
  • +
  • Reload catalog
  • +
  • Add current feed to catalogs
  • +
  • HTTP authentication support
  • +
+

Other changes:

+
    +
  • Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files
  • +
  • Fixed newlines being ignored when copying text
  • +
  • “Turn page on tap” is now disabled in non-paginated layouts
  • +
  • Opening a book from the library view now closes the library window
  • +
  • Language and publication dates in metadata are now parsed and formatted
  • +
  • Export annotations from the library view
  • +
+
+
+ + +

Changes:

+
    +
  • Fixed blurry book covers on HiDPI
  • +
  • Fixed OPDS links to Standard Ebooks and Project Gutenberg
  • +
  • Fixed wrong view icon on startup
  • +
+
+
+ + +

Library:

+
    +
  • A library view showing recent books and reading progress
  • +
  • Search books by metadata
  • +
  • E-book discovery with OPDS
  • +
+

New supported formats:

+
    +
  • FictionBook (.fb2, .fb2.zip)
  • +
  • Comic book archive (.cbr, .cbz, .cbt, .cb7)
  • +
  • Plain text (.txt)
  • +
  • Unpacked EPUB files
  • +
+

Layout:

+
    +
  • Option to set maximum page width
  • +
  • The "Automatic" layout will now show four columns when the page width is wide
  • +
+

Image viewer:

+
    +
  • Improved image viewer, with new shortcuts and the ability to rotate and invert images
  • +
  • Option to disable image viewer, or to open images on double, middle, or right click
  • +
+

Text-to-speech:

+
    +
  • Improved text-to-speech configuration UI
  • +
  • Ability to set text-to-speech voice based on book language
  • +
+

Annotations

+
    +
  • Import annotations from JSON
  • +
  • Search in annotations
  • +
  • Annotations are now sorted in the same order as they appear in the book
  • +
+

Security:

+
    +
  • "Allow Unsafe Content" now only enables JavaScript; external content will no longer be loaded
  • +
  • WebKit processes are now sandboxed
  • +
+

Other featues and fixes:

+
    +
  • Improved support for vertical and right-to-left books
  • +
  • Support for StarDict dictionaries
  • +
  • Fixed current location not preserved when resizing
  • +
  • Fixed auto-hiding header bar under some themes
  • +
  • Command-line options for showing version and adding books to library
  • +
  • Option to clear or disable cache
  • +
  • When an HTML page contains invalid self-closing anchor tags, it is now parsed as XHTML
  • +
+
+
+ + +

Fixes:

+
    +
  • Fixed wrong version number
  • +
  • Fixed dictionary, translation, and Wikipedia not working in the Snap package
  • +
+
+
+ + +

New features:

+
    +
  • New and improved icon
  • +
  • Option to disable turn page on tap
  • +
  • A menu on the welcome screen for opening recent files
  • +
  • Restored shortcuts for showing ToC, annotations, and bookmarks
  • +
+

Fixes:

+
    +
  • Fixed application not translated
  • +
+
+
+ + +

Interface:

+
    +
  • A redesigned interface that works better for smaller screens
  • +
  • Improved fullscreen mode with an overlaid headerbar
  • +
  • The headerbar and the progress bar now auto-hide, for a distraction-free reading experience
  • +
  • Various location information, as well as a clock, can now be displayed in the footer
  • +
  • A new location popover (Ctrl + L) that shows reading time estimates and allows skipping to locations
  • +
  • E-reader style navigation: go to the previous or next page by tapping on the left or right part of the view; tap on the middle to toggle header bar and progress bar
  • +
  • Annotations, bookmarks, and find results now show chapter titles
  • +
  • When looking up words in dictionaries, the query can now be edited
  • +
  • New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)
  • +
  • A new traditional menubar, which may be displayed depending on the desktop environment
  • +
  • Option to use a traditional titlebar and menubar instead of a headerbar (experimental)
  • +
+

Reading:

+
    +
  • Continuous scrolling layout
  • +
  • Option to show decorative shadows that mimic the appearance of a real book
  • +
  • Ability to zoom in and zoom out
  • +
  • Improved image viewer with "save as" option
  • +
  • Open copies of a book in new windows (Ctrl + N)
  • +
  • Reload book (Ctrl + R)
  • +
  • New built-in themes: Gray, Solarized, Gruvbox, Nord
  • +
+

Text selection:

+
    +
  • Ability to select text across pages
  • +
  • Find selected text in book
  • +
  • Speak selected text or from the selected locatio
  • +
+

Annotations:

+
    +
  • Spellcheck notes
  • +
  • Export annotations to Markdown
  • +
  • Options to use custom colors for highlights
  • +
+

For publishers and developers:

+
    +
  • Support for Apple Books theme attribute, which allows books to detect themes without JavaScript
  • +
  • WebKit's developer tools can be enabled
  • +
+

Breaking changes:

+
    +
  • The settings schemas has been reorganized
  • +
  • The format for custom themes has changed
  • +
  • Locations are now 1024 characters in size
  • +
+

Bug fixes:

+
    +
  • Fixed not restoring exact last location
  • +
  • Fixed navigation not working with scrolled layout
  • +
  • Fixed font size not changing when the book uses absolute-size keywords
  • +
  • Fixed text cut off at margin edge
  • +
  • Fixed unable to open books with "#" or "?" in the file name
  • +
+
+
+ + +

Changes:

+
    +
  • Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files
  • +
  • Improved Wiktionary lookup, now with links and example sentences
  • +
  • Improved popover footnote extraction and formatting
  • +
  • Added option to export annotations to BibTeX
  • +
+
+
+ + +

Fixes:

+
    +
  • Fixed table of contents navigation not working with some books
  • +
  • Fixed not being able to zoom images with Kindle books
  • +
  • Fixed not being able to open books with .epub3 filename extension
  • +
  • Fixed temporary directory not being cleaned after closing
  • +
+
+
+ + +

Changes:

+
    +
  • Fixed F9 shortcut not working
  • +
  • Updated translations
  • +
+
+
+ + +

Changes:

+
    +
  • External resources and JavaScript are now blocked by default
  • +
  • Basic text-to-speech support
  • +
  • Export annotations to HTML, plain text, or JSON
  • +
  • Support for viewing .mobi, .azw, and .azw3 files
  • +
+
+
+ + +

Changes:

+
    +
  • New alternative sidebar UI
  • +
  • Lookup words in Wikipedia and offline dictionaries
  • +
  • Translate passages with Google Translate
  • +
  • Configure default action when words are selected
  • +
  • Experimental popup footnote support
  • +
  • Ability to find within only the current chapter
  • +
  • Fixed CPU spikes when left open
  • +
  • Fixed highlights not rendering at the correct positions
  • +
+
+
+ + +

Changes:

+
    +
  • Fixed crashing when opening files
  • +
  • Updated translations
  • +
+
+
+ + +

Changes:

+
    +
  • Customize page margins and brightness
  • +
  • Tweak the theme colors, or add your own custom themes
  • +
  • Ability to zoom and copy images
  • +
  • Option to auto-hide cursor
  • +
  • See reading time left by hovering over the reading progress slider
  • +
+
+
+ + +

Fixes:

+
    +
  • Fixed some books not rendering sometimes
  • +
  • Fixed images being too wide in some cases
  • +
+
+
+ + +

New features:

+
    +
  • Auto-hyphenation
  • +
  • Option to switch between left and full justification
  • +
  • New layout option: single-column paginated view
  • +
+

Fixed:

+
    +
  • Generated locations are now stored in the cache directory rather than localStorage
  • +
+
+
+ + +

Changes:

+
    +
  • Allow font size adjustment when using publisher fonts
  • +
  • Fixed reading progress slider not appearing after localStorage quota is exceeded
  • +
+
+
+ + +

New features:

+
    +
  • Touchpad gestures and ability to scroll through pages
  • +
  • Fullscreen mode
  • +
  • Option to hide reading progress bar
  • +
  • Option to disable dictionary
  • +
  • Option to use publisher font
  • +
+

Fixes:

+
    +
  • Restoring reading progress is now smooth and jank-free
  • +
  • Fixed custom styles not applying in some cases
  • +
+
+
+ + +

Fixed invalid AppData file

+
+
+ + +

Initial release

+
+
+
+ + + workstation + mobile + +
diff -Nru foliate-2.6.3ubuntu1/data/meson.build foliate-2.6.4/data/meson.build --- foliate-2.6.3ubuntu1/data/meson.build 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/data/meson.build 2022-01-13 19:59:57.000000000 +0000 @@ -15,8 +15,8 @@ endif appstream_file = i18n.merge_file( - input: 'com.github.johnfactotum.Foliate.appdata.xml.in', - output: 'com.github.johnfactotum.Foliate.appdata.xml', + input: 'com.github.johnfactotum.Foliate.metainfo.xml.in', + output: 'com.github.johnfactotum.Foliate.metainfo.xml', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'metainfo') diff -Nru foliate-2.6.3ubuntu1/debian/changelog foliate-2.6.4/debian/changelog --- foliate-2.6.3ubuntu1/debian/changelog 2021-04-02 01:52:31.000000000 +0000 +++ foliate-2.6.4/debian/changelog 2022-01-13 19:59:57.000000000 +0000 @@ -1,11 +1,17 @@ -foliate (2.6.3ubuntu1) bionic; urgency=medium +foliate (2.6.4-1~ubuntu22.04.1) jammy; urgency=low - * Rename package to foliate + * Auto build. - -- Archisman Panigrahi Fri, 02 Apr 2021 07:22:31 +0530 + -- Archisman Panigrahi Thu, 13 Jan 2022 19:59:57 +0000 -com.github.johnfactotum.foliate (2.6.3) bionic; urgency=medium +foliate (2.6.4) bionic; urgency=medium + + * rename package + + -- Archisman Panigrahi Thu, 13 Jan 2022 18:07:32 +0530 + +com.github.johnfactotum.foliate (2.6.4) bionic; urgency=medium * New version - -- John Factotum <50942278+johnfactotum@users.noreply.github.com> Thu, 01 Apr 2021 16:25:25 +0800 + -- John Factotum <50942278+johnfactotum@users.noreply.github.com> Thu, 13 Jan 2022 19:25:25 +0800 diff -Nru foliate-2.6.3ubuntu1/debian/control foliate-2.6.4/debian/control --- foliate-2.6.3ubuntu1/debian/control 2021-04-02 01:52:31.000000000 +0000 +++ foliate-2.6.4/debian/control 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,8 @@ meson (>= 0.40), pkg-config, libglib2.0-dev (>= 2.54), - gjs + gjs, + appstream Standards-Version: 4.5.0 Rules-Requires-Root: no Homepage: https://johnfactotum.github.io/foliate/ @@ -23,7 +24,7 @@ Recommends: gir1.2-gspell-1, gir1.2-handy-0.0, iso-codes (>= 3.67) -Suggests: gir1.2-tracker-2.0, +Suggests: gir1.2-tracker-3.0, espeak, festival, sdcv, diff -Nru foliate-2.6.3ubuntu1/debian/git-build-recipe.manifest foliate-2.6.4/debian/git-build-recipe.manifest --- foliate-2.6.3ubuntu1/debian/git-build-recipe.manifest 1970-01-01 00:00:00.000000000 +0000 +++ foliate-2.6.4/debian/git-build-recipe.manifest 2022-01-13 19:59:57.000000000 +0000 @@ -0,0 +1,2 @@ +# git-build-recipe format 0.4 deb-version {debupstream}-1 +lp:foliate git-commit:a5a0e31cc4885f71479310f09510c00835761226 diff -Nru foliate-2.6.3ubuntu1/debian/source/format foliate-2.6.4/debian/source/format --- foliate-2.6.3ubuntu1/debian/source/format 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/debian/source/format 2022-01-13 19:59:57.000000000 +0000 @@ -1 +1 @@ -3.0 (quilt) +3.0 (native) diff -Nru foliate-2.6.3ubuntu1/.gitattributes foliate-2.6.4/.gitattributes --- foliate-2.6.3ubuntu1/.gitattributes 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/.gitattributes 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -src/assets/KindleUnpack/* linguist-vendored=true -src/web/jszip.min.js linguist-vendored=true -src/web/epub.js linguist-vendored=true -src/web/libarchivejs/* linguist-vendored=true -src/web/crypto-js/* linguist-vendored=true -src/epubcfi.js linguist-vendored=true diff -Nru foliate-2.6.3ubuntu1/.github/ISSUE_TEMPLATE/discussion.md foliate-2.6.4/.github/ISSUE_TEMPLATE/discussion.md --- foliate-2.6.3ubuntu1/.github/ISSUE_TEMPLATE/discussion.md 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/.github/ISSUE_TEMPLATE/discussion.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ ---- -name: Discussion -about: Discuss anything related to this project -title: '' -labels: discussion -assignees: '' - ---- - - diff -Nru foliate-2.6.3ubuntu1/.github/workflows/main.yml foliate-2.6.4/.github/workflows/main.yml --- foliate-2.6.3ubuntu1/.github/workflows/main.yml 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/.github/workflows/main.yml 2022-01-13 19:59:57.000000000 +0000 @@ -7,6 +7,8 @@ # Triggers the workflow on push or pull request events but only for the master branch push: branches: [ master ] + pull_request: + branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -23,7 +25,7 @@ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - - run: sudo apt install build-essential debhelper meson gettext pkg-config libglib2.0-dev gjs + - run: sudo apt install build-essential debhelper meson gettext pkg-config libglib2.0-dev gjs appstream - run: dpkg-buildpackage -us -uc -nc - run: mv ../*.deb . - uses: actions/upload-artifact@v2 diff -Nru foliate-2.6.3ubuntu1/.gitignore foliate-2.6.4/.gitignore --- foliate-2.6.3ubuntu1/.gitignore 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -_build/ -build/ -.flatpak-builder/ -.mo -__pycache__/ - -#snapcraft specific ignores -/parts/ -/stage/ -/prime/ - -*.snap - -.snapcraft -__pycache__ -*.pyc -*_source.tar.bz2 -snap/.snapcraft diff -Nru foliate-2.6.3ubuntu1/meson.build foliate-2.6.4/meson.build --- foliate-2.6.3ubuntu1/meson.build 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/meson.build 2022-01-13 19:59:57.000000000 +0000 @@ -1,5 +1,5 @@ project('com.github.johnfactotum.Foliate', - version: '2.6.3', + version: '2.6.4', meson_version: '>= 0.40.0', ) diff -Nru foliate-2.6.3ubuntu1/po/com.github.johnfactotum.Foliate.pot foliate-2.6.4/po/com.github.johnfactotum.Foliate.pot --- foliate-2.6.3ubuntu1/po/com.github.johnfactotum.Foliate.pot 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/com.github.johnfactotum.Foliate.pot 2022-01-13 19:59:57.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "" @@ -357,7 +357,7 @@ msgid "translator-credits" msgstr "" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "" @@ -850,7 +850,7 @@ msgstr "" #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "" @@ -1160,7 +1160,7 @@ msgstr "" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "" @@ -1409,7 +1409,7 @@ msgstr "" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "" @@ -3004,774 +3004,774 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " "progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "" diff -Nru foliate-2.6.3ubuntu1/po/cs.po foliate-2.6.4/po/cs.po --- foliate-2.6.3ubuntu1/po/cs.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/cs.po 2022-01-13 19:59:57.000000000 +0000 @@ -1,13 +1,13 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.johnfactotum.Foliate package. # -# Pavel Fric , 2019, 2020. +# Pavel Fric , 2019, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" -"PO-Revision-Date: 2020-08-10 23:03+0200\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-05-13 22:17+0200\n" "Last-Translator: Pavel Fric \n" "Language-Team: Czech \n" "Language: cs\n" @@ -15,11 +15,11 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Lokalize 19.04.0\n" +"X-Generator: Lokalize 20.12.0\n" #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -44,12 +44,12 @@ #: src/contents.js:222 msgid "Remove current location" -msgstr "Odstranit nynější polohu" +msgstr "Odstranit nynější místo" #: src/contents.js:225 src/ui/contentsStack.ui:204 #: src/ui/shortcutsWindow.ui:155 msgid "Bookmark current location" -msgstr "Přidat nynější polohu do záložek" +msgstr "Přidat nynější místo do záložek" #: src/contents.js:268 msgid "No results" @@ -69,7 +69,7 @@ #: src/contents.js:303 msgid "Bibliography" -msgstr "Bibliografie" +msgstr "Seznam pramenů" #: src/contents.js:304 msgid "Glossary" @@ -78,7 +78,7 @@ #. deprecated #: src/contents.js:306 src/contents.js:313 msgid "Annotation" -msgstr "Knihopisná poznámka" +msgstr "Poznámka" #: src/contents.js:309 msgid "Footnote" @@ -166,7 +166,7 @@ #: src/export.js:106 msgid "Highlight some text to add annotations." -msgstr "Zvýrazněte text pro přidání poznámek." +msgstr "Pro jejich přidání zvýrazněte text." #: src/export.js:128 msgid "Save File" @@ -223,12 +223,12 @@ #: src/export.js:246 msgid "Could not import annotations." -msgstr "Nepodařilo se zavést poznámky" +msgstr "Poznámky se nepodařilo zavést." #: src/library.js:99 src/window.js:672 src/ui/bookBoxMenu.ui:13 #: src/ui/mainMenu.ui:612 msgid "About This Book" -msgstr "O této knize" +msgstr "O knize" #: src/library.js:133 msgid "Choose File" @@ -240,11 +240,11 @@ #: src/library.js:428 msgid "File location unkown" -msgstr "Umístění souboru neznámé" +msgstr "Umístění souboru není známo" #: src/library.js:429 msgid "Choose the location of this file to open it." -msgstr "Vyberte umístění tohoto souboru pro jeho otevření." +msgstr "Pro otevření tohoto souboru vyberte jeho umístění." #: src/library.js:449 #, javascript-format @@ -320,7 +320,7 @@ #: src/lookup.js:106 msgid "Search on Wikipedia" -msgstr "Hledat na Wikipedii" +msgstr "Hledat ve Wikipedii" #: src/lookup.js:228 msgid "Source: " @@ -348,7 +348,7 @@ #: src/main.js:156 msgid "Open Catalog" -msgstr "Otevřít soupis" +msgstr "Otevřít katalog" #: src/main.js:162 src/opds.js:202 src/opds.js:377 src/ui/catalogRow.ui:50 msgid "Open" @@ -356,7 +356,7 @@ #: src/main.js:166 msgid "OPDS Catalog URL:" -msgstr "Adresa (URL) soupisu OPDS:" +msgstr "Adresa (URL) katalogu OPDS:" #. Translators: put your names here, one name per line #. they will be shown in the "About" dialog @@ -364,7 +364,7 @@ msgid "translator-credits" msgstr "Pavel Fric" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Jednoduchý a současný prohlížeč elektronických knih" @@ -493,7 +493,7 @@ #: src/opds.js:1068 src/ui/catalogWindow.ui:6 msgid "OPDS Catalog" -msgstr "Soupis OPDS" +msgstr "Katalog OPDS" #: src/opds.js:1168 src/ui/catalogWindow.ui:53 msgid "OPDS URL" @@ -627,7 +627,7 @@ #: src/properties.js:643 msgid "Find on…" -msgstr "Najít v..." +msgstr "Najít..." #: src/theme.js:23 msgid "Light" @@ -635,7 +635,7 @@ #: src/theme.js:27 msgid "Sepia" -msgstr "Sépiově hnědý" +msgstr "Hnědý" #: src/theme.js:31 msgid "Gray" @@ -653,23 +653,23 @@ #: src/theme.js:43 msgid "Solarized Light" -msgstr "Slunečně světlý" +msgstr "Zářící světlý" #: src/theme.js:47 msgid "Solarized Dark" -msgstr "Slunečně tmavý" +msgstr "Zářící tmavý" #: src/theme.js:51 msgid "Gruvbox Light" -msgstr "Gruvbox světlý" +msgstr "Nádherný světlý" #: src/theme.js:55 msgid "Gruvbox Dark" -msgstr "Gruvbox tmavý" +msgstr "Nádherný tmavý" #: src/theme.js:59 msgid "Nord" -msgstr "Nord" +msgstr "Severský" #. Translators: these are sentences from "The North Wind and the Sun", #. used for testing text-to-speech @@ -748,7 +748,7 @@ #: src/utils.js:794 msgid "Remember my credentials" -msgstr "" +msgstr "Zapamatovat si moje přihlašovací údaje" #: src/window.js:126 src/window.js:838 msgid "Leave fullscreen" @@ -844,7 +844,7 @@ #: src/ui/catalogWindow.ui:93 msgid "Remove Catalog" -msgstr "Odstranit soupis" +msgstr "Odstranit katalog" #: src/ui/contentsStack.ui:39 msgid "Table of Contents" @@ -852,14 +852,14 @@ #: src/ui/contentsStack.ui:51 msgid "Search annotations" -msgstr "Hledat poznámky" +msgstr "Hledat čtenářské poznámky" #: src/ui/contentsStack.ui:92 msgid "Select some text to add annotations." -msgstr "Vyberte text pro přidání poznámek." +msgstr "Pro přidání čtenářských poznámek vyberte text." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Poznámky" @@ -869,7 +869,7 @@ #: src/ui/contentsStack.ui:171 msgid "Add some bookmarks to see them here." -msgstr "Přidejte nějaké záložky a uvidíte je zde." +msgstr "Abyste zde nějaké uviděl/a, přidejte je." #: src/ui/contentsStack.ui:216 msgid "Bookmarks" @@ -877,7 +877,7 @@ #: src/ui/dictionaryBox.ui:75 msgid "No definitions found" -msgstr "Nenalezena žádná vymezení" +msgstr "Nenalezeno žádné vysvětlení" #: src/ui/exportWindow.ui:11 msgid "BibTeX" @@ -921,7 +921,7 @@ #: src/ui/findBox.ui:22 msgid "Current chapter" -msgstr "Nynější kapitolu" +msgstr "Nynější kapitola" #: src/ui/footnotePopover.ui:36 src/ui/mainMenu.ui:552 src/ui/menuBar.ui:154 msgid "Reference Preview" @@ -931,7 +931,7 @@ #: src/ui/shortcutsWindow.ui:371 src/ui/wikipediaBox.ui:107 #: data/com.github.johnfactotum.Foliate.gschema.xml:272 msgid "View" -msgstr "Pohled" +msgstr "Zobrazení" #: src/ui/imageViewer.ui:31 src/ui/menuBar.ui:60 src/ui/preferenceWindow.ui:59 #: src/ui/selectionPopover.ui:19 src/ui/shortcutsWindow.ui:340 @@ -986,7 +986,7 @@ #: src/ui/libraryWindow.ui:11 msgid "Open Catalog…" -msgstr "Otevřít soupis..." +msgstr "Otevřít katalog..." #: src/ui/libraryWindow.ui:17 msgid "Add Books…" @@ -994,7 +994,7 @@ #: src/ui/libraryWindow.ui:21 src/ui/libraryWindow.ui:683 msgid "Add Catalog…" -msgstr "Přidat soupis..." +msgstr "Přidat katalog..." #: src/ui/libraryWindow.ui:26 src/ui/mainMenu.ui:315 src/ui/menuBar.ui:78 #: src/ui/preferenceWindow.ui:118 @@ -1015,7 +1015,7 @@ #: src/ui/libraryWindow.ui:83 msgid "Add this feed to catalogs" -msgstr "Přidat tento kanál do soupisů" +msgstr "Přidat tento kanál do katalogů" #: src/ui/libraryWindow.ui:104 msgid "Location…" @@ -1027,7 +1027,7 @@ #: src/ui/libraryWindow.ui:123 msgid "Go Back to Catalogs" -msgstr "Jít zpět do soupisů" +msgstr "Jít zpět do katalogů" #: src/ui/libraryWindow.ui:149 msgid "Add books" @@ -1035,7 +1035,7 @@ #: src/ui/libraryWindow.ui:166 msgid "Add catalog" -msgstr "Přidat soupis" +msgstr "Přidat katalog" #: src/ui/libraryWindow.ui:229 src/ui/libraryWindow.ui:316 #: src/ui/shortcutsWindow.ui:44 @@ -1064,7 +1064,7 @@ #: src/ui/libraryWindow.ui:515 msgid "Browse Catalogs" -msgstr "Procházet soupisy" +msgstr "Procházet katalogy" #: src/ui/libraryWindow.ui:547 msgid "No results found" @@ -1076,11 +1076,11 @@ #: src/ui/libraryWindow.ui:656 msgid "No catalogs" -msgstr "Žádné soupisy" +msgstr "Žádné katalogy" #: src/ui/libraryWindow.ui:668 msgid "You can browse, search, and download content from OPDS catalogs." -msgstr "Můžete procházet, vyhledávat a stahovat obsah ze soupisů OPDS." +msgstr "Můžete procházet, vyhledávat a stahovat obsah ze katalogů OPDS." #: src/ui/libraryWindow.ui:692 msgid "Learn More" @@ -1088,7 +1088,7 @@ #: src/ui/libraryWindow.ui:708 src/ui/shortcutsWindow.ui:67 msgid "Catalogs" -msgstr "Soupisy" +msgstr "Katalogy" #: src/ui/mainMenu.ui:115 data/com.github.johnfactotum.Foliate.gschema.xml:181 msgid "Brightness" @@ -1150,11 +1150,11 @@ #: src/ui/mainMenu.ui:462 src/ui/menuBar.ui:126 msgid "Scrolled" -msgstr "Posouvání" +msgstr "Posuvné" #: src/ui/mainMenu.ui:470 src/ui/menuBar.ui:131 msgid "Continuous" -msgstr "Nepřetržité" +msgstr "Souvislé" #: src/ui/mainMenu.ui:487 msgid "Text" @@ -1169,7 +1169,7 @@ msgstr "Plné zarovnání" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Automatické dělení slov" @@ -1179,7 +1179,7 @@ #: src/ui/mainMenu.ui:559 src/ui/menuBar.ui:158 msgid "Auto-hide Cursor" -msgstr "Automaticky skrývat ukazatel" +msgstr "Automaticky skrývat ukazovátko" #: src/ui/mainMenu.ui:566 src/ui/menuBar.ui:162 msgid "Realistic Shadows" @@ -1248,19 +1248,19 @@ #: src/ui/menuBar.ui:57 msgid "_Edit" -msgstr "_Upravit" +msgstr "Úp_ravy" #: src/ui/menuBar.ui:66 msgid "Bookmark Current Location" -msgstr "Přidat nynější polohu do záložek" +msgstr "Přidat nynější místo do záložek" #: src/ui/menuBar.ui:72 src/ui/ttsDialog.ui:6 msgid "Text-to-Speech" -msgstr "Text na řeč" +msgstr "Převod textu na řeč" #: src/ui/menuBar.ui:85 msgid "_View" -msgstr "_Zobrazit" +msgstr "_Pohled" #: src/ui/menuBar.ui:88 msgid "Toggle Fullscreen" @@ -1280,11 +1280,11 @@ #: src/ui/menuBar.ui:116 msgid "Up to Two Columns" -msgstr "" +msgstr "Až dva sloupce" #: src/ui/menuBar.ui:179 msgid "_Go" -msgstr "_Jít" +msgstr "P_ohyb" #: src/ui/menuBar.ui:182 msgid "Go Back" @@ -1317,7 +1317,7 @@ #: src/ui/menuBar.ui:218 src/ui/navBar.ui:134 src/ui/navBar.ui:313 #: src/ui/preferenceWindow.ui:19 msgid "Location" -msgstr "Poloha" +msgstr "Místo" #: src/ui/menuBar.ui:225 msgid "_Help" @@ -1366,7 +1366,7 @@ #: src/ui/navBar.ui:298 src/ui/shortcutsWindow.ui:277 msgid "Go back to previous location" -msgstr "Jít zpět na předchozí polohu" +msgstr "Jít zpět na předchozí místo" #: src/ui/navBar.ui:387 src/ui/shortcutsWindow.ui:263 #: src/ui/shortcutsWindow.ui:299 @@ -1375,7 +1375,7 @@ #: src/ui/navBar.ui:402 msgid "Text-to-speech" -msgstr "Text na řeč" +msgstr "Převod textu na řeč" #: src/ui/preferenceWindow.ui:11 msgid "Nothing" @@ -1407,25 +1407,25 @@ #: src/ui/preferenceWindow.ui:67 msgid "Look up in dictionary" -msgstr "Vyhledat ve slovníku" +msgstr "Hledat ve slovníku" #: src/ui/preferenceWindow.ui:71 msgid "Look up in Wikipedia" -msgstr "Vyhledat na Wikipedii" +msgstr "Hledat ve Wikipedii" #: src/ui/preferenceWindow.ui:75 src/ui/selectionPopover.ui:93 msgid "Translate" msgstr "Přeložit" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Najít v knize" #: src/ui/preferenceWindow.ui:83 src/ui/selectionPopover.ui:59 #: src/ui/ttsDialog.ui:165 msgid "Speak" -msgstr "Mluvit" +msgstr "Přečíst nahlas" #: src/ui/preferenceWindow.ui:95 msgid "Disabled" @@ -1463,25 +1463,25 @@ #: src/ui/preferenceWindow.ui:197 #: data/com.github.johnfactotum.Foliate.gschema.xml:108 msgid "Turn page on tap" -msgstr "Obrátit stranu při ťuknutí" +msgstr "Obrátit stranu při klepnutí/ťuknutí" #: src/ui/preferenceWindow.ui:220 #: data/com.github.johnfactotum.Foliate.gschema.xml:98 msgid "Left footer" -msgstr "Levá patička stránky" +msgstr "Levé zápatí" #: src/ui/preferenceWindow.ui:254 #: data/com.github.johnfactotum.Foliate.gschema.xml:103 msgid "Right footer" -msgstr "Pravá patička stránky" +msgstr "Pravé zápatí" #: src/ui/preferenceWindow.ui:288 msgid "When a word is selected" -msgstr "Když je vybráno slovo" +msgstr "Při vybrání slova" #: src/ui/preferenceWindow.ui:322 msgid "When multiple words are selected" -msgstr "Když je vybráno více slov" +msgstr "Při vybrání více slov" #: src/ui/preferenceWindow.ui:356 msgid "Open images on" @@ -1490,7 +1490,7 @@ #: src/ui/preferenceWindow.ui:391 #: data/com.github.johnfactotum.Foliate.gschema.xml:78 msgid "Text-to-speech command" -msgstr "Příkaz pro text na řeč" +msgstr "Příkaz pro převod textu na řeč" #: src/ui/preferenceWindow.ui:407 msgid "Configure…" @@ -1536,7 +1536,7 @@ #: src/ui/preferenceWindow.ui:620 msgid "Use Tracker to track file locations" -msgstr "Použít stopaře na sledování umístění souborů" +msgstr "Použít sledování umístění souborů" #: src/ui/preferenceWindow.ui:662 msgid "Save file locations" @@ -1557,15 +1557,15 @@ #: src/ui/selectionPopover.ui:79 msgid "Look Up in Dictionary" -msgstr "Vyhledat ve slovníku" +msgstr "Hledat ve slovníku" #: src/ui/selectionPopover.ui:86 msgid "Look Up in Wikipedia" -msgstr "Vyhledat ve Wikipedii" +msgstr "Hledat ve Wikipedii" #: src/ui/selectionPopover.ui:105 msgid "Speak from Here" -msgstr "Mluvit odtud" +msgstr "Číst nahlas odtud" #: src/ui/shortcutsWindow.ui:9 msgid "Library Shortcuts" @@ -1590,7 +1590,7 @@ #: src/ui/shortcutsWindow.ui:85 src/ui/shortcutsWindow.ui:285 msgid "Go to location" -msgstr "Jít na polohu" +msgstr "Jít na místo" #: src/ui/shortcutsWindow.ui:98 msgid "E-book Viewer Shortcuts" @@ -1614,7 +1614,7 @@ #: src/ui/shortcutsWindow.ui:176 msgid "Start/stop text-to-speech" -msgstr "Spustit/Zastavit text na řeč" +msgstr "Spustit/Zastavit převod textu na řeč" #: src/ui/shortcutsWindow.ui:206 src/ui/shortcutsWindow.ui:391 msgid "Restore zoom level" @@ -1650,7 +1650,7 @@ #: src/ui/shortcutsWindow.ui:295 msgid "Touchpad Gestures" -msgstr "Gesta pro dotykovou plochu" +msgstr "Pohyby prsty nad dotykovou plochou" #: src/ui/shortcutsWindow.ui:332 msgid "Image Viewer Shortcuts" @@ -1690,11 +1690,12 @@ #: src/ui/ttsDialog.ui:46 msgid "Text-to-Speech Command" -msgstr "Příkaz pro text na řeč" +msgstr "Příkaz pro převod textu na řeč" #: src/ui/ttsDialog.ui:57 msgid "Make sure the selected text-to-speech program is correctly installed." -msgstr "Ujistěte se, že je program pro Text na řeč správně nainstalován." +msgstr "" +"Ujistěte se, že je program pro převod textu na řeč správně nainstalován." #: src/ui/ttsDialog.ui:63 msgid "eSpeak NG" @@ -1724,7 +1725,7 @@ #: src/ui/ttsDialog.ui:178 msgid "The program should speak the following test sentences in order:" -msgstr "Program má vyslovit následující zkušební věty v pořadí:" +msgstr "Program má nahlas přečíst následující zkušební věty v pořadí:" #: src/ui/ttsDialog.ui:191 msgid "1" @@ -2890,7 +2891,7 @@ #: src/schemes.js:467 msgid "Speaker" -msgstr "Řečník" +msgstr "Mluvčí" #: src/schemes.js:468 msgid "Sponsor" @@ -3016,298 +3017,299 @@ msgid "Writer of supplementary textual content" msgstr "Autor dalšího textového obsahu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "" "Foliate je jednoduchý a moderní prohlížeč elektronických knih napsaný v GTK." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Funkce zahrnují:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Zobrazení dvou stran a zobrazení s posouváním" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Přizpůsobení písma a odstupu řádků" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" -msgstr "Světlý, sépiový, tmavý a obrácený režim" +msgstr "Světlý, hnědý (sépiový), tmavý a obrácený režim" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Posuvník s postupem čtení se značkami kapitol" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Záložky a poznámky" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Rychlé prohledání slovníku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" +"Opraven problém s výkonem u komprimovaných souborů (včetně souborů EPUB)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" -msgstr "" +msgstr "Opraveno uživatelské rozhraní při spuštění s libhandy 1.x." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" -msgstr "" +msgstr "Opraveno automatické rozložení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Změny:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" -msgstr "" +msgstr "Přidána podpora pro otevírání souborů HTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" -msgstr "" +msgstr "Sladěny vnitřní a vnější okraje" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" -msgstr "" +msgstr "Automatické rozvržení již nepodporuje 4 sloupce" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" -msgstr "" +msgstr "Opraveno přetékání dlouhých slov" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" -msgstr "Opraveny vlastní styly, které se v některých případech nepoužily" +msgstr "Opravené vlastní motivy neuložené napříč sezeními" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" -msgstr "Opraven problém s nepracující klávesovou zkratkou F9" +msgstr "Opravené klávesové zkratky pro klávesnice" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" -msgstr "" +msgstr "Opraveno otevírání souborů FB2 nezipovaných ne-UTF-8" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" -msgstr "Opraveny vlastní styly, které se v některých případech nepoužily" +msgstr "Opraveno, že se v GNOME 40 neotevřely knihy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" -msgstr "" +msgstr "Vylepšena podpora pro dotykové obrazovky" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" -msgstr "" +msgstr "Ověření OPDS si lze nyní zapamatovat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" -msgstr "" +msgstr "Různé opravy pro GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" -msgstr "" +msgstr "Opraveny vnitřní odkazy Wikislovníku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" -msgstr "" +msgstr "Přidány baskický, korejský a norský překlad" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" -msgstr "" -"Opraven stav, kdy nebylo možno otevírat knihy se souborovou příponou .epub3" +msgstr "Opraveno, že nelze otevřít některé soubory EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" -msgstr "" -"Opraven stav, kdy nebylo možno otevírat knihy se souborovou příponou .epub3" +msgstr "Opraveno, že nelze otevřít soubory Mobipocket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" -msgstr "" +msgstr "Vylepšeno zobrazování popisných dat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" -msgstr "" +msgstr "Vylepšeno vykreslování FictionBook" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" -msgstr "" +msgstr "Vylepšeno uživatelské rozhraní pro získávání knih z OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" -msgstr "" -"Opraven stav, kdy nebylo možno otevírat knihy se souborovou příponou .epub3" +msgstr "Opraveno vytahování jedinečných identifikátorů pro soubory EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" -msgstr "" +msgstr "Opravená ikona chybějícího okna" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" +"Opraveno, že proměnné prostředí TTS nebyly nastaveny při použití Flatpaku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" -msgstr "" +msgstr "Opraveno, že hlas eSpeak NG nebyl vybrán při zkoušení nastavení TTS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" +"Opraven nesprávný atribut „__ibooks_internal_theme“, když je povoleno " +"„Obrácený“" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" -msgstr "Soupisy OPDS:" +msgstr "Katalogy OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" -msgstr "" +msgstr "Katalogy se nyní otevírají v hlavním okně knihovny" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" -msgstr "Zobrazit nynější polohu" +msgstr "Zobrazit nynější místo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" -msgstr "Jít na začáteční stranu soupisu" +msgstr "Jít na začáteční stranu katalogu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" -msgstr "Nahrát soupis znovu" +msgstr "Nahrát katalog znovu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" -msgstr "Přidat nynější kanál do soupisů" +msgstr "Přidat nynější kanál do katalogů" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" -msgstr "Požadováno ověření" +msgstr "Podpora pro ověření HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Jiné změny:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" +"Opraveno vytahování jedinečných identifikátorů pro soubory FictionBook (." +"fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" -msgstr "" +msgstr "Opraven, že při kopírování textu se přehlížely nové řádky" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" +"Možnost „obrátit stránku při klepnutí/ťuknutí“ je nyní v nestránkovaných" +" rozloženích " +"zakázána" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" -msgstr "" +msgstr "Otevřením knihy ze zobrazení knihovny se nyní zavře okno knihovny" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" +"Jazyk a data vydání v popisných adatech jsou nyní analyzována a formátována" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" -msgstr "Vyvést poznámky do Markdown" +msgstr "Vyvést poznámky ze zobrazení knihovny" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Opraveny rozmazané obaly knih na HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" "Opraveny odkazy OPDS na standardní elektronické knihy a Projekt Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Opraveno nesprávné zobrazení ikony při spuštění" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Knihovna:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" -msgstr "" +msgstr "Zobrazení knihovny ukazující poslední knihy a postup čtení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Prohledávat knihy podle popisných dat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "Zpřístupnění elektronických knih s OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nově podporované formáty:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Archiv knihy komiksů (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Prostý text (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Nezabalené soubory EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Rozvržení:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Volba pro nastavení největší šířky strany" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" +"Rozložení „Automaticky“ nyní zobrazí čtyři sloupce, pokud je šířka stránky " +"široký" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Prohlížeč obrázků:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3315,506 +3317,521 @@ "Vylepšený prohlížeč obrázků, nové klávesové zkratky a schopnost otáčet a " "obrátit barvu obrázků" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" +"Možnost zakázat prohlížeč obrázků nebo otevírat obrázky dvojitým klepnutím, " +"klepnutím prostředním nebo pravým tlačítkem myši" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" -msgstr "Text na řeč:" +msgstr "Převod textu na řeč:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Vylepšené nastavení rozhraní textu na řeč" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "Schopnost nastavení hlasu textu na řeč podle jazyka knihy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Zavést poznámky z JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Hledat v poznámkách" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" -msgstr "Poznámky jsou nyní řazeny ve stejném pořadí, jak se objevují v knize" +msgstr "" +"Poznámky jsou nyní řazeny ve stejném pořadí, v němž se objevují v knize" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Bezpečnost:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" +"Možnost „Povolit nebezpečný obsah“ nyní povoluje pouze JavaScript; vnější " +"obsah už nadále nepůjde načíst" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" -msgstr "" +msgstr "Procesy WebKit jsou nyní v karanténě" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" -msgstr "" +msgstr "Další funkce a opravy:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" -msgstr "" +msgstr "Vylepšena podpora pro svislé knihy a knihy čtené zprava doleva" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" -msgstr "" +msgstr "Podpora slovníků StarDict" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" -msgstr "" +msgstr "Opraveno, že nynější místo se při změně velikosti nezachovalo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" -msgstr "" +msgstr "Opraveno automatické skrývání pruhu záhlaví pod některými motivy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" -msgstr "" +msgstr "Volby příkazového řádku pro zobrazení verze a přidání knih do knihovny" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" -msgstr "Volba pro zakázání slovníku" +msgstr "Volba pro smazání nebo zakázání slovníku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" +"Pokud stránka HTML obsahuje neplatné samouzavírací kotevní značky, je nyní " +"analyzován jako XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Opravy:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Opraveno nesprávné číslo verze" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "Opraven slovník, překlad a Wikipedie nepracující v balíčku Snap" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nové vlastnosti:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Nová a lepší ikona" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" -msgstr "Volba pro zakázání obrácení strany při ťuknutí" +msgstr "Volba pro zakázání obrácení strany při klepnutí/ťuknutí" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Nabídka na uvítací obrazovce pro otevření nedávných souborů" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "Obnoveny zkratky pro ukázání obsahu, poznámek a záložek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Opraven program, nepřeloženo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Rozhraní:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" -msgstr "" +msgstr "Přepracované rozhraní, které lépe pracuje na menších obrazovkách" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" -msgstr "" +msgstr "Vylepšený režim celé obrazovky s překrytým záhlavím" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "" +"Pruh záhlaví a ukazatel postupu se nyní automaticky skryjí, aby při čtení " +"neodváděly pozornost" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" -msgstr "" +msgstr "V zápatí lze nyní zobrazit různé informace o místě, a také hodiny" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "" -"Nový vysunovací panel s polohami (Ctrl+L), který ukáže odhad pro dobu čtení " -"a umožní přeskočit na polohu" +"Nový vysunovací panel s místy (Ctrl+L), který ukáže odhad pro dobu čtení " +"a umožní přeskočit na místa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " "progress bar" msgstr "" -"Je-li zapnuto, můžete jít na předchozí nebo na další stranu ťuknutím do levé " -"nebo pravé části zobrazeného; ťukněte doprostřed pro přepnutí záhlaví a " +"Pohyb v knize ve stylu elektronické čtečky: přejděte na předchozí nebo na" +" další" +" stranu klepnutím/ťuknutím v levé " +"nebo pravé části zobrazení; klepněte/ťukněte doprostřed pro přepnutí záhlaví" +" a " "ukazatele postupu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "Poznámky, záložky a výsledky hledání nyní ukazují názvy kapitol" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" -msgstr "" +msgstr "Při vyhledávání slov ve slovnících lze nyní dotaz upravit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" +"Nová zkratka pro prohlížení popisných dat (Ctrl + I) a nastavení (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" +"Nový obvyklý nabídkový panel, který se může zobrazit v závislosti na" +" prostředí pracovní plochy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" -msgstr "Použít tradiční titulkový pruh (pokusné)" +msgstr "" +"Možnost použít tradiční titulkový pruh a hlavní nabídku místo pruhu záhlaví " +"(pokusné)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Čtení:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" -msgstr "" +msgstr "Nepřetržité posunování rozvržení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" -msgstr "" +msgstr "Možnost zobrazit ozdobné stíny napodobující vzhled skutečné knihy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Schopnost přibližovat a oddalovat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" -msgstr "" +msgstr "Vylepšený prohlížeč obrázků s možností „uložit jako“" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Otevřít kopie knihy v nových oknech (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Nahrát knihu znovu (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nová vestavěná témata: šedé, osluněné, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Výběr textu:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Schopnost vybrat text přes stránky" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Najít vybraný text v knize" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" -msgstr "Říct vybraný text nebo od vybrané polohy" +msgstr "Přečíst nahlas vybraný text nebo od vybraného místa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Poznámky:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Zkontrolovat pravopis poznámek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Vyvést poznámky do Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" -msgstr "Volbyk použití vlastních barev pro zvýraznění" +msgstr "Volby k použití vlastních barev pro zvýraznění" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Pro vydavatele a vývojáře:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "" +"Podpora atributu motivu Apple Books, který umožňuje knihám rozpoznávat " +"motivy bez JavaScriptu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" -msgstr "Je-li zapnuto, jsou povoleny vývojářské nástroje" +msgstr "Lze povolit vývojářské nástroje WebKit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" -msgstr "Kritické změny:" +msgstr "Zásadní změny:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Schéma nastavení bylo změněno" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Formát pro vlastní vzhled byl změněn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" -msgstr "Polohy nyní mají velikost 1024 znaků" +msgstr "Místa nyní mají velikost 1024 znaků" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Opravy chyb:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" -msgstr "" +msgstr "Opraveno neobnovení přesného posledního místa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" -msgstr "Opravený pohyb v obsahu u některých knih nepracuje" +msgstr "Opraven pohyb nepracující při posuvném rozvržení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" +"Opraveno velikost písma se nemění, když kniha používá klíčová slova " +"absolutní velikosti" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" -msgstr "" +msgstr "Opraven text oříznutý na okraji okraje" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" -msgstr "" -"Opraven stav, kdy nebylo možno otevírat knihy se souborovou příponou .epub3" +msgstr "Opraveno, že nebylo lze otevírat knihy s „#“ nebo „?“ v názvu souboru" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "Opravená verze Flatpak neumí otevřít soubory .mobi, .azw, and .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Vylepšené vyhledávání ve Wiktionary, nyní s odkazy a vzorovými větami" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Vylepšené získávání a formátování poznámek pod čarou" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Přidána volba vyvádění poznámek do BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Opravený pohyb v obsahu u některých knih nepracuje" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Opravena věc ohledně nemožnosti přiblížení obrázků v knihách Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" "Opraven stav, kdy nebylo možno otevírat knihy se souborovou příponou .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Opraven stav, kdy nebyl dočasný adresář po zavření vyčištěn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Opraven problém s nepracující klávesovou zkratkou F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Aktualizovány překlady" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" -msgstr "" +msgstr "Vnější zdroje a JavaScript jsou nyní ve výchozím nastavení blokovány" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" -msgstr "Základní podpora pro text na řeč" +msgstr "Základní podpora pro převod textu na řeč" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Vyvést poznámky do HTML, prostého textu nebo JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Podpora pro zobrazení souborů .mobi, .azw, a .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nové další rozhraní postranního pruhu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" -msgstr "Vyhledat slova ve Wikipedii a ve slovnících mimo internet" +msgstr "Hledat slova ve Wikipedii a ve slovnících vytvářených mimo internet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Překlad pasáží pomocí Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Nastavit výchozí činnost, kdy jsou vybrána slova" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Pokusná podpora pro vysunovací poznámky pod čarou" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Schopnost hledat jen v nynější kapitole" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" -msgstr "" +msgstr "Opravené špičky CPU, když zůstalo otevřeno" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" -msgstr "" +msgstr "Opraveno nevykreslování zvýraznění ve správné poloze" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" -msgstr "" +msgstr "Opraveno padání při otevírání souborů" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Přizpůsobit okraje stran a jas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Ladit barvy vzhledu nebo přidat své vlastní vzhledy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Schopnost zvětšovat a kopírovat obrázky" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" -msgstr "Volba automatického skrývání ukazatele" +msgstr "Volba automatického skrývání ukazovátka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "Vidět zbývající dobu čtení po přejetí nad posuvníkem s postupem čtení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" -msgstr "Opraveny vlastní styly, které se v některých případech nepoužily" +msgstr "Opraveno, že se některé knihy někdy nevykreslovaly" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" -msgstr "Opraveny vlastní styly, které se v některých případech nepoužily" +msgstr "Opraveno, že v některých případech byly obrázky příliš široké" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" -msgstr "Volba pro přepnutí mezi levým a zarovnáním do bloku" +msgstr "Volba pro přepnutí mezi zarovnáním vlevo a do bloku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" -msgstr "" +msgstr "Nová možnost rozvržení: jednosloupcové stránkové zobrazení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Opraveno:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" -msgstr "Poznámky jsou nyní řazeny ve stejném pořadí, jak se objevují v knize" +msgstr "" +"Vytvořená místa jsou nyní uložena spíše v adresáři s vyrovnávací pamětí než" +"v místním úložišti" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "Povolit přizpůsobení velikosti písma při používání písma vydavatele" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" +"Opraveno, že se po překročení stanoveného přídělu pro místní úložiště" +" nezobrazoval posuvník postupu čtení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gesta pro dotykovou plochu a schopnost posunu skrze strany" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Celoobrazovkový režim" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Volba pro skrytí posuvníku s postupem čtení" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Volba pro zakázání slovníku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Volba pro použití písma vydavatele" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Obnovení postupu čtení je nyní hladší a plynulejší" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Opraveny vlastní styly, které se v některých případech nepoužily" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Opraven neplatný soubor AppData" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Počáteční vydání" @@ -3831,8 +3848,8 @@ "Whether to save generated locations to cache (the locations are needed for " "calculating percentages of locations in book)" msgstr "" -"Zda uložit vytvořené polohy do vyrovnávací paměti (k vypočítání procenta " -"poloh v knize jsou potřeba polohy)" +"Zda uložit vytvořená místa do vyrovnávací paměti (k vypočítání procenta " +"míst v knize jsou potřeba místa)" #: data/com.github.johnfactotum.Foliate.gschema.xml:33 msgid "Cache covers" @@ -3921,7 +3938,7 @@ #: data/com.github.johnfactotum.Foliate.gschema.xml:84 msgid "If true, a side pane will be used instead of popovers" -msgstr "Je-li zapnuto, bude namísto vysunovacích použit postranní panel" +msgstr "Je-li zapnuto, bude namísto vyskakovacích oken použit postranní panel" #: data/com.github.johnfactotum.Foliate.gschema.xml:88 msgid "Use menubar" @@ -3929,11 +3946,11 @@ #: data/com.github.johnfactotum.Foliate.gschema.xml:89 msgid "If true, use traditional titlebars and menubars" -msgstr "Je-li zapnuto, používat obyčejné titulkové pruhy a nabídky" +msgstr "Je-li zapnuto, používat obvyklé titulkové pruhy a hlavní nabídky" #: data/com.github.johnfactotum.Foliate.gschema.xml:93 msgid "Auto-hide headerbar" -msgstr "Automaticky skrývat pruh se záhlavím" +msgstr "Automaticky skrývat záhlaví" #: data/com.github.johnfactotum.Foliate.gschema.xml:94 msgid "" @@ -3957,8 +3974,10 @@ "right part of the view; tap on the middle to toggle header bar and progress " "bar" msgstr "" -"Je-li zapnuto, můžete jít na předchozí nebo na další stranu ťuknutím do levé " -"nebo pravé části zobrazeného; ťukněte doprostřed pro přepnutí záhlaví a " +"Je-li zapnuto, můžete jít na předchozí nebo na další stranu" +" klepnutím/ťuknutím do levé " +"nebo pravé části zobrazeného; klepněte/ťukněte doprostřed pro přepnutí" +" záhlaví a " "ukazatele postupu" #: data/com.github.johnfactotum.Foliate.gschema.xml:116 @@ -3984,9 +4003,8 @@ msgstr "Okraj" #: data/com.github.johnfactotum.Foliate.gschema.xml:137 -#, fuzzy msgid "Page margin in pixels" -msgstr "Okraj strany v procentech" +msgstr "Okraj strany v pixelech" #: data/com.github.johnfactotum.Foliate.gschema.xml:141 msgid "Max width" @@ -4161,13 +4179,12 @@ msgstr "Jak zobrazit knihovnu" #: data/com.github.johnfactotum.Foliate.gschema.xml:277 -#, fuzzy msgid "Library page" -msgstr "Knihovna" +msgstr "Stránka knihovny" #: data/com.github.johnfactotum.Foliate.gschema.xml:278 msgid "Current library page (“library” or “catalog”)" -msgstr "" +msgstr "Nynější stránka knihovny („knihovna“ nebo „katalog“)" #: data/com.github.johnfactotum.Foliate.gschema.xml:282 msgid "Use Tracker" @@ -4182,11 +4199,11 @@ #: data/com.github.johnfactotum.Foliate.gschema.xml:287 msgid "OPDS download action" -msgstr "" +msgstr "Akce stahování OPDS" #: data/com.github.johnfactotum.Foliate.gschema.xml:288 msgid "What to do when downloading a file from an OPDS feed" -msgstr "" +msgstr "Co dělat při stahování souboru z kanálu OPDS" #~ msgid "" #~ "This book has no identifier. This is the MD5 hash generated from the file." diff -Nru foliate-2.6.3ubuntu1/po/de.po foliate-2.6.4/po/de.po --- foliate-2.6.3ubuntu1/po/de.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/de.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-04-10 14:28+0200\n" "Last-Translator: kleinHeiti \n" "Language-Team: German \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -365,7 +365,7 @@ msgid "translator-credits" msgstr "Christian Heitjan" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Ein einfacher und moderner eBook-Reader" @@ -861,7 +861,7 @@ msgstr "Wählen Sie einen Text aus, um Anmerkungen hinzuzufügen." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Anmerkungen" @@ -1176,7 +1176,7 @@ msgstr "Gesamte Breite" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Automatische Silbentrennung" @@ -1425,7 +1425,7 @@ msgstr "Übersetzen" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Im Buch finden" @@ -3027,294 +3027,294 @@ msgid "Writer of supplementary textual content" msgstr "Schreiber von ergänzendem Textinhalt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate ist ein einfacher und moderner GTK eBook-Reader." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Merkmale:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Zweiseitige- und gescrollte Ansicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Anpassen von Schriftart und Zeilenabstand" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Hell-, Sepia-, Dunkel- und Invertierter Modus." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Lesefortschrittsregler mit Kapitelmarkierungen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Lesezeichen und Anmerkungen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Schnelles Nachschlagen im Wörterbuch" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Änderungen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Benutzerdefinierte Stile werden jetzt immer angewendet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Behoben: F9 Shortcut funktioniert nicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Behoben: einige Bücher werden manchmal nicht angezeigt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "Verbesserte Unterstützung für Touchscreens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "OPDS-Anmeldeinformationen können jetzt gespeichert werden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "Verschiedene Korrekturen für GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "Wiktionary interne Links korrigiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "Baskische, koreanische und norwegische Übersetzungen hinzugefügt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 #, fuzzy msgid "Fixed unable to open some EPUB files" msgstr "Behoben: Einige EPUB-Dateien lassen sich nicht öffnen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Behoben: Mobipocket-Dateien können nicht geöffnet werden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Verbesserte Anzeige von Metadaten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Optimierte FictionBook-Darstellung" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "Verbesserte Benutzeroberfläche für den Erwerb von Büchern aus OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Extraktion des eindeutigen Bezeichners für EPUB-Dateien korrigiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Fehlendes Fenstersymbol behoben" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" "Behoben: TTS-Umgebungsvariablen wurden bei Verwendung von Flatpak nicht " "gesetzt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" "Behoben: eSpeak NG Stimme nicht ausgewählt beim Testen der TTS-Konfiguration" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Behoben: Falsches Attribut „__ibooks_internal_theme“, wenn „Invertieren“ " "aktiviert ist" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS-Kataloge:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Kataloge werden jetzt im Hauptfenster der Bibliothek geöffnet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Aktuelle Position anzeigen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Zur Katalogstartseite gehen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Katalog neu laden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Aktuellen Feed zu Katalogen hinzufügen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "Unterstützung der HTTP-Authentifizierung" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Weitere Änderungen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Behoben: eindeutige Bezeichner-Extraktion für FictionBook (.fb2, .fb2.zip) " "Dateien" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Behoben: Neuzeilen werden beim Kopieren von Text ignoriert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" "“Seite beim Antippen umblättern” ist jetzt in nicht-seitenbasierten Layouts " "deaktiviert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" "Das Öffnen eines Buches aus der Bibliotheksansicht schließt jetzt das " "Bibliotheksfenster" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "Sprache und Veröffentlichungsdatum in Metadaten werden jetzt geparst und " "formatiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Exportieren von Anmerkungen aus der Bibliotheksansicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Behoben: Unscharfe Buchcover bei HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Behoben: OPDS-Verknüpfungen zu Standard-Ebooks und Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Behoben: Falsches Ansichtssymbol beim Starten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Bibliothek:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" "Eine Bibliotheksansicht, die die letzten Bücher und den Lesefortschritt " "anzeigt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Bücher nach Metadaten suchen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "E-Book-Erkennung mit OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Neue unterstützte Formate:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Comicbuch-Archiv (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Einfacher Text (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Ungepackte EPUB-Dateien" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Layout:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Option zum Einstellen der maximalen Seitenbreite" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3322,11 +3322,11 @@ "Das Layout \"Automatic\" zeigt nun vier Spalten an, wenn die Seitenbreite " "breit ist." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Bildbetrachter:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3334,7 +3334,7 @@ "Verbesserter Bildbetrachter, mit neuen Tastenkombinationen und der " "Möglichkeit, Bilder zu drehen und zu invertieren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3342,39 +3342,39 @@ "Option zum Deaktivieren des Bildbetrachters oder zum Öffnen von Bildern bei " "Doppel-, Mittel- oder Rechtsklick." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Text-zu-Sprache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Verbesserte Text-zu-Sprache-Konfigurations UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" "Möglichkeit zur Einstellung der Text-to-Speech-Stimme basierend auf der " "Buchsprache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importieren von Anmerkungen aus JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Suche in Anmerkungen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Anmerkungen werden nun in der gleichen Reihenfolge sortiert, wie sie im Buch " "erscheinen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Sicherheit:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3382,41 +3382,41 @@ "\"Allow Unsafe Content\" aktiviert jetzt nur noch JavaScript; externe " "Inhalte werden nicht mehr geladen." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit-Prozesse sind jetzt in der Sandbox" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Weitere Funktionen und Korrekturen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Verbesserte Unterstützung für vertikale und Rechts-nach-Links-Bücher" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Unterstützung für StarDict-Wörterbücher" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "Behoben: Aktuelle Position bleibt bei Größenänderung nicht erhalten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "Behoben: Automatische Ausblendung der Kopfleiste bei einigen Themes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Befehlszeilenoptionen zum Anzeigen der Version und Hinzufügen von Büchern " "zur Bibliothek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Option zum Löschen oder Deaktivieren des Cache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3424,68 +3424,68 @@ "Wenn eine HTML-Seite ungültige selbstschließende Anker-Tags enthält, wird " "sie jetzt als XHTML geparst." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Korrekturen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Falsche Versionsnummer korrigiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Wörterbuch, Übersetzung und Wikipedia funktionieren nicht im Snap-Paket " "korrigiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Neue Funktionen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Neues, verbessertes Symbol" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Option zum deaktivieren des umblätterns beim Antippen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Ein Menü auf dem Begrüßungsbildschirm zum öffnen der letzten Dateien" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" "Wiederhergestellte Verknüpfungen zum Anzeigen von ToC, Anmerkungen und " "Lesezeichen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Anwendung nicht übersetzt behoben" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Benutzeroberfläche:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" "Eine neu gestaltete Benutzeroberfläche, die bei kleineren Bildschirmenbesser " "funktioniert " -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Verbesserter Vollbildmodus mit einer überlagerten Kopfzeile" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3493,13 +3493,13 @@ "Die Kopfzeile und der Fortschrittsbalken werden jetzt automatisch " "ausgeblendet, um beim Lesen nicht abzulenken." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "Fortschrittsinformationen und Uhr in der Statusleiste hinzugefügt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3507,7 +3507,7 @@ "Neues Popup-Menü (Strg + L), das die geschätzte Lesezeit anzeigt und das " "Überspringen von Stellen ermöglicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3517,29 +3517,29 @@ "indem Sie auf den linken oder rechten Teil der Ansicht tippen; tippen Sie " "auf die Mitte, um zwischen Kopfzeile und Fortschrittsbalken zu wechseln" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "Anmerkungen, Lesezeichen und Suchergebnisse zeigen jetzt Kapiteltitel" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" "Beim Nachschlagen von Wörtern in Wörterbüchern kann die Abfrage jetzt " "bearbeitet werden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Neue Tastenkombination für die Anzeige von Metadaten (Strg + I) und " "Einstellungen (Strg + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "Traditionelle Menüleiste für Nicht-GTK-Arbeitsumgebungen hinzugefügt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3547,78 +3547,78 @@ "Option zur Verwendung einer traditionellen Titelleiste und Menüleiste " "anstelle einer Kopfleiste (experimentell)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lesen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Layout für kontinuierlichen Bildlauf" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Möglichkeit, dekorative Schatten zu zeigen, die das Aussehen eines echten " "Buches imitieren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Möglichkeit zum Vergrößern und Verkleinern" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Verbesserter Bildbetrachter mit \"Speichern unter\"-Option" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Kopien eines Buches in neuen Fenstern öffnen (Strg + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Buch neu laden (Strg + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Neue integrierte Themen: Grau, Solarisiert, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Textauswahl:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Möglichkeit zur seitenübergreifenden Textauswahl" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Ausgewählten Text im Buch finden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Ausgewählten Text oder von der ausgewählten Stelle vorlesen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Anmerkungen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Rechtschreibprüfung in Anmerkungen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Anmerkungen zu Markierung exportieren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Optionen zur Verwendung benutzerdefinierter Farben für Hervorhebungen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Für Verleger und Entwickler:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3626,200 +3626,200 @@ "Unterstützung für Apple Books Themen, das es Büchern ermöglicht, Themen ohne " "JavaScript zu erkennen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "WebKit's Entwickler-Tools können aktiviert werden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Umfangreiche Anpassungen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Die Einstellungsschemata wurden neu organisiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Das Format für benutzerdefinierte Themen hat sich geändert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Lokationen sind jetzt 1024 Zeichen lang" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Fehlerkorrekturen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "" "Korrigiert, dass die exakte letzte Position nicht wiederhergestellt wurde" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "Ein Problem mit der Navigation mit Bildlauffunktion wurde behoben." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Feste Schriftgröße ändert sich nicht, wenn das Buch Schlüsselwörter in " "absoluter Größe verwendet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Text am Rand abgeschnitten behoben" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Behoben, dass Bücher mit \"#\" oder \"?\" im Dateinamen nicht geöffnet " "werden können." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Behoben: Flatpak-Version kann .mobi-, .azw- und .azw3-Dateien nicht öffnen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Verbesserte Wiktionary-Suche, jetzt mit Links und Beispielsätzen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Verbesserte Extrahierung und Formatierung von Popover-Fußnoten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Option zum Exportieren von Anmerkungen nach BibTeX hinzugefügt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" "Behoben: Navigation im Inhaltsverzeichnis funktioniert bei einigen Büchern " "nicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Behoben: Bilder können in Kindle-Büchern nicht gezoomt werden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" "Behoben: Bücher mit der Dateiendung .epub3 können nicht geöffnet werden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Behoben: temporäres Verzeichnis wird nach dem Schließen nicht gelöscht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 #, fuzzy msgid "Fixed F9 shortcut not working" msgstr "Behoben: F9 Shortcut funktioniert nicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Aktualisierte Übersetzungen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Externe Quellen und JavaScript sind jetzt standardmäßig blockiert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Grundlegende Text-zu-Sprach-Unterstützung" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Export von Anmerkungen in HTML, einfachen Text oder JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Unterstützung für die Anzeige von .mobi-, .azw- und .azw3-Dateien" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Neues, alternatives Layout mit Seitenleiste" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Nachschlagen von Wörtern in Wikipedia und Offline-Wörterbüchern" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Übersetzen von Passagen mit Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Festlegen einer Standardaktion für die Wortauswahl" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Experimentelles Dropdown-Fenster für Fußnoten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Möglichkeit, nur innerhalb des aktuellen Kapitels zu suchen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "" "Ein Problem mit hohem CPU-Verbrauch bei der Ausführung im Hintergrund wurde " "behoben" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Problem mit Markierungen an den falschen Stellen gelöst" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Programmabstürze beim Öffnen von Dateien wurde behoben" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Seitenränder und Helligkeit anpassen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" "Passen Sie die Themenfarben an oder fügen Sie Ihre eigenen Themen hinzu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Möglichkeit, Bilder zu zoomen und zu kopieren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Option zum automatischen Ausblenden des Cursors" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Die verbleibende Lesezeit anzeigen, indem Sie über den Schieberegler für den " "Lesefortschritt fahren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Behoben: einige Bücher werden manchmal nicht angezeigt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Behoben: Bilder sind in einigen Fällen zu breit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Möglichkeit, zwischen linkem und vollem Blocksatz zu wechseln" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Neue Layout-Option: einspaltige Seitenansicht" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Behoben:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3827,13 +3827,13 @@ "Generierte Speicherorte werden jetzt im Cache-Ordner anstelle von " "localStorage gespeichert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" "DErlaubt die Anpassung der Schriftgröße bei der Verwendung von " "Verlagsschriften" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3841,41 +3841,41 @@ "Lesefortschritts-Schieberegler erscheint nicht, nachdem die localStorage-" "Quota überschritten wurde" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Touchpad-Gesten und die Möglichkeit, durch Seiten zu blättern" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Option zum Ausblenden des Lesefortschrittsbalkens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Option zum deaktivieren des Wörterbuchs" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Option zur Verwendung der Verlagsschriftart" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" "Das Wiederherstellen des Lesefortschritts ist jetzt reibungslos und " "ruckelfrei" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Benutzerdefinierte Stile werden jetzt immer angewendet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "ungültige AppData-Datei" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Erste Veröffentlichung" diff -Nru foliate-2.6.3ubuntu1/po/es.po foliate-2.6.4/po/es.po --- foliate-2.6.3ubuntu1/po/es.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/es.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2021-02-05 13:08+0100\n" "Last-Translator: micrococo\n" "Language-Team: \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -365,7 +365,7 @@ "micrococo\n" "Óscar Fernández Díaz" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Un visor sencillo y moderno de libros electrónicos" @@ -859,7 +859,7 @@ msgstr "Seleccione algún texto para añadir notas." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Notas" @@ -1171,7 +1171,7 @@ msgstr "Justificación completa" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "División silábica automática" @@ -1420,7 +1420,7 @@ msgstr "Traducir" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Buscar en el libro" @@ -3022,296 +3022,296 @@ msgid "Writer of supplementary textual content" msgstr "Escritor de contenido textual complementario" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate es un visor GTK de libros electrónicos sencillo y moderno..." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Funcionalidades incluidas:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Vista a doble página con desplazamiento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Personalizar fuente y espaciado de líneas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Modos claro, sepia, oscuro y en negativo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Barra de progreso de lectura con marcas de capítulo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Marcadores y notas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Búsqueda rápida en el diccionario" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Cambios:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Corregido la no aplicación de estilos personalizados en algunos casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Corregido el que no funcionase el atajo de teclado F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Corregido que algunos libros no se muestran a veces" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "Mejora de la compatibilidad con las pantallas táctiles" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "Ahora se puede recordar las credenciales del OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "Varias correcciones para GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "Corregidos los enlaces internos de Wiktionary" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "Se han añadido traducciones al euskera, al coreano y al noruego" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Se ha corregido la imposibilidad de abrir algunos archivos EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Se ha corregido la imposibilidad de abrir archivos Mobipocket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Mejora de visualización de los metadatos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Mejora de la representación de FictionBook" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" "Mejora de la interfaz de usuario para la adquisición de libros en el OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Corregida la extracción del identificador único para los archivos EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Corregido el icono de la ventana que faltaba" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" "Corregido que las variables de entorno de TTS no se establecen cuando se " "utiliza Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" "Corregido que la voz eSpeak NG no se selecciona al probar la configuración " "TTS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Corregido el atributo “__ibooks_internal_theme” erróneo cuando se habilita " "“Invert”" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Catálogos OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Los catálogos se abren ahora en la ventana principal de la biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Ver la posición actual" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Ir a la página de inicio del catálogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Recargar el catálogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Añadir la fuente actual a los catálogos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "Soporte para autenticación HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Otros cambios:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Corregida la extracción del identificador único de archivos FictionBook (." "fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Corregido el que se ignorasen los saltos de línea al copiar texto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" "«Pasar página al dar toques» está ahora deshabilitado en diseños no paginados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" "Abrir un libro desde la vista de la biblioteca cierra ahora la ventana de la " "biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "El idioma y las fechas de publicación en los metadatos son procesados y " "formateados ahora" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Exportar notas desde la vista de la biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" "Corregido el aspecto borroso de las portadas de libros en pantallas de alta " "definición" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" "Corregidos los enlaces a OPDS hacia «Standard Ebooks» y «Project Gutenberg»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Corregido el icono de vista incorrecto al inicio" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Biblioteca:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" "Vista de la biblioteca que muestra libros recientes y el progreso de lectura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Buscar libros por metadatos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "Descubrimiento de libros electrónicos con OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nuevos formatos admitidos:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Archivos de cómic (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Texto sin formato (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Archivos EPUB descomprimidos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Diseño:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Opción para fijar la anchura máxima de página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3319,11 +3319,11 @@ "El diseño «Automático» no muestra cuatro columnas cuando el ancho de página " "es muy grande" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Visor de imágenes:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3331,7 +3331,7 @@ "Mejorado el visor de imágenes, con nuevos atajos de teclado y la capacidad " "de rotar e invertir imágenes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3339,38 +3339,38 @@ "Opción para deshabilitar el visor de imágenes, o para abrir imágenes al " "hacer doble, clic o haciendo clic con el botón central o derecho" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Texto a voz:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Mejorada la interfaz de la configuración de texto a voz" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" "Capacidad para establecer la voz del texto a voz en base al idioma del libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importar notas desde JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Buscar en notas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Las notas están ordenadas ahora en el mismo orden en el que aparecen en el " "libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Seguridad:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3378,44 +3378,44 @@ "«Permitir contenido inseguro» solo habilita ahora JavaScript; el contenido " "externo ya no se carga" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "Los procesos de WebKit están ahora confinados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Otras funcionalidades y correcciones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" "Mejor soporte para libros verticales y con escritura de derecha a izquierda" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Soporte para diccionarios de «StarDict»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" "Corregido el que no se preservara la posición actual al cambiar el tamaño" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" "Corregida la ocultación automática de la barra de cabecera con algunos temas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Opciones de la línea de órdenes para mostrar la versión y añadir libros a la " "biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Opción para borrar o deshabilitar la caché" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3423,67 +3423,67 @@ "Cuando una página HTML contiene etiquetas de anclas autocerradas no válidas, " "se procesa ahora como XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Correcciones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Corregido el número de versión incorrecto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Corregido que no funcionaran diccionarios, traducciones y Wikipedia en el " "paquete Snap" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nuevas funcionalidades:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Icono nuevo y mejorado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Opción para deshabilitar el paso de página al dar toques" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Un menú en la pantalla de bienvenida para abrir archivos recientes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" "Se han restaurado los atajos de teclado para mostrar la tabla de contenidos, " "notas y marcadores" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Corregido el que no apareciera traducida la aplicación" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Interfaz:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Una interfaz rediseñada que funciona mejor en pantallas pequeñas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" "Mejorado el modo de pantalla completa con una barra de cabecera superpuesta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3491,7 +3491,7 @@ "La barra de cabecera y la de progreso se ocultan automáticamente ahora, para " "tener una experiencia de lectura sin distracciones" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3499,7 +3499,7 @@ "Se pueden mostrar varias fuentes de información, además de un reloj, en el " "pie de página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3507,7 +3507,7 @@ "Un nuevo elemento gráfico emergente (Ctrl + L) que muestra el tiempo de " "lectura estimado y permite saltar a posiciones" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3518,23 +3518,23 @@ "vista; toque en la parte central para conmutar la barra de cabecera y la de " "progreso" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "Notas, marcadores y resultados de búsqueda muestran ahora los títulos de " "capítulos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "Al buscar palabras en diccionarios, la consulta se puede editar ahora" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Nuevo atajo de teclado para ver metadatos (Ctrl + I) y preferencias (Ctrl " "+ ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" @@ -3542,7 +3542,7 @@ "Un nuevo menú tradicional, que puede mostrarse dependiendo del entorno de " "escritorio" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3550,78 +3550,78 @@ "Opción para usar la barra de títulos y de menús tradicionales en vez de una " "barra de cabecera (experimental)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lectura:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Diseño de desplazamiento continuo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Opción para mostrar sombras decorativas que imitan la apariencia de un libro " "real" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Capacidad para ampliar y reducir el zum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Mejorado el visor de imágenes con una opción «guardar como»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Abrir copias de un libro en ventanas nuevas (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Recargar libros (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nuevos temas integrados: Gray, Solarizado, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Selección de texto:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Capacidad para seleccionar texto entre páginas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Buscar texto seleccionado en el libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Leer en voz alta texto seleccionado o desde la posición seleccionada" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Notas:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Corrección ortográfica de notas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Exportar notas en Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Opciones para usar colores personalizados para resaltes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Para editores y desarrolladores:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3629,200 +3629,200 @@ "Soporte para el atributo de tema de «Apple Books», que permite que los " "libros detecten temas sin JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "Se pueden habilitar las herramientas de desarrollador de WebKit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Cambios no compatibles hacia atrás:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Los esquemas de configuraciones han sido reorganizados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "El formato para temas personalizados ha cambiado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Las posiciones tienen ahora 1024 caracteres de tamaño" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Correcciones de errores:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Corregido el que no se restaurase la última posición exacta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" "Corregido el que la navegación no funcionara con el diseño con desplazamiento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Corregido el que no cambiase el tamaño de la fuente cuando el libro usa " "palabras clave de tamaños absolutos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Corregido el texto cortado en el borde del margen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Corregido el no poder abrir libros con «#» o «?» en el nombre de archivo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Corregido el que la versión Flatpak no pudiera abrir archivos .mobi, .azw y ." "azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "Mejorada la búsqueda en Wikcionario, ahora con enlaces y frases de ejemplo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "" "Mejorada la extracción y el formato del elemento gráfico emergente para las " "notas a pie de página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Añadida una opción para exportar notas en BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" "Corregido el que la tabla de contenidos no funcionara con algunos libros" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Corregido el no poder hacer zum a imágenes con libros de Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Corregido el no poder abrir libros con extensión de archivo .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Corregido el que no se borrase el directorio temporal al cerrar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Corregido el que no funcionase el atajo de teclado F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Traducciones actualizadas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Recursos externos y JavaScript son bloqueados ahora por defecto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Soporte básico para texto a voz" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Exportar notas a HTML, texto sin formato o JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Soporte para ver archivos .mobi, .azw y .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nuevo interfaz alternativa del panel lateral" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Buscar palabras en Wikipedia y diccionarios sin conexión" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Traducir pasajes con Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Configurar la acción por defecto al seleccionar palabras" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "" "Soporte experimental para elemento gráfico emergente para notas a pie de " "página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Capacidad para buscar solo en el capítulo actual" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Corregidos los picos de CPU cuando se deja abierto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Corregido que los resaltes no se mostrasen en las posiciones correctas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Corregido el cierre de la aplicación al abrir archivos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Personalizar los márgenes de página y el brillo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" "Modificar los colores del tema o añadir sus propios temas personalizados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Capacidad para hacer zum de imágenes y copiarlas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Opción para ocultar el cursor automáticamente" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Ver el tiempo de lectura restante al pasar sobre el deslizador de progreso " "de lectura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Corregido que algunos libros no se muestran a veces" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Corregido que las imágenes sean demasiado anchas en algunos casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Opción para cambiar entre alineado a la izquierda o justificado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nueva opción de diseño: vista paginada de una sola columna" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Corregido:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3830,12 +3830,12 @@ "Las ubicaciones generadas se almacenan ahora en el directorio de la caché en " "lugar de en «localStorage»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" "Permitir el ajuste del tamaño de la fuente al usar las fuentes del editor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3843,39 +3843,39 @@ "Corregido la no aparición del deslizador de progreso después de exceder la " "cuota localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gestos del panel táctil y capacidad de desplazamiento entre páginas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Modo pantalla completa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Opción para ocultar la barra de progreso de lectura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Opción para deshabilitar el diccionario" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Opción para usar la fuente del editor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Restaurar el progreso de lectura ahora es fácil y sin sacudidas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Corregido la no aplicación de estilos personalizados en algunos casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Corregido fichero AppData inválido" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Versión inicial" diff -Nru foliate-2.6.3ubuntu1/po/eu.po foliate-2.6.4/po/eu.po --- foliate-2.6.3ubuntu1/po/eu.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/eu.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-08-30 16:03+0200\n" "Last-Translator: micrococo\n" "Language-Team: \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -363,7 +363,7 @@ "Blanc Chan\n" "micrococo" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Liburu elektronikoen ikustaile sinple eta modernoa" @@ -856,7 +856,7 @@ msgstr "Hautatu testuren bat oharrak gehitu ahal izateko." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Oharrak" @@ -1168,7 +1168,7 @@ msgstr "Justifikazio osoa" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Hitzen zatiketa automatikoa" @@ -1417,7 +1417,7 @@ msgstr "Itzulpena" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Bilatu liburuan" @@ -3024,291 +3024,291 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate GTK liburu elektronikoen ikustaile sinplea eta modernoa..." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Utilitateak:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Orri bikoitzeko ikuspegia eta korritzeko ikuspegia" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Pertsonalizatu letra mota eta lerroartea" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Itxura argia, sepia, iluna eta negatiboa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Irakurketaren aurrerapen barra kapitulu markekin" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Laster-markak eta oharrak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Hiztegiko bilaketa azkarra" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Aldaketak:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Corregido la no aplicación de estilos personalizados en algunos casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Corregido el que no funcionase el atajo de teclado F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Corregido que algunos libros no se muestran a veces" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 #, fuzzy msgid "Improved support for touch screens" msgstr "" "Mejor soporte para libros verticales y con escritura de derecha a izquierda" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Zuzendu da EPUB batzuk irekitzeko ezintasuna" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Zuzendu da Mobipocket fitxategiak irekitzeko ezintasuna" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Metadatuen bistaratzea hobetu da" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "FictionBook errendatzea hobetu da" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "OPDStik liburuak eskuratzeko interfazea hobetu da" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Zuzendu da EPUB fitxategien identifikatzaile bakarraren erauzketa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Zuzendu da leihoen ikonoen falta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS katalogoak:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Los catálogos se abren ahora en la ventana principal de la biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Ver la posición actual" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Ir a la página de inicio del catálogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Recargar el catálogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Añadir la fuente actual a los catálogos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "Soporte para autenticación HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Otros cambios:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Corregida la extracción del identificador único de archivos FictionBook (." "fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Corregido el que se ignorasen los saltos de línea al copiar texto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" "«Pasar página al dar toques» está ahora deshabilitado en diseños no paginados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" "Abrir un libro desde la vista de la biblioteca cierra ahora la ventana de la " "biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "El idioma y las fechas de publicación en los metadatos son procesados y " "formateados ahora" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Exportar notas desde la vista de la biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" "Corregido el aspecto borroso de las portadas de libros en pantallas de alta " "definición" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" "Corregidos los enlaces a OPDS hacia «Standard Ebooks» y «Project Gutenberg»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Corregido el icono de vista incorrecto al inicio" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Biblioteca:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" "Vista de la biblioteca que muestra libros recientes y el progreso de lectura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Buscar libros por metadatos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "Descubrimiento de libros electrónicos con OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nuevos formatos admitidos:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Archivos de cómic (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Texto sin formato (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Archivos EPUB descomprimidos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Diseño:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Opción para fijar la anchura máxima de página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3316,11 +3316,11 @@ "El diseño «Automático» no muestra cuatro columnas cuando el ancho de página " "es muy grande" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Visor de imágenes:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3328,7 +3328,7 @@ "Mejorado el visor de imágenes, con nuevos atajos de teclado y la capacidad " "de rotar e invertir imágenes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3336,38 +3336,38 @@ "Opción para deshabilitar el visor de imágenes, o para abrir imágenes al " "hacer doble, clic o haciendo clic con el botón central o derecho" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Texto a voz:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Mejorada la interfaz de la configuración de texto a voz" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" "Capacidad para establecer la voz del texto a voz en base al idioma del libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importar notas desde JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Buscar en notas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Las notas están ordenadas ahora en el mismo orden en el que aparecen en el " "libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Seguridad:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3375,44 +3375,44 @@ "«Permitir contenido inseguro» solo habilita ahora JavaScript; el contenido " "externo ya no se carga" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "Los procesos de WebKit están ahora confinados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Otras funcionalidades y correcciones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" "Mejor soporte para libros verticales y con escritura de derecha a izquierda" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Soporte para diccionarios de «StarDict»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" "Corregido el que no se preservara la posición actual al cambiar el tamaño" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" "Corregida la ocultación automática de la barra de cabecera con algunos temas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Opciones de la línea de órdenes para mostrar la versión y añadir libros a la " "biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Opción para borrar o deshabilitar la caché" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3420,67 +3420,67 @@ "Cuando una página HTML contiene etiquetas de anclas autocerradas no válidas, " "se procesa ahora como XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Correcciones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Corregido el número de versión incorrecto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Corregido que no funcionaran diccionarios, traducciones y Wikipedia en el " "paquete Snap" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nuevas funcionalidades:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Icono nuevo y mejorado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Opción para deshabilitar el paso de página al dar toques" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Un menú en la pantalla de bienvenida para abrir archivos recientes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" "Se han restaurado los atajos de teclado para mostrar la tabla de contenidos, " "notas y marcadores" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Corregido el que no apareciera traducida la aplicación" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Interfaz:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Una interfaz rediseñada que funciona mejor en pantallas pequeñas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" "Mejorado el modo de pantalla completa con una barra de cabecera superpuesta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3488,7 +3488,7 @@ "La barra de cabecera y la de progreso se ocultan automáticamente ahora, para " "tener una experiencia de lectura sin distracciones" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3496,7 +3496,7 @@ "Se pueden mostrar varias fuentes de información, además de un reloj, en el " "pie de página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3504,7 +3504,7 @@ "Un nuevo elemento gráfico emergente (Ctrl + L) que muestra el tiempo de " "lectura estimado y permite saltar a posiciones" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3515,23 +3515,23 @@ "vista; toque en la parte central para conmutar la barra de cabecera y la de " "progreso" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "Notas, marcadores y resultados de búsqueda muestran ahora los títulos de " "capítulos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "Al buscar palabras en diccionarios, la consulta se puede editar ahora" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Nuevo atajo de teclado para ver metadatos (Ctrl + I) y preferencias (Ctrl " "+ ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" @@ -3539,7 +3539,7 @@ "Un nuevo menú tradicional, que puede mostrarse dependiendo del entorno de " "escritorio" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3547,78 +3547,78 @@ "Opción para usar la barra de títulos y de menús tradicionales en vez de una " "barra de cabecera (experimental)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lectura:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Diseño de desplazamiento continuo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Opción para mostrar sombras decorativas que imitan la apariencia de un libro " "real" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Capacidad para ampliar y reducir el zum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Mejorado el visor de imágenes con una opción «guardar como»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Abrir copias de un libro en ventanas nuevas (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Recargar libros (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nuevos temas integrados: Gray, Solarizado, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Selección de texto:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Capacidad para seleccionar texto entre páginas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Buscar texto seleccionado en el libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Leer en voz alta texto seleccionado o desde la posición seleccionada" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Notas:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Corrección ortográfica de notas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Exportar notas en Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Opciones para usar colores personalizados para resaltes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Para editores y desarrolladores:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3626,200 +3626,200 @@ "Soporte para el atributo de tema de «Apple Books», que permite que los " "libros detecten temas sin JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "Se pueden habilitar las herramientas de desarrollador de WebKit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Cambios no compatibles hacia atrás:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Los esquemas de configuraciones han sido reorganizados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "El formato para temas personalizados ha cambiado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Las posiciones tienen ahora 1024 caracteres de tamaño" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Correcciones de errores:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Corregido el que no se restaurase la última posición exacta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" "Corregido el que la navegación no funcionara con el diseño con desplazamiento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Corregido el que no cambiase el tamaño de la fuente cuando el libro usa " "palabras clave de tamaños absolutos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Corregido el texto cortado en el borde del margen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Corregido el no poder abrir libros con «#» o «?» en el nombre de archivo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Corregido el que la versión Flatpak no pudiera abrir archivos .mobi, .azw y ." "azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "Mejorada la búsqueda en Wikcionario, ahora con enlaces y frases de ejemplo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "" "Mejorada la extracción y el formato del elemento gráfico emergente para las " "notas a pie de página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Añadida una opción para exportar notas en BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" "Corregido el que la tabla de contenidos no funcionara con algunos libros" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Corregido el no poder hacer zum a imágenes con libros de Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Corregido el no poder abrir libros con extensión de archivo .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Corregido el que no se borrase el directorio temporal al cerrar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Corregido el que no funcionase el atajo de teclado F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Traducciones actualizadas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Recursos externos y JavaScript son bloqueados ahora por defecto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Soporte básico para texto a voz" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Exportar notas a HTML, texto sin formato o JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Soporte para ver archivos .mobi, .azw y .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nuevo interfaz alternativa del panel lateral" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Buscar palabras en Wikipedia y diccionarios sin conexión" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Traducir pasajes con Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Configurar la acción por defecto al seleccionar palabras" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "" "Soporte experimental para elemento gráfico emergente para notas a pie de " "página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Capacidad para buscar solo en el capítulo actual" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Corregidos los picos de CPU cuando se deja abierto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Corregido que los resaltes no se mostrasen en las posiciones correctas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Corregido el cierre de la aplicación al abrir archivos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Personalizar los márgenes de página y el brillo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" "Modificar los colores del tema o añadir sus propios temas personalizados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Capacidad para hacer zum de imágenes y copiarlas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Opción para ocultar el cursor automáticamente" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Ver el tiempo de lectura restante al pasar sobre el deslizador de progreso " "de lectura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Corregido que algunos libros no se muestran a veces" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Corregido que las imágenes sean demasiado anchas en algunos casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Opción para cambiar entre alineado a la izquierda o justificado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nueva opción de diseño: vista paginada de una sola columna" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Corregido:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3827,12 +3827,12 @@ "Las ubicaciones generadas se almacenan ahora en el directorio de la caché en " "lugar de en «localStorage»" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" "Permitir el ajuste del tamaño de la fuente al usar las fuentes del editor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3840,39 +3840,39 @@ "Corregido la no aparición del deslizador de progreso después de exceder la " "cuota localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gestos del panel táctil y capacidad de desplazamiento entre páginas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Modo pantalla completa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Opción para ocultar la barra de progreso de lectura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Opción para deshabilitar el diccionario" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Opción para usar la fuente del editor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Restaurar el progreso de lectura ahora es fácil y sin sacudidas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Corregido la no aplicación de estilos personalizados en algunos casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Corregido fichero AppData inválido" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Versión inicial" diff -Nru foliate-2.6.3ubuntu1/po/fr.po foliate-2.6.4/po/fr.po --- foliate-2.6.3ubuntu1/po/fr.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/fr.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-05-09 19:00+0900\n" "Last-Translator: Julien Humbert \n" "Language-Team: français \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -361,7 +361,7 @@ msgid "translator-credits" msgstr "Julien Humbert " -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Un lecteur de livres électroniques simple et moderne" @@ -857,7 +857,7 @@ msgstr "Sélectionnez du texte pour ajouter une annotation." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Annotations" @@ -1171,7 +1171,7 @@ msgstr "Justifié" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Césure automatique" @@ -1420,7 +1420,7 @@ msgstr "Traduire" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Rechercher dans le livre" @@ -3020,447 +3020,447 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate est un lecteur de livres électroniques GTK simple et moderne." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Fonctionnalités incluses :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Vue double page et vue défilante" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Personnalisation de la police et de l’interligne" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Modes clair, sépia, sombre et inversé" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Barre de progression de lecture avec marques des chapitres" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Marque-pages et annotations" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Consultation rapide du dictionnaire" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Modifications :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "" "Correction des styles personnalisés qui n’étaient pas appliqués dans " "certains cas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Correction pour le raccourci F9 qui ne fonctionnait pas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "" "Correction pour certains livres qui pouvaient parfois ne pas s’afficher" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Correction pour l’impossibilité d’ouvrir certains fichiers EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Correction pour l’impossibilité d’ouvrir certains fichiers Mobipocket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 #, fuzzy msgid "Fixed unique identifier extraction for EPUB files" msgstr "Correction pour l’impossibilité d’ouvrir certains fichiers EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Catalogues OPDS :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Voir la position actuelle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 #, fuzzy msgid "Go to catalog start page" msgstr "Aller à la position" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Recharger le catalogue" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Ajouter le flux actuel aux catalogues" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 #, fuzzy msgid "HTTP authentication support" msgstr "Authentification requise" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Autres modifications :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 #, fuzzy msgid "Export annotations from the library view" msgstr "Export des annotations en Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 #, fuzzy msgid "Fixed wrong view icon on startup" msgstr "Correction du mauvais numéro de version" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Bibliothèque :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nouveaux formats pris en charge :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Comic book archive (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Texte brut (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Fichiers EPUB non empaquetés" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Mise en page :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 #, fuzzy msgid "Option to set maximum page width" msgstr "Largeur maximum de la page" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 #, fuzzy msgid "Image viewer:" msgstr "Raccourcis clavier du visionneur d’images" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Synthèse vocale :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importer les annotations depuis un fichier JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Rechercher dans les annotations" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 #, fuzzy msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Les positions générées sont désormais enregistrées dans le dossier de cache " "plutôt que dans le localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Sécurité :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 #, fuzzy msgid "Option to clear or disable cache" msgstr "Option pour désactiver le dictionnaire" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Corrections :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Correction du mauvais numéro de version" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Correction des malfonctions du dictionnaire, de la traduction et de " "Wikipédia dans le paquet Snap" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nouvelles fonctionnalités :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Nouvelle icône améliorée" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Option pour désactiver le changement de page en appuyant" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Un menu sur la page d’accueil pour l’ouverture des fichiers récents" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" "Restauration des raccourcis clavier pour afficher la table des matières, les " "annotations et les marque-pages" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Correction pour l’application non traduite" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Interface :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" "Une interface redesignée pour une meilleure utilisabilité sur les écrans de " "petite taille" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Mode plein écran amélioré avec une barre d’entête" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3468,7 +3468,7 @@ "Les barres d’entête et de progression se masquent automatiquement pour une " "expérience de lecture sans distraction" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3476,7 +3476,7 @@ "Différentes informations de position, ainsi qu’une horloge, peuvent " "désormais être affichées dans le pied de page" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3484,7 +3484,7 @@ "Une nouvelle fenêtre contextuelle de position (Ctrl + L) affichant le temps " "de lecture estimé et permettant de sauter à certaines positions" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3494,25 +3494,25 @@ "suivantes ou précédentes en appuyant sur la partie droite ou gauche des " "pages ; appuyez au milieu pour afficher les barres d’entête et de progression" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "Les annotations, marque-pages et les résultats de recherche affichent " "désormais le titre du chapitre" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" "Lors de la recherche d’un mot dans le dictionnaire, la recherche peut " "maintenant être modifiée" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Nouveau raccourci clavier pour accéder aux métadonnées (Ctrl + I) et aux " "préférences (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" @@ -3520,7 +3520,7 @@ "Une barre de menu traditionnelle, qui peut être affichée en fonction de " "l’environnement de bureau" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3528,79 +3528,79 @@ "Option pour utiliser une barre de titre et une barre de menu traditionnelle " "en lieu et place de la barre d’entête (expérimental)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lecture :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Mise en page en défilement continu" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Option pour afficher des ombres décoratives imitant l’apparence d’un vrai " "livre" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Possibilité de zoomer et de dézoomer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Visionneur d’image amélioré avec une option « enregistrer sous »" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Ouvrir des copies du livre dans de nouvelles fenêtres (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Recharger le livre (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nouveaux thèmes intégrés : Gris, Solarisé, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Sélection de texte :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Possibilité de sélectionner du texte sur différentes pages" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Rechercher le texte sélectionné dans le livre" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Lecture du texte sélectionné ou depuis la position sélectionnée" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Annotations :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Vérification de l’orthographe pour les notes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Export des annotations en Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "" "Option pour utiliser des couleurs personnalisées pour les surlignements" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Pour les éditeurs et développeurs :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3608,207 +3608,207 @@ "Compatibilité avec les attributs de thème des Apple Book permettant aux " "livres de détecter les thèmes sans utiliser JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "Les outils de développement Webkit peuvent maintenant être activés" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Modifications importantes :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Les schémas de configuration ont été réorganisés" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Le format pour les thèmes personnalisés a été modifié" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Les positions sont maintenant constituées de 1 024 caractères" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Bogues corrigés :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Correction pour les restaurations de position incorrectes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" "Correction pour la navigation ne fonctionnant pas avec la mise en page " "scrollée" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Correction la taille des polices ne changeant pas lorsque le livre utilise " "les mots-clés de taille absolue" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Correction pour le texte coupé aux abords des marges" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Correction pour l’impossibilité d’ouvrir les livres ayant des « # » ou « ? » " "dans leurs noms de fichier" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Correction pour la version Flatpak qui n’était pas capable d’afficher les " "fichiers .mobi, .azw et .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "Amélioration de la recherche sur le Wiktionnaire, affichage des liens et de " "phrases d’exemple" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "" "Amélioration de la fenêtre contextuelle d’extraction et de formatage des " "notes de bas de page" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Ajout d’une option pour exporter les annotations au format BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" "Correction pour la table des matières ne fonctionnant pas avec certains " "livres" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Correction pour les images non zoomables avec les livres Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" "Correction pour l’impossibilité d’ouvrir les livres avec l’extension .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" "Correction pour les fichiers temporaires non supprimés après la fermeture" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Correction pour le raccourci F9 qui ne fonctionnait pas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Mise à jour des traductions" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "" "Les ressources externes et les scripts JavaScript sont désormais bloqués par " "défaut" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Support basique des synthèses vocales" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Exporter les annotations au format HTML, texte brut ou JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Ajout de la possibilité de visionner les fichiers .mobi, .azw et .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nouvelle interface avec barre latérale" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Rechercher des mots sur Wikipédia et dans des dictionnaires hors-ligne" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Traduire des passages avec Google Traduction" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Configurer les actions par défaut lorsque des mots sont sélectionnés" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "" "Support expérimental de fenêtres flottantes pour les notes de bas de page" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Possibilité de rechercher uniquement dans le chapitre courant" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Correction des pics CPU lorsque laissé ouvert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Correction des surlignages ne s’affichant pas à la position correcte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Correction de crashs lors de l’ouverture de fichiers" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Personnalisation des marges et de la luminosité" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Modification des couleurs des thèmes et ajout de thèmes personnalisés" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Possibilité de zoomer et de copier les images" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Option pour masquer automatiquement le curseur" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Voir le temps de lecture restant en survolant la barre de progression de " "lecture" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "" "Correction pour certains livres qui pouvaient parfois ne pas s’afficher" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Correction pour les images pouvant être trop larges dans certains cas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Option pour basculer entre texte aligné à gauche et texte justifié" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nouvelle option de mise en page : vue paginée en colonne simple" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Corrigé :" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3816,13 +3816,13 @@ "Les positions générées sont désormais enregistrées dans le dossier de cache " "plutôt que dans le localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" "Possibilité d’ajuster la taille de la police lors de l’utilisation des " "polices d’écritures de l’éditeur" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3830,42 +3830,42 @@ "Correction pour la barre de progression de lecture n’apparaissant pas lors " "du dépassement du quota du localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gestes au pavé tactile et possibilité de faire défiler les pages" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Mode plein écran" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Option pour masquer la barre de progression de lecture" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Option pour désactiver le dictionnaire" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Option pour utiliser la police d’écriture de l’éditeur" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" "Restauration de la progression de la lecture est désormais totalement fluide" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "" "Correction des styles personnalisés qui n’étaient pas appliqués dans " "certains cas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Correction du fichier AppData invalide" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Publication initiale" diff -Nru foliate-2.6.3ubuntu1/po/id.po foliate-2.6.4/po/id.po --- foliate-2.6.3ubuntu1/po/id.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/id.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2019-06-14 21:02+0700\n" "Last-Translator: \n" "Language-Team: \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -385,7 +385,7 @@ msgid "translator-credits" msgstr "" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Pembaca eBook yang sederhana dan modern" @@ -903,7 +903,7 @@ msgstr "Sorot teks untuk memberi anotasi." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Anotasi" @@ -1233,7 +1233,7 @@ msgstr "Rata Kanan-Kiri" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Tanda hubung otomatis" @@ -1513,7 +1513,7 @@ msgstr "Terjemahkan" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Temukan dalam buku" @@ -3161,818 +3161,818 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate adalah pembuka eBook yang sederhana dan modern." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Fitur termasuk:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Pemirsa dua halaman dan pemirsa gulir" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Kustom fonta dan jarak baris" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Mode terang, sepia, gelap, dan inversi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Slider progres baca dengan tanda bab" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Penanda buku dan anotasi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Pencarian kamus cepat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 #, fuzzy msgid "Changes:" msgstr "Oranye" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Perbaikan gaya kustom tidak terterapkan pada beberapa kasus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Perbaikan jalan pintas F9 tidak bekerja" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Perbaikan beberapa buku terkadang tidak terender" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 #, fuzzy msgid "Fixed unable to open some EPUB files" msgstr "Perbaikan tidak dapat membuka buku dengan ekstensi berkas .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 #, fuzzy msgid "Fixed unable to open Mobipocket files" msgstr "Perbaikan tidak dapat membuka buku dengan ekstensi berkas .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 #, fuzzy msgid "Fixed unique identifier extraction for EPUB files" msgstr "Perbaikan tidak dapat membuka buku dengan ekstensi berkas .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 #, fuzzy msgid "OPDS catalogs:" msgstr "Bahasa Katala" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 #, fuzzy msgid "View current location" msgstr "Bersihkan Lokasi Kini" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 #, fuzzy msgid "Go to catalog start page" msgstr "Kembali ke lokasi sebelumnya" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 #, fuzzy msgid "Reload catalog" msgstr "Bahasa Katala" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 #, fuzzy msgid "Other changes:" msgstr "Oranye" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 #, fuzzy msgid "Export annotations from the library view" msgstr "Anotasi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 #, fuzzy msgid "New supported formats:" msgstr "Pilih format ekspor:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 #, fuzzy msgid "Plain text (.txt)" msgstr "Teks Biasa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 #, fuzzy msgid "Layout:" msgstr "Tata letak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 #, fuzzy msgid "Option to set maximum page width" msgstr "Opsi untuk menonaktifkan kamus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 #, fuzzy msgid "Image viewer:" msgstr "Pintasan Keyboard" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 #, fuzzy msgid "Text-to-speech:" msgstr "Text-to-speech" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 #, fuzzy msgid "Import annotations from JSON" msgstr "Anotasi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 #, fuzzy msgid "Search in annotations" msgstr "Tampilkan anotasi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 #, fuzzy msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Lokasi yang dibuat kini disimpan di direktori cache alih-alih di localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 #, fuzzy msgid "Option to clear or disable cache" msgstr "Opsi untuk menonaktifkan kamus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Perbaikan:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Fitur-fitur baru:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 #, fuzzy msgid "Option to disable turn page on tap" msgstr "Opsi untuk menonaktifkan kamus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 #, fuzzy msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" "Gunakan sidebar untuk menampilkan daftar isi, anotasi, dan penanda buku." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " "progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 #, fuzzy msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "Gunakan sidebar (membutuhkan restart)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 #, fuzzy msgid "Reading:" msgstr "Lanjutkan Membaca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 #, fuzzy msgid "Continuous scrolling layout" msgstr "Gulir Berlanjut (membutuhkan restart)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 #, fuzzy msgid "Ability to zoom in and zoom out" msgstr "Kemampuan untuk memperbesar dan menyalin gambar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 #, fuzzy msgid "Text selection:" msgstr "Text-to-speech" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 #, fuzzy msgid "Ability to select text across pages" msgstr "Kemampuan untuk memperbesar dan menyalin gambar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 #, fuzzy msgid "Find selected text in book" msgstr "Temukan dalam buku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 #, fuzzy msgid "Annotations:" msgstr "Anotasi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 #, fuzzy msgid "Export annotations to Markdown" msgstr "Anotasi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 #, fuzzy msgid "Breaking changes:" msgstr "Oranye" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 #, fuzzy msgid "Bug fixes:" msgstr "Perbaikan:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 #, fuzzy msgid "Fixed navigation not working with scrolled layout" msgstr "Perbaikan navigasi daftar isi yang tidak bekerja pada beberapa buku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 #, fuzzy msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "Perbaikan tidak dapat membuka buku dengan ekstensi berkas .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Perbaikan versi flatpak tidak dapat membuka berkas .mobi, .azw, dan .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "Pengembangan pencarian Wikitionary, sekarang dengan tautan dan contoh kalimat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Perbaikan ekstraksi dan pemformatan popover catatan kaki" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Penambahan opsi untuk mengekspor anotasi ke BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Perbaikan navigasi daftar isi yang tidak bekerja pada beberapa buku" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Perbaikan tidak dapat memperbesar gambar pada buku Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Perbaikan tidak dapat membuka buku dengan ekstensi berkas .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Perbaikan direktori temporari tidak dibersihkan setelah ditutup" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Perbaikan jalan pintas F9 tidak bekerja" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Pembaruan terjemahan" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Resource luar dan JavaScript sekarang diblok secara default" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Dukungan text-to-speech awal" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Ekspor anotasi ke HTML, teks biasa, atau JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Dukungan membuka berkas .mobi, .azw, dan .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Alternatif sidebar UI baru" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Cari kata di Wikipedia dan kamus luring" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Terjemahkan kalimat dengan Google Terjemahan" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Konfigurasi aksi default saat kata dipilih" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Percobaan dukungan popup catatan kaki" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Kemampuan untuk mencari hanya di bab saat ini" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Perbaikan CPU spikes ketika dibiarkan terbuka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Perbaikan sorotan tidak terender pada posisi yang benar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Perbaikan crash saat membuka berkas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Kustomisasi margin halaman dan kecerahan" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Ubah warna tema, atau tambahkan tema kustom sendiri" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Kemampuan untuk memperbesar dan menyalin gambar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Opsi untuk menyembunyikan kursor otomatis" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "Melihat sisa waktu baca dengan hover pada slider progres baca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Perbaikan beberapa buku terkadang tidak terender" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Perbaikan gambar terlalu lebar pada beberapa kasus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Opsi untuk beralih antara rata kiri dan rata kanan-kiri" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Opsi tata letak baru: pemirsa kolom tunggal dengan pagina" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Perbaikan:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "" "Lokasi yang dibuat kini disimpan di direktori cache alih-alih di localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "Izinkan pengaturan ukuran fonta ketika menggunakan fonta penerbit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" "Perbaikan bar progres baca tidak muncul setelah melampaui kuota localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gestur touchpad dan kemampuan untuk gulir ke halaman" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Mode layar penuh" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Opsi untuk menyembunyikan bar progres baca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Opsi untuk menonaktifkan kamus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Opsi untuk menggunakan fonta penerbit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Pengembalian progres baca kini halus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Perbaikan gaya kustom tidak terterapkan pada beberapa kasus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Perbaikan berkas AppData tidak valid" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Rilis awal" diff -Nru foliate-2.6.3ubuntu1/po/ie.po foliate-2.6.4/po/ie.po --- foliate-2.6.3ubuntu1/po/ie.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/ie.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-07-06 13:17+0800\n" "Last-Translator: OIS \n" "Language-Team: \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -359,7 +359,7 @@ msgid "translator-credits" msgstr "OIS , 2020" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Un simplic e modern visor de eLibres" @@ -856,7 +856,7 @@ msgstr "Selecte alcun textu por adjunter anotation." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Anotationes" @@ -1168,7 +1168,7 @@ msgstr "Alineament de subtitules" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Separation síllabic" @@ -1419,7 +1419,7 @@ msgstr "Traducter" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Trovar in li libre" @@ -3118,816 +3118,816 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate es un simplic e modern visor de eLibres basat sur GTK." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Su caracteristicas include:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 #, fuzzy msgid "Two-page view and scrolled view" msgstr "Vider documentes con mult págines" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 #, fuzzy msgid "Customize font and line-spacing" msgstr "Interspacie:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Marca-págines e anotationes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 #, fuzzy msgid "Quick dictionary lookup" msgstr "Serchar in un dictionarium" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Modificationes:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 #, fuzzy msgid "Improved metadata display" msgstr "Lansante li redactor VI Improvat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 #, fuzzy msgid "Improved FictionBook rendering" msgstr "Presentation" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 #, fuzzy msgid "Fixed missing window icon" msgstr "Dimen_sion de icone (px):" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Catalogs OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 #, fuzzy msgid "View current location" msgstr "Actual localisation" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Ear al inicial págine del catalog" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Recargar li catalog" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 #, fuzzy msgid "Add current feed to catalogs" msgstr "Adjunter ti-ci feed a catalogs" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 #, fuzzy msgid "HTTP authentication support" msgstr "Autentication HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Altri modificationes:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 #, fuzzy msgid "Export annotations from the library view" msgstr "Exportar anotationes..." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 #, fuzzy msgid "Fixed wrong view icon on startup" msgstr " -v, --version\tmonstra li numeró del version\n" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Biblioteca:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 #, fuzzy msgid "Search books by metadata" msgstr "Metadata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 #, fuzzy msgid "E-book discovery with OPDS" msgstr "Files de e-libres" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nov suportat formates:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Simplic textu (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 #, fuzzy msgid "Unpacked EPUB files" msgstr "Ne es un document ePub" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Arangeament:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 #, fuzzy msgid "Option to set maximum page width" msgstr "Max largore de págine" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Visor de images:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Parlation:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 #, fuzzy msgid "Import annotations from JSON" msgstr "Selecter un file JSON por importation" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 #, fuzzy msgid "Search in annotations" msgstr "Serchar anotationes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Securitá:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 #, fuzzy msgid "Other featues and fixes:" msgstr "Correctiones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Supporte de dictionariums Stardict" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 #, fuzzy msgid "Option to clear or disable cache" msgstr "Vacuar li cache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Correctiones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 #, fuzzy msgid "Fixed wrong version number" msgstr " -v, --version\tmonstra li numeró del version\n" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nov caracteristicas:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 #, fuzzy msgid "New and improved icon" msgstr "Lansante li redactor VI Improvat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 #, fuzzy msgid "Option to disable turn page on tap" msgstr "Depermisser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 #, fuzzy msgid "Fixed application not translated" msgstr "Traductet de:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Interfacie:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " "progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 #, fuzzy msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "Usar superposition (EXPERIMENTAL)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Letion:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 #, fuzzy msgid "Continuous scrolling layout" msgstr "Rulament" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 #, fuzzy msgid "Ability to zoom in and zoom out" msgstr "Diminuer li págine" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Recargar li libre (Ctrl+R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Selection de textu:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 #, fuzzy msgid "Find selected text in book" msgstr "Trovar in li libre" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Anotationes:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 #, fuzzy msgid "Spellcheck notes" msgstr "Ortografie" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 #, fuzzy msgid "Export annotations to Markdown" msgstr "Exportar anotationes..." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 #, fuzzy msgid "Options to use custom colors for highlights" msgstr "Usar colores personalisat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Por publicatores e developatores:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 #, fuzzy msgid "WebKit's developer tools can be enabled" msgstr "Instrumentarium de developator" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 #, fuzzy msgid "Breaking changes:" msgstr "Ruption de lineas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Correctiones:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Actualisat traductiones" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 #, fuzzy msgid "Basic text-to-speech support" msgstr "Comande de parlation" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 #, fuzzy msgid "Export annotations to HTML, plain text, or JSON" msgstr "Exportar anotationes..." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 #, fuzzy msgid "Translate passages with Google Translate" msgstr "Traductet med Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 #, fuzzy msgid "Configure default action when words are selected" msgstr "Si multiplic paroles es selectet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 #, fuzzy msgid "Fixed crashing when opening files" msgstr "Substituer li playlist per apertet files" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 #, fuzzy msgid "Ability to zoom and copy images" msgstr "Diminuer li págine" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 #, fuzzy msgid "Option to auto-hide cursor" msgstr "Auto-celar li apuntator" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Correctet:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Mode plen-ecran" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 #, fuzzy msgid "Option to disable dictionary" msgstr "Depermisser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 #, fuzzy msgid "Option to use publisher font" msgstr "Usar li fonde del publicator" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 #, fuzzy msgid "Fixed invalid AppData file" msgstr "Li nómine de file es ínvalid" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Inicial publication" diff -Nru foliate-2.6.3ubuntu1/po/it.po foliate-2.6.4/po/it.po --- foliate-2.6.3ubuntu1/po/it.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/it.po 2022-01-13 19:59:57.000000000 +0000 @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" -"PO-Revision-Date: 2021-03-12 11:50+0100\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-04-13 00:43+0200\n" "Last-Translator: Gianluca Boiano \n" "Language-Team: Italian\n" "Language: it\n" @@ -21,7 +21,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -51,7 +51,7 @@ #: src/contents.js:225 src/ui/contentsStack.ui:204 #: src/ui/shortcutsWindow.ui:155 msgid "Bookmark current location" -msgstr "Aggiunge un segnalibro" +msgstr "Aggiungi un segnalibro" #: src/contents.js:268 msgid "No results" @@ -92,7 +92,7 @@ #. deprecated #: src/contents.js:312 src/contents.js:339 msgid "Note" -msgstr "Note" +msgstr "Nota" #: src/epubView.js:1121 msgid "Failed to load remote file." @@ -362,7 +362,7 @@ msgid "translator-credits" msgstr "Gianluca Boiano" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Un visualizzatore di eBook semplice e moderno" @@ -625,7 +625,7 @@ #: src/properties.js:643 msgid "Find on…" -msgstr "Trova su…" +msgstr "Cerca su…" #: src/theme.js:23 msgid "Light" @@ -786,7 +786,7 @@ #: src/window.js:832 src/ui/selectionPopover.ui:47 msgid "Find" -msgstr "Trova" +msgstr "Cerca" #: src/window.js:833 src/ui/libraryWindow.ui:205 src/ui/libraryWindow.ui:300 msgid "Menu" @@ -859,7 +859,7 @@ msgstr "Seleziona del testo per aggiungere annotazioni." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Annotazioni" @@ -1172,7 +1172,7 @@ msgstr "Giustificato" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Auto-sillabazione" @@ -1421,9 +1421,9 @@ msgstr "Traduci" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" -msgstr "Trova nel libro" +msgstr "Cerca nel libro" #: src/ui/preferenceWindow.ui:83 src/ui/selectionPopover.ui:59 #: src/ui/ttsDialog.ui:165 @@ -1581,7 +1581,7 @@ #: src/ui/shortcutsWindow.ui:24 src/ui/shortcutsWindow.ui:134 #: src/ui/shortcutsWindow.ui:354 msgid "Close current window" -msgstr "Chiude finestra corrente" +msgstr "Chiudi finestra corrente" #: src/ui/shortcutsWindow.ui:51 msgid "List view" @@ -3020,296 +3020,293 @@ msgid "Writer of supplementary textual content" msgstr "Scrittore di contenuti testuali supplementari" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate è un visualizzatore di eBook semplice e moderno in GTK." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Caratteristiche principali:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Vista a pagine affiancate e a scorrimento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Personalizzazione carattere e interlinea" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Modalità chiaro, seppia, scuro e negativo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Cursore progresso di lettura con indicatori di capitolo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Segnalibri e annotazioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Ricerca rapida nel dizionario" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" +"Risolto un problema di prestazioni con i file compressi (inclusi i file EPUB)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" -msgstr "" +msgstr "Correzione dell'UI durante l'esecuzione con libhandy 1.x" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" -msgstr "" +msgstr "Risolto un problema con l'impaginazione automatica" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Novità:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" -msgstr "" +msgstr "Aggiunto supporto per l'apertura di file HTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" -msgstr "" +msgstr "Margini interni ed esterni coerenti" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" -msgstr "" +msgstr "L'impaginazione automatica non supporta più 4 colonne" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" -msgstr "" +msgstr "Risolto il problema con parole molto lunghe" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" -msgstr "Risolti gli stili personalizzati che non si applicavano in alcuni casi" +msgstr "Risolti i temi personalizzati non salvati tra le sessioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" -msgstr "Risolto il problema con la scorciatoia F9 che non funzionava" +msgstr "Risolto il problema con le scorciatoie da tastiera" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" -msgstr "" +msgstr "Risolto il problema con l'apertura di file FB2 compressi non UTF-8" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" -msgstr "" -"Risolto il problema con alcuni libri che a volte non venivano visualizzati" +msgstr "Risolto il problema con i libri che non si aprivano su GNOME 40" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "Supporto migliorato per schermi touch" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "Le credenziali OPDS ora possono essere memorizzate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "Varie correzioni per GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "Link interni di Wiktionary corretti" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "Aggiunte traduzioni in Basco, Coreano e Norvegese" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Risolto il problema con l'impossibilità di aprire alcuni file EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Risolto il problema con l'impossibilità di aprire i file Mobipocket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Visualizzazione dei metadati migliorata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Visualizzazione FictionBook migliorata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "UI migliorata per l'acquisizione di libri da OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "" "Risolto il problema con l'estrazione dell'identificatore univoco per i file " "EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Risolto il problema con l'icona della finestra mancante" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" "Risolto il problema con le variabili di ambiente TTS non impostate con " "Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" "Risolto il problema con la voce eSpeak NG non selezionata durante il test " "della configurazione TTS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Risolto il problema con l'attributo \"__ibooks_internal_theme\" errato " "quando \"Inverti\" è abilitato" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Cataloghi OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "I cataloghi sono ora aperti nella finestra principale della libreria" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Mostra posizione corrente" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Vai alla pagina iniziale del catalogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Aggiorna catalogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Aggiungi feed corrente ai cataloghi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "Supporto autenticazione HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Altre novità:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Risolto il problema con l'estrazione dell'identificatore univoco per i file " "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" "Risolto il problema con le nuove righe ignorate durante la copia del testo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "\"Volta pagina al tocco\" è ora disabilitato nei layout non impaginati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" "L'apertura di un libro dalla visualizzazione della libreria ora chiude la " "finestra della libreria" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "La lingua e le date di pubblicazione nei metadati vengono ora analizzate e " "formattate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Esporta annotazioni dalla vista libreria" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Risolto il problema con le copertine dei libri sfocate su HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Risolti i link OPDS agli Standard Ebooks e al Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Risolto il problema con l'icona di visualizzazione errata all'avvio" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Libreria:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" "Una vista della libreria che mostra i libri recenti e il progresso della " "lettura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Cerca libri in base ai metadati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "Esplora E-book con OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nuovi formati supportati:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Archivio Comic book (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Testo Semplice (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "File EPUB decompresso" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Impaginazione:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Opzione per impostare la larghezza massima di pagina" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3317,11 +3314,11 @@ "Il layout \"Automatico\" ora mostrerà quattro colonne quando la larghezza " "della pagina è ampia" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Visualizzatore immagini:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3329,7 +3326,7 @@ "Visualizzatore di immagini migliorato, con nuove scorciatoie e la " "possibilità di ruotare e invertire le immagini" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3337,38 +3334,38 @@ "Opzione per disabilitare il visualizzatore di immagini o per aprire le " "immagini con doppio click, tasto centrale o destro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Sintesi vocale:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "UI di configurazione sintesi vocale migliorata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" "Possibilità di impostare la sintesi vocale in base alla lingua del libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importa annotazioni da JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Cerca nelle annotazioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Le annotazioni sono ora ordinate nello stesso ordine in cui appaiono nel " "libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Sicurezza:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3376,45 +3373,45 @@ "\"Mostra Contenuto Insicuro\" ora attiva solo JavaScript; il contenuto " "esterno non sarà caricato" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "I processi WebKit sono ora in modalità sandbox" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Altre caratteristiche e correzioni:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Supporto migliorato per libri verticali e da destra a sinistra" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Supporto per dizionari StarDict" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" "Risolto il problema con la posizione corrente non mantenuta durante il " "ridimensionamento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" "Risolto il problema con la barra superiore che si auto-nascondeva con alcuni " "temi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Opzioni della riga di comando per mostrare versione e aggiungere libri alla " "libreria" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Opzione per pulire o disabilitare la cache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3422,65 +3419,65 @@ "Quando una pagina HTML contiene tag anchor non validi, ora viene analizzata " "come XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Correzioni:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Corretto il numero di versione errato" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Risolto il problema con dizionario, traduzione e Wikipedia che non " "funzionavano nel pacchetto Snap" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nuove caratteristiche:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Icona nuova e migliorata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Opzione per disabilitare volta pagina al tocco" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Un menu nella schermata di benvenuto per aprire i file recenti" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "Scorciatoie ripristinate per mostrare ToC, annotazioni e segnalibri" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Risolto un problema con le traduzioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Interfaccia:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Interfaccia ridisegnata più funzionale con schermi piccoli" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" "Modalità a schermo intero migliorata con una barra superiore sovrapposta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3488,7 +3485,7 @@ "La barra superiore e la barra di progresso ora si nascondono " "automaticamente, per un'esperienza di lettura senza distrazioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3496,7 +3493,7 @@ "Varie informazioni sulla posizione, così come un orologio, possono ora " "essere visualizzate nel piè di pagina" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3504,7 +3501,7 @@ "Un nuovo popover di posizione (Ctrl + L) che mostra le stime del tempo di " "lettura e consente di saltare alle posizioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3514,24 +3511,24 @@ "toccando la parte sinistra o destra della vista; tocca al centro per " "attivare la barra principale e la barra di progresso" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "Annotazioni, segnalibri e risultati della ricerca ora mostrano i titoli dei " "capitoli" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" "Quando si cercano parole nei dizionari, è ora possibile modificare la query" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Nuova scorciatoia per la visualizzazione dei metadati (Ctrl + I) e delle " "preferenze (Ctrl +,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" @@ -3539,7 +3536,7 @@ "Una nuova barra dei menu tradizionale, che può essere visualizzata a seconda " "dell'ambiente desktop" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3547,78 +3544,78 @@ "Opzione per usare la barra del titolo classica e quella di menu " "(sperimentale)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lettura:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Scorrimento continuo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Possibilità di mostrare ombre decorative che imitano l'aspetto di un vero " "libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Possibilità di ingrandire e rimpicciolire" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Visualizzatore di immagini migliorato con opzione \"salva con nome\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Apri copie di un libro in nuove finestre (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Ricarica libro (Ctrl + Rs)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nuovi temi incorporati: Grigio, Solarized, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Selezione testo:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Possibilità di selezionare il testo tra le pagine" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" -msgstr "Trova testo selezionato nel libro" +msgstr "Cerca testo selezionato nel libro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Pronuncia il testo selezionato o dalla posizione selezionata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Annotazioni:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Note per il controllo ortografico" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Esporta annotazioni in Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Opzioni per utilizzare colori personalizzati per le evidenziazioni" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Per editori e sviluppatori:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3626,210 +3623,210 @@ "Supporto per l'attributo del tema di Apple Books, che consente ai libri di " "rilevare i temi senza JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "Gli strumenti per sviluppatori possono essere abilitati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Novità importanti:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Gli schemi delle impostazioni sono stati riorganizzati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Il formato per i temi personalizzati è cambiato" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Le posizioni ora hanno una dimensione di 1024 caratteri" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Correzioni:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "" "Risolto il problema con il mancato ripristino dell'ultima posizione esatta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" "Risolto il problema con la navigazione che non funzionava con il layout a " "scorrimento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Risolto il problema con la dimensione del carattere che non cambiava quando " "il libro utilizza parole chiave di dimensione assoluta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Risolto il problema con il testo tagliato sul bordo del margine" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Risolto il problema con l'impossibilità di aprire libri con \"#\" o \"?\" " "nel nome del file" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Risolto il problema con la versione di Flatpak che non era in grado di " "aprire file .mobi, .azw e .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "Ricerca in Wikizionario migliorata, ora con collegamenti e frasi di esempio" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Estrazione e formattazione delle note a piè di pagina migliorate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Aggiunta l'opzione per esportare le annotazioni in BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" "Risolto il problema con la navigazione del sommario non funzionante con " "alcuni libri" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "" "Risolto il problema con l'impossibilità di ingrandire le immagini con i " "libri Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" "Risolto il problema per cui non era possibile aprire libri con estensione ." "epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" "Risolto il problema con la directory temporanea che non veniva pulita dopo " "la chiusura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Risolto il problema con la scorciatoia F9 che non funzionava" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Traduzioni aggiornate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "" "Le risorse esterne e JavaScript sono ora bloccati per impostazione " "predefinita" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Supporto di base alla sintesi vocale" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Esporta Annotazioni in HTML, testo semplice, o JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Supporto per la visualizzazione di file .mobi, .azw e .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nuova UI alternativa della barra laterale" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Cerca le parole in Wikipedia e nei dizionari offline" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Traduci passaggio con Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Configura azione predefinita sulla selezione di parole" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Supporto sperimentale per le note a piè di pagina" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" -msgstr "Possibilità di trovare solo all'interno del capitolo corrente" +msgstr "Possibilità di cercare solo all'interno del capitolo corrente" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Risolto utilizzo intensivo casuale della CPU" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "" "Risolto il problema con le evidenziazioni che non venivano visualizzate " "nelle posizioni corrette" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Risolto il problema con l'arresto anomalo durante l'apertura dei file" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Personalizza i margini e la luminosità della pagina" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Modifica i colori del tema o aggiungi i tuoi temi personalizzati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Possibilità di ingrandire e copiare le immagini" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Opzione per auto-nascondere il cursore" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Visualizza il tempo di lettura rimanente passando con il mouse sul cursore " "di avanzamento della lettura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "" "Risolto il problema con alcuni libri che a volte non venivano visualizzati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Risolto il problema con le immagini troppo grandi in alcuni casi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Opzione per passare dal giustificato a sinistra a globale" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nuova opzione di layout: vista impaginata a colonna singola" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Risolto:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3837,13 +3834,13 @@ "Le posizioni generate vengono ora archiviate nella directory della cache " "anziché in localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" "Consenti la regolazione della dimensione del carattere quando si utilizzano " "i caratteri dell'editore" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3851,40 +3848,40 @@ "Risolto il problema con il cursore di avanzamento della lettura che non " "veniva visualizzato dopo il superamento della quota di localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gesti del touchpad e possibilità di scorrere le pagine" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Modalità schermo intero" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Opzione per nascondere la barra progresso di lettura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Opzione per disabilitare il dizionario" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Opzione per usare il carattere dell'editore" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" "Il ripristino dei progressi di lettura ora è fluido e privo di fallimenti" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Risolti gli stili personalizzati che non si applicavano in alcuni casi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Risolto file AppData non valido" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Rilascio iniziale" @@ -4256,129 +4253,3 @@ #: data/com.github.johnfactotum.Foliate.gschema.xml:288 msgid "What to do when downloading a file from an OPDS feed" msgstr "Cosa fare quando si scarica un file da un feed OPDS" - -#, fuzzy -#~ msgid "Open a Catalog…" -#~ msgstr "Apri file…" - -#, fuzzy -#~ msgid "English" -#~ msgstr "Editore" - -#, fuzzy -#~ msgid "Lao" -#~ msgstr "Impaginazione" - -#, fuzzy -#~ msgid "Polish" -#~ msgstr "Editore" - -#, fuzzy -#~ msgid "Cache locations in book" -#~ msgstr "%d minuto alla fine del libro" - -#, fuzzy -#~ msgid "The file cannot be opened." -#~ msgstr "Oh no! Il file non può essere aperto" - -#~ msgid "Auto" -#~ msgstr "Automatica" - -#~ msgid "Yellow" -#~ msgstr "Giallo" - -#~ msgid "Red" -#~ msgstr "Rosso" - -#~ msgid "Magenta" -#~ msgstr "Magenta" - -#~ msgid "Aqua" -#~ msgstr "Acqua" - -#~ msgid "Lime" -#~ msgstr "Lime" - -#~ msgid "From Wiktionary, the free dictionary" -#~ msgstr "Da Wikizionario, il dizionario libero" - -#, javascript-format -#~ msgid "%d hour left in book" -#~ msgid_plural "%d hours left in book" -#~ msgstr[0] "%d ora alla fine del libro" -#~ msgstr[1] "%d ore alla fine del libro" - -#, fuzzy, javascript-format -#~ msgid "%d minute left in section" -#~ msgid_plural "%d minutes left in section" -#~ msgstr[0] "%d minuto alla fine del libro" -#~ msgstr[1] "%d minuti alla fine del libro" - -#, fuzzy, javascript-format -#~ msgid "%d hour left in section" -#~ msgid_plural "%d hours left in section" -#~ msgstr[0] "%d ora alla fine del libro" -#~ msgstr[1] "%d ore alla fine del libro" - -#~ msgid "Find in Book" -#~ msgstr "Trova nel libro" - -#, fuzzy -#~ msgid "From Wikipedia, the free encyclopedia" -#~ msgstr "Da Wikizionario, il dizionario libero" - -#, fuzzy -#~ msgid "Go to Linked Location" -#~ msgstr "Torna al punto precedente" - -#~ msgid "Zoom" -#~ msgstr "Ingrandisci" - -#~ msgid "Open a file, or continue reading the last opened book." -#~ msgstr "Apri un file o continua a leggere l'ultimo libro aperto." - -#, fuzzy -#~ msgid "Go to Location…" -#~ msgstr "Torna al punto precedente" - -#~ msgid "Set font, theme, and layout" -#~ msgstr "Configura carattere, tema e impaginazione" - -#~ msgid "Reading Progress Bar" -#~ msgstr "Barra Progresso di Lettura" - -#, fuzzy, javascript-format -#~ msgid "Annotations for %s" -#~ msgstr "Annotazioni" - -#~ msgid "Link" -#~ msgstr "Collegamenti" - -#~ msgid "A theme with that name already exists." -#~ msgstr "Esiste già un tema con quel nome." - -#~ msgid "Add" -#~ msgstr "Aggiungi" - -#~ msgid "Add…" -#~ msgstr "Aggiungi…" - -#~ msgid "Add a new theme" -#~ msgstr "Aggiungi un nuovo tema" - -#~ msgid "Increase font size" -#~ msgstr "Aumenta la dimensione del carattere" - -#~ msgid "Decrease font size" -#~ msgstr "Riduce la dimensione del carattere" - -#~ msgid "Never" -#~ msgstr "Mai" - -#~ msgid "Always" -#~ msgstr "Sempre" - -#~ msgid "%d hour left in chapter" -#~ msgid_plural "%d hours left in chapter" -#~ msgstr[0] "%d ora alla fine del capitolo" -#~ msgstr[1] "%d ore alla fine del capitolo" diff -Nru foliate-2.6.3ubuntu1/po/ko.po foliate-2.6.4/po/ko.po --- foliate-2.6.3ubuntu1/po/ko.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/ko.po 2022-01-13 19:59:57.000000000 +0000 @@ -1,14 +1,15 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.johnfactotum.Foliate package. -# JungHee Lee , 2020 +# JungHee Lee , 2020, 2021 +# msgid "" msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-15 08:52+0800\n" -"PO-Revision-Date: 2020-11-22 23:48+0900\n" -"Language-Team: \n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-04-21 00:54+0900\n" +"Language-Team: 이정희 \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -17,9 +18,9 @@ "Last-Translator: JungHee Lee \n" "Language: ko\n" -#: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:739 -#: src/main.js:209 src/window.js:1001 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 +#: src/main.js:209 src/window.js:1023 src/schemes.js:100 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -36,8 +37,8 @@ msgid "Ebook;Book;EPUB;Viewer;Reader;" msgstr "Ebook;Book;EPUB;Viewer;Reader;이북;도서;뷰어;리더;책;전자책;" -#: data/com.github.johnfactotum.Foliate.desktop.in:17 -#: src/ui/libraryWindow.ui:612 src/ui/mainMenu.ui:304 +#: data/com.github.johnfactotum.Foliate.desktop.in:19 +#: src/ui/libraryWindow.ui:612 src/ui/mainMenu.ui:303 #: src/ui/shortcutsWindow.ui:40 msgid "Library" msgstr "라이브러리" @@ -92,19 +93,19 @@ msgid "Note" msgstr "메모" -#: src/epubView.js:1127 +#: src/epubView.js:1121 msgid "Failed to load remote file." msgstr "원격 파일을 불러오지 못했습니다." -#: src/epubView.js:1136 +#: src/epubView.js:1130 msgid "File not found." msgstr "파일 찾을 할 수 없습니다." -#: src/epubView.js:1150 +#: src/epubView.js:1144 msgid "Could not unpack Kindle file." msgstr "Kindle 파일의 압축풀기를 할 수 없습니다." -#: src/epubView.js:1166 +#: src/epubView.js:1162 msgid "File type not supported." msgstr "파일 유형이 지원되지 않습니다." @@ -175,7 +176,7 @@ msgid "Annotations for “%s”" msgstr "\"%s\"에 대한 주석" -#: src/export.js:166 src/utils.js:279 +#: src/export.js:166 src/utils.js:281 msgid "All Files" msgstr "모든 파일" @@ -196,11 +197,15 @@ msgstr "식별자 불일치" #: src/export.js:229 -msgid "The identifier of the imported file does not match the book’s. This might indicate that the annotations do not belong to this book." -msgstr "가져온 파일의 식별자가 책의 식별자와 일치하지 않습니다. 이는 주석이 이 책에 속하지 않음을 나타낼 수 있습니다." +msgid "" +"The identifier of the imported file does not match the book’s. This might " +"indicate that the annotations do not belong to this book." +msgstr "" +"가져온 파일의 식별자가 책의 식별자와 일치하지 않습니다. 이는 주석이 이 책에 " +"속하지 않음을 나타낼 수 있습니다." -#: src/export.js:234 src/library.js:455 src/main.js:161 src/opds.js:229 -#: src/opds.js:376 src/opds.js:1174 src/utils.js:770 src/window.js:571 +#: src/export.js:234 src/library.js:456 src/main.js:161 src/opds.js:229 +#: src/opds.js:376 src/opds.js:1174 src/utils.js:772 src/window.js:593 #: src/ui/bookEditDialog.ui:10 src/ui/catalogWindow.ui:10 #: src/ui/exportWindow.ui:38 src/ui/importWindow.ui:10 #: src/ui/libraryWindow.ui:601 src/ui/themeWindow.ui:10 src/ui/ttsDialog.ui:10 @@ -211,7 +216,7 @@ msgid "Import Anyway" msgstr "어떻게 해서든지 가져오기" -#: src/export.js:245 src/opds.js:1300 src/opds.js:1371 src/window.js:1031 +#: src/export.js:245 src/opds.js:1300 src/opds.js:1371 src/window.js:1059 msgid "Error" msgstr "오류" @@ -219,98 +224,98 @@ msgid "Could not import annotations." msgstr "주석을 가져올 수 없습니다." -#: src/library.js:98 src/window.js:650 src/ui/bookBoxMenu.ui:13 -#: src/ui/mainMenu.ui:613 +#: src/library.js:99 src/window.js:672 src/ui/bookBoxMenu.ui:13 +#: src/ui/mainMenu.ui:612 msgid "About This Book" msgstr "이 책 소개" -#: src/library.js:132 +#: src/library.js:133 msgid "Choose File" msgstr "파일 선택하기" -#: src/library.js:265 src/library.js:283 +#: src/library.js:266 src/library.js:284 msgid "Load more" msgstr "더 많이 불러오기" -#: src/library.js:427 +#: src/library.js:428 msgid "File location unkown" msgstr "알 수 없는 파일 위치" -#: src/library.js:428 +#: src/library.js:429 msgid "Choose the location of this file to open it." msgstr "이 파일을 열 위치를 선택하십시오." -#: src/library.js:448 +#: src/library.js:449 #, javascript-format msgid "Are you sure you want to remove this book?" msgid_plural "Are you sure you want to remove the %d selected books?" msgstr[0] "이 책을 제거하시겠습니까?" msgstr[1] "선택한 %d권의 책을 제거하시겠습니까?" -#: src/library.js:450 +#: src/library.js:451 msgid "Reading progress, annotations, and bookmarks will be permanently lost." msgstr "읽기 진행률 상황, 주석 및 책갈피가 영구적으로 손실됩니다." -#: src/library.js:456 src/ui/annotationBox.ui:63 src/ui/annotationRow.ui:53 +#: src/library.js:457 src/ui/annotationBox.ui:63 src/ui/annotationRow.ui:53 #: src/ui/bookBoxMenu.ui:44 src/ui/bookmarkRow.ui:44 #: src/ui/libraryWindow.ui:581 msgid "Remove" msgstr "제거" -#: src/library.js:578 +#: src/library.js:579 #, javascript-format msgid "%d selected" msgid_plural "%d selected" msgstr[0] "%d권 선택됨" msgstr[1] "%d권 선택됨" -#: src/library.js:697 +#: src/library.js:698 msgid "Failed to add book" msgid_plural "Failed to add books" msgstr[0] "책을 추가하지 못했습니다" msgstr[1] "책들을 추가하지 못했습니다" -#: src/library.js:699 +#: src/library.js:700 msgid "Could not add the following file:" msgid_plural "Could not add the following files:" msgstr[0] "다음 파일을 추가할 수 없음:" msgstr[1] "다음 파일들을 추가할 수 없음:" -#: src/library.js:771 +#: src/library.js:772 msgid "All" msgstr "모두" -#: src/library.js:774 src/ui/catalogWindow.ui:39 +#: src/library.js:775 src/ui/catalogWindow.ui:39 msgid "Title" msgstr "제목" -#: src/library.js:775 src/schemes.js:257 +#: src/library.js:776 src/schemes.js:257 msgid "Author" msgstr "저자" -#: src/library.js:776 src/properties.js:359 src/ui/propertyBox.ui:16 +#: src/library.js:777 src/properties.js:359 src/ui/propertyBox.ui:16 msgid "Tags" msgstr "태그" -#: src/library.js:777 src/ui/propertiesBox.ui:65 +#: src/library.js:778 src/ui/propertiesBox.ui:65 msgid "Description" msgstr "설명" -#: src/library.js:778 src/properties.js:418 src/schemes.js:407 +#: src/library.js:779 src/properties.js:418 src/schemes.js:407 msgid "Publisher" msgstr "게시자" -#: src/library.js:779 src/properties.js:438 src/ui/ttsDialog.ui:284 +#: src/library.js:780 src/properties.js:438 src/ui/ttsDialog.ui:284 msgid "Language" msgstr "언어" -#: src/library.js:816 +#: src/library.js:817 msgid "Add Files" msgstr "파일 추가" #: src/lookup.js:106 msgid "Search on Wikipedia" -msgstr "위키백과 검색" +msgstr "위키백과에서 검색" #: src/lookup.js:228 msgid "Source: " @@ -332,7 +337,7 @@ msgid "Translation by Google Translate" msgstr "Google 번역으로 번역" -#: src/main.js:135 src/window.js:666 +#: src/main.js:135 src/window.js:688 msgid "Open File" msgstr "파일 열기" @@ -354,7 +359,7 @@ msgid "translator-credits" msgstr "이정희 (daemul72@gmail.com)" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "간단하고 현대적인 eBook 뷰어" @@ -470,13 +475,13 @@ msgid "Unable to load OPDS feed" msgstr "OPDS 피드를 불러올 수 없음" -#: src/opds.js:667 src/ui/libraryWindow.ui:69 src/ui/mainMenu.ui:632 +#: src/opds.js:667 src/ui/libraryWindow.ui:69 src/ui/mainMenu.ui:631 #: src/ui/menuBar.ui:18 src/ui/shortcutsWindow.ui:78 #: src/ui/shortcutsWindow.ui:120 msgid "Reload" msgstr "다시 불러오기" -#: src/opds.js:835 src/window.js:340 +#: src/opds.js:835 src/window.js:368 #, javascript-format msgid "%d of %d" msgstr "%d / %d" @@ -493,7 +498,7 @@ msgid "Go" msgstr "가기" -#: src/opds.js:1195 src/opds.js:1221 src/window.js:1312 +#: src/opds.js:1195 src/opds.js:1221 src/window.js:1340 #: src/ui/libraryWindow.ui:359 msgid "Loading…" msgstr "불러오는 중…" @@ -560,11 +565,11 @@ #: src/properties.js:47 msgid "LibraryThing" -msgstr "라이브러리Thing" +msgstr "LibraryThing" #: src/properties.js:52 msgid "Open Library" -msgstr "Open 라이브러리" +msgstr "Open Library" #: src/properties.js:57 msgid "WorldCat" @@ -635,7 +640,7 @@ msgid "Dark" msgstr "어둡게" -#: src/theme.js:39 src/ui/imageViewer.ui:56 src/ui/shortcutsWindow.ui:409 +#: src/theme.js:39 src/ui/imageViewer.ui:56 src/ui/shortcutsWindow.ui:413 #: src/ui/themeWindow.ui:145 #: data/com.github.johnfactotum.Foliate.gschema.xml:176 msgid "Invert" @@ -704,41 +709,41 @@ msgstr[0] "%d시간" msgstr[1] "%d시간" -#: src/utils.js:281 +#: src/utils.js:283 msgid "E-book Files" -msgstr "E book 파일" +msgstr "E-book 파일" -#: src/utils.js:761 +#: src/utils.js:763 msgid "Authentication Required" msgstr "인증 요구됨" -#: src/utils.js:763 +#: src/utils.js:765 #, javascript-format msgid "Authentication required by %s" msgstr "%s에 인증 요구됨" -#: src/utils.js:766 +#: src/utils.js:768 #, javascript-format msgid "The site says: “%s”" msgstr "사이트 내용: \"%s\"" -#: src/utils.js:771 +#: src/utils.js:773 msgid "Authenticate" msgstr "인증하기" -#: src/utils.js:785 +#: src/utils.js:787 msgid "Username" msgstr "사용자이름" -#: src/utils.js:789 +#: src/utils.js:791 msgid "Password" msgstr "비밀번호" -#: src/utils.js:792 +#: src/utils.js:794 msgid "Remember my credentials" msgstr "내 자격 증명 기억하기" -#: src/window.js:126 src/window.js:816 +#: src/window.js:126 src/window.js:838 msgid "Leave fullscreen" msgstr "전체화면 종료" @@ -752,40 +757,40 @@ msgid "of %d" msgstr "/ %d" -#: src/window.js:565 +#: src/window.js:587 msgid "This file or format does not work well with annotations" msgstr "이 파일 또는 형식은 주석과 잘 작동하지 않음" -#: src/window.js:566 +#: src/window.js:588 msgid "Your annotations might stop working properly at any time." msgstr "주석은 언제든지 제대로 작동하지 않을 수 있습니다." -#: src/window.js:572 +#: src/window.js:594 msgid "Continue Anyway" msgstr "어떻게 해서든지 계속하기" -#: src/window.js:795 +#: src/window.js:817 msgid "Contents" msgstr "콘텐츠" -#: src/window.js:799 data/com.github.johnfactotum.Foliate.gschema.xml:244 +#: src/window.js:821 data/com.github.johnfactotum.Foliate.gschema.xml:244 msgid "Show sidebar" msgstr "사이드바 표시" -#: src/window.js:810 src/ui/selectionPopover.ui:47 +#: src/window.js:832 src/ui/selectionPopover.ui:47 msgid "Find" msgstr "찾기" -#: src/window.js:811 src/ui/libraryWindow.ui:205 src/ui/libraryWindow.ui:300 +#: src/window.js:833 src/ui/libraryWindow.ui:205 src/ui/libraryWindow.ui:300 msgid "Menu" msgstr "메뉴" -#: src/window.js:1097 +#: src/window.js:1125 #, javascript-format msgid "Image from “%s”" msgstr "\"%s\"의 이미지" -#: src/window.js:1097 +#: src/window.js:1125 msgid "Image" msgstr "이미지" @@ -801,7 +806,7 @@ msgid "Remote file" msgstr "원격 파일" -#: src/ui/bookBoxMenu.ui:25 src/ui/mainMenu.ui:651 src/ui/menuBar.ui:34 +#: src/ui/bookBoxMenu.ui:25 src/ui/mainMenu.ui:650 src/ui/menuBar.ui:34 msgid "Export Annotations…" msgstr "주석 내보내기…" @@ -847,6 +852,7 @@ msgstr "주석을 추가하려면 텍스트를 선택합니다." #: src/ui/contentsStack.ui:124 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "주석" @@ -880,7 +886,7 @@ #: src/ui/exportWindow.ui:23 msgid "Markdown" -msgstr "가격 인하" +msgstr "마크다운" #: src/ui/exportWindow.ui:27 msgid "Plain Text" @@ -910,28 +916,28 @@ msgid "Current chapter" msgstr "현재 챕터" -#: src/ui/footnotePopover.ui:36 src/ui/mainMenu.ui:553 src/ui/menuBar.ui:149 +#: src/ui/footnotePopover.ui:36 src/ui/mainMenu.ui:552 src/ui/menuBar.ui:154 msgid "Reference Preview" msgstr "참조 미리보기" #: src/ui/footnotePopover.ui:46 src/ui/shortcutsWindow.ui:186 -#: src/ui/shortcutsWindow.ui:369 src/ui/wikipediaBox.ui:107 +#: src/ui/shortcutsWindow.ui:371 src/ui/wikipediaBox.ui:107 #: data/com.github.johnfactotum.Foliate.gschema.xml:272 msgid "View" msgstr "보기" #: src/ui/imageViewer.ui:31 src/ui/menuBar.ui:60 src/ui/preferenceWindow.ui:59 -#: src/ui/selectionPopover.ui:19 src/ui/shortcutsWindow.ui:338 +#: src/ui/selectionPopover.ui:19 src/ui/shortcutsWindow.ui:340 msgid "Copy" msgstr "복사하기" -#: src/ui/imageViewer.ui:44 src/ui/shortcutsWindow.ui:345 +#: src/ui/imageViewer.ui:44 src/ui/shortcutsWindow.ui:347 msgid "Save as" msgstr "다른 이름으로 저장" #: src/ui/imageViewer.ui:126 src/ui/mainMenu.ui:50 -#: src/ui/shortcutsWindow.ui:198 src/ui/shortcutsWindow.ui:318 -#: src/ui/shortcutsWindow.ui:381 +#: src/ui/shortcutsWindow.ui:198 src/ui/shortcutsWindow.ui:320 +#: src/ui/shortcutsWindow.ui:383 msgid "Zoom out" msgstr "축소" @@ -940,16 +946,16 @@ msgstr "확대/축소 복원" #: src/ui/imageViewer.ui:152 src/ui/mainMenu.ui:73 -#: src/ui/shortcutsWindow.ui:190 src/ui/shortcutsWindow.ui:311 -#: src/ui/shortcutsWindow.ui:373 +#: src/ui/shortcutsWindow.ui:190 src/ui/shortcutsWindow.ui:313 +#: src/ui/shortcutsWindow.ui:375 msgid "Zoom in" msgstr "확대" -#: src/ui/imageViewer.ui:184 src/ui/shortcutsWindow.ui:395 +#: src/ui/imageViewer.ui:184 src/ui/shortcutsWindow.ui:399 msgid "Rotate 90° counter-clockwise" msgstr "시계 반대 방향으로 90° 회전" -#: src/ui/imageViewer.ui:197 src/ui/shortcutsWindow.ui:402 +#: src/ui/imageViewer.ui:197 src/ui/shortcutsWindow.ui:406 msgid "Rotate 90° clockwise" msgstr "시계 방향으로 90° 회전" @@ -962,12 +968,15 @@ msgstr "다음 주석이 추가됨:" #: src/ui/importWindow.ui:64 -msgid "The imported annotations will NOT overwrite the existing ones when they highlight the same passages." -msgstr "가져온 주석이 동일한 구문을 강조 표시할 때 기존 주석을 덮어쓰지 않습니다." +msgid "" +"The imported annotations will NOT overwrite the existing ones when they " +"highlight the same passages." +msgstr "" +"가져온 주석이 동일한 구문을 강조 표시할 때 기존 주석을 덮어쓰지 않습니다." #: src/ui/libraryWindow.ui:7 msgid "Open Book…" -msgstr "도서 열기…" +msgstr "책 열기…" #: src/ui/libraryWindow.ui:11 msgid "Open Catalog…" @@ -975,22 +984,22 @@ #: src/ui/libraryWindow.ui:17 msgid "Add Books…" -msgstr "도서 추가…" +msgstr "책도서 추가…" #: src/ui/libraryWindow.ui:21 src/ui/libraryWindow.ui:683 msgid "Add Catalog…" msgstr "카탈로그 추가…" -#: src/ui/libraryWindow.ui:26 src/ui/mainMenu.ui:316 src/ui/menuBar.ui:78 +#: src/ui/libraryWindow.ui:26 src/ui/mainMenu.ui:315 src/ui/menuBar.ui:78 #: src/ui/preferenceWindow.ui:118 msgid "Preferences" msgstr "환경설정" -#: src/ui/libraryWindow.ui:30 src/ui/mainMenu.ui:323 src/ui/menuBar.ui:223 +#: src/ui/libraryWindow.ui:30 src/ui/mainMenu.ui:322 src/ui/menuBar.ui:228 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" -#: src/ui/libraryWindow.ui:34 src/ui/mainMenu.ui:330 src/ui/menuBar.ui:227 +#: src/ui/libraryWindow.ui:34 src/ui/mainMenu.ui:329 src/ui/menuBar.ui:232 msgid "About Foliate" msgstr "Foliate 소개" @@ -1092,110 +1101,111 @@ msgid "Margins" msgstr "여백" -#: src/ui/mainMenu.ui:231 +#: src/ui/mainMenu.ui:230 msgid "Width" msgstr "너비" -#: src/ui/mainMenu.ui:232 data/com.github.johnfactotum.Foliate.gschema.xml:142 +#: src/ui/mainMenu.ui:231 data/com.github.johnfactotum.Foliate.gschema.xml:142 msgid "Maximum page width" msgstr "최대 페이지 너비" -#: src/ui/mainMenu.ui:266 src/ui/mainMenu.ui:343 +#: src/ui/mainMenu.ui:265 src/ui/mainMenu.ui:342 msgid "Theme" msgstr "테마" -#: src/ui/mainMenu.ui:273 src/ui/mainMenu.ui:409 src/ui/preferenceWindow.ui:600 +#: src/ui/mainMenu.ui:272 src/ui/mainMenu.ui:408 src/ui/preferenceWindow.ui:600 msgid "Advanced" msgstr "고급" -#: src/ui/mainMenu.ui:285 src/ui/mainMenu.ui:603 src/ui/shortcutsWindow.ui:151 +#: src/ui/mainMenu.ui:284 src/ui/mainMenu.ui:602 src/ui/shortcutsWindow.ui:151 msgid "Book" -msgstr "도서" +msgstr "책들" -#: src/ui/mainMenu.ui:297 src/ui/menuBar.ui:8 +#: src/ui/mainMenu.ui:296 src/ui/menuBar.ui:8 msgid "Open…" msgstr "열기…" -#: src/ui/mainMenu.ui:383 +#: src/ui/mainMenu.ui:382 msgid "Add Custom Theme…" msgstr "사용자지정 테마 추가…" -#: src/ui/mainMenu.ui:429 src/ui/menuBar.ui:108 +#: src/ui/mainMenu.ui:428 src/ui/menuBar.ui:108 #: data/com.github.johnfactotum.Foliate.gschema.xml:201 msgid "Layout" msgstr "레이아웃" -#: src/ui/mainMenu.ui:447 src/ui/menuBar.ui:111 +#: src/ui/mainMenu.ui:446 src/ui/menuBar.ui:111 msgid "Automatic" msgstr "자동" -#: src/ui/mainMenu.ui:455 src/ui/menuBar.ui:116 +#: src/ui/mainMenu.ui:454 src/ui/menuBar.ui:121 msgid "Single Column" msgstr "단일 열" -#: src/ui/mainMenu.ui:463 src/ui/menuBar.ui:121 +#: src/ui/mainMenu.ui:462 src/ui/menuBar.ui:126 msgid "Scrolled" msgstr "스크롤됨" -#: src/ui/mainMenu.ui:471 src/ui/menuBar.ui:126 +#: src/ui/mainMenu.ui:470 src/ui/menuBar.ui:131 msgid "Continuous" msgstr "연속" -#: src/ui/mainMenu.ui:488 +#: src/ui/mainMenu.ui:487 msgid "Text" msgstr "텍스트" -#: src/ui/mainMenu.ui:505 src/ui/menuBar.ui:135 +#: src/ui/mainMenu.ui:504 src/ui/menuBar.ui:140 msgid "Use Publisher Font" msgstr "출판사 글꼴 사용" -#: src/ui/mainMenu.ui:512 src/ui/menuBar.ui:139 +#: src/ui/mainMenu.ui:511 src/ui/menuBar.ui:144 msgid "Full Justification" msgstr "전체 맞춤" -#: src/ui/mainMenu.ui:519 src/ui/menuBar.ui:143 +#: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "하이픈 자동넣기" -#: src/ui/mainMenu.ui:536 src/ui/ttsDialog.ui:114 src/schemes.js:402 +#: src/ui/mainMenu.ui:535 src/ui/ttsDialog.ui:114 src/schemes.js:402 msgid "Other" msgstr "기타" -#: src/ui/mainMenu.ui:560 src/ui/menuBar.ui:153 +#: src/ui/mainMenu.ui:559 src/ui/menuBar.ui:158 msgid "Auto-hide Cursor" msgstr "커서 자동 숨김" -#: src/ui/mainMenu.ui:567 src/ui/menuBar.ui:157 +#: src/ui/mainMenu.ui:566 src/ui/menuBar.ui:162 msgid "Realistic Shadows" msgstr "책처럼 보기" -#: src/ui/mainMenu.ui:579 +#: src/ui/mainMenu.ui:578 msgid "Allow JavaScript" msgstr "JavaScript 허용" -#: src/ui/mainMenu.ui:580 src/ui/menuBar.ui:163 +#: src/ui/mainMenu.ui:579 src/ui/menuBar.ui:168 msgid "Allow Unsafe Content" msgstr "안전하지 않은 콘텐츠 허용" -#: src/ui/mainMenu.ui:587 src/ui/menuBar.ui:167 +#: src/ui/mainMenu.ui:586 src/ui/menuBar.ui:172 msgid "Enable Developer Tools" msgstr "개발자 도구 활성화" -#: src/ui/mainMenu.ui:625 src/ui/menuBar.ui:14 +#: src/ui/mainMenu.ui:624 src/ui/menuBar.ui:14 msgid "Open a Copy" msgstr "사본 열기" -#: src/ui/mainMenu.ui:639 src/ui/menuBar.ui:22 +#: src/ui/mainMenu.ui:638 src/ui/menuBar.ui:22 msgid "Clear Cache" msgstr "캐시 지우기" -#: src/ui/mainMenu.ui:658 src/ui/menuBar.ui:40 +#: src/ui/mainMenu.ui:657 src/ui/menuBar.ui:40 msgid "Import Annotations…" msgstr "주석 가져오기…" #: src/ui/mainOverlay.ui:48 msgid "No books open" -msgstr "열려있는 도서 없음" +msgstr "열려있는 책들 없음" #: src/ui/mainOverlay.ui:88 msgid "Recent Files" @@ -1226,7 +1236,7 @@ msgstr "창 닫기" #: src/ui/menuBar.ui:50 src/ui/shortcutsWindow.ui:31 -#: src/ui/shortcutsWindow.ui:141 src/ui/shortcutsWindow.ui:359 +#: src/ui/shortcutsWindow.ui:141 src/ui/shortcutsWindow.ui:361 msgid "Quit" msgstr "끝내기" @@ -1262,44 +1272,48 @@ msgid "Zoom Out" msgstr "축소" -#: src/ui/menuBar.ui:174 +#: src/ui/menuBar.ui:116 +msgid "Up to Two Columns" +msgstr "최대 2 열" + +#: src/ui/menuBar.ui:179 msgid "_Go" msgstr "넘기기(_G)" -#: src/ui/menuBar.ui:177 +#: src/ui/menuBar.ui:182 msgid "Go Back" msgstr "돌아가기" -#: src/ui/menuBar.ui:183 +#: src/ui/menuBar.ui:188 msgid "Next Page" msgstr "다음 페이지" -#: src/ui/menuBar.ui:187 +#: src/ui/menuBar.ui:192 msgid "Previous Page" msgstr "이전 페이지" -#: src/ui/menuBar.ui:193 +#: src/ui/menuBar.ui:198 msgid "Next Chapter" msgstr "다음 챕터" -#: src/ui/menuBar.ui:197 +#: src/ui/menuBar.ui:202 msgid "Previous Chapter" msgstr "이전 챕터" -#: src/ui/menuBar.ui:203 +#: src/ui/menuBar.ui:208 msgid "Beginning" msgstr "첫장" -#: src/ui/menuBar.ui:207 +#: src/ui/menuBar.ui:212 msgid "End" msgstr "마지막장" -#: src/ui/menuBar.ui:213 src/ui/navBar.ui:134 src/ui/navBar.ui:313 +#: src/ui/menuBar.ui:218 src/ui/navBar.ui:134 src/ui/navBar.ui:313 #: src/ui/preferenceWindow.ui:19 msgid "Location" -msgstr "위치 찾기" +msgstr "위치" -#: src/ui/menuBar.ui:220 +#: src/ui/menuBar.ui:225 msgid "_Help" msgstr "도움말(_H)" @@ -1339,17 +1353,17 @@ msgid "Go to end of book" msgstr "책의 마지막장으로 가기" -#: src/ui/navBar.ui:284 src/ui/shortcutsWindow.ui:268 -#: src/ui/shortcutsWindow.ui:304 +#: src/ui/navBar.ui:284 src/ui/shortcutsWindow.ui:270 +#: src/ui/shortcutsWindow.ui:306 msgid "Go to previous page" msgstr "이전 페이지로 가기" -#: src/ui/navBar.ui:298 src/ui/shortcutsWindow.ui:275 +#: src/ui/navBar.ui:298 src/ui/shortcutsWindow.ui:277 msgid "Go back to previous location" msgstr "이전 위치로 돌아가기" -#: src/ui/navBar.ui:387 src/ui/shortcutsWindow.ui:261 -#: src/ui/shortcutsWindow.ui:297 +#: src/ui/navBar.ui:387 src/ui/shortcutsWindow.ui:263 +#: src/ui/shortcutsWindow.ui:299 msgid "Go to next page" msgstr "다음 페이지로 가기" @@ -1398,7 +1412,7 @@ msgstr "번역하기" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "책에서 찾기" @@ -1428,7 +1442,7 @@ msgstr "오른쪽 버튼 클릭" #: src/ui/preferenceWindow.ui:142 src/ui/shortcutsWindow.ui:13 -#: src/ui/shortcutsWindow.ui:334 +#: src/ui/shortcutsWindow.ui:336 msgid "General" msgstr "일반" @@ -1556,7 +1570,7 @@ msgstr "파일 열기" #: src/ui/shortcutsWindow.ui:24 src/ui/shortcutsWindow.ui:134 -#: src/ui/shortcutsWindow.ui:352 +#: src/ui/shortcutsWindow.ui:354 msgid "Close current window" msgstr "현재 창 닫기" @@ -1568,13 +1582,13 @@ msgid "Grid view" msgstr "그리드 보기" -#: src/ui/shortcutsWindow.ui:85 src/ui/shortcutsWindow.ui:283 +#: src/ui/shortcutsWindow.ui:85 src/ui/shortcutsWindow.ui:285 msgid "Go to location" msgstr "위치로 가기" #: src/ui/shortcutsWindow.ui:98 msgid "E-book Viewer Shortcuts" -msgstr "E book 뷰어 단축키" +msgstr "E-book 뷰어 단축키" #: src/ui/shortcutsWindow.ui:102 msgid "File" @@ -1596,43 +1610,43 @@ msgid "Start/stop text-to-speech" msgstr "텍스트 음성 변환 시작/중지" -#: src/ui/shortcutsWindow.ui:205 src/ui/shortcutsWindow.ui:388 +#: src/ui/shortcutsWindow.ui:206 src/ui/shortcutsWindow.ui:391 msgid "Restore zoom level" msgstr "확대/축소 수준 복원" -#: src/ui/shortcutsWindow.ui:212 +#: src/ui/shortcutsWindow.ui:214 msgid "Toggle fullscreen" msgstr "전체화면 전환" -#: src/ui/shortcutsWindow.ui:219 +#: src/ui/shortcutsWindow.ui:221 msgid "Show contents" msgstr "콘텐츠 표시" -#: src/ui/shortcutsWindow.ui:226 +#: src/ui/shortcutsWindow.ui:228 msgid "Show table of contents" msgstr "목차 표시" -#: src/ui/shortcutsWindow.ui:233 +#: src/ui/shortcutsWindow.ui:235 msgid "Show annotations" msgstr "주석 표시" -#: src/ui/shortcutsWindow.ui:240 +#: src/ui/shortcutsWindow.ui:242 msgid "Show bookmarks" msgstr "책갈피 표시" -#: src/ui/shortcutsWindow.ui:247 +#: src/ui/shortcutsWindow.ui:249 msgid "Show primary menu" msgstr "기본 메뉴 표시" -#: src/ui/shortcutsWindow.ui:257 +#: src/ui/shortcutsWindow.ui:259 msgid "Navigation" msgstr "탐색" -#: src/ui/shortcutsWindow.ui:293 +#: src/ui/shortcutsWindow.ui:295 msgid "Touchpad Gestures" msgstr "터치패드 제스처" -#: src/ui/shortcutsWindow.ui:330 +#: src/ui/shortcutsWindow.ui:332 msgid "Image Viewer Shortcuts" msgstr "이미지 뷰어 단축키" @@ -1674,7 +1688,8 @@ #: src/ui/ttsDialog.ui:57 msgid "Make sure the selected text-to-speech program is correctly installed." -msgstr "선택한 텍스트 음성 변환 프로그램이 올바르게 설치되어 있는지 확인합니다." +msgstr "" +"선택한 텍스트 음성 변환 프로그램이 올바르게 설치되어 있는지 확인합니다." #: src/ui/ttsDialog.ui:63 msgid "eSpeak NG" @@ -1689,8 +1704,14 @@ msgstr "Festival" #: src/ui/ttsDialog.ui:137 -msgid "The environment variable $FOLIATE_TTS_LANG is available for the language code of the book, or use $FOLIATE_TTS_LANG_LOWER for the all lower case code." -msgstr "환경 변수 $FOLIATE_TTS_LANG은(는) 책의 언어 코드에 사용할 수 있거나 모든 소문자 코드에 $FOLIATE_TTS_LANG_LOWER을(를) 사용합니다." +msgid "" +"The environment variable $FOLIATE_TTS_LANG is available for " +"the language code of the book, or use $FOLIATE_TTS_LANG_LOWER for " +"the all lower case code." +msgstr "" +"환경 변수 $FOLIATE_TTS_LANG은(는) 책의 언어 코드에 사용할 수 " +"있거나 모든 소문자 코드에 $FOLIATE_TTS_LANG_LOWER을(를) 사용합니다." +"" #: src/ui/ttsDialog.ui:156 msgid "Test Your Configuration" @@ -1960,7 +1981,7 @@ #: src/schemes.js:238 msgid "Animator" -msgstr "만화 영화[동영상] 제작자" +msgstr "만화 영화 제작자" #: src/schemes.js:239 msgid "Annotator" @@ -2036,11 +2057,11 @@ #: src/schemes.js:258 msgid "Binding designer" -msgstr "제본용 표지 디자이너" +msgstr "제본 디자이너" #: src/schemes.js:259 msgid "Bookjacket designer" -msgstr "책 커버 디자이너" +msgstr "책표지 디자이너" #: src/schemes.js:260 msgid "Book designer" @@ -2048,15 +2069,15 @@ #: src/schemes.js:261 msgid "Book producer" -msgstr "책 제작자" +msgstr "책 제작도구" #: src/schemes.js:262 msgid "Blurb writer" -msgstr "안내문 작가" +msgstr "안내문 작성자" #: src/schemes.js:263 msgid "Binder" -msgstr "제본 기술자" +msgstr "제본도구" #: src/schemes.js:264 msgid "Bookplate designer" @@ -2064,15 +2085,15 @@ #: src/schemes.js:265 msgid "Broadcaster" -msgstr "방송인" +msgstr "방송 진행자" #: src/schemes.js:266 msgid "Braille embosser" -msgstr "점자 제판가" +msgstr "점자 양각도구" #: src/schemes.js:267 msgid "Bookseller" -msgstr "서적상" +msgstr "서점" #: src/schemes.js:268 msgid "Caster" @@ -2088,7 +2109,7 @@ #: src/schemes.js:271 msgid "Client" -msgstr "의뢰인" +msgstr "클라이언트" #: src/schemes.js:272 msgid "Calligrapher" @@ -2990,42 +3011,797 @@ msgid "Writer of supplementary textual content" msgstr "증보판의 원문 콘텐츠 작성자" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate는 간단하고 현대적인 GTK eBook 뷰어입니다." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "기능 포함:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "2페이지 보기 및 스크롤된 보기" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "글꼴 및 줄 간격 사용자 맞춤" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "밝게, 세피아, 어둡게, 반전 모드" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "챕터 표시가 있는 진행률 슬라이더 읽기" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "책갈피 및 주석" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "빠른 사전 조회" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 +msgid "Fixed a performance issue with zipped files (including EPUB files)" +msgstr "압축된 파일(EPUB 파일 포함)의 성능 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 +msgid "Fix UI when running with libhandy 1.x" +msgstr "libhandy 1.x로 실행할 때의 UI 문제 수정하기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 +msgid "Fixed automatic layout" +msgstr "자동 레이아웃 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 +msgid "Changes:" +msgstr "변경사항:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 +msgid "Added support for opening HTML files" +msgstr "HTML 파일 열기에 대한 지원 추가됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 +msgid "Consistent inner and outer margins" +msgstr "일관된 내부 및 외부 여백" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 +msgid "The automatic layout no longer supports 4 columns" +msgstr "자동 레이아웃은 더 이상 4개의 열을 지원하지 않습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 +msgid "Fixed long words overflowing" +msgstr "긴 단어 오버플로링 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 +msgid "Fixed custom themes not saved across sessions" +msgstr "세션에 걸쳐 저장되지 않은 사용자 지정 테마 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 +msgid "Fixed shortcuts for key pads" +msgstr "키패드에 대한 단축키 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 +msgid "Fixed opening non-UTF-8 zipped FB2 files" +msgstr "UTF-8 압축되지 않은 FB2 파일 열기 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 +msgid "Fixed books not opening on GNOME 40" +msgstr "GNOME 40에서 열리지 않는 책들 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 +msgid "Improved support for touch screens" +msgstr "터치 스크린에 대한 향상된 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 +msgid "OPDS credentials can now be remembered" +msgstr "이제 OPDS 자격 증명을 기억할 수 있습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 +msgid "Various fixes for GNOME 3.38" +msgstr "GNOME 3.38에 대한 다양한 수정 사항" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 +msgid "Fixed Wiktionary internal links" +msgstr "위키낱말사전 내부 링크 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 +msgid "Added Basque, Korean, and Norwegian translations" +msgstr "바스크어, 한국어 및 노르웨이어 번역 추가됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 +msgid "Fixed unable to open some EPUB files" +msgstr "일부 EPUB 파일을 열 수 없는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 +msgid "Fixed unable to open Mobipocket files" +msgstr "Mobilepocket 파일을 열 수 없는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 +msgid "Improved metadata display" +msgstr "향상된 메타데이터 디스플레이" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 +msgid "Improved FictionBook rendering" +msgstr "향상된 FictionBook 렌더링" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 +msgid "Improved UI for acquiring books from OPDS" +msgstr "OPDS에서 책들을 가져오기 위한 향상된 UI" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 +msgid "Fixed unique identifier extraction for EPUB files" +msgstr "EPUB 파일의 고유 식별자 추출 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 +msgid "Fixed missing window icon" +msgstr "누락된 창 아이콘 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 +msgid "Fixed TTS environment variables not set when using Flatpak" +msgstr "Flatpak 사용 시, TTS 환경 변수가 설정되지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 +msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" +msgstr "TTS 구성을 테스트할 때 eSpeak NG 음성이 선택되지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 +msgid "" +"Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" +msgstr "" +"\"Invert\"를 사용하도록 설정한 경우, 잘못된 \"__ibooks_internal_teme\" 속성 " +"문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 +msgid "OPDS catalogs:" +msgstr "OPDS 카탈로그:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 +msgid "Catalogs are now opened in the main library window" +msgstr "이제 카탈로그가 기본 라이브러리 창에서 열립니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 +msgid "View current location" +msgstr "현재 위치 보기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 +msgid "Go to catalog start page" +msgstr "카탈로그 시작 페이지로 이동" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 +msgid "Reload catalog" +msgstr "카탈로그 다시 불러오기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 +msgid "Add current feed to catalogs" +msgstr "카탈로그에 현재 피드 추가" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 +msgid "HTTP authentication support" +msgstr "HTTP 인증 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 +msgid "Other changes:" +msgstr "기타 변경사항:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 +msgid "" +"Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" +msgstr "FictionBook(.fb2, .fb2.zip) 파일의 고유 식별자 추출 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 +msgid "Fixed newlines being ignored when copying text" +msgstr "텍스트를 복사할 때 무시되는 새 줄 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 +msgid "“Turn page on tap” is now disabled in non-paginated layouts" +msgstr "" +"페이지가 매겨지지 않은 레이아웃에서 \"화면터치 또는 클릭시 페이지 넘기기\"가 " +"비활성화 되었습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 +msgid "Opening a book from the library view now closes the library window" +msgstr "이제 라이브러리 보기에서 책을 열면 라이브러리 창이 닫힙니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 +msgid "Language and publication dates in metadata are now parsed and formatted" +msgstr "이제 메타 데이터의 언어 및 게시 날짜가 구문 분석되고 형식이 지정됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 +msgid "Export annotations from the library view" +msgstr "라이브러리 보기에서 주석 내보내기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 +msgid "Fixed blurry book covers on HiDPI" +msgstr "HiDPI의 흐릿한 책 표지 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 +msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" +msgstr "Ebooks 및 Project Gutenberg에 대한 OPDS 링크 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 +msgid "Fixed wrong view icon on startup" +msgstr "시작 시 잘못된 보기 아이콘 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 +msgid "Library:" +msgstr "라이브러리:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 +msgid "A library view showing recent books and reading progress" +msgstr "최근 책과 읽기 진행상황을 보여주는 라이브러리 보기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 +msgid "Search books by metadata" +msgstr "메타데이터별 서적 검색" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 +msgid "E-book discovery with OPDS" +msgstr "OPDS를 사용한 E-book 검색" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 +msgid "New supported formats:" +msgstr "새로 지원되는 형식:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 +msgid "FictionBook (.fb2, .fb2.zip)" +msgstr "FictionBook (.fb2, .fb2.zip)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 +msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" +msgstr "만화책 아카이브 (.cbr, .cbz, .cbt, .cb7)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 +msgid "Plain text (.txt)" +msgstr "일반 텍스트(.txt)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 +msgid "Unpacked EPUB files" +msgstr "압축 해제된 EPUB 파일" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 +msgid "Layout:" +msgstr "레이아웃:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 +msgid "Option to set maximum page width" +msgstr "최대 페이지 너비를 설정하는 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 +msgid "" +"The \"Automatic\" layout will now show four columns when the page width is " +"wide" +msgstr "이제 \"자동\" 레이아웃에는 페이지 폭이 넓을 때 네 개의 열이 표시됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 +msgid "Image viewer:" +msgstr "이미지 뷰어:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 +msgid "" +"Improved image viewer, with new shortcuts and the ability to rotate and " +"invert images" +msgstr "" +"새 단축키 및 이미지를 회전 및 반전할 수 있는 기능을 갖춘 향상된 이미지 뷰어" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 +msgid "" +"Option to disable image viewer, or to open images on double, middle, or " +"right click" +msgstr "" +"이미지 뷰어를 비활성화하거나 두 번, 중간 또는 오른쪽 클릭으로 이미지를 여는 " +"옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 +msgid "Text-to-speech:" +msgstr "텍스트 음성 변환:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 +msgid "Improved text-to-speech configuration UI" +msgstr "텍스트 음성 변환 구성 UI 개선됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 +msgid "Ability to set text-to-speech voice based on book language" +msgstr "책 언어에 따라 텍스트 음성변환 음성 지정 기능" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 +msgid "Import annotations from JSON" +msgstr "JSON에서 주석 가져오기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 +msgid "Search in annotations" +msgstr "주석으로 검색" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 +msgid "Annotations are now sorted in the same order as they appear in the book" +msgstr "이제 주석이 책에 표시된 것과 같은 순서로 정렬됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 +msgid "Security:" +msgstr "보안:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 +msgid "" +"\"Allow Unsafe Content\" now only enables JavaScript; external content will " +"no longer be loaded" +msgstr "" +"이제 \"불안전한 콘텐츠 허용\"은 JavaScript만 사용하도록 설정되고 외부 콘텐츠" +"는 더 이상 로드되지 않습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 +msgid "WebKit processes are now sandboxed" +msgstr "이제 WebKit 프로세스가 샌드박스로 처리되었습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 +msgid "Other featues and fixes:" +msgstr "기타 특징 및 수정사항:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 +msgid "Improved support for vertical and right-to-left books" +msgstr "세로 및 오른쪽에서 왼쪽 읽기 책에 대한 향상된 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 +msgid "Support for StarDict dictionaries" +msgstr "StarDict 사전 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 +msgid "Fixed current location not preserved when resizing" +msgstr "크기 조정 시 현재 위치가 보존되지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 +msgid "Fixed auto-hiding header bar under some themes" +msgstr "일부 테마에서 머리글 표시줄 자동 정렬 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 +msgid "Command-line options for showing version and adding books to library" +msgstr "버전을 표시하고 라이브러리에 책을 추가하기 위한 명령줄 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 +msgid "Option to clear or disable cache" +msgstr "캐시를 지우거나 사용하지 않는 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 +msgid "" +"When an HTML page contains invalid self-closing anchor tags, it is now " +"parsed as XHTML" +msgstr "" +"HTML 페이지에 유효하지 않은 자동 닫힘 앵커 태그가 포함되어 있으면 이제 XHTML" +"로 구문 분석됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 +msgid "Fixes:" +msgstr "수정사항:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 +msgid "Fixed wrong version number" +msgstr "잘못된 버전 번호 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 +msgid "" +"Fixed dictionary, translation, and Wikipedia not working in the Snap package" +msgstr "Snap 패키지에서 작동하지 않는 사전, 번역 및 위키백과 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 +msgid "New features:" +msgstr "새로운 기능:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 +msgid "New and improved icon" +msgstr "새롭고 향상된 아이콘" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 +msgid "Option to disable turn page on tap" +msgstr "화면터치 또는 클릭시 페이지 넘기기 비활성화 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 +msgid "A menu on the welcome screen for opening recent files" +msgstr "최근 파일을 여는 시작 화면의 메뉴" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 +msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" +msgstr "ToC, 주석 및 북마크를 표시하기 위한 복원된 단축키" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 +msgid "Fixed application not translated" +msgstr "번역되지 않은 응용프로그램 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 +msgid "Interface:" +msgstr "인터페이스:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 +msgid "A redesigned interface that works better for smaller screens" +msgstr "작은 화면에 더 적합한 재설계된 인터페이스" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 +msgid "Improved fullscreen mode with an overlaid headerbar" +msgstr "오버레이 헤더표시줄로 향상된 전체화면 모드" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 +msgid "" +"The headerbar and the progress bar now auto-hide, for a distraction-free " +"reading experience" +msgstr "" +"이제 머리글 표시줄과 진행 표시줄이 자동으로 숨겨져 산만하지 않은 판독이 가능" +"합니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 +msgid "" +"Various location information, as well as a clock, can now be displayed in " +"the footer" +msgstr "이제 다양한 위치 정보와 시계를 바닥글에 표시할 수 있습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 +msgid "" +"A new location popover (Ctrl + L) that shows reading time estimates and " +"allows skipping to locations" +msgstr "예상 읽기 시간을 표시하고 위치로 건너뛸 수 있는 새 위치 팝업(Ctrl + L)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 +msgid "" +"E-reader style navigation: go to the previous or next page by tapping on the " +"left or right part of the view; tap on the middle to toggle header bar and " +"progress bar" +msgstr "" +"E-reader 스타일 탐색: 보기의 왼쪽 또는 오른쪽 부분을 눌러 이전 또는 다음 페이" +"지로 이동하고, 머리글 표시줄과 진행 표시줄을 전환하려면 가운데를 누릅니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 +msgid "Annotations, bookmarks, and find results now show chapter titles" +msgstr "주석, 책갈피 및 찾기 결과에 장 제목이 표시됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 +msgid "When looking up words in dictionaries, the query can now be edited" +msgstr "사전에서 단어를 조회할 때, 이제 쿼리를 편집할 수 있습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 +msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" +msgstr "메타데이터(Ctrl + I) 및 기본 설정을 볼 수 있는 새 단축키(Ctrl + ,)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 +msgid "" +"A new traditional menubar, which may be displayed depending on the desktop " +"environment" +msgstr "데스크톱 환경에 따라 표시될 수 있는 새로운 기존 메뉴 모음" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 +msgid "" +"Option to use a traditional titlebar and menubar instead of a headerbar " +"(experimental)" +msgstr "" +"머리글 표시줄 대신 기존 제목 표시줄과 메뉴 모음을 사용하는 옵션(실험적)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 +msgid "Reading:" +msgstr "읽기:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 +msgid "Continuous scrolling layout" +msgstr "연속 스크롤 레이아웃" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 +msgid "" +"Option to show decorative shadows that mimic the appearance of a real book" +msgstr "실제 책의 외관을 모방한 장식 그림자를 보여주는 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 +msgid "Ability to zoom in and zoom out" +msgstr "확대 및 축소 기능" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 +msgid "Improved image viewer with \"save as\" option" +msgstr "다른 이름으로 저장 옵션을 사용하여 향상된 이미지 뷰어" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 +msgid "Open copies of a book in new windows (Ctrl + N)" +msgstr "새 창에서 책 사본 열기(Ctrl + N)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 +msgid "Reload book (Ctrl + R)" +msgstr "책 다시 불러오기 (Ctrl + R)" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 +msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" +msgstr "새로운 기본 제공 테마: 회색, Solarized, Gruvbox, 노르" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 +msgid "Text selection:" +msgstr "텍스트 선택:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 +msgid "Ability to select text across pages" +msgstr "페이지 전체에서 텍스트를 선택하는 기능" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 +msgid "Find selected text in book" +msgstr "책에서 선택한 텍스트 찾기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 +msgid "Speak selected text or from the selected locatio" +msgstr "선택한 텍스트 또는 선택한 위치에서 말하기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 +msgid "Annotations:" +msgstr "주석:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 +msgid "Spellcheck notes" +msgstr "맞춤법 노트" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 +msgid "Export annotations to Markdown" +msgstr "마크다운에 주석 내보내기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 +msgid "Options to use custom colors for highlights" +msgstr "강조 표시에 사용자 지정 색상을 사용하는 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 +msgid "For publishers and developers:" +msgstr "게시자 및 개발자의 경우:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 +msgid "" +"Support for Apple Books theme attribute, which allows books to detect themes " +"without JavaScript" +msgstr "" +"JavaScript 없이 책을 통해 테마를 검색할 수 있는 Apple Books 테마 속성 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 +msgid "WebKit's developer tools can be enabled" +msgstr "WebKit의 개발자 도구를 활성화할 수 있습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 +msgid "Breaking changes:" +msgstr "주요 변경사항:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 +msgid "The settings schemas has been reorganized" +msgstr "설정 스키마가 재구성되었습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 +msgid "The format for custom themes has changed" +msgstr "사용자 지정 테마의 형식이 변경되었습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 +msgid "Locations are now 1024 characters in size" +msgstr "이제 위치의 크기가 1024자입니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 +msgid "Bug fixes:" +msgstr "버그 수정:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 +msgid "Fixed not restoring exact last location" +msgstr "정확한 마지막 위치를 복원하지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 +msgid "Fixed navigation not working with scrolled layout" +msgstr "스크롤된 레이아웃에서 탐색이 작동하지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 +msgid "Fixed font size not changing when the book uses absolute-size keywords" +msgstr "" +"책이 절대 크기 키워드를 사용할 때 글꼴 크기가 변경되지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 +msgid "Fixed text cut off at margin edge" +msgstr "여백 가장자리에서 잘린 텍스트 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 +msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" +msgstr "파일 이름에 \"#\" 또는 \"?\"이 있는 책을 열 수 없는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 +msgid "" +"Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" +msgstr "Flatpak 버전이 .mobi, .azw 및 .azw3 파일을 열 수 없는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 +msgid "Improved Wiktionary lookup, now with links and example sentences" +msgstr "향상된 위키낱말사전 조회, 링크 및 예제 문장 제공" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 +msgid "Improved popover footnote extraction and formatting" +msgstr "개선된 팝오버 각주 추출 및 서식" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 +msgid "Added option to export annotations to BibTeX" +msgstr "BibTeX로 주석을 내보내기 위한 옵션 추가됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 +msgid "Fixed table of contents navigation not working with some books" +msgstr "일부 책과 함께 작동하지 않는 목차 탐색 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 +msgid "Fixed not being able to zoom images with Kindle books" +msgstr "Kindle 북스에서 이미지를 확대/축소할 수 없는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 +msgid "Fixed not being able to open books with .epub3 filename extension" +msgstr ".epub3 파일 이름 확장자로 책을 열 수 없는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 +msgid "Fixed temporary directory not being cleaned after closing" +msgstr "닫은 후 임시 디렉토리가 정리되지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 +msgid "Fixed F9 shortcut not working" +msgstr "F9 단축키가 작동하지 않는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 +msgid "Updated translations" +msgstr "업데이트된 번역" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 +msgid "External resources and JavaScript are now blocked by default" +msgstr "이제 외부 리소스 및 JavaScript가 기본적으로 차단됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 +msgid "Basic text-to-speech support" +msgstr "기본 텍스트 음성변환 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 +msgid "Export annotations to HTML, plain text, or JSON" +msgstr "HTML, 일반 텍스트 또는 JSON으로 주석 내보내기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 +msgid "Support for viewing .mobi, .azw, and .azw3 files" +msgstr ".mobi, .azw 및 .azw3 파일 보기 지원 " + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 +msgid "New alternative sidebar UI" +msgstr "새로운 대체 사이드바 UI" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 +msgid "Lookup words in Wikipedia and offline dictionaries" +msgstr "위키백과 및 오프라인 사전에서 단어 검색" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 +msgid "Translate passages with Google Translate" +msgstr "Google 번역으로 구절 번역" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 +msgid "Configure default action when words are selected" +msgstr "단어를 선택할 때 기본 수행 구성하기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 +msgid "Experimental popup footnote support" +msgstr "실험적인 팝업 각주 지원" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 +msgid "Ability to find within only the current chapter" +msgstr "현재 장 내에서만 찾을 수 있는 기능" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 +msgid "Fixed CPU spikes when left open" +msgstr "린 상태로 두면 CPU가 급증하는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 +msgid "Fixed highlights not rendering at the correct positions" +msgstr "올바른 위치에서 렌더링되지 않는 강조 표시 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 +msgid "Fixed crashing when opening files" +msgstr "파일을 열 때 충돌하는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 +msgid "Customize page margins and brightness" +msgstr "페이지 여백 및 밝기 사용자 지정" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 +msgid "Tweak the theme colors, or add your own custom themes" +msgstr "테마 색상 트윅 또는 사용자 지정 테마 추가" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 +msgid "Ability to zoom and copy images" +msgstr "이미지 확대/축소 및 복사 기능" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 +msgid "Option to auto-hide cursor" +msgstr "커서를 자동으로 숨기는 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 +msgid "See reading time left by hovering over the reading progress slider" +msgstr "읽기 진행률 슬라이더 위를 맴돌면서 남은 읽기 시간 보기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 +msgid "Fixed some books not rendering sometimes" +msgstr "때때로 렌더링되지 않는 일부 책 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 +msgid "Fixed images being too wide in some cases" +msgstr "경우에 따라 이미지가 너무 넓어지는 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 +msgid "Option to switch between left and full justification" +msgstr "왼쪽 정렬과 전체 정렬 사이를 전환하는 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 +msgid "New layout option: single-column paginated view" +msgstr "새 레이아웃 옵션: 단일 열 페이지 보기" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 +msgid "Fixed:" +msgstr "문제 수정됨:" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 +msgid "" +"Generated locations are now stored in the cache directory rather than " +"localStorage" +msgstr "생성된 위치는 이제 localStorage가 아닌 캐시 디렉토리에 저장됩니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 +msgid "Allow font size adjustment when using publisher fonts" +msgstr "게시자 글꼴을 사용할 때 글꼴 크기 조정 허용" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 +msgid "" +"Fixed reading progress slider not appearing after localStorage quota is " +"exceeded" +msgstr "" +"localStorage 할당량을 초과 한 후, 읽기 진행률 슬라이더가 표시되지 않는 문제 " +"수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 +msgid "Touchpad gestures and ability to scroll through pages" +msgstr "터치패드 제스처 및 페이지 스크롤 기능" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 +msgid "Fullscreen mode" +msgstr "전체화면 모드" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 +msgid "Option to hide reading progress bar" +msgstr "읽기 진행률 표시줄 숨김 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 +msgid "Option to disable dictionary" +msgstr "사전 비활성화 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 +msgid "Option to use publisher font" +msgstr "게시자 글꼴 사용 옵션" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 +msgid "Restoring reading progress is now smooth and jank-free" +msgstr "읽기 진행상황 복원이 이제 원활하고 버벅거림이 없습니다" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 +msgid "Fixed custom styles not applying in some cases" +msgstr "경우에 따라 적용되지 않는 사용자 지정 스타일 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 +msgid "Fixed invalid AppData file" +msgstr "잘못된 AppData 파일 문제 수정됨" + +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 +msgid "Initial release" +msgstr "초기 릴리스" + #: data/com.github.johnfactotum.Foliate.gschema.xml:23 msgid "Store URIs" msgstr "URI 저장소" @@ -3035,8 +3811,12 @@ msgstr "파일 URI 저장 여부" #: data/com.github.johnfactotum.Foliate.gschema.xml:29 -msgid "Whether to save generated locations to cache (the locations are needed for calculating percentages of locations in book)" -msgstr "생성된 위치를 캐시에 저장할지 여부 (책에서 위치의 비율을 계산하는 데 필요한 위치)" +msgid "" +"Whether to save generated locations to cache (the locations are needed for " +"calculating percentages of locations in book)" +msgstr "" +"생성된 위치를 캐시에 저장할지 여부 (책에서 위치의 비율을 계산하는 데 필요한 " +"위치)" #: data/com.github.johnfactotum.Foliate.gschema.xml:33 msgid "Cache covers" @@ -3075,8 +3855,13 @@ msgstr "사전" #: data/com.github.johnfactotum.Foliate.gschema.xml:54 -msgid "Identifier of the default dictionary. Dictionaries from dictd and stardict, if any, are available with the \"dictd_\" and \"stardict_\" prefix added to the database ID" -msgstr "기본 사전의 식별자입니다. 데이터베이스 ID에 \"dictd_\" 및 \"stardct_\" 접두사가 추가된 dictd 및 stardict의 사전을 사용할 수 있습니다" +msgid "" +"Identifier of the default dictionary. Dictionaries from dictd and stardict, " +"if any, are available with the \"dictd_\" and \"stardict_\" prefix added to " +"the database ID" +msgstr "" +"기본 사전의 식별자입니다. 데이터베이스 ID에 \"dictd_\" 및 \"stardct_\" 접두사" +"가 추가된 dictd 및 stardict의 사전을 사용할 수 있습니다" #: data/com.github.johnfactotum.Foliate.gschema.xml:58 msgid "Target language of translation" @@ -3107,8 +3892,12 @@ msgstr "이미지 뷰어 열기 이벤트" #: data/com.github.johnfactotum.Foliate.gschema.xml:74 -msgid "DOM event type for viewing images; the special value \"middleclick\" is available for the middle click event" -msgstr "이미지를 볼 수 있는 DOM 이벤트 유형; 마우스 가운데 버튼 클릭 이벤트에는 특별 값 \"가운데버튼클릭\"을 사용할 수 있음" +msgid "" +"DOM event type for viewing images; the special value \"middleclick\" is " +"available for the middle click event" +msgstr "" +"이미지를 볼 수 있는 DOM 이벤트 유형; 마우스 가운데 버튼 클릭 이벤트에는 특별 " +"값 \"가운데버튼클릭\"을 사용할 수 있음" #: data/com.github.johnfactotum.Foliate.gschema.xml:79 msgid "Command to execute for text-to-speech" @@ -3131,8 +3920,12 @@ msgstr "헤더표시줄 자동 숨김" #: data/com.github.johnfactotum.Foliate.gschema.xml:94 -msgid "Whether to hide the headerbar automatically (this setting has no effect if skeuomorphism or sidebar is enabled)" -msgstr "헤더표시줄을 자동으로 숨길지 여부(이 설정은 스큐어모피즘 또는 사이드바를 활성화할 경우 영향을 미치지 않음)" +msgid "" +"Whether to hide the headerbar automatically (this setting has no effect if " +"skeuomorphism or sidebar is enabled)" +msgstr "" +"헤더표시줄을 자동으로 숨길지 여부(이 설정은 스큐어모피즘 또는 사이드바를 활성" +"화할 경우 영향을 미치지 않음)" #: data/com.github.johnfactotum.Foliate.gschema.xml:99 msgid "Information to be displayed on the left footer" @@ -3143,8 +3936,13 @@ msgstr "오른쪽 바닥글에 표시할 정보" #: data/com.github.johnfactotum.Foliate.gschema.xml:109 -msgid "If true, you can go to the previous or next page by tapping on the left or right part of the view; tap on the middle to toggle header bar and progress bar" -msgstr "참일 경우, 보기의 왼쪽 또는 오른쪽을 눌러 이전 또는 다음 페이지로 이동할 수 있습니다. 가운데를 눌러 머리글 표시줄과 진행 표시줄을 전환하십시오" +msgid "" +"If true, you can go to the previous or next page by tapping on the left or " +"right part of the view; tap on the middle to toggle header bar and progress " +"bar" +msgstr "" +"참일 경우, 보기의 왼쪽 또는 오른쪽을 눌러 이전 또는 다음 페이지로 이동할 수 " +"있습니다. 가운데를 눌러 머리글 표시줄과 진행 표시줄을 전환하십시오" #: data/com.github.johnfactotum.Foliate.gschema.xml:116 msgid "Prefer dark GTK theme" @@ -3168,8 +3966,8 @@ msgstr "여백" #: data/com.github.johnfactotum.Foliate.gschema.xml:137 -msgid "Page margin in percentage" -msgstr "페이지 여백 비율" +msgid "Page margin in pixels" +msgstr "페이지 여백(픽셀)" #: data/com.github.johnfactotum.Foliate.gschema.xml:141 msgid "Max width" @@ -3222,8 +4020,13 @@ msgstr "반전 페이지" #: data/com.github.johnfactotum.Foliate.gschema.xml:182 -msgid "A value under 1 darkens the page, while a value over 1 brightens it. A value of 0 will make the page completely black, while a value of 1 leaves the brightness unchanged" -msgstr "값이 1보다 작으면 페이지가 어두워지고 1보다 크면 페이지가 밝아집니다. 값이 0이면 페이지가 완전히 검은색인 반면 값이 1이면 밝기는 변경되지 않습니다" +msgid "" +"A value under 1 darkens the page, while a value over 1 brightens it. A value " +"of 0 will make the page completely black, while a value of 1 leaves the " +"brightness unchanged" +msgstr "" +"값이 1보다 작으면 페이지가 어두워지고 1보다 크면 페이지가 밝아집니다. 값이 0" +"이면 페이지가 완전히 검은색인 반면 값이 1이면 밝기는 변경되지 않습니다" #: data/com.github.johnfactotum.Foliate.gschema.xml:186 msgid "Footnote preview" @@ -3258,12 +4061,14 @@ msgstr "스큐어모피즘(사물모습대로 디자인하는 기법)" #: data/com.github.johnfactotum.Foliate.gschema.xml:207 -msgid "If true, the book is decoratively presented in a way that resembles physical books" +msgid "" +"If true, the book is decoratively presented in a way that resembles physical " +"books" msgstr "참일 경우, 이 책은 실제 책과 유사한 방식으로 장식이 되어 출판됩니다" #: data/com.github.johnfactotum.Foliate.gschema.xml:211 msgid "Auto-hide cursor" -msgstr "커서 숨김 자동" +msgstr "커서 자동 숨김" #: data/com.github.johnfactotum.Foliate.gschema.xml:212 msgid "Whether to hide the cursor automatically" @@ -3346,8 +4151,10 @@ msgstr "추적기 사용" #: data/com.github.johnfactotum.Foliate.gschema.xml:283 -msgid "If true, will try to use Tracker (the file indexer) to get file locations" -msgstr "참일 경우, 추적기(파일 인덱서)를 사용하여 파일 위치를 가져오려고 시도합니다" +msgid "" +"If true, will try to use Tracker (the file indexer) to get file locations" +msgstr "" +"참일 경우, 추적기(파일 인덱서)를 사용하여 파일 위치를 가져오려고 시도합니다" #: data/com.github.johnfactotum.Foliate.gschema.xml:287 msgid "OPDS download action" diff -Nru foliate-2.6.3ubuntu1/po/LINGUAS foliate-2.6.4/po/LINGUAS --- foliate-2.6.3ubuntu1/po/LINGUAS 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/LINGUAS 2022-01-13 19:59:57.000000000 +0000 @@ -6,6 +6,7 @@ id ie it +ko nb nl nn diff -Nru foliate-2.6.3ubuntu1/po/nb.po foliate-2.6.4/po/nb.po --- foliate-2.6.3ubuntu1/po/nb.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/nb.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-08-29 19:59+0200\n" "Last-Translator: Kay Siver Bø <63042612+tupubozu@users.noreply.github.com>\n" "Language-Team: \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -359,7 +359,7 @@ msgid "translator-credits" msgstr "Kay Siver Bø" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "En enkel og moderne e-bok fremviser" @@ -852,7 +852,7 @@ msgstr "Velg noe tekst for å legge til kommentarer." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Kommentarer" @@ -1165,7 +1165,7 @@ msgstr "" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Auto-orddeling" @@ -1414,7 +1414,7 @@ msgstr "Oversett" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Finn i bok" @@ -3013,281 +3013,281 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate er en enkel og moderne GTK e-bok fremviser." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Programfunksjoner inkluderer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "To-side visning og rullende visning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Forandelig skrifttype og linjeavstand" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Lys, brunnyansert, mørk og invertert modus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Lese-fremgangsindikator med kapittelmerker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Bokmerker og kommentarer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Raskt ordbokksoppslag" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Endringer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Fikset tilfeller av for brede bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Fikset F9-snarvei" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Fikset noen boker som ikke renderet av og til" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 #, fuzzy msgid "Improved support for touch screens" msgstr "Forbedret støtte for vertikale og høyre-til-venstre bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Fikset åpningsproblem for noen EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Fikset åpningsproblem for Mobipocket-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Forbedret metadata fremvisning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Forbedret FictionBook rendering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "Forbedret UI for annskaffelse av bøker fra OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Fikset unik indentifikator uthenting for EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Fikset manglende vidusikon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "Fikset TTS-miljøvariabler ikke satt ved bruk av Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "Fikset eSpeak NG stemme ikke valgt når TTS konfigurasjontestes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Fikset feil: “__ibooks_internal_theme” attribute when “Invert” is enabled" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS kataloger:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Kataloger er nå åpnet i hovedbiblioteksvinduet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Vis nåværende posisjon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Gå til katalogstartside" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Last inn katalog på nytt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Legg til nåverende nyhetsstrøm i kataloger" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "HTTP autentiseringsstøtte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Andre endringer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Fikset unik identifikator uthenting for FictionBook (.fb2, .fb2.zip) filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Fikset nylinjeringnorering ved tekstkopiering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "“Bla side ved berøring” er nå deaktivert i ikke-sidede oppsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "Å åpne ei bok fra biblioteksvisninen stenger nå biblioteksvinduet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "Språk og publikasjonsdoatoer i metadata er no parset og formatert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Eksporter kommentarer fra biblioteksvisningen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Fikset uklare bokomslag på HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Fikset OPDS-linker til Standard Ebooks og Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Fikset feil visningsikon på oppstart" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Bibliotek:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "Biblioteksvisning som viser nylige bøker og lese-fermgang" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Søk etter bøker med metadata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "E-bok oppdagelse med OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nye støttede formater:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Comic book archive (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Ren tekst (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Upakkede EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Oppsett:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Valg om å sette maksimal sidebredde" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3295,11 +3295,11 @@ "Det \"automatiske\" oppsettet vil nå vise fire kolonner når sidebredden er " "bred" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Bildeviser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3307,7 +3307,7 @@ "Forbedret bildeviser, med nye snarveier og evne til å rotere og invertere " "bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3315,35 +3315,35 @@ "Valg om å deaktivere bildeviser, eller å åpne ved dobbel-, middel- eller " "høyreklikk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Tekst-til-Tale:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Forbedret Tekst-til-Tale konfigurasjons-UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "Evne til å sette Tekst-til-tale stemme basert på bokspråket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importere kommentarer fra JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Kommentarsøk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "Kommentarer er nå sorter i samme rekkeføge som de opptrer i boka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Sikkerhet:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3351,39 +3351,39 @@ "\"Tillat utrygt innhold\" tillater kun JavaScript; eksternt innhold vil ikke " "lenger bli lastet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit prossser er nå i sandkasse" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Andre programfunksjoner og fikser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Forbedret støtte for vertikale og høyre-til-venstre bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Støtte for StarDict ordbøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "Fikset nåværende posisjon ikke ivaretatt ved omskalering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "Fikset auto-gjem toppmeny under noen tema" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "Kommando-linje valg for visning av versjon og bokimport til bibliotek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Valg om å tømme eller deaktivere mellomlager" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3391,62 +3391,62 @@ "Når en HTML-side inneholder ugyldige selv-stengende anker-markører blirden " "nå tilket som XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Fikser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Fikset feil versjonsnummer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "Fixset ordbok, oversetting og Wikipedia feil i Snap-pakka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nye programfunksjoner:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Nytt og forbedret ikon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Valg om å deaktivere \"bla side ved berøring\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "En meny på velkomsskjermen for åpning av nylige filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "Gjenopprettet snarveier for visning av ToC, kommentarer og bokmerker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Fikset applikasjon ikke oversatt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Grensesnitt:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Et redesignet grensesnitt som fungerer bedre for mindre skjermer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Forbedret fullskjermsmodus med toppmeny lagt over" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3454,7 +3454,7 @@ "Toppmenyen og fremgangsviseren auto-gjemmer seg, for en distraksjonsfri " "leseopplevelse" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3462,7 +3462,7 @@ "Diverse posisjonsinformasjon, i tillegg til en klokke kan nå bli vist " "bunnmenyen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3470,7 +3470,7 @@ "En ny posisjons-popover (Ctrl + L) som viser lesetidsestimar og tillater " "hopp til lokasjoner" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3480,27 +3480,27 @@ "venstreeller høyre side av visningen; tapp på midten for å veksle toppmeny " "og fremgangsviser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "Kommentarer, bokmerker og søkeresultater viser nå kapitteltitler" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "Ved oppslag i ordbøker, kan søket nå endres" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Ny snarvei for visning av metadata (Ctrl + I) og instillinger (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" "En ny tradisjonell menybar, som kan bli vist avhengig av skrivebordmiljøet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3508,77 +3508,77 @@ "Valg om å bruke en tradisjonell tittelbar og menybar istedet for en toppmeny " "(eksperimental)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lesing:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Kontinuerlig rullende oppsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Valg om å vise decorative skygger som etterligner utseende til ei ekte bok" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Evne til å zoome inn og ut" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Forbedret bildeviser med \"Lagre som\" valg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Åpne bokkopier i nye vindu (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Last bok inn på nytt (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nye innebyggde tema: Grå, Solarisert, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Tekstutvalg:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Evne til å velge teks på tvers av sider" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Finne valgt text i bok" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Opplesing av valgt tekst frå den valgte posisjonen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Kommentarer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Stavekontroller notat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Eksporter kommentarer til Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Valgfrihet til å bruke egendefinerte farger til fremheving" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "For utgivere og utviklere:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3586,241 +3586,241 @@ "Støtte for Apple Books tema-attributt, som tillater temadeteksjon uten " "JavaSkript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "WebKit sine utviklerverktøy kan bli slått på" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Brytende forandringer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Innstillingssjemaene har blitt omorganisert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Formatet for temaer har blitt endret" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Posisjoner er nå 1024 tegn lange" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Bug-fikser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Fikset gjenoppretter ikke til eksakt siste posisjon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "Fikset navigasjon fungerer ikke med rullende oppsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Fikset skriftstørrelse forandrer seg ikke når boka bruker absolutt-størrelse-" "nøkkelord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Fikset tekst \"cut-off\" ved marg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "Fikset klarer ikke åpne bøker med \"#\" eller \"?\" i filnavnet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "Fikset Flatpak-utgaven som ikke åpner .mobi, .azw, og .azw3 filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Forbedret Wikitionary oppslag, nå med liker og eksempelsetninger" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Forbedret popover fotnote uthenting og formatering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "La til mulighet for kommentareksport til BibTex" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Fikset innholsfortegnelsenavigasjons i noen bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Fikset bildezoom i Kindle-bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Fikset filåpning for .epub3-filetternavn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Fikset rengjøring av midlertidige filer etter stenging" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Fikset F9-snarvei" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Oppdaterte oversettelser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Ekstene resurser og JavaScript er nå blokker som standard" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Grunnleggende Tekst-til-Tale støtte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Kommentareksport til HTML, ren tekst eller JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Visningstøtte for .mobi, .azw, og .azw3 filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Ny alternativ sidebar UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Oppslag av ord i Wikipedia og lokale ordbøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Utdragsoversetting med Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Konfigurerbar standardhandling ved ordvalg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Eksperimentell popup fotnote støtte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Evne til søk begrenset til nåværende kapittel" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Fikset CPU spikere når programmet kjører" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Fikset visningproblem ved fremheving" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Fikset programstopp ved filåpning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Tilpass sidemarger og lysstyrke" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Juster temafarger, eller legg til dine egne tema" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Evne til å zoome og kopiere bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Mulighet til auto-gjem musepeker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "Se gjenstående tid ved å holde musepeker over lesefremgangsviseren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Fikset noen boker som ikke renderet av og til" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Fikset tilfeller av for brede bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Valg mellom venste- eller blokkjustert(?) tekst" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nytt oppsettsvalg: enkelt-kolonne sidet visning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Fikset:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 #, fuzzy msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "Kommentarer er nå sorter i samme rekkeføge som de opptrer i boka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 #, fuzzy msgid "Fullscreen mode" msgstr "Fullskjerm" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 #, fuzzy msgid "Option to hide reading progress bar" msgstr "Valg om å deaktivere \"bla side ved berøring\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 #, fuzzy msgid "Option to disable dictionary" msgstr "Valg om å deaktivere \"bla side ved berøring\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 #, fuzzy msgid "Option to use publisher font" msgstr "Bruk utgiverskrifttype" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 #, fuzzy msgid "Fixed custom styles not applying in some cases" msgstr "Fikset tilfeller av for brede bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "" diff -Nru foliate-2.6.3ubuntu1/po/nl.po foliate-2.6.4/po/nl.po --- foliate-2.6.3ubuntu1/po/nl.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/nl.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,26 +7,26 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" -"PO-Revision-Date: 2021-03-24 09:54+0100\n" -"Last-Translator: Heimen Stoffels \n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-06-05 12:43+0200\n" +"Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch \n" "Language: nl_NL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 2.4.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" #: data/com.github.johnfactotum.Foliate.desktop.in:4 msgid "eBook Viewer" -msgstr "eBook-lezer" +msgstr "E-boeklezer" #: data/com.github.johnfactotum.Foliate.desktop.in:5 msgid "View eBooks" @@ -95,7 +95,7 @@ #: src/epubView.js:1121 msgid "Failed to load remote file." -msgstr "Kan extern bestand niet laden." +msgstr "Het externe bestand kan niet worden geladen." #: src/epubView.js:1130 msgid "File not found." @@ -103,7 +103,7 @@ #: src/epubView.js:1144 msgid "Could not unpack Kindle file." -msgstr "Kan Kindle-bestand niet uitpakken." +msgstr "Het Kindle-bestand kan niet worden uitgepakt." #: src/epubView.js:1162 msgid "File type not supported." @@ -124,7 +124,7 @@ #: src/export.js:50 #, javascript-format msgid "Annotations for “%s” by %s" -msgstr "Aantekeningen bij '%s' van '%s'" +msgstr "Aantekeningen bij ‘%s’ van ‘%s’" #: src/export.js:54 msgid "Section: " @@ -174,7 +174,7 @@ #: src/export.js:135 #, javascript-format msgid "Annotations for “%s”" -msgstr "Aantekeningen bij '%s'" +msgstr "Aantekeningen bij ‘%s’" #: src/export.js:166 src/utils.js:281 msgid "All Files" @@ -279,8 +279,8 @@ #: src/library.js:700 msgid "Could not add the following file:" msgid_plural "Could not add the following files:" -msgstr[0] "Kan het volgende bestand niet toevoegen:" -msgstr[1] "Kan de volgende bestanden niet toevoegen:" +msgstr[0] "Het volgende bestand kan niet worden toegevoegd:" +msgstr[1] "De volgende bestanden kunnen niet worden toegevoegd:" #: src/library.js:772 msgid "All" @@ -336,7 +336,7 @@ #: src/lookup.js:410 msgid "Translation by Google Translate" -msgstr "Vertaling door Google Translate" +msgstr "Vertaald door Google Translate" #: src/main.js:135 src/window.js:688 msgid "Open File" @@ -358,9 +358,9 @@ #. they will be shown in the "About" dialog #: src/main.js:208 msgid "translator-credits" -msgstr "Heimen Stoffelssni" +msgstr "Heimen Stoffels " -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Een eenvoudige, moderne e-boeklezer" @@ -474,7 +474,7 @@ #: src/opds.js:662 msgid "Unable to load OPDS feed" -msgstr "Kan OPDS-feed niet laden" +msgstr "De opds-feed kan niet worden geladen" #: src/opds.js:667 src/ui/libraryWindow.ui:69 src/ui/mainMenu.ui:631 #: src/ui/menuBar.ui:18 src/ui/shortcutsWindow.ui:78 @@ -721,7 +721,7 @@ #: src/utils.js:765 #, javascript-format msgid "Authentication required by %s" -msgstr "Authenticatie vereist door %s" +msgstr "%s vereist authenticatie" #: src/utils.js:768 #, javascript-format @@ -789,7 +789,7 @@ #: src/window.js:1125 #, javascript-format msgid "Image from “%s”" -msgstr "Afbeelding van '%s'" +msgstr "Afbeelding van ‘%s’" #: src/window.js:1125 msgid "Image" @@ -801,7 +801,7 @@ #: src/ui/annotationBox.ui:98 msgid "Choose custom color" -msgstr "Aangepaste kleur kiezen" +msgstr "Eigen kleur kiezen" #: src/ui/bookBoxChild.ui:29 src/ui/bookBoxRow.ui:76 msgid "Remote file" @@ -853,7 +853,7 @@ msgstr "Maak aantekeningen door tekst te markeren." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Aantekeningen" @@ -908,7 +908,7 @@ #: src/ui/exportWindow.ui:104 msgid "Choose “JSON” if you plan on importing annotations back to Foliate." msgstr "" -"Kies 'JSON' als je van plan bent later aantekeningen te importeren in " +"Kies ‘JSON’ als je van plan bent later aantekeningen te importeren in " "Foliate." #: src/ui/findBox.ui:16 @@ -921,7 +921,7 @@ #: src/ui/footnotePopover.ui:36 src/ui/mainMenu.ui:552 src/ui/menuBar.ui:154 msgid "Reference Preview" -msgstr "Voorvertoning van referentie" +msgstr "Referentie voorvertonen" #: src/ui/footnotePopover.ui:46 src/ui/shortcutsWindow.ui:186 #: src/ui/shortcutsWindow.ui:371 src/ui/wikipediaBox.ui:107 @@ -1079,7 +1079,7 @@ #: src/ui/libraryWindow.ui:668 msgid "You can browse, search, and download content from OPDS catalogs." msgstr "" -"Je kunt OPDS-catalogi doorzoeken, doorbladeren of de inhoud downloaden." +"Je kunt opds-catalogi doorzoeken, doorbladeren of inhoud eruit downloaden." #: src/ui/libraryWindow.ui:692 msgid "Learn More" @@ -1132,7 +1132,7 @@ #: src/ui/mainMenu.ui:382 msgid "Add Custom Theme…" -msgstr "Aangepast thema toevoegen…" +msgstr "Eigen thema toevoegen…" #: src/ui/mainMenu.ui:428 src/ui/menuBar.ui:108 #: data/com.github.johnfactotum.Foliate.gschema.xml:201 @@ -1168,7 +1168,7 @@ msgstr "Volledige breedte" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Automatische woordafbreking" @@ -1255,7 +1255,7 @@ #: src/ui/menuBar.ui:72 src/ui/ttsDialog.ui:6 msgid "Text-to-Speech" -msgstr "Tekst-naar-spraak" +msgstr "Voorlezen" #: src/ui/menuBar.ui:85 msgid "_View" @@ -1299,11 +1299,11 @@ #: src/ui/menuBar.ui:198 msgid "Next Chapter" -msgstr "Volgende hoofdstuk" +msgstr "Volgend hoofdstuk" #: src/ui/menuBar.ui:202 msgid "Previous Chapter" -msgstr "Vorige hoofdstuk" +msgstr "Vorig hoofdstuk" #: src/ui/menuBar.ui:208 msgid "Beginning" @@ -1374,11 +1374,11 @@ #: src/ui/navBar.ui:402 msgid "Text-to-speech" -msgstr "Tekst-naar-spraak" +msgstr "Voorlezen" #: src/ui/preferenceWindow.ui:11 msgid "Nothing" -msgstr "Niks doen" +msgstr "Niets doen" #: src/ui/preferenceWindow.ui:15 msgid "Percentage" @@ -1394,7 +1394,7 @@ #: src/ui/preferenceWindow.ui:51 msgid "Do nothing" -msgstr "Niks doen" +msgstr "Niets doen" #: src/ui/preferenceWindow.ui:55 msgid "Show menu" @@ -1417,7 +1417,7 @@ msgstr "Vertalen" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Doorzoek het boek" @@ -1432,7 +1432,7 @@ #: src/ui/preferenceWindow.ui:99 msgid "Single click" -msgstr "Eén keer klikken" +msgstr "Eenmaal klikken" #: src/ui/preferenceWindow.ui:103 msgid "Double click" @@ -1484,12 +1484,12 @@ #: src/ui/preferenceWindow.ui:356 msgid "Open images on" -msgstr "Afbeeldingen openen op" +msgstr "Afbeeldingen openen na" #: src/ui/preferenceWindow.ui:391 #: data/com.github.johnfactotum.Foliate.gschema.xml:78 msgid "Text-to-speech command" -msgstr "Tekst-naar-spraak-opdracht" +msgstr "Voorleesopdracht" #: src/ui/preferenceWindow.ui:407 msgid "Configure…" @@ -1497,7 +1497,7 @@ #: src/ui/preferenceWindow.ui:425 msgid "Interface" -msgstr "Uiterlijk" +msgstr "Vormgeving" #: src/ui/preferenceWindow.ui:440 msgid "Auto-hide header bar" @@ -1585,7 +1585,7 @@ #: src/ui/shortcutsWindow.ui:58 msgid "Grid view" -msgstr "Rasterweergave" +msgstr "Roosterweergave" #: src/ui/shortcutsWindow.ui:85 src/ui/shortcutsWindow.ui:285 msgid "Go to location" @@ -1613,7 +1613,7 @@ #: src/ui/shortcutsWindow.ui:176 msgid "Start/stop text-to-speech" -msgstr "Tekst-naar-spraak aan/uit" +msgstr "Voorlezen aan/uit" #: src/ui/shortcutsWindow.ui:206 src/ui/shortcutsWindow.ui:391 msgid "Restore zoom level" @@ -1649,7 +1649,7 @@ #: src/ui/shortcutsWindow.ui:295 msgid "Touchpad Gestures" -msgstr "Touchpad-gebaren" +msgstr "Touchpadgebaren" #: src/ui/shortcutsWindow.ui:332 msgid "Image Viewer Shortcuts" @@ -1657,7 +1657,7 @@ #: src/ui/themeWindow.ui:6 msgid "Custom Theme" -msgstr "Aangepast thema" +msgstr "Eigen thema" #: src/ui/themeWindow.ui:39 msgid "Theme Name" @@ -1685,17 +1685,15 @@ #: src/ui/translationBox.ui:53 msgid "Cannot retrieve translation" -msgstr "Kan vertaling niet ophalen" +msgstr "De vertaling kan niet worden opgehaald" #: src/ui/ttsDialog.ui:46 msgid "Text-to-Speech Command" -msgstr "Tekst-naar-spraakopdracht" +msgstr "Voorleesopdracht" #: src/ui/ttsDialog.ui:57 msgid "Make sure the selected text-to-speech program is correctly installed." -msgstr "" -"Zorg er voor dat het gekozen tekst-naar-spraakprogramma juist geïnstalleerd " -"is." +msgstr "Zorg er voor dat de gekozen voorleestoepassingjuist geïnstalleerd is." #: src/ui/ttsDialog.ui:63 msgid "eSpeak NG" @@ -1715,7 +1713,7 @@ "the language code of the book, or use $FOLIATE_TTS_LANG_LOWER for " "the all lower case code." msgstr "" -"De 'environment'-variabele $FOLIATE_TTS_LANG is beschikbaar " +"De ‘environment’-variabele $FOLIATE_TTS_LANG is beschikbaar " "voor de taalcode van het book, of gebruik $FOLIATE_TTS_LANG_LOWER " "voor alle tekst in kleine letters." @@ -1726,7 +1724,7 @@ #: src/ui/ttsDialog.ui:178 msgid "The program should speak the following test sentences in order:" msgstr "" -"Het programma zou de volgende testzinnen in de juiste volgorde moeten " +"De toepassing zou de volgende testzinnen in de juiste volgorde moeten " "voorlezen:" #: src/ui/ttsDialog.ui:191 @@ -3019,300 +3017,302 @@ msgid "Writer of supplementary textual content" msgstr "Schrijver van aanvullende tekstinhoud" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate is een eenvoudige en moderne e-boeklezer." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Mogelijkheden:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Weergave-opties: twee pagina's naast elkaar en oneindig scrollen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Pas het lettertype en de regelafstand aan" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Kleurmodi: licht, sepia, donker en negatief" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Voortgangsbalk, voorzien van hoofdstukmarkeringen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Bladwijzers en aantekeningen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Geïntegreerd woordenboek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" +"[OPGELOST] Prestatieprobleem bij gebruik van zip-bestanden (inclusief epub-" +"bestanden)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" -msgstr "" +msgstr "[OPGELOST] Vormgevingsprobleem bij gebruik van libhandy 1.x" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "Probleem opgelost met de automatische indeling" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" -msgstr "Wijzigingen:" +msgstr "Wijzigingslog:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "Ondersteuning toegevoegd voor het openen van html-bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "Consistente binnen- en buitenmarges" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "De automatische indeling heeft geen ondersteuning meer voor 4 kolommen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "Opgelost: lange woorden vielen van het scherm" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" msgstr "Aangepaste stijlen werden niet opgeslagen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" msgstr "Probleem opgelost met sneltoetsen op numpads" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "Opgelost: openen van gezipte niet-utf-8 fb2-bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" msgstr "Opgelost: boeken konden niet worden geopend op GNOME 40" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "Verbeterde ondersteuning voor touchscreens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "OPDS-inloggegevens worden voortaan onthouden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "Verschillende foutoplossingen voor GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "Wiktionary-links gerepareerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "Baskische, Koreaanse en Noorse vertalingen toegevoegd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Probleem opgelost met het openen van epub-bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Probleem opgelost met het openen van Mobipocket-bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Verbeterde weergave van metagegevens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Verbeterde FictionBook-rendering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "Verbeterd uiterlijk bij het ophalen van boeken van OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Unieke identificatie-extrahering van EPUB-bestanden gerepareerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Opgelost: ontbrekend vensterpictogram" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" "Opgelost: TTS-omgevingsvariabelen werden niet ingesteld bij gebruik van " "Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" "Opgelost: eSpeak NG-stem werd niet geselecteerd tijdens het testen van de " "TTS-instellingen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -"Opgelost: verkeerd '__ibooks_internal_theme'-attribuut als 'Omkeren' is " +"Opgelost: verkeerd ‘__ibooks_internal_theme’-attribuut als ‘Omkeren’ is " "ingeschakeld" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS-catalogi:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Catalogi worden voortaan geopend in het hoofdvenster" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Huidige locatie tonen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Ga naar catalogusindex" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Catalogus herladen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Feed toevoegen aan catalogi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "HTTP-authenticatie-ondersteuning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Andere aanpassingen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Unieke identificatie-extrahering van FictionBook (.fb2, .fb2.zip)-bestanden " "gerepareerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Regeleindes worden niet meer genegeerd tijdens het kopiëren van tekst" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" -"'Pagina omslaan door drukken' is voortaan uitgeschakeld in niet-gepagineerde " +"‘Pagina omslaan door drukken’ is voortaan uitgeschakeld in niet-gepagineerde " "indelingen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" "Het openen van een boek in het bibliotheekvenster sluit voortaan dat venster" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "Taal en publicatiedata in metagegevens worden voortaan verwerkt en voorzien " "van opmaak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Aantekeningen exporteren in het bibliotheekvenster" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Opgelost: vage boekomslagen op HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Opgelost: ODPS-links naar Standard Ebooks en Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Onjuist versienummer gerepareerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Bibliotheek:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "Een bibliotheekweergave die recente boeken en leesvoortgang toont" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Boeken zoeken op metagegevens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "E-boekverkenning met OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nieuwe ondersteunde formaten:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Stripboekarchief (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Platte tekst (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Onuitgepakte epub-bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Indeling:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Optie om de maximale paginabreedte in te stellen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -"De 'Automatische' indeling toont voortaan vier kolommen als je pagina erg " +"De automatische indeling toont voortaan vier kolommen als je pagina erg " "breed is" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Afbeeldingsweergave:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3320,7 +3320,7 @@ "Verbeterde afbeeldingsweergave, met nieuwe sneltoetsen en de mogelijkheid " "afbeeldingen te draaien en de kleuren om te keren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3328,80 +3328,78 @@ "Optie om de afbeeldingsweergave uit te schakelen, of afbeeldingen te openen " "met linker-, middel- of rechtermuisklik" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" -msgstr "Tekst-naar-spraak:" +msgstr "Voorlezen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" -msgstr "Verbeterde tekst-naar-spraakinstellingen" +msgstr "Verbeterde voorleesinstellingen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" -msgstr "" -"Mogelijkheid om de stem van tekst-naar-spraak in te stellen op basis van de " -"boektaal" +msgstr "Mogelijkheid om de voorleesstem in te stellen op basis van de boektaal" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" -msgstr "Aantekeningen importeren uit JSON" +msgstr "Aantekeningen importeren uit json" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Aantekeningen doorzoeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "Gegenereerde locaties worden nu gesorteerd in de boekvolgorde" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Beveiliging:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -"'Onveilige inhoud toestaan' schakelt voortaan alleen JavaScript in - externe " +"‘Onveilige inhoud toestaan’ schakelt voortaan alleen JavaScript in - externe " "inhoud wordt niet meer geladen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit-processen draaien voortaan in een sandbox" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Andere functies en foutoplossingen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Verbeterde ondersteuning voor verticale en van-rechts-naar-linksboeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Ondersteuning voor StarDict-woordenboeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" "Opgelost: huidige positie werd niet behouden na aanpassen vensterafmetingen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" "Opgelost: de kopbalk wordt voortaan altijd verborgen bij sommige thema's" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Opdrachtregelopties voor het tonen van de versie en het toevoegen van boeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Optie om het woordenboek uit te schakelen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3409,67 +3407,67 @@ "Als een html-pagina ongeldige, zelfsluitende anchor-tags bevat, wordt deze " "voortaan behandeld als xhtml" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Opgeloste fouten:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Onjuist versienummer gerepareerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "Woordenboek, vertaling en Wikipedia gerepareerd in Snap-pakket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nieuwe mogelijkheden:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Nieuw, verbeterd pictogram" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Optie om pagina omslaan door drukken uit te schakelen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "" "Menu toegevoegd op het welkomstscherm voor het openen van recente bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" "Sneltoetsen hersteld voor het tonen van de inhoudsopgave, aantekeningen en " "bladwijzers" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Vertaalprobleem opgelost" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Uiterlijk:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" "Het uiterlijk is opnieuw ontworpen om Foliate beter te laten werken op " "kleinere schermen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Verbeterde beeldvullende modus met kopbalk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3477,13 +3475,13 @@ "De kop- en voortgangsbalk verbergen voortaan automatisch zodat je ongestoord " "kunt lezen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "Locatie-informatie en klok toegevoegd aan de statusbalk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3491,7 +3489,7 @@ "Locatiemenu (Ctrl + L) toegevoegd waar je de geschatte leestijd kunt zien en " "naar andere bladzijden kunt gaan" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3501,29 +3499,29 @@ "te drukken op de linker- of rechterkant van het boek - druk in het midden om " "de kop- en voortgangsbalk te tonen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "Aantekeningen, bladwijzers en zoekresultaten zijn nu voorzien van " "hoofdstuktitels" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "Woordenboekzoekopdrachten kunnen voortaan worden bewerkt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Sneltoetsen toegevoegd voor het tonen van metagegevens (Ctrl + I) en " "voorkeuren (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "Traditionele menubalk toegevoegd voor niet-GTK-werkomgevingen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3531,76 +3529,76 @@ "Optie toegevoegd om een traditionele titel- en menubalk te gebruiken " "(experimenteel)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lezen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Oneindig scrollen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "Optie om schaduwen te tonen zodat het meer lijkt op een papieren boek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Mogelijkheid om in en uit te zoomen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" -msgstr "Verbeterde afbeeldingsweergave met 'Opslaan als'-optie" +msgstr "Verbeterde afbeeldingsweergave in de ‘Opslaan als’-optie" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Kopieën openen in nieuwe vensters (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Boek opnieuw inlezen (Ctrl +R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nieuwe thema's: grijs, gesolariseerd, Gruvbox en Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Tekstselectie:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Mogelijkheid om tekst te selecteren op meerdere pagina's" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Geselecteerde tekst zoeken in boek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Geselecteerde tekst voorlezen, of voorlezen vanaf gekozen locatie" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Aantekeningen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Spellingscontrole-aantekeningen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Aantekeningen exporteren naar Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Optie om markeringen met aangepaste kleuren te gebruiken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Voor uitgevers en ontwikkelaars:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3608,204 +3606,204 @@ "Ondersteuning voor Apple Books-thema's, zodat boeken thema's kunnen " "detecteren zonder gebruik van JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "WebKit's ontwikkelaarshulpmiddelen kunnen voortaan worden gebruikt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Grootschalige aanpassingen:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "De instellingsschema's zijn geherorganiseerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "De opmaak van aangepaste thema's is gewijzigd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" -msgstr "Locaties zijn nu 1024 tekens lang" +msgstr "Locaties zijn voortaan 1024 tekens lang" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Opgeloste fouten:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Niet herstellen van recentste locatie opgelost" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "Probleem opgelost met navigatie in scrollindeling" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Probleem opgelost met lettertypegrootte als het boek trefwoorden met vaste " "groottes gebruikt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Probleem opgelost met tekst op de schermranden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" -"Probleem opgelost met het openen van boeken met '#' of '?' in de bestandsnaam" +"Probleem opgelost met het openen van boeken met ‘#’ of ‘?’ in de bestandsnaam" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Probleem opgelost met het openen van .mobi-, .azw- en .azw3-bestanden in de " "Flatpak-versie" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Zoeken op Wiktionary verbeterd met links en voorbeeldzinnen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Verbeterde menu's voor voetnoten en opmaak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Optie toegevoegd om aantekeningen te exporteren naar BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Probleem opgelost met niet-verschijnende inhoudsopgaven" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Probleem opgelost met in-/uitzoomen van afbeeldingen in Kindle-boeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Probleem opgelost met het openen van .epub3-boeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" "Probleem opgelost met het opschonen van de tijdelijke map na het afsluiten " "van de app" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Probleem opgelost met de sneltoets F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Bijgewerkte vertalingen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Externe bronnen en JavaScript worden nu standaard geblokkeerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" -msgstr "Basisondersteuning voor tekst-naar-spraak" +msgstr "Basisondersteuning voor voorlezen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" -msgstr "Exporteer aantekeningen naar HTML, platte tekst of JSON" +msgstr "Exporteer aantekeningen naar html, platte tekst of json" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Ondersteuning voor .mobi-, .azw- en .azw3-bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nieuwe, alternatieve indeling met zijbalk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Zoek woorden op op Wikipedia en in offline woordenboeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Vertaal gedeelten met Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Stel een standaardactie in bij woordselectie" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Experimenteel uitklapvenster voor voetnoten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Mogelijkheid om alleen het huidige hoofdstuk te doorzoeken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Probleem opgelost met hoog CPU-verbruik bij draaien op achtergrond" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Probleem opgelost met markeringen op de verkeerde locaties" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Probleem opgelost met crash bij openen van bestanden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Pas de paginamarges en helderheid aan" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Pas de themakleuren aar of voeg je eigen thema's toe" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Zoom in/uit op afbeeldingen en kopieer ze" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Optie om de cursor automatisch te verbergen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Bekijk de leestijd door de cursor boven de leesvoortgangsbalk te houden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Boeken worden nu altijd goed weergegeven" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Afbeeldingen zijn nooit meer té breed" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Optie om te schakelen tussen één of twee pagina's" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nieuwe indelingsoptie: alles tonen in één kolom" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Opgelost:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "" "Gegenereerde locaties worden nu opgeslagen in de cachemap i.p.v. localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "De lettergrootte van uitgeverslettertypes kan nu worden aangepast" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3813,40 +3811,40 @@ "De leesvoortgangsbalk wordt nu ook getoond als het localStorage-quotum is " "overschreden" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Touchpad-gebaren en de mogelijkheid om door pagina's te scrollen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Beeldvullende modus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Optie om de leesvoortgang te verbergen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Optie om het woordenboek uit te schakelen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Optie om het lettertype van de uitgever te gebruiken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" "Herstellen van de leesvoortgang verloopt nu vloeiend (geen gestotter meer)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Aangepaste stijlen worden nu altijd toegepast" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Ongeldig AppData-bestand gerepareerd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Initiële uitgave" @@ -3910,8 +3908,8 @@ "the database ID" msgstr "" "Identificatie van het standaard woordenboek. Woordenboeken van dictd en " -"stardict zijn beschikbaar als naam + 'dictd_' en 'stardict_' in de databank-" -"id" +"stardict zijn beschikbaar als naam + ‘dictd_’ en ‘stardict_’ in de databank-" +"id." #: data/com.github.johnfactotum.Foliate.gschema.xml:58 msgid "Target language of translation" @@ -3946,12 +3944,12 @@ "DOM event type for viewing images; the special value \"middleclick\" is " "available for the middle click event" msgstr "" -"DOM-actie voor het tonen van afbeeldingen. De speciale waarde 'middleclick' " +"DOM-actie voor het tonen van afbeeldingen. De speciale waarde ‘middleclick’ " "is beschikbaar voor middelklikken." #: data/com.github.johnfactotum.Foliate.gschema.xml:79 msgid "Command to execute for text-to-speech" -msgstr "Opdracht voor tekst-naar-spraak" +msgstr "Voorleesopdracht" #: data/com.github.johnfactotum.Foliate.gschema.xml:84 msgid "If true, a side pane will be used instead of popovers" diff -Nru foliate-2.6.3ubuntu1/po/nn.po foliate-2.6.4/po/nn.po --- foliate-2.6.3ubuntu1/po/nn.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/nn.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-08-29 19:57+0200\n" "Last-Translator: Kay Siver Bø <63042612+tupubozu@users.noreply.github.com>\n" "Language-Team: \n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -359,7 +359,7 @@ msgid "translator-credits" msgstr "Kay Siver Bø" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Ein enkel og moderne e-bok framsynar" @@ -852,7 +852,7 @@ msgstr "Vel noko tekst for å leggje til kommentarar." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Kommentarar" @@ -1164,7 +1164,7 @@ msgstr "Blokkjustert" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Auto-orddeling" @@ -1413,7 +1413,7 @@ msgstr "Omsett" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Finn i bok" @@ -3012,281 +3012,281 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate er ein enkel og moderne GTK e-bok framsynar." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Programfunksjonar inkluderer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "To-side visning og rullende visning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Utskiftbar skrifttype og linjeavstand" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Lys, brunnyansert, mørk og invertert modus" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Lese-fremgangsindikator med kapittelmerkjer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Bokmerkjer og kommentarar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Raskt ordbokksoppslag" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Endringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Fiksa tilfeller av for breie bileter" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Fiksa F9-snarveg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Fiksa nokre bøker som ikkje rendera av og til" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 #, fuzzy msgid "Improved support for touch screens" msgstr "Betra støtte for vertikale og høgre-til-venstre bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Fiksa opningsproblem for nokon EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Fiksa opningsproblem for Mobipocket-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Betra metadata framsynsing" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Betra FictionBook rendering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "Betra UI for henting av bøker frå OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Fiksa unik indentifikator uthenting for EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Fiksa manglende vindaugeikon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "Fiksa TTS-miljøvariablar ikkje sett ved bruk av Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "Fiksa eSpeak NG stemme ikkje valgt når TTS konfigurasjontestast" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Fiksa feil: “__ibooks_internal_theme” attribute when “Invert” is enabled" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS katalogar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Katalogar er nå opnet i hovedbiblioteksvinduet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Vis noverande posisjon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Gå til katalogstartside" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Last inn katalog på nytt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Legg til noverande nyheitsstraum i katalogar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "HTTP autentiseringsstøtte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Andre endringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Fiksa unik identifikator uthenting for FictionBook (.fb2, .fb2.zip) filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Fiksa nylinjeringnorering ved tekstkopiering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "“Bla side ved rørsle” er nå deaktivert i ikkje-sida oppsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "Å opne ei bok frå biblioteksvisninen stenger nå biblioteksvinduet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "Språk og publikasjonsdoatoer i metadata er no parsa og formatert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Eksporter kommentarar frå bibliotekssyninga" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Fiksa uklare bokomslag på HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Fiksa OPDS-linker til Standard Ebooks og Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Fiksa feil visningsikon under oppstart" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Bibliotek:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "Bibliotekssyning som viser nylege bøker og lese-fermgang" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Søk etter bøker med metadata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "E-bok oppdaging med OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nye støtta formater:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Comic book archive (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Rein tekst (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Upakka EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Oppsett:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Val om å settje maksimal sidebreidd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3294,11 +3294,11 @@ "Det \"automatiske\" oppsettet vil no vise fire kolonner når sidebreidden er " "brei" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Bileteframsynar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3306,7 +3306,7 @@ "Betra bileteframsynar, med nye snarvegar og evne til å rotere og invertere " "bilete" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3314,35 +3314,35 @@ "Val om å deaktivere bileteframsynar, eller opning ved dobbel-, middel- eller " "høgreklikk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Tekst-til-Tale:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Betra Tekst-til-Tale konfigurasjons-UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "Evne til å velje Tekst-til-tale stemme basert på bokspråket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importer kommentarar frå JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Kommentarsøk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "Kommentarar er no sortert i samme rekkeføge som dei opptrer i boka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Tryggleik:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3350,39 +3350,39 @@ "\"Tillat utrygt innhald\" tillet kun JavaScript; eksternt innhald vil ikkje " "lenger bli lasta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit prossser er nå i sandkasse" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Andre programfunksjoner og fikser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Betra støtte for vertikale og høgre-til-venstre bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Støtte for StarDict ordbøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "Fiksa noverande posisjon ikkje ivaretatt ved omskalering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "Fiksa auto-gjem toppmeny under nokon tema" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "Kommando-linje valg for visning av versjon og bokimport til bibliotek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Val om å tømme eller deaktivere mellomlager" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3390,62 +3390,62 @@ "Når ein HTML-side inneheld ugyldige selv-stengande anker-markører blirden nå " "tolka som XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Fiksar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Fiksa feil versjonsnummer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "Fixset ordbok, omsetting og Wikipedia feil i Snap-pakka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nye programfunksjoner:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Nytt og forbetra ikon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Val om å deaktivere \"bla side ved rørsle\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Ein meny på velkomsskjermen for opning av nylege filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "Gjenoppretta snarvegar for visning av ToC, kommentarar og bokmerkjer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Fiksa applikasjon ikkje omsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Grensesnitt:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Eit redesignet grensesnitt som fungerer betre for mindre skjermar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Betra fullskjermsmodus med toppmeny lagt over" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3453,7 +3453,7 @@ "Toppmenyen og framgangsviseren auto-gjemmer seg, for ein distraksjonsfri " "leseoppleving" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3461,7 +3461,7 @@ "Diverse posisjonsinformasjon, i tillegg til ei klokke, kan nå bli vist " "botnmenyen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3469,7 +3469,7 @@ "Ein ny posisjons-popover (Ctrl + L) som viser lesetidsestimat og tillet hopp " "til lokasjoner" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3479,27 +3479,27 @@ "venstreeller høgre side av visningen; tapp på midten for å veksle toppmeny " "og fremgangsviser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "Kommentarar, bokmerkjer og søkjeresultat viser nå kapitteltitler" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "Ved oppslag i ordbøker, kan søkjet nå endrast" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Ny snarveg for visning av metadata (Ctrl + I) og instillingar (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" "Ein ny tradisjonell menybar, som kan bli syna avhengig av skrivebordmiljøet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3507,77 +3507,77 @@ "Val om å nytte ein tradisjonell tittelbar og menybar i staden for ein " "toppmeny (eksperimental)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Lesing:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Kontinuerleg rullende oppsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Val om å vise dekorative skugger som etterliknar utsjånaden til ei ekte bok" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Evne til å zoome inn og ut" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Betra bileteframsynar med \"Lagra som\" val" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Opne bokkopier i nye vindu (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Last bok inn på nytt (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nye innebyggde tema: Grå, Solarisert, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Tekstutvalg:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Evne til å velge tekst på tvers av sider" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Finne valgt tekst i bok" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Opplesing av valgt tekst frå den valde posisjonen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Kommentarar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Stavekontroller notat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Eksporter kommentarar til Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Valfridom til å nytte eigendefinerte fargar til framheving" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "For utgivarar og utviklarar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3585,241 +3585,241 @@ "Støtte for Apple Books tema-attributt, som tillet temadeteksjon utan " "JavaSkript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "WebKit sine utviklerverktøy kan bli slått på" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Brytende endringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Innstillingssjema har blitt omorganisert" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Formatet for tema har blitt endra" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Posisjoner er nå 1024 teikn lange" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Bug-fikser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Fiksa: gjenoppretter ikkje til eksakt siste posisjon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "Fiksa: navigasjon fungerer ikkje med rullande oppsett" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Fiksa: skriftstorleik endrar seg ikkje når boka bruker absolutt-storleik-" "nøkkelord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Fiksa: tekst \"cut-off\" ved marg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "Fiksa: klarer ikkje opne bøker med \"#\" eller \"?\" i filnavnet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "Fiksa Flatpak-utgaven som ikkje opner .mobi, .azw, og .azw3 filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Betra Wiktionary oppslag, nå med lenkjer og dømesetninger" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Betra popover fotnote uthenting og formatering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "La til muligdom for kommentareksport til BibTex" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Fiksa innhaldslistenavigasjon i nokre bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Fiksa biletezoom i Kindle-bøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Fiksa filopning for .epub3-filetternavn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Fiksa reingjering av midlertidige filer etter stenging" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Fiksa F9-snarveg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Oppdaterte omsettjingar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Ekstene resursar og JavaScript er nå blokkert som standard" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Grunnleggjende Tekst-til-Tale støtte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Kommentareksport til HTML, rein tekst eller JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Visningstøtte for .mobi, .azw, og .azw3 filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Ny alternativ sidebar UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Oppslag av ord på Wikipedia og i lokale ordbøker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Utdragsomsettjing med Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Konfigurerbar standardhandling ved ordvalg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Eksperimentell popup-fotnote støtte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Evne til søk avgrensa til noverande kapittel" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Fiksa CPU spikarar når programmet køyrer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Fiksa visningproblem ved framheving" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Fiksa programstopp ved filopning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Tilpass sidemargar og lysstyrke" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Juster temafarger, eller legg til dine eigne tema" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Evne til å zoome og kopiere bileter" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Moglegdom til auto-gøym musepeikar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "Sjå gjenstående tid ved å halde musepeikar over leseframgangsvisaren" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Fiksa nokre bøker som ikkje rendera av og til" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Fiksa tilfeller av for breie bileter" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Val mellom venste- eller blokkjustert(?) tekst" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nytt oppsettsval: enkelt-kolonne sida visning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Fiksa:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 #, fuzzy msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "Kommentarar er no sortert i samme rekkeføge som dei opptrer i boka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 #, fuzzy msgid "Fullscreen mode" msgstr "Fullskjerm" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 #, fuzzy msgid "Option to hide reading progress bar" msgstr "Val om å deaktivere \"bla side ved rørsle\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 #, fuzzy msgid "Option to disable dictionary" msgstr "Val om å deaktivere \"bla side ved rørsle\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 #, fuzzy msgid "Option to use publisher font" msgstr "Bruk utgivarskrifttype" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 #, fuzzy msgid "Fixed custom styles not applying in some cases" msgstr "Fiksa tilfeller av for breie bileter" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "" diff -Nru foliate-2.6.3ubuntu1/po/POTFILES foliate-2.6.4/po/POTFILES --- foliate-2.6.3ubuntu1/po/POTFILES 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/POTFILES 2022-01-13 19:59:57.000000000 +0000 @@ -53,5 +53,5 @@ src/schemes.js -data/com.github.johnfactotum.Foliate.appdata.xml.in +data/com.github.johnfactotum.Foliate.metainfo.xml.in data/com.github.johnfactotum.Foliate.gschema.xml diff -Nru foliate-2.6.3ubuntu1/po/pt_BR.po foliate-2.6.4/po/pt_BR.po --- foliate-2.6.3ubuntu1/po/pt_BR.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/pt_BR.po 2022-01-13 19:59:57.000000000 +0000 @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" -"PO-Revision-Date: 2021-03-20 12:31-0300\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-05-06 13:04-0300\n" "Last-Translator: Fúlvio Alves \n" "Language-Team: Fábio Nogueira ; Marcelo dos Santos " "Mafra \n" @@ -19,11 +19,11 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.4.1\n" +"X-Generator: Poedit 2.4.2\n" #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -367,7 +367,7 @@ "Marcelo dos Santos Mafra\n" "Fúlvio Alves" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Um simples e moderno visualizador de e-Book" @@ -861,7 +861,7 @@ msgstr "Selecione algum texto para adicionar anotações." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Anotações" @@ -1174,7 +1174,7 @@ msgstr "Justificação Completa" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Auto-hifenização" @@ -1423,7 +1423,7 @@ msgstr "Traduzir" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Pesquisar no livro" @@ -3023,289 +3023,288 @@ msgid "Writer of supplementary textual content" msgstr "Escritor do conteúdo textual suplementar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate é um simples e moderno visualizador de eBook em GTK." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Recursos incluídos:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Visualização de duas páginas e visualização rolada" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Personalizar fonte e espaçamento de linha" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Modo claro, sépia, escuro e invertido" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Controle deslizante de progresso de leitura com marcas de capítulos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Marcadores e anotações" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Pesquisa rápida de dicionário" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" +"Corrigido um problema de desempenho com arquivos compactados (incluindo " +"arquivos EPUB)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" -msgstr "" +msgstr "Correção da IU ao ser executada com libhandy 1.x" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" -msgstr "" +msgstr "Corrigido layout automático" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Alterações:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" -msgstr "" +msgstr "Adicionado suporte para abrir arquivos HTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" -msgstr "" +msgstr "Margens internas e externas consistentes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" -msgstr "" +msgstr "O layout automático não suporta mais 4 colunas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" -msgstr "" +msgstr "Corrigido o transbordamento de palavras longas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" -msgstr "Corrigidos estilos personalizados que não se aplicavam em alguns casos" +msgstr "Corrigidos temas personalizados que não eram salvos nas sessões" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" -msgstr "Corrigido o atalho F9 que não funcionava" +msgstr "Corrigidos atalhos de teclado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" -msgstr "" +msgstr "Corrigida a abertura de arquivos compactados FB2 que não são UTF-8" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" -msgstr "Corrigidos alguns livros que às vezes não renderizavam" +msgstr "Corrigido livros que não abriam no GNOME 40" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "Suporte aprimorado para telas sensíveis ao toque" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "As credenciais OPDS agora podem ser lembradas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "Várias correções para o GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "Corrigidos links internos do Wikcionário" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "Adicionadas traduções para basco, coreano e norueguês" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Corrigida a impossibilidade de abrir alguns arquivos EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Corrigida a impossibilidade de abrir arquivos Mobipocket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Exibição de metadados aprimorada" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Renderização de FictionBook aprimorada" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "Interface aprimorada para obter livros do OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Corrigida extração de identificador único para arquivos EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Corrigido ícone de janela ausente" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "Corrigidas variáveis de ambiente TTS não definidas ao usar Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" "Corrigida voz do eSpeak NG que não era selecionada ao testar a configuração " "TTS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Corrigido o atributo errado “__ibooks_internal_theme” quando “Inverter” está " "ativado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Catálogos OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Os catálogos agora são abertos na janela principal da biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Ver localização atual" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Ir para a página inicial do catálogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Recarregar catálogo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Adicionar feed atual aos catálogos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "Suporte a autenticação HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Outras alterações:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Corrigida extração de identificador único para arquivos FictionBook (.fb2, ." "fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Corrigido problema em que novas linhas são ignoradas ao copiar texto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "“Virar página ao tocar” agora é desativado em layouts não paginados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" "Abrir um livro a partir da visualização da biblioteca agora fecha a janela " "da biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "Idioma de datas de publicação nos metadados agora são analisadas e formatadas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Exportar anotações da visualização da biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Corrigidas capas de livros embaçadas ao usar HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Corrigidos links para Standard Ebooks e Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Corrigido ícone de visualização incorreto ao inicializar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Biblioteca:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" "Uma exibição de biblioteca mostrando os livros recentes e o progresso de " "leitura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Pesquisar livros por metadados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "Descobrir e-books com OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Novos formatos suportados:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Arquivo de quadrinhos (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Texto sem formatação (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Arquivos EPUB descompactados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Layout:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Opção para definir a largura máxima da página" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3313,11 +3312,11 @@ "O layout \"Automático\" agora exibirá quatro colunas quando a largura da " "página estiver grande" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Visualizador de imagens:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3325,7 +3324,7 @@ "Visualizador de imagens aprimorado, com novos atalhos e capacidade de girar " "e inverter imagens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3333,38 +3332,38 @@ "Opção para desativar o visualizador de imagens ou para abrir imagens com " "clique duplo, clique do meio ou com o botão direito" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Texto-para-voz:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "" "Interface de usuário aprimorada para configurar conversão de texto-para-voz" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" "Capacidade de definir a voz de texto-para-voz com base no idioma do livro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importar anotações do JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Pesquisar nas anotações" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "As anotações agora são classificadas na mesma ordem em que aparecem no livro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Segurança:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3372,43 +3371,43 @@ "\"Permitir conteúdo não seguro\" agora ativa apenas o JavaScript; o conteúdo " "externo não será mais carregado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "Os processos WebKit agora estão na área restrita" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Outros destaques e correções:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" "Suporte aprimorado para livros com escrita vertical e da direita-para-" "esquerda" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Suporte para dicionários StarDict" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "Corrigido o local atual que não era preservado ao redimensionar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "Corrigida barra de cabeçalho auto-ocultável em alguns temas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Opções de linha de comando para mostrar a versão e adicionar livros à " "biblioteca" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Opção para limpar ou desativar a cache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3416,64 +3415,64 @@ "Quando uma página HTML contém tags inválidas de âncora de fechamento " "automático, agora será analisada como XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Correções:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Corrigido número incorreto da versão" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Corrigido dicionário, tradução e a Wikipédia, que não funcionam no pacote " "Snap" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Novos recursos:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Ícone novo e aprimorado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Opção para desativar a alternação de página ao tocar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Um menu na tela de boas-vindas para abrir arquivos recentes" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "Usa a barra lateral para exibir o índice, anotações e marcadores" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Corrigida aplicação não traduzida" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Interface:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Uma interface redesenhada que funciona melhor em telas menores" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Modo de tela cheia aprimorado com uma barra de cabeçalho sobreposta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3481,7 +3480,7 @@ "As barras de cabeçalho e de progresso agora são ocultadas automaticamente, " "para uma experiência de leitura sem distrações" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3489,7 +3488,7 @@ "Várias informações de localização, bem como um relógio, agora podem ser " "exibidas no rodapé" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3497,7 +3496,7 @@ "Uma nova janela suspensa (Ctrl + L) que mostra estimativas de tempo de " "leitura e permite pular para determinado local" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3507,22 +3506,22 @@ "na parte esquerda ou direita da visualização; toque no meio para alternar " "entre as barras de cabeçalho e a de progresso" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "As anotações, favoritos e os resultados encontrados agora mostram os títulos " "de capítulos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "Ao procurar palavras em dicionários, a consulta agora pode ser editada" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Novo atalho para visualizar metadados (Ctrl + I) e preferências (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" @@ -3530,7 +3529,7 @@ "Uma nova barra de menus tradicional, que pode ser exibida dependendo do " "ambiente desktop" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3538,78 +3537,78 @@ "Opção para usar uma barra de título e de menus tradicionais em vez de uma " "barra de cabeçalho (experimental)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Leitura:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Layout de rolagem contínua" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Opção para mostrar sombras decorativas que imitam a aparência de um livro " "real" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Capacidade de ampliar e diminuir o zoom" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Visualizador de imagens aprimorado com a opção \"Salvar como\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Abrir cópias de um livro em novas janelas (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Recarregar livro (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Novos temas incorporados: Cinza, Solarizado, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Seleção de texto:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Capacidade de selecionar texto nas páginas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Encontrar texto selecionado no livro" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Falar o texto selecionado ou a partir do local selecionado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Anotações:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Notas de verificação ortográfica" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Exportar anotações para Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Opções para usar cores personalizadas para realces" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Para editores e desenvolvedores:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3617,193 +3616,193 @@ "Suporte ao atributo de tema Apple Books, que permite que os livros detectem " "temas sem JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "As ferramentas de desenvolvedor WebKit podem ser ativadas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Alterações recentes:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Os esquemas de configurações foram reorganizados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "O formato para temas personalizados foi alterado" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Os locais agora possuem 1024 caracteres de tamamho" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Correções de bugs:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Corrigida a não restauração do último local exati" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "Corrigida a navegação que não funcionava no layout de rolagem" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Corrigido o tamanho da fonte que não muda quando o livro usa palavras-chave " "de tamanho absoluto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Corrigido texto cortado nas margens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Corrigida a incapacidade de abrir livros com \"#\" ou \"?\" no nome do " "arquivo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Corrigida a versão do Flatpak que não abria arquivos .mobi, .azw e .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "Melhorada a pesquisa no Wiktionary, agora com links e setenças de exemplo" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Melhorada a formatação e extração de nota de rodapé do popover" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Adicionada opção de exportação de anotações para o BibTex" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Corrigida a navegação do sumário que não funcionava em alguns livros" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Corrigida a impossibilidade de ampliar imagens em livros Kindle" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Corrigida a impossibilidade de abrir livros com a extensão .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Corrigido diretório temporário que não era limpo após o fechamento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Corrigido o atalho F9 que não funcionava" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Traduções atualizadas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Recursos externos e o JavaScript estão agora bloqueados por padrão" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Suporte básico para texto-para-voz" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Exportar anotações para HTML, texto simples ou JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Suporte para visualização de arquivos .mobi, .azw e .azw3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nova interface da barra lateral alternativa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Pesquise palavras na Wikipédia e dicionários offline" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Traduzir trechos com o Google Tradutor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Configura a ação padrão quando palavras são selecionadas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Suporte experimental a nota de rodapé em popup" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Capacidade de encontrar apenas no capítulo atual" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Corrigido picos da CPU quando deixado aberto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Corrigidos destaques não renderizados nas posições corretas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Corrigida a falha ao abrir arquivos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Customiza margens de página e brilho" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Ajuste as cores do tema ou adicione seus próprios temas personalizados" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Capacidade de ampliar e copiar imagens" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Opção de cursor automaticamente oculto" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Veja o tempo restante de leitura passando o cursor sobre o progresso da " "leitura" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Corrigidos alguns livros que às vezes não renderizavam" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Corrigidas imagens grandes em alguns casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Opção para alternar entre justificação à esquerda e completa" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nova opção de layout: visualização paginada de coluna única" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Corrigido:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3811,11 +3810,11 @@ "Localizações geradas agora são armazenadas no diretório cache ao invés do " "localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "Permitir o ajuste do tamanho da fonte ao usar fontes da editora" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3823,39 +3822,39 @@ "Corrigido o controle deslizante de leitura que não aparece depois que a cota " "localStorage é excedida" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Gestos do touchpad e capacidade de percorrer as páginas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Modo tela cheia" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Opção de ocultar a barra de progresso" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Opção de desabilitar o dicionário" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Opção de utilizar a fonte da editora" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Restaurar o progresso da leitura agora é suave e sem travamento" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Corrigidos estilos personalizados que não se aplicavam em alguns casos" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Corrigido o arquivo AppData inválido" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Lançamento inicial" diff -Nru foliate-2.6.3ubuntu1/po/ru.po foliate-2.6.4/po/ru.po --- foliate-2.6.3ubuntu1/po/ru.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/ru.po 2022-01-13 19:59:57.000000000 +0000 @@ -4,26 +4,27 @@ # Schwonder Reismus , 2019. # Artem Polishchuk , 2019. # Artemii Sudakov , 2020. +# Alexandre Prokoudine , 2021. # msgid "" msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" -"PO-Revision-Date: \n" -"Last-Translator: zluka \n" -"Language-Team: \n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-06-12 12:10+0300\n" +"Last-Translator: Alexandre Prokoudine \n" +"Language-Team: русский \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" -"X-Generator: Poedit 2.3\n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.4.2\n" #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "" @@ -371,9 +372,10 @@ msgstr "" "Schwonder Reismus, 2019\n" "Artem Polishchuk, 2019\n" -"Artemii Sudakov, 2020" +"Artemii Sudakov, 2020\n" +"Alexandre Prokoudine, 2021" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Простая и современная программа для чтения электронных книг" @@ -436,11 +438,11 @@ #: src/opds.js:209 msgid "Update available" -msgstr "" +msgstr "Доступно обновление" #: src/opds.js:210 msgid "Update" -msgstr "" +msgstr "Обновить" #: src/opds.js:218 src/opds.js:230 msgid "Delete" @@ -456,7 +458,7 @@ #: src/opds.js:276 msgid "An error occurred." -msgstr "" +msgstr "Произошла ошибка." #: src/opds.js:280 src/ui/ttsDialog.ui:17 msgid "OK" @@ -568,7 +570,7 @@ #: src/properties.js:32 src/schemes.js:82 msgid "Amazon" -msgstr "" +msgstr "Amazon" #: src/properties.js:37 msgid "Goodreads" @@ -600,9 +602,8 @@ msgstr "" #: src/properties.js:402 -#, fuzzy msgid "Collections" -msgstr "Все главы" +msgstr "Коллекции" #: src/properties.js:424 msgid "Publication Date" @@ -625,9 +626,8 @@ msgstr "Идентификатор" #: src/properties.js:463 -#, fuzzy msgid "Source" -msgstr "Источник: " +msgstr "Источник" #: src/properties.js:518 #, fuzzy @@ -872,7 +872,7 @@ msgstr "Выделите текст, чтобы добавить примечание." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Примечания" @@ -1186,7 +1186,7 @@ msgstr "Выравнивание по ширине" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Автоперенос" @@ -1298,7 +1298,7 @@ #: src/ui/menuBar.ui:116 msgid "Up to Two Columns" -msgstr "" +msgstr "До двух столбцов" #: src/ui/menuBar.ui:179 msgid "_Go" @@ -1436,7 +1436,7 @@ msgstr "Перевести" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Найти в книге" @@ -1537,17 +1537,16 @@ msgstr "Требуется перезапуск" #: src/ui/preferenceWindow.ui:542 -#, fuzzy msgid "OPDS" -msgstr "URL адрес OPDS" +msgstr "OPDS" #: src/ui/preferenceWindow.ui:552 msgid "When downloading books" -msgstr "" +msgstr "При скачивании книг" #: src/ui/preferenceWindow.ui:563 msgid "Save to default directory" -msgstr "" +msgstr "Сохранять в используемый по умолчанию каталог" #: src/ui/preferenceWindow.ui:583 msgid "Ask what to do" @@ -1572,7 +1571,7 @@ #: src/ui/propertiesBox.ui:93 msgid "Details" -msgstr "" +msgstr "Подробности" #: src/ui/selectionPopover.ui:79 msgid "Look Up in Dictionary" @@ -1719,7 +1718,7 @@ #: src/ui/ttsDialog.ui:63 msgid "eSpeak NG" -msgstr "" +msgstr "eSpeak NG" #: src/ui/ttsDialog.ui:80 src/ui/ttsDialog.ui:106 src/ui/ttsDialog.ui:269 msgid "Reset" @@ -1727,7 +1726,7 @@ #: src/ui/ttsDialog.ui:88 msgid "Festival" -msgstr "" +msgstr "Festival" #: src/ui/ttsDialog.ui:137 msgid "" @@ -1773,7 +1772,7 @@ #: src/schemes.js:43 msgid "ISBN" -msgstr "" +msgstr "ISBN" #: src/schemes.js:44 src/schemes.js:48 src/schemes.js:53 src/schemes.js:58 msgid "International Standard Book Number" @@ -1781,19 +1780,19 @@ #: src/schemes.js:47 msgid "ISBN-10" -msgstr "" +msgstr "ISBN-10" #: src/schemes.js:52 msgid "ISBN-13" -msgstr "" +msgstr "ISBN-13" #: src/schemes.js:57 msgid "ISBN-A" -msgstr "" +msgstr "ISBN-A" #: src/schemes.js:62 msgid "JDCN" -msgstr "" +msgstr "JDCN" #: src/schemes.js:63 msgid "Japan Digital Comic Number" @@ -1801,7 +1800,7 @@ #: src/schemes.js:66 msgid "UUID" -msgstr "" +msgstr "UUID" #: src/schemes.js:67 msgid "Universally-Unique Identifier" @@ -1809,7 +1808,7 @@ #: src/schemes.js:70 msgid "URL" -msgstr "" +msgstr "URL" #: src/schemes.js:71 msgid "Uniform Resource Locator" @@ -1817,7 +1816,7 @@ #: src/schemes.js:74 msgid "URI" -msgstr "" +msgstr "URI" #: src/schemes.js:75 msgid "Uniform Resource Identifier" @@ -1825,7 +1824,7 @@ #: src/schemes.js:78 msgid "ISSN" -msgstr "" +msgstr "ISSN" #: src/schemes.js:79 msgid "International Standard Serial Number" @@ -1837,7 +1836,7 @@ #: src/schemes.js:87 msgid "OCLC" -msgstr "" +msgstr "OCLC" #: src/schemes.js:88 msgid "Online Computer Library Center" @@ -1845,11 +1844,11 @@ #: src/schemes.js:92 src/schemes.js:93 msgid "arXiv" -msgstr "" +msgstr "arXiv" #: src/schemes.js:96 src/schemes.js:97 msgid "calibre" -msgstr "" +msgstr "calibre" #: src/schemes.js:101 msgid "Foliate generated identifier" @@ -1857,7 +1856,7 @@ #: src/schemes.js:122 msgid "AAT" -msgstr "" +msgstr "AAT" #: src/schemes.js:123 msgid "The Getty Art and Architecture Taxonomy" @@ -1865,7 +1864,7 @@ #: src/schemes.js:126 msgid "BIC" -msgstr "" +msgstr "BIC" #: src/schemes.js:127 msgid "Book Industry Communication" @@ -1873,7 +1872,7 @@ #: src/schemes.js:130 msgid "BISAC" -msgstr "" +msgstr "BISAC" #: src/schemes.js:131 msgid "Book Industry Standards and Communications" @@ -1881,7 +1880,7 @@ #: src/schemes.js:135 msgid "CLC" -msgstr "" +msgstr "CLC" #: src/schemes.js:136 msgid "Chinese Library Classification" @@ -1889,7 +1888,7 @@ #: src/schemes.js:139 msgid "DDC" -msgstr "" +msgstr "DDC" #: src/schemes.js:140 msgid "Dewey Decimal Classification" @@ -1897,7 +1896,7 @@ #: src/schemes.js:144 msgid "CLIL" -msgstr "" +msgstr "CLIL" #: src/schemes.js:145 msgid "Commission de Liaison Interprofessionnelle du Livre" @@ -1905,11 +1904,11 @@ #: src/schemes.js:148 src/schemes.js:149 msgid "EuroVoc" -msgstr "" +msgstr "EuroVoc" #: src/schemes.js:152 msgid "MEDTOP" -msgstr "" +msgstr "MEDTOP" #: src/schemes.js:153 msgid "IPTC Media Topics" @@ -1917,7 +1916,7 @@ #: src/schemes.js:156 msgid "LCC" -msgstr "" +msgstr "LCC" #: src/schemes.js:157 msgid "Library of Congress Classification" @@ -1925,7 +1924,7 @@ #: src/schemes.js:161 msgid "LCSH" -msgstr "" +msgstr "LCSH" #: src/schemes.js:162 msgid "Library of Congress Subject Headings" @@ -1933,20 +1932,19 @@ #: src/schemes.js:166 msgid "NDC" -msgstr "" +msgstr "NDC" #: src/schemes.js:167 msgid "Nippon Decimal Classification" msgstr "" #: src/schemes.js:170 src/schemes.js:171 -#, fuzzy msgid "Thema" msgstr "Тема" #: src/schemes.js:174 msgid "UDC" -msgstr "" +msgstr "UDC" #: src/schemes.js:175 msgid "Universal Decimal Classification" @@ -1954,7 +1952,7 @@ #: src/schemes.js:179 msgid "WGS" -msgstr "" +msgstr "WGS" #: src/schemes.js:180 msgid "Warengruppen-Systematik" @@ -1962,7 +1960,7 @@ #: src/schemes.js:183 msgid "DCMIType" -msgstr "" +msgstr "DCMIType" #: src/schemes.js:184 msgid "DCMI Type Vocabulary" @@ -1970,7 +1968,7 @@ #: src/schemes.js:188 msgid "Audience" -msgstr "" +msgstr "Аудитория" #: src/schemes.js:189 msgid "Intended Audience" @@ -1992,7 +1990,7 @@ #: src/schemes.js:234 msgid "Art director" -msgstr "" +msgstr "Арт-директор" #: src/schemes.js:235 #, fuzzy @@ -2001,20 +1999,19 @@ #: src/schemes.js:236 msgid "Author of afterword, colophon, etc." -msgstr "" +msgstr "Автор послесловия, выходных данных и пр." #: src/schemes.js:237 msgid "Analyst" -msgstr "" +msgstr "Аналитик" #: src/schemes.js:238 msgid "Animator" msgstr "" #: src/schemes.js:239 -#, fuzzy msgid "Annotator" -msgstr "Примечание" +msgstr "" #: src/schemes.js:240 #, fuzzy @@ -2039,16 +2036,15 @@ #: src/schemes.js:245 msgid "Architect" -msgstr "" +msgstr "Архитектор" #: src/schemes.js:246 msgid "Artistic director" msgstr "" #: src/schemes.js:247 -#, fuzzy msgid "Arranger" -msgstr "Оранжевый" +msgstr "" #: src/schemes.js:248 msgid "Artist" @@ -2060,7 +2056,7 @@ #: src/schemes.js:250 msgid "Associated name" -msgstr "" +msgstr "Связанное имя" #: src/schemes.js:251 msgid "Autographer" @@ -2071,21 +2067,20 @@ msgstr "" #: src/schemes.js:253 -#, fuzzy msgid "Auctioneer" -msgstr "Подраздел" +msgstr "" #: src/schemes.js:254 msgid "Author of dialog" -msgstr "" +msgstr "Автор диалогов" #: src/schemes.js:255 msgid "Author of introduction, etc." -msgstr "" +msgstr "Автор предисловия и пр." #: src/schemes.js:256 msgid "Screenwriter" -msgstr "" +msgstr "Сценарист" #: src/schemes.js:258 msgid "Binding designer" @@ -2096,9 +2091,8 @@ msgstr "" #: src/schemes.js:260 -#, fuzzy msgid "Book designer" -msgstr "Читалка электронных книг" +msgstr "" #: src/schemes.js:261 msgid "Book producer" @@ -2110,7 +2104,7 @@ #: src/schemes.js:263 msgid "Binder" -msgstr "" +msgstr "Переплетчик" #: src/schemes.js:264 msgid "Bookplate designer" @@ -2118,16 +2112,15 @@ #: src/schemes.js:265 msgid "Broadcaster" -msgstr "" +msgstr "Вещательная компания" #: src/schemes.js:266 msgid "Braille embosser" msgstr "" #: src/schemes.js:267 -#, fuzzy msgid "Bookseller" -msgstr "Читалка электронных книг" +msgstr "Продавец книг" #: src/schemes.js:268 msgid "Caster" @@ -2139,19 +2132,19 @@ #: src/schemes.js:270 msgid "Choreographer" -msgstr "" +msgstr "Хореограф" #: src/schemes.js:271 msgid "Client" -msgstr "" +msgstr "Клиент" #: src/schemes.js:272 msgid "Calligrapher" -msgstr "" +msgstr "Каллиграф" #: src/schemes.js:273 msgid "Colorist" -msgstr "" +msgstr "Колорист" #: src/schemes.js:274 msgid "Collotyper" @@ -2163,7 +2156,7 @@ #: src/schemes.js:276 msgid "Composer" -msgstr "" +msgstr "Композитор" #: src/schemes.js:277 msgid "Compositor" @@ -2171,7 +2164,7 @@ #: src/schemes.js:278 msgid "Conductor" -msgstr "" +msgstr "Дирижер" #: src/schemes.js:279 msgid "Cinematographer" @@ -2179,7 +2172,7 @@ #: src/schemes.js:280 msgid "Censor" -msgstr "" +msgstr "Цензор" #: src/schemes.js:281 msgid "Contestant-appellee" @@ -2202,9 +2195,8 @@ msgstr "" #: src/schemes.js:286 -#, fuzzy msgid "Contestant" -msgstr "Оглавление" +msgstr "" #: src/schemes.js:287 msgid "Contestant-appellant" @@ -2229,9 +2221,8 @@ msgstr "" #: src/schemes.js:292 -#, fuzzy msgid "Copyright holder" -msgstr "Авторские права" +msgstr "Владелец авторских прав" #: src/schemes.js:293 msgid "Complainant" @@ -2247,27 +2238,27 @@ #: src/schemes.js:296 msgid "Correspondent" -msgstr "" +msgstr "Корреспондент" #: src/schemes.js:297 msgid "Corrector" -msgstr "" +msgstr "Корректор" #: src/schemes.js:298 msgid "Court reporter" -msgstr "" +msgstr "Репортер из зала суда" #: src/schemes.js:299 msgid "Consultant" -msgstr "" +msgstr "Консультант" #: src/schemes.js:300 msgid "Consultant to a project" -msgstr "" +msgstr "Консультант проекта" #: src/schemes.js:301 msgid "Costume designer" -msgstr "" +msgstr "Художник-костюмер" #: src/schemes.js:302 #, fuzzy @@ -2280,16 +2271,15 @@ #: src/schemes.js:304 msgid "Cartographer" -msgstr "" +msgstr "Картограф" #: src/schemes.js:305 msgid "Contractor" -msgstr "" +msgstr "Подрядчик" #: src/schemes.js:306 -#, fuzzy msgid "Contestee" -msgstr "Оглавление" +msgstr "Участник конкурса" #: src/schemes.js:307 msgid "Contestee-appellant" @@ -2297,7 +2287,7 @@ #: src/schemes.js:308 msgid "Curator" -msgstr "" +msgstr "Куратор" #: src/schemes.js:309 msgid "Commentator for written text" @@ -2336,9 +2326,8 @@ msgstr "" #: src/schemes.js:318 -#, fuzzy msgid "Dancer" -msgstr "Отменить" +msgstr "Танцор" #: src/schemes.js:319 msgid "Donor" @@ -2358,11 +2347,11 @@ #: src/schemes.js:323 msgid "Director" -msgstr "" +msgstr "Руководитель" #: src/schemes.js:324 msgid "Designer" -msgstr "" +msgstr "Дизайнер" #: src/schemes.js:325 msgid "Distributor" @@ -2398,18 +2387,16 @@ msgstr "Событие для открытия программы просмотра изображений" #: src/schemes.js:333 -#, fuzzy msgid "Editor" -msgstr "Редактировать" +msgstr "Редактор" #: src/schemes.js:334 msgid "Engraver" msgstr "" #: src/schemes.js:335 -#, fuzzy msgid "Electrician" -msgstr "Галисийский" +msgstr "Электрик" #: src/schemes.js:336 msgid "Electrotyper" @@ -2417,7 +2404,7 @@ #: src/schemes.js:337 msgid "Engineer" -msgstr "" +msgstr "Инженер" #: src/schemes.js:338 msgid "Enacting jurisdiction" @@ -2433,7 +2420,7 @@ #: src/schemes.js:341 msgid "Expert" -msgstr "" +msgstr "Эксперт" #: src/schemes.js:342 msgid "Facsimilist" @@ -2498,7 +2485,7 @@ #: src/schemes.js:357 msgid "Illustrator" -msgstr "" +msgstr "Иллюстратор" #: src/schemes.js:358 msgid "Illuminator" @@ -2510,9 +2497,8 @@ msgstr "Подписаться" #: src/schemes.js:360 -#, fuzzy msgid "Inventor" -msgstr "Негатив" +msgstr "Изобретатель" #: src/schemes.js:361 msgid "Issuing body" @@ -2534,7 +2520,7 @@ #: src/schemes.js:365 msgid "Judge" -msgstr "" +msgstr "Судья" #: src/schemes.js:366 msgid "Jurisdiction governed" @@ -2542,11 +2528,11 @@ #: src/schemes.js:367 msgid "Laboratory" -msgstr "" +msgstr "Лаборатория" #: src/schemes.js:368 msgid "Librettist" -msgstr "" +msgstr "Автор либретто" #: src/schemes.js:369 msgid "Laboratory director" @@ -2602,7 +2588,7 @@ #: src/schemes.js:382 msgid "Lithographer" -msgstr "" +msgstr "Литограф" #: src/schemes.js:383 msgid "Lyricist" @@ -2675,7 +2661,7 @@ #: src/schemes.js:400 msgid "Organizer" -msgstr "" +msgstr "Организатор" #: src/schemes.js:401 msgid "Onscreen presenter" @@ -2683,7 +2669,7 @@ #: src/schemes.js:403 msgid "Owner" -msgstr "" +msgstr "Владелец" #: src/schemes.js:404 msgid "Panelist" @@ -2694,9 +2680,8 @@ msgstr "" #: src/schemes.js:406 -#, fuzzy msgid "Publishing director" -msgstr "Издатель" +msgstr "" #: src/schemes.js:408 msgid "Project director" @@ -2771,9 +2756,8 @@ msgstr "" #: src/schemes.js:426 -#, fuzzy msgid "Production place" -msgstr "Дата публикации" +msgstr "Место производства" #: src/schemes.js:427 msgid "Production designer" @@ -2809,9 +2793,8 @@ msgstr "" #: src/schemes.js:435 -#, fuzzy msgid "Publication place" -msgstr "Дата публикации" +msgstr "Место публикации" #: src/schemes.js:436 msgid "Rubricator" @@ -2823,7 +2806,7 @@ #: src/schemes.js:438 msgid "Recording engineer" -msgstr "" +msgstr "Инженер по записи звука" #: src/schemes.js:439 msgid "Addressee" @@ -2831,7 +2814,7 @@ #: src/schemes.js:440 msgid "Radio director" -msgstr "" +msgstr "Директор радиостанции" #: src/schemes.js:441 msgid "Redaktor" @@ -2842,18 +2825,16 @@ msgstr "" #: src/schemes.js:443 -#, fuzzy msgid "Researcher" -msgstr "Поиск" +msgstr "Исследователь" #: src/schemes.js:444 -#, fuzzy msgid "Reviewer" -msgstr "Просмоторщик изображений:" +msgstr "Рецензент" #: src/schemes.js:445 msgid "Radio producer" -msgstr "" +msgstr "Продюсер на радио" #: src/schemes.js:446 msgid "Repository" @@ -2861,7 +2842,7 @@ #: src/schemes.js:447 msgid "Reporter" -msgstr "" +msgstr "Репортер" #: src/schemes.js:448 msgid "Responsible party" @@ -2901,16 +2882,15 @@ #: src/schemes.js:457 msgid "Scenarist" -msgstr "" +msgstr "Сценарист" #: src/schemes.js:458 msgid "Sculptor" -msgstr "" +msgstr "Скульптор" #: src/schemes.js:459 -#, fuzzy msgid "Scribe" -msgstr "Подписаться" +msgstr "" #: src/schemes.js:460 msgid "Sound designer" @@ -2918,7 +2898,7 @@ #: src/schemes.js:461 msgid "Secretary" -msgstr "" +msgstr "Секретарь" #: src/schemes.js:462 msgid "Stage director" @@ -2934,16 +2914,15 @@ #: src/schemes.js:465 msgid "Seller" -msgstr "" +msgstr "Продавец" #: src/schemes.js:466 msgid "Singer" -msgstr "" +msgstr "Певец" #: src/schemes.js:467 -#, fuzzy msgid "Speaker" -msgstr "Произнести" +msgstr "Докладчик" #: src/schemes.js:468 msgid "Sponsor" @@ -2983,11 +2962,11 @@ #: src/schemes.js:477 msgid "Technical director" -msgstr "" +msgstr "Технический директор" #: src/schemes.js:478 msgid "Teacher" -msgstr "" +msgstr "Преподаватель" #: src/schemes.js:479 msgid "Thesis advisor" @@ -3002,22 +2981,20 @@ msgstr "" #: src/schemes.js:482 -#, fuzzy msgid "Transcriber" -msgstr "Подписаться" +msgstr "Наборщик текста" #: src/schemes.js:483 -#, fuzzy msgid "Translator" -msgstr "Перевести" +msgstr "Переводчик" #: src/schemes.js:484 msgid "Type designer" -msgstr "" +msgstr "Дизайнер шрифтов" #: src/schemes.js:485 msgid "Typographer" -msgstr "" +msgstr "Наборщик" #: src/schemes.js:486 msgid "University place" @@ -3025,11 +3002,11 @@ #: src/schemes.js:487 msgid "Voice actor" -msgstr "" +msgstr "Актер озвучания" #: src/schemes.js:488 msgid "Videographer" -msgstr "" +msgstr "Видеографер" #: src/schemes.js:489 msgid "Writer of added commentary" @@ -3049,7 +3026,7 @@ #: src/schemes.js:493 msgid "Woodcutter" -msgstr "" +msgstr "Резчик по дереву" #: src/schemes.js:494 msgid "Wood engraver" @@ -3060,9 +3037,8 @@ msgstr "" #: src/schemes.js:496 -#, fuzzy msgid "Witness" -msgstr "Яркость" +msgstr "Свидетель" #: src/schemes.js:497 msgid "Writer of preface" @@ -3072,292 +3048,292 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "" "Foliate — это простая и современная читалка электронных книг на основе GTK." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Особенности:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Просмотр как в виде двух страниц, так и с помощью прокрутки" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Настраиваемый шрифт и интервал между строками" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Светлый, сепия, тёмный и негативный режимы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Ползунок навигации с отметками глав" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Закладки и примечания" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Быстрый поиск значения в словаре" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "Джон Фактотум" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Изменения:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "Исправлена возможность добавлять свои стили" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "Исправлена неработающая клавиша F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "Исправлен рендеринг некоторых книг" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 #, fuzzy msgid "Improved support for touch screens" msgstr "Улучшена поддержка вертикальных книг и книг справа-налево" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" -msgstr "" +msgstr "Различные исправления для GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 #, fuzzy msgid "Fixed unable to open some EPUB files" msgstr "" "Исправлена невозможность открытия книг у которых имя содержит \"#\" или \"?\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 #, fuzzy msgid "Fixed unable to open Mobipocket files" msgstr "" "Исправлена невозможность открытия книг у которых имя содержит \"#\" или \"?\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 #, fuzzy msgid "Fixed unique identifier extraction for EPUB files" msgstr "" "Исправлен уникальный идентификатор для файлов FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Каталоги OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Теперь каталоги открываются в основном окне библиотеки" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Показать текущее расположение" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Перейти к начальному каталогу" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Перезагрузить каталог" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Добавить текущий канал к каталогам" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "Поддержка аутентификации HTTP" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Прочие изменения:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Исправлен уникальный идентификатор для файлов FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" "Исправлена ошибка при которой игнорировались переносы строки при копировании " "текста" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" "Опция \"Перелистывать страницы по нажатию\" теперь отключена для неразрывных " "представлений" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "Открытие книги из библиотеки теперь закрывает окно библиотеки" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "Язык и дата публикации теперь парсятся и форматируются" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Экспортировать примечания из библиотеки" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Исправлены размытые обложки книг на HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" "Исправлены ссылки OPDS на стандартные электронные книги и Проект Гутенберга" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Исправлена неправильная иконка при запуске" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Библиотека:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "Вид библиотеки, показывающее последние книги и прогресс чтения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Поиск книг по их метаданным" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "Электронная книга с OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Новые поддерживаемые форматы:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Архив comic book (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Текст (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Распакованные файлы EPUB" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Расположение:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Параметр для изменения максимальной ширины страницы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" @@ -3365,11 +3341,11 @@ "\"Автоматическое\" расположение теперь будет отображать четыре столбца при " "широкой ширине страницы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Просмоторщик изображений:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" @@ -3377,7 +3353,7 @@ "Улучшенный просмотрщик изображений с новыми сочетаниями клавиш и " "возможностью поворачивать и инвертировать изображения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3385,37 +3361,37 @@ "Возможность для отключения просмотрщика изображений или открытия изображения " "по двойному, среднему или правому щелчку" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Озвучка текста:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Улучшенный пользовательский интерфейс для настройки озвучки текста" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" "Возможность установить голос для озвучки текста основываясь на языке книги" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Импортировать примечания из JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Поиск по примечания" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" "Примечания теперь отсортированы в том же порядке что появляются в книге" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Безопасность:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3423,44 +3399,44 @@ "\"Разрешить небезопасный контент\" теперь только включает JavaScript; " "внешние данные не будут загруженны" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "Процессы WebKit теперь изолированны в песочнице" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Другие улучшения и исправления:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Улучшена поддержка вертикальных книг и книг справа-налево" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Поддержка словарей StarDict" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" "Исправлена ошибка с не сохранением текущего местоположения при изменении " "размера" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" "Исправлено автоматическое скрытие панели заголовка под некоторыми темами" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Параметры командной строки для отображения версии и добавления книг в " "библиотеку" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Параметр для очистки или выключения кеширования" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3468,63 +3444,63 @@ "Когда HTML-страница содержит недопустимые самозакрывающиеся теги привязки, " "теперь анализируется как XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Исправления:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Исправлен неправильный номер версии" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Исправлена ошибка: словарь, перевод и Википедия не работали в Snap пакете" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Новые функции:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Новая улучшенная иконка" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Возможность отключить перелистывание по нажатию" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "Меню для открытия недавних файлов на экране приветствия" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "Восстановлены ярлыки для отображения примечаний, закладок" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Исправления перевода" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Интерфейс:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Редизайн интерфейса для лучшей работы на маленьких экранах" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Улучшен полноэкранный режим" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3532,7 +3508,7 @@ "Заголовок и полоска прогресса автоматически скрываются что не отвлекать от " "чтения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" @@ -3540,7 +3516,7 @@ "Различная дополнительная информация, например часы, может отображаться в " "футере" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3548,7 +3524,7 @@ "Новая всплывашка (Ctrl + L) которая показывает ожидаемое время прочтения и " "позволяет перемещаться между расположениями" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3558,22 +3534,22 @@ "страницу нажмите на левую или правую часть экрана; нажатие на центральную " "часть переключает отображение заголовка и полоски прогресса" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" "Примечания, закладки и результаты поиска теперь отображают название главы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "При поиске слова в словаре запрос может быть отредактирован" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" "Новые горячие клавиши для показа метаинформации (Ctrl + I) и настроек (Ctrl " "+ ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" @@ -3581,82 +3557,82 @@ "Новая дополнительная панель меню, которая может отображаться в зависимости " "от окружения рабочего стола" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "Возможность использования традиционного заголовка и меню вместо шапки" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Чтение:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Непрерывный вид отображения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "Декоративные тени для схожести с реальной книгой" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Возможность менять масштаб" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Улучшено отображение картинок с возможностью сохранения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Открыть копию книги в новом окне (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Перезагрузить книгу (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Новые встроенные темы: Серая, Solarized, Gruvbox, Северная" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Выделение текста:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Возможность выделять текст между страницами" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Поиск по книге" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Произнести выделенный текст или текст из выделенного расположения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Примечания:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Проверка орфографии в заметках" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Экспортировать примечания в Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Возможность использовать свои цвета для выделения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "Для издателей и разработчиков:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3664,188 +3640,188 @@ "Поддержка атрибута тем Apple Books, что позволяет книгам распознавать темы " "без JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "Стали доступны средства разработчика WebKit" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Ломающие изменения:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Реорганизована схема настроек" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Формат пользовательских тем был изменён" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Расположения теперь имеют размер 1024 символов" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Исправления ошибок:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Исправлено неправильное восстановление последней позиции" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "Исправлена навигация не работавшая в виде с прокруткой" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Исправлено масштабирование шрифта в книгах использующих абсолютные размеры" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Исправлена обрезка текста на границе отступа" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" "Исправлена невозможность открытия книг у которых имя содержит \"#\" или \"?\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "Flatpack версия не может открыть .mobi, .azw, и .azw3 файлы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Улучшенный вики-поиск, теперь со ссылками и примерами" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Улучшенное форматирование и извлечение сносок" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Добавлена опция для экспорта примечаний в BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "Исправлена навигация по оглавлению не работавшая в некоторых книгах" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Исправлено масштабирование картинок в Kindle книгах" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Исправлена невозможность открытия книг с расширением .epub3" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Исправлена очистка временной директории после закрытия" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "Исправлена неработающая клавиша F9" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Обновлены переводы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Внешние ресурсы и Javascript теперь заблокированы по умолчанию" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Базовая поддержка озвучки текста" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Экспорт примечаний в HTML, текстовый формат или JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Поддержка .mobi, .azw, и .azw3 форматов" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Новый альтернативный интерфейс боковой панели" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Ищите слова в Википедии и оффлайн-словарях" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Переводите предложения с Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Настроить действие по умолчанию когда выбрано несколько слов" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Экспериментальная поддержка всплывающих сносок" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Возможность искать только в текущей главе" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Исправлено потребление CPU" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Исправлен рендеринг выделений" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Исправлено падение при открытии файлов" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Изменены отступы и яркость страницы" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Настройте цветовую тему, или создайте свою собственную" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Возможность увеличивать и копировать изображения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Возможность скрывать курсор" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" "Показать оставшееся время чтения при наведении курсора на строку прогресса" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Исправлен рендеринг некоторых книг" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Исправлены слишком широкие изорбражения" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Возможность выравнивания слева или по ширине" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Новый способ отображения: возможность просмотра по одной странице" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Исправления:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" @@ -3853,49 +3829,49 @@ "Сгенерированные местоположения теперь хранятся в кеше директории а не в " "localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "Возможность менять размер шрифта издателя" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "Исправлено исчезновение строки прогресса при переполнении localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Жесты тачпада и возможность скроллить постранично" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "На весь экран" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Возможность скрыть ползунок навигации" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Возможность отключить словарь" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Возможность использовать шрифт издателя" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Переход к месту, где вы остановились в прошлый раз, стал более плавным" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Исправлена возможность добавлять свои стили" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Исправлен некорректный файл AppData" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Начальный релиз" @@ -4630,21 +4606,18 @@ #~ msgid "View on Wiktionary" #~ msgstr "Смотреть на Викисловаре" -#, javascript-format #~ msgid "%d hour left in book" #~ msgid_plural "%d hours left in book" #~ msgstr[0] "Книгу осталось читать %d час" #~ msgstr[1] "Книгу осталось читать %d часа" #~ msgstr[2] "Книгу осталось читать %d часов" -#, javascript-format #~ msgid "%d minute left in section" #~ msgid_plural "%d minutes left in section" #~ msgstr[0] "Главу осталось читать %d минуту" #~ msgstr[1] "Книгу осталось читать %d минуты" #~ msgstr[2] "Книгу осталось читать %d минут" -#, javascript-format #~ msgid "%d hour left in section" #~ msgid_plural "%d hours left in section" #~ msgstr[0] "Главу осталось читать %d час" @@ -4681,7 +4654,6 @@ #~ msgid "Reading Progress Bar" #~ msgstr "Навигация" -#, javascript-format #~ msgid "Annotations for %s" #~ msgstr "Примечания к %s" diff -Nru foliate-2.6.3ubuntu1/po/sv.po foliate-2.6.4/po/sv.po --- foliate-2.6.3ubuntu1/po/sv.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/sv.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" -"PO-Revision-Date: 2020-12-09 22:25+0100\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" +"PO-Revision-Date: 2021-04-02 22:14+0200\n" "Last-Translator: Jonatan Nyberg \n" "Language-Team: \n" "Language: sv\n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -359,7 +359,7 @@ msgid "translator-credits" msgstr "Jonatan Nyberg" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "En enkel och modern e-bokvisare" @@ -829,7 +829,7 @@ #: src/ui/catalogWindow.ui:68 msgid "Preview URL" -msgstr "Förhandsgranska webbadress" +msgstr "Förhandsgranskningswebbadress" #: src/ui/catalogWindow.ui:77 msgid "Optional" @@ -852,7 +852,7 @@ msgstr "Välj lite text för att lägga till anteckningar." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Anteckningar" @@ -1166,7 +1166,7 @@ msgstr "Fullständig justering" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Automatisk avstavning" @@ -1277,7 +1277,7 @@ #: src/ui/menuBar.ui:116 msgid "Up to Two Columns" -msgstr "" +msgstr "Upp till två kolumner" #: src/ui/menuBar.ui:179 msgid "_Go" @@ -1415,7 +1415,7 @@ msgstr "Översätt" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Hitta i boken" @@ -3013,302 +3013,298 @@ msgid "Writer of supplementary textual content" msgstr "Författare av kompletterande textinnehåll" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate är en enkel och modern GTK e-bokvisare." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Funktioner inkluderar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "Tvåsidig vy och rullad vy" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Anpassa teckensnitt och radavstånd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Ljust-, sepia-, mörkt- och inverterat läge" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Läsförloppsreglage med kapitelmärken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Bokmärken och anteckningar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Snabb ordboksuppslagning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" -msgstr "" +msgstr "Åtgärdat ett prestandaproblem med packade filer (inklusive EPUB-filer)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" -msgstr "" +msgstr "Åtgärdat användargränssnittet vid körning med libhandy 1.x" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" -msgstr "" +msgstr "Åtgärdat automatisk layout" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Ändringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" -msgstr "" +msgstr "Lagt till stöd för att öppna HTML-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" -msgstr "" +msgstr "Konsekventa inre och yttre marginaler" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" -msgstr "" +msgstr "Den automatiska layouten stöder inte längre fyra kolumner" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" -msgstr "" +msgstr "Åtgärdat att långa ord flyter över" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" -msgstr "Åtgärdat att anpassade stilar inte tillämpas i vissa fall" +msgstr "Åtgärdat att anpassade teman sparades inte över sessioner" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" -msgstr "Åtgärdat att F9-kortkommandot inte fungerar" +msgstr "Åtgärdat genvägar för knappsatser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" -msgstr "" +msgstr "Åtgärdat öppnande av FB2-filer som inte är UTF-8" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" -msgstr "Åtgärdat att vissa böcker inte återges ibland" +msgstr "Åtgärdat att böcker inte öppnas i GNOME 40" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 -#, fuzzy +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" -msgstr "Förbättrat stöd för vertikala och höger till vänster böcker" +msgstr "Förbättrat stöd för pekskärmar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" -msgstr "" +msgstr "OPDS-referenser kan nu kommas ihåg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" -msgstr "" +msgstr "Olika korrigeringar för GNOME 3.38" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" -msgstr "" +msgstr "Åtgärdat interna länkar för Wiktionary" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" -msgstr "" +msgstr "Lade till baskiska, koreanska och norska översättningar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "Åtgärdat att inte kunna öppna vissa EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "Åtgärdat att inte kunna öppna Mobipocket-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "Förbättrad visning av metadata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "Förbättrad rendering av FictionBook" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "Förbättrad användargränssnitt för att skaffa böcker från OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "Åtgärdat unika identifierarextraktion för EBUP-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "Åtgärdat saknad fönsterikon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" "Åtgärdat TTS-miljövariabler som inte ställs in vid användning av Flatpak" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" "Åtgärdat att eSpeak NG-röst inte är vald vid testning av TTS-konfiguration" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" "Åtgärdat fel \"__ibooks_internal_theme\" attribut när \"Invert\" är aktiverat" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS-kataloger:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "Kataloger öppnas nu i huvudbibliotekets fönster" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Visa aktuell plats" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "Gå till katalogens startsida" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Uppdatera katalogen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "Lägg till aktuellt flöde i katalogerna" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "HTTP-autentiseringsstöd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "Andra ändringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" "Åtgärdat unika identifierarextraktion för FictionBook (.fb2, .fb2.zip)-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "Åtgärdat att nya rader ignoreras vid kopiering av text" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "\"Vänd sida vid tryck\" är nu inaktiverat i icke-sidnumrerade layouter" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "Öppnande av en bok från biblioteksvyn stängs nu biblioteksfönstret" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" "Språk och publiceringsdatum i metadata är nu analyserade och formaterade" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "Exportera kommentarer från biblioteksvyn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "Åtgärdat oskarpa bokomslag på HiDPI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "Åtgärdat OPDS-länkar till standardböcker och Project Gutenberg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "Åtdärdat felvyikon vid uppstart" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Bibliotek:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "En biblioteksvy som visar senaste böcker och läsningens framsteg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "Sök i böcker efter metadata" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "E-bokupptäckt med OPDS" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "Nya format som stöds:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "Serietidningsarkiv (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "Klartext (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "Uppackade EPUB-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Layout:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "Alternativ för att ställa in maximal sidbredd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "Layouten \"Automatisk\" visar nu fyra kolumner när sidbredden är bred" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "Bildvisare:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -"Förbättrad bildvisare, med nya kortkommandon och förmågan att rotera och " +"Förbättrad bildvisare, med nya genvägar och förmågan att rotera och " "invertera bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" @@ -3316,35 +3312,35 @@ "Alternativ för att inaktivera bildvisaren eller att öppna bilder med " "dubbel-, mitten- eller högerklick" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "Text-till-tal:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "Förbättrat användargränssnitt för konfiguration av text till tal" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "Möjlighet att ställa in text-till-tal-röst baserat på bokspråk" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Importera kommentarer från JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Sök i kommentarer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "Kommentarer sorteras nu i samma ordning som de visas i boken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "Säkerhet:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" @@ -3352,40 +3348,40 @@ "\"Tillåt osäkert innehåll\" aktiverar nu bara JavaScript; externt innehåll " "kommer inte längre att läsas in" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit-processer är nu satta i sandlådaläge" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "Andra funktioner och korrigeringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "Förbättrat stöd för vertikala och höger till vänster böcker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "Stöd för StarDict-ordböcker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "Åtgärdade att aktuell plats inte bevaras vid storleksändring" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "Åtgärdade automatisk döljande av rubrikfält under vissa teman" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" "Kommandoradsflaggor för att visa version och lägga till böcker i biblioteket" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "Alternativ för att rensa eller inaktivera cache" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" @@ -3393,65 +3389,65 @@ "När en HTML-sida innehåller ogiltiga självstängande ankartaggar, har den nu " "analyserats som XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "Åtgärder:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "Åtgärdat felversionsnummer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" "Åtgärdade att ordbok, översättning och Wikipedia inte fungerar i Snap-paketet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "Nya funktioner:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "Ny och förbättrad ikon" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "Alternativ att inaktivera vänd sida vid tryck" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "En meny på välkomstskärmen för att öppna nya filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" -"Återställda kortkommandon för att visa innehållsföreteckning, kommentarer " -"och bokmärken" +"Återställda genvägar för att visa innehållsföreteckning, kommentarer och " +"bokmärken" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "Åtgärdat att applikationen inte översatts" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "Gränssnitt:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "Ett nytt gränssnitt som fungerar bättre för mindre skärmar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "Förbättrad helskärmsläge med en överlagrad rubrikrad" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" @@ -3459,13 +3455,13 @@ "Rubrikraden och förloppsindikatorn döljer sig nu automatiskt för en " "distraktionsfri läsupplevelse" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "Olika platsinformation samt en klocka kan nu visas i sidfoten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" @@ -3473,7 +3469,7 @@ "En ny flytande platsruta (Ctrl + L) som visar lästidsuppskattningar och gör " "det möjligt att hoppa till platser" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3483,27 +3479,26 @@ "trycka på vänster eller höger del av vyn; tryck på mitten för att växla " "rubrikraden och förloppsindikatorn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "Kommentarer, bokmärken och hitta resultat visar nu kapiteltitlar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "När du slår upp ord i ordböcker kan förfrågan nu redigeras" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" -"Nytt kortkommando för visning av metadata (Ctrl + I) och inställningar (Ctrl " -"+ ,)" +"Ny genväg för visning av metadata (Ctrl + I) och inställningar (Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "En ny traditionell menyrad, som kan visas beroende på skrivbordsmiljön" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" @@ -3511,77 +3506,77 @@ "Alternativ att använda en traditionell titelrad och menyrad istället för en " "rubrikrad (experimentell)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "Läser:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "Kontinuerlig rullningslayout" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" "Alternativ att visa dekorativa skuggor som härmar utseendet på en riktig bok" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "Möjlighet att zooma in och zooma ut" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "Förbättrad bildvisare med alternativet \"spara som\"" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "Öppna kopior av en bok i nya fönster (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "Läs om boken (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "Nya inbyggda teman: Grå, Solarized, Gruvbox, Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "Textmarkering:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "Möjlighet att välja text mellan sidor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "Hitta vald text i book" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "Säg markerad text eller från den valda platsen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Kommentarer:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "Stavekontrollanteckningar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "Exportera kommentarer till Markdown" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "Alternativ för att använda anpassade färger för markeringar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "För utgivare och utvecklare:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" @@ -3589,201 +3584,201 @@ "Stöd för Apple Books-temaattribut, som gör det möjligt för böcker att " "upptäcka teman utan JavaScript" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "WebKits utvecklarverktyg kan aktiveras" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "Stora förändringar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "Inställningsschema har omorganiserats" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "Formatet för anpassade teman har ändrats" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "Platserna är nu 1024 tecken i storlek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "Åtgärdade fel:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "Åtgärdat att exakt sista plats inte återställs" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" "Åtgärdat att innehållsförteckningsnavigering inte fungerar med " "rullningslayout" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" "Åtgärdat att teckenstorleken inte ändras när boken använder nyckelord i " "absolut storlek" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "Åtgärdat att texten avskärs i marginalkanten" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "Åtgärdat att inte kunna öppna böcker med \"#\" eller \"?\" i filnamnet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" "Åtgärdat att Flatpak-versionen inte kan öppna .mobi-, .azw- och .azw3-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "Förbättrad Wiktionary-uppslagning, nu med länkar och exempelmeningar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "Förbättrad fotnotsextraktion och -formatering i flytande ruta" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "Tillagt alternativ för att exportera kommentarer till BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" "Åtgärdat att innehållsförteckningsnavigering inte fungerar med vissa böcker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "Åtgärdat att inte kunna zooma bilder med Kindle-böcker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "Åtgärdat att inte kunna öppna böcker med .epub3-filnamnstillägg" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "Åtgärdat att tillfällig katalog inte rensas efter stängning" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" -msgstr "Åtgärdat att F9-kortkommandot inte fungerar" +msgstr "Åtgärdat att F9-genvägen inte fungerar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "Uppdaterade översättningar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "Externa resurser och JavaScript blockeras nu som standard" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "Grundläggande text-till-tal-stöd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "Exportera kommentarer till HTML, vanlig text eller JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "Stöd för visning av .mobi-, .azw- och .azw3-filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "Nytt alternativt sidofältsanvändargränssnitt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "Slå upp ord i Wikipedia och frånkopplade ordböcker" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "Översätt passager med Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "Konfigurera standardåtgärd när ord är markerade" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "Experimentellt popup-fotnot stöd" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "Förmåga att hitta inom endast det aktuella kapitlet" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "Åtgärdat CPU-toppar när lämnad öppen" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "Åtgärdat att markeringar inte visas på rätt positioner" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "Åtgärdat kraschar när man öppnar filer" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "Anpassa sidmarginaler och ljusstyrka" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "Justera temafärger, eller lägga till dina egna teman" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "Möjlighet att zooma och kopiera bilder" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "Alternativ att automatiskt dölja markören" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "Se lästid kvar genom att sväva över reglaget för läsförlopp" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "Åtgärdat att vissa böcker inte återges ibland" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "Åtgärdat att bilder är för breda i vissa fall" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "Alternativ att växla mellan vänster och fullständig justering" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "Nytt layoutalternativ: siddelad vy med en kolumn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "Åtgärdat:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "Genererade platser lagras nu i cachekatalogen snarare än localStorage" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "Tillåt justering av teckenstorlek när du använder förlagstypsnitt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" @@ -3791,39 +3786,39 @@ "Åtgärdat att läsförloppsreglaget inte visas efter att localStorage-kvot " "överskrids" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "Pekplattgester och förmåga att bläddra igenom sidor" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Helskärmsläge" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "Alternativ att dölja läsförloppsindikatorn" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "Alternativ att inaktivera ordbok" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "Alternativ att använda förlagstypsnitt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "Att återställa läsningsförlopp är nu smidigt och problemfritt" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "Åtgärdat att anpassade stilar inte tillämpas i vissa fall" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "Åtgärdat ogiltig AppData-fil" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "Första utgåvan" @@ -3996,9 +3991,8 @@ msgstr "Marginal" #: data/com.github.johnfactotum.Foliate.gschema.xml:137 -#, fuzzy msgid "Page margin in pixels" -msgstr "Sidmarginal i procent" +msgstr "Sidmarginal i pixlar" #: data/com.github.johnfactotum.Foliate.gschema.xml:141 msgid "Max width" diff -Nru foliate-2.6.3ubuntu1/po/tr.po foliate-2.6.4/po/tr.po --- foliate-2.6.3ubuntu1/po/tr.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/tr.po 2022-01-13 19:59:57.000000000 +0000 @@ -21,7 +21,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:1225 #: src/library.js:1543 src/main.js:181 src/window.js:1003 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -412,7 +412,7 @@ msgid "translator-credits" msgstr "Emin Tufan Çetin " -#: src/main.js:182 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:182 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Basit ve çağdaş e-kitap görüntüleyici" @@ -698,7 +698,7 @@ msgstr "Açıklama eklemek için metin seçin." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:87 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:87 msgid "Annotations" msgstr "Açıklamalar" @@ -991,7 +991,7 @@ msgstr "İki Yana Yasla" #: src/ui/mainMenu.ui:519 src/ui/menuBar.ui:143 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 msgid "Auto-hyphenation" msgstr "Kendiliğinden Tireleme" @@ -1252,7 +1252,7 @@ msgstr "Çevir" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:135 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Kitapta bul" @@ -1973,611 +1973,611 @@ msgid "Wikipedia" msgstr "Vikipedi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate, basit ve çağdaş GTK eKitap görüntüleyicidir." -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "Şu özellikleri vardır:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "İki sayfalı görünüm ve kaydırmalı görünüm" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "Özelleştirilebilir yazı tipi ve satır boşluklama" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "Aydınlık, sepya, karanlık ve ters çevirme kipi" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "Bölüm imleriyle okuma süreci kaydırıcı" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "Hızlı sözlük göz atma" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:226 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:296 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:226 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:296 msgid "Changes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:51 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:51 msgid "Fixed blurry book covers on HiDPI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:52 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:52 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:53 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:53 msgid "Fixed wrong view icon on startup" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Library:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:61 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:61 msgid "A library view showing recent books and reading progress" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:62 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:62 msgid "Search books by metadata" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:63 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:63 msgid "E-book discovery with OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:65 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:65 msgid "New supported formats:" msgstr "Yeni desteklenen biçimler:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Plain text (.txt)" msgstr "Düz metin (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Unpacked EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Layout:" msgstr "Yerleşim:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:74 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:74 msgid "Option to set maximum page width" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:75 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:75 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:77 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:77 msgid "Image viewer:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:80 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:80 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "Text-to-speech:" msgstr "Metinden sese:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Improved text-to-speech configuration UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Ability to set text-to-speech voice based on book language" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:89 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:89 msgid "Import annotations from JSON" msgstr "JSONʼdan notları içe aktar" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:90 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:90 msgid "Search in annotations" msgstr "Notlarda ara" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:93 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:93 msgid "Security:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:95 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:95 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "WebKit processes are now sandboxed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:98 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:98 msgid "Other featues and fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:100 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:100 msgid "Improved support for vertical and right-to-left books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 msgid "Support for StarDict dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:102 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:102 msgid "Fixed current location not preserved when resizing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Fixed auto-hiding header bar under some themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Command-line options for showing version and adding books to library" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Option to clear or disable cache" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:112 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:206 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:273 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:313 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:112 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:206 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:273 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:313 msgid "Fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:114 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:114 msgid "Fixed wrong version number" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:115 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:115 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:282 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:305 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:282 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:305 msgid "New features:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "New and improved icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:124 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:124 msgid "Option to disable turn page on tap" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "A menu on the welcome screen for opening recent files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:126 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:126 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Fixed application not translated" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:136 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:136 msgid "Interface:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 msgid "A redesigned interface that works better for smaller screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:139 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:139 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:143 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:143 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " "progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:144 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:144 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:145 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:145 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:146 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:146 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:147 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:147 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "Reading:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "Continuous scrolling layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:153 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:153 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "Ability to zoom in and zoom out" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:155 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:155 msgid "Improved image viewer with \"save as\" option" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Reload book (Ctrl + R)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:160 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:160 msgid "Text selection:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:162 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:162 msgid "Ability to select text across pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Find selected text in book" msgstr "Seçili metni kitapta bul" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "Speak selected text or from the selected locatio" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Annotations:" msgstr "Notlar:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "Spellcheck notes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "Export annotations to Markdown" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:170 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:170 msgid "Options to use custom colors for highlights" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:172 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:172 msgid "For publishers and developers:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:175 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:175 msgid "WebKit's developer tools can be enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:177 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:177 msgid "Breaking changes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "The settings schemas has been reorganized" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "The format for custom themes has changed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:181 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:181 msgid "Locations are now 1024 characters in size" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:183 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:183 msgid "Bug fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "Fixed not restoring exact last location" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:186 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:186 msgid "Fixed navigation not working with scrolled layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:188 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:188 msgid "Fixed text cut off at margin edge" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:197 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:197 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:198 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:198 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" "İyileştirilmiş Vikisözlük göz atma, şimdi bağlantılar ve örnek tümcelerle " "birlikte" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:199 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:199 msgid "Improved popover footnote extraction and formatting" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:200 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:200 msgid "Added option to export annotations to BibTeX" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:208 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:208 msgid "Fixed table of contents navigation not working with some books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:209 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:209 msgid "Fixed not being able to zoom images with Kindle books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:211 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:211 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed F9 shortcut not working" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:220 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:220 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Updated translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "External resources and JavaScript are now blocked by default" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "Basic text-to-speech support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "Export annotations to HTML, plain text, or JSON" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "New alternative sidebar UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:240 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:240 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Translate passages with Google Translate" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "Configure default action when words are selected" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Experimental popup footnote support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Ability to find within only the current chapter" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Fixed CPU spikes when left open" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Fixed highlights not rendering at the correct positions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:254 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:254 msgid "Fixed crashing when opening files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "Customize page margins and brightness" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:265 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:265 msgid "Ability to zoom and copy images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Option to auto-hide cursor" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:267 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:267 msgid "See reading time left by hovering over the reading progress slider" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed some books not rendering sometimes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed images being too wide in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:285 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:285 msgid "Option to switch between left and full justification" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "New layout option: single-column paginated view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Fixed:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:290 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:290 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Allow font size adjustment when using publisher fonts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:307 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:307 msgid "Touchpad gestures and ability to scroll through pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fullscreen mode" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 msgid "Option to hide reading progress bar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:310 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:310 msgid "Option to disable dictionary" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:311 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:311 msgid "Option to use publisher font" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:316 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:316 msgid "Fixed custom styles not applying in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:322 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:322 msgid "Fixed invalid AppData file" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:327 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:327 msgid "Initial release" msgstr "" diff -Nru foliate-2.6.3ubuntu1/po/uk.po foliate-2.6.4/po/uk.po --- foliate-2.6.3ubuntu1/po/uk.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/uk.po 2022-01-13 19:59:57.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-07-08 15:09+0300\n" "Last-Translator: Anton Isachenko \n" "Language-Team: \n" @@ -22,7 +22,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -375,7 +375,7 @@ "Danylo Korostil \n" "Юрій Яновський " -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "Простий і сучасний переглядач електронних книжок" @@ -872,7 +872,7 @@ msgstr "Виберіть текст, щоб додати примітки." #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "Примітки" @@ -1185,7 +1185,7 @@ msgstr "Повне вирівнювання" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "Автоматичне перенесення слів" @@ -1434,7 +1434,7 @@ msgstr "Переклад" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "Пошук в книзі" @@ -3067,457 +3067,457 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 #, fuzzy msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Простий і сучасний переглядач електронних книжок" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 #, fuzzy msgid "Features include:" msgstr "Спеціальне" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "Закладки та анотації" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "Зміни:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "Каталоги OPDS:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "Показати теперішнє розташування" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 #, fuzzy msgid "Go to catalog start page" msgstr "Перевернути сторінку" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "Оновити каталог" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 #, fuzzy msgid "Add current feed to catalogs" msgstr "Відкрити каталог" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 #, fuzzy msgid "HTTP authentication support" msgstr "Потрібна автентифікація" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 #, fuzzy msgid "Other changes:" msgstr "Зміни:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 #, fuzzy msgid "Export annotations from the library view" msgstr "Імпортувати анотації" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "Бібліотека:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 #, fuzzy msgid "New supported formats:" msgstr "Виберіть формат для експорту:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 #, fuzzy msgid "Plain text (.txt)" msgstr "Простий текст" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "Формат:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 #, fuzzy msgid "Option to set maximum page width" msgstr "Максимальна ширина сторінки" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 #, fuzzy msgid "Image viewer:" msgstr "Інтерфейс" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 #, fuzzy msgid "Text-to-speech:" msgstr "Команда для синтезу мовлення" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "Імпортувати анотації з JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "Пошук в анотаціях" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 #, fuzzy msgid "Option to clear or disable cache" msgstr "Перевертати сторінку торканням" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 #, fuzzy msgid "Option to disable turn page on tap" msgstr "Перевертати сторінку торканням" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 #, fuzzy msgid "Interface:" msgstr "Інтерфейс" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 #, fuzzy msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " @@ -3528,347 +3528,347 @@ "на ліву та праву частину сторінки; торкання на середину сторінку, щоб " "перемкнути заголовок та поступ" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 #, fuzzy msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "Якщо вказано, буде використано звичну смужку заголовку і панель меню" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 #, fuzzy msgid "Reading:" msgstr "Читання" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 #, fuzzy msgid "Text selection:" msgstr "Команда для синтезу мовлення" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 #, fuzzy msgid "Find selected text in book" msgstr "Пошук в книзі" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "Анотації:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 #, fuzzy msgid "Export annotations to Markdown" msgstr "Імпортувати анотації" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 #, fuzzy msgid "WebKit's developer tools can be enabled" msgstr "Якщо вказано, вмикає розробницькі інструменти" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 #, fuzzy msgid "Updated translations" msgstr "Цільова мова для перекладів" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 #, fuzzy msgid "Basic text-to-speech support" msgstr "Команда для синтезу мовлення" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 #, fuzzy msgid "Export annotations to HTML, plain text, or JSON" msgstr "Імпортувати анотації" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 #, fuzzy msgid "Translate passages with Google Translate" msgstr "Переклад через Google Translate" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 #, fuzzy msgid "Configure default action when words are selected" msgstr "Типова дія, коли вибираєте слово" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 #, fuzzy msgid "Option to auto-hide cursor" msgstr "Автоматично ховати вказівник" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "Повноекранний режим" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 #, fuzzy msgid "Option to hide reading progress bar" msgstr "Перевертати сторінку торканням" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 #, fuzzy msgid "Option to disable dictionary" msgstr "Перевертати сторінку торканням" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 #, fuzzy msgid "Option to use publisher font" msgstr "Вжити шрифт видавця" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "" diff -Nru foliate-2.6.3ubuntu1/po/zh_CN.po foliate-2.6.4/po/zh_CN.po --- foliate-2.6.3ubuntu1/po/zh_CN.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/zh_CN.po 2022-01-13 19:59:57.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2021-03-30 14:03+0800\n" "Last-Translator: Tranquilo Chan \n" "Language-Team: Chinese - China \n" @@ -21,7 +21,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -354,7 +354,7 @@ "Tranquilo Chan\n" "王滋涵" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "简洁现代的电子书查看器" @@ -845,7 +845,7 @@ msgstr "选中文本以添加笔记。" #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "笔记" @@ -1155,7 +1155,7 @@ msgstr "左右对齐" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "自动断词" @@ -1404,7 +1404,7 @@ msgstr "翻译" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "书中搜索" @@ -3002,442 +3002,442 @@ msgid "Writer of supplementary textual content" msgstr "补充文本内容作者" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate 是简洁现代的 GTK 电子书阅读器。" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "功能包括:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "两栏视图及滚动视图" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "自定义字体和行距" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "亮色、棕色、暗色和反转色模式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "带章节标签的阅读进度条" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "书签和笔记" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "快速查阅词典" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "修复了使用 libhandy 1.x 时的 UI 问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "修复了“自动”布局的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "改进:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "支持打开 HTML 文件" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "一致的内部和外部页边距" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "“自动”布局不再支持四栏" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "修复了较长单词溢出的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 msgid "Fixed custom themes not saved across sessions" msgstr "修复了自定义主题不能跨进程保存的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 msgid "Fixed shortcuts for key pads" msgstr "修复了快捷键的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "修复了打开非 UTF-8 编码的 FB2 文件的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 msgid "Fixed books not opening on GNOME 40" msgstr "修复了 GNOME 40 上不能打开图书的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 msgid "Improved support for touch screens" msgstr "改进的对触摸屏的支持" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "现在可记住 OPDS 的登录信息" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "修复了多项在 GNOME 3.38 上的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "修复了维基词典的内部链接" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "支持巴斯克语、韩语和挪威语翻译" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 msgid "Fixed unable to open some EPUB files" msgstr "修复了无法打开部分 EPUB 文件的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "修复了无法打开 Mobi 文件的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "改进的元数据展示" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "改进的 FB 格式的渲染" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "改进的用于 OPDS 下载图书的UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "修复了 EPUB 格式唯一标识符提取的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "修复了错误的窗口图标" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "修复了 Flatpak 下文字转语音的环境变量未设置的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "修复了测试文字转语音时, eSpeak NG 声音文件不被选中的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "修复了“反转色“开启时 “__ibooks_internal_theme” 属性错误的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS 图书列表:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "图书列表现在在书库主窗口打开" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "查看当前位置" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "转到图书列表开始" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "刷新图书列表" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "添加图书源到列表" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "支持 HTTP 认证" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "其它改进:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "修复了FB格式(.fb2, .fb2.zip)标识符提取的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "修复了复制文本时忽略换行符的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "“点击翻页”现在在非分页布局下禁用" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "从书库视图打开图书现在会关闭书库窗口" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "元数据中的语言和出版日期现在将被解析和格式化" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "从书库视图导出笔记" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "修复了 HiDPI 上书本模糊的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "修复了 Standard Ebooks 和古腾堡计划的 OPDS 链接" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "修复了启动时错误的视图图标的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "书库:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "书库视图展示最近的图书及阅读进度" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "用元数据搜索图书" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "用 OPDS 发现电子书" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "新增支持格式:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FB格式 (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "漫画 (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "纯文本 (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "已解压的 EPUB 文件" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "布局:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "支持设置页面最大宽度" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "页面宽度为宽时,\"自动\"布局将显示四栏" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "图像查看器:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "改进的图片查看器,支持快捷键旋转图片和反转颜色" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "支持禁用图片查看器,支持使用鼠标双击、中键或右键来打开图片" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "文字转语音:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "改进的文字转语音设置界面" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "支持基于图书语言设置文字转语音使用的声音" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "从 JSON 导入书签" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "笔记中搜索" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "笔记现在以它们在书中出现的顺序存储" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "安全:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "“允许不安全内容”现在只允许 JavaScipt,外部内容将不再会被加载" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit 进程现在已沙盒化" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "其它功能和修复:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "改进的对竖排及从左到右的书本的支持" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "支持将星际译王作为词典" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "修复了当前位置在调整窗口大小时不被保存的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "修复了某些主题下标题栏自动隐藏的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "新增显示版本和向书库添加图书的命令行选项" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "支持清除和禁用缓存" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "当一个 HTML 页面包含无效的自关闭锚标记时,它现在被解析为 XHTML" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "修复:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "修正了错误的版本号" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "修复了 snap 包中词典、翻译和维基百科不能使用的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "新功能:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "改进的新图标" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "支持禁用“点击翻页”" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "欢迎屏幕添加打开最近文件的菜单" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "还原了用于显示目录、笔记和书签的快捷方式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "修复了程序未被翻译的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "界面:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "重新设计了界面,以适配较小的屏幕" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "改进了全屏模式,加入了悬浮标题栏" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "自动隐藏标题栏和进度条,以免打扰阅读" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "底栏可显示更多的位置信息和时钟" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "新的弹窗(Ctrl + L)显示预计阅读时间,可以跳转到书中位置" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3446,332 +3446,332 @@ "电子阅读器风格的导航:点击页面左侧向上翻页,点击页面右侧向下翻页;点击页面中" "间显示标题栏和进度栏" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "笔记、书签和搜索结果现在显示章节标题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "查词典时,现在可以编辑查询内容" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "新的快捷键:查看元数据(Ctrl + I)、查看偏好(Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "新的旧式菜单栏,依桌面环境而显示" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "支持使用旧的标题栏和菜单栏(实验性)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "阅读:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "连续滑动功能" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "支持界面模仿纸质书" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "可放大/缩小" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "改进了在\"另存为\"时使用的图片查看器" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "在新窗口中打开副本 (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "刷新图书 (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "新的预置主题:灰色,日光,Gruvbox 和深蓝色" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "文本选择:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "能够跨页选择文本" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "在书中搜索选定文本" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "朗读选定文本" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "笔记:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "拼写检查记录" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "以 Markdown 格式导出笔记" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "支持以自定义颜色高亮" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "对于出版社和开发者:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "支持 Apple Books 的主题标签,即可以不使用 JavaScript 检测主题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "WebKit 开发者工具可用" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "重大改进:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "重构了设置的 schemas" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "改变了自定义主题的格式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "位置现在最大支持1024位数字" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "修复的 bug:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "修复了不能完全恢复上次阅读位置" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "修复了导航在滚动模式下无法工作" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "修复了图书使用绝对字体大小时不能调节字体大小" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "修复了文本在缩进边缘丢失" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "修复了无法打开文件名中含 \"#\" 或 \"?\"的图书" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "修复了 Flatpak 版不能打开 mobi、azw 和 azw3 文件的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "改进的维基词典搜索,现在带有链接和例句" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "改进的脚笔记压和格式弹窗" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "支持导出笔记为 BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "修复了目录导航在部分书中无法使用的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "修复了无法缩放 Kindle 电子书中的图片的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "修复了无法打开 .epub3 文件的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "修复了关闭时临时目录未清空的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "修复了快捷键 F9 没用的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "更新了翻译" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "外部内容和 JavaScript 现在默认禁用" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "基本的文字转语音支持" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "导出笔记到 HTML、纯文本或JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "支持查看mobi、azw和azw3文件" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "新的侧边栏" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "在维基词典和本地词典中搜索" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "用 Google Translate 来翻译页面" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "配置选中单词时的默认操作" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "支持实验性的脚注弹窗" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "支持只在本章内搜索" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "修复了打开时占用CPU的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "修复了高亮不在正确的地方显示的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "修复了打开文件时崩溃的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "自定义页面缩进和亮度" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "改变主题颜色或添加自定义主题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "支持缩放和复制图片" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "支持鼠标自动隐藏" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "支持在阅读进度栏上悬停以查看" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "修复了部分图书无法渲染的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "修复了图片有时太宽的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "支持切换左对齐与两端对齐" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "新的布局选项:单栏分页视图" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "修复了:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "生成的“位置”现在存储在缓存目录中" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "使用出版社字体时,允许调整字体大小" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "修复阅读进度条在超出存储份额后无法显示的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "触控板手势与页间滚动" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "全屏模式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "支持隐藏阅读进度条" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "支持禁用词典" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "支持使用出版社字体" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "现在恢复阅读进度变得顺畅,且不产生垃圾" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "修复了偶尔不能应用自定义颜色的问题" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "修正了错误的 AppData 文件" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "首次发布" diff -Nru foliate-2.6.3ubuntu1/po/zh_TW.po foliate-2.6.4/po/zh_TW.po --- foliate-2.6.3ubuntu1/po/zh_TW.po 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/po/zh_TW.po 2022-01-13 19:59:57.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: com.github.johnfactotum.Foliate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-01 16:44+0800\n" +"POT-Creation-Date: 2021-04-13 00:21+0200\n" "PO-Revision-Date: 2020-07-06 13:16+0800\n" "Last-Translator: Blanc Chan\n" "Language-Team: none\n" @@ -20,7 +20,7 @@ #: data/com.github.johnfactotum.Foliate.desktop.in:3 src/library.js:740 #: src/main.js:209 src/window.js:1023 src/schemes.js:100 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:6 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:6 msgid "Foliate" msgstr "Foliate" @@ -353,7 +353,7 @@ "Blan Chan\n" "John Factotum" -#: src/main.js:210 data/com.github.johnfactotum.Foliate.appdata.xml.in:7 +#: src/main.js:210 data/com.github.johnfactotum.Foliate.metainfo.xml.in:7 msgid "A simple and modern eBook viewer" msgstr "簡潔現代的電子書檢視器" @@ -844,7 +844,7 @@ msgstr "選取一些文字以新增註解。" #: src/ui/contentsStack.ui:124 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:176 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:176 msgid "Annotations" msgstr "註解" @@ -1154,7 +1154,7 @@ msgstr "左右對齊" #: src/ui/mainMenu.ui:518 src/ui/menuBar.ui:148 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:373 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:373 msgid "Auto-hyphenation" msgstr "自動斷字" @@ -1403,7 +1403,7 @@ msgstr "翻譯" #: src/ui/preferenceWindow.ui:79 src/ui/shortcutsWindow.ui:162 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:18 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:18 msgid "Find in book" msgstr "搜尋書籍內容" @@ -3000,447 +3000,447 @@ msgid "Writer of supplementary textual content" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:10 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:10 msgid "Foliate is a simple and modern GTK eBook viewer." msgstr "Foliate 是簡潔現代的 GTK 電子書閱讀器。" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:11 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:11 msgid "Features include:" msgstr "功能包括:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:13 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:13 msgid "Two-page view and scrolled view" msgstr "兩欄頁面與捲動檢視" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:14 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:14 msgid "Customize font and line-spacing" msgstr "自訂字體和行距" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:15 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:15 msgid "Light, sepia, dark, and invert mode" msgstr "亮色,棕色,暗色和反轉模式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:16 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:16 msgid "Reading progress slider with chapter marks" msgstr "有標示章節的閱讀進度滑桿" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:17 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:17 msgid "Bookmarks and annotations" msgstr "書籤和註解" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:19 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:19 msgid "Quick dictionary lookup" msgstr "快速字典查詢" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:22 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:22 msgid "John Factotum" msgstr "John Factotum" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:49 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:49 msgid "Fixed a performance issue with zipped files (including EPUB files)" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:54 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:54 msgid "Fix UI when running with libhandy 1.x" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:59 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:59 msgid "Fixed automatic layout" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:64 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:79 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:101 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:138 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:284 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:306 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:315 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:326 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:341 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:350 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:385 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:64 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:79 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:101 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:138 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:284 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:306 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:315 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:326 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:341 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:350 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:385 msgid "Changes:" msgstr "改變:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:66 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:66 msgid "Added support for opening HTML files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:67 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:67 msgid "Consistent inner and outer margins" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:68 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:68 msgid "The automatic layout no longer supports 4 columns" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:69 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:69 msgid "Fixed long words overflowing" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:70 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:70 #, fuzzy msgid "Fixed custom themes not saved across sessions" msgstr "修復了有時無法套用自訂顏色的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:71 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:71 #, fuzzy msgid "Fixed shortcuts for key pads" msgstr "修復了鍵盤捷徑鍵 F9 無法使用的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:72 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:72 msgid "Fixed opening non-UTF-8 zipped FB2 files" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:73 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:73 #, fuzzy msgid "Fixed books not opening on GNOME 40" msgstr "修復了部分書籍無法渲染的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:81 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:81 #, fuzzy msgid "Improved support for touch screens" msgstr "改善直排和右到左書籍的支援" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:82 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:82 msgid "OPDS credentials can now be remembered" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:83 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:83 msgid "Various fixes for GNOME 3.38" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:84 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:84 msgid "Fixed Wiktionary internal links" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:85 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:85 msgid "Added Basque, Korean, and Norwegian translations" msgstr "" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:91 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:91 #, fuzzy msgid "Fixed unable to open some EPUB files" msgstr "修正無法開啟 Mobipocket 檔案的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:96 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:96 msgid "Fixed unable to open Mobipocket files" msgstr "修正無法開啟 Mobipocket 檔案的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:103 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:103 msgid "Improved metadata display" msgstr "改進書籍屬性顯示" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:104 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:104 msgid "Improved FictionBook rendering" msgstr "改進 FictionBook 檔案顯示" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:105 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:105 msgid "Improved UI for acquiring books from OPDS" msgstr "改進從 OPDS 取得書籍的介面" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:106 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:106 msgid "Fixed unique identifier extraction for EPUB files" msgstr "修正了讀取 EPUB 獨特識別碼的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:107 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:107 msgid "Fixed missing window icon" msgstr "修正無視窗圖標的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:108 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:108 msgid "Fixed TTS environment variables not set when using Flatpak" msgstr "修正使用 Flatpak 時未設定文字轉語音環境變數的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:109 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:109 msgid "Fixed eSpeak NG voice not selected when testing TTS configuration" msgstr "修正測試文字轉語音設定時不會自動選擇 eSpeak NG 聲音的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:110 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:110 msgid "" "Fixed wrong “__ibooks_internal_theme” attribute when “Invert” is enabled" msgstr "修正反轉顏色時「__ibooks_internal_theme」屬性錯誤" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:116 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:116 msgid "OPDS catalogs:" msgstr "OPDS 目錄:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:118 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:118 msgid "Catalogs are now opened in the main library window" msgstr "目錄現在在主書庫視窗中開啟" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:119 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:119 msgid "View current location" msgstr "檢視目前位置" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:120 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:120 msgid "Go to catalog start page" msgstr "前往起始頁" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:121 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:121 msgid "Reload catalog" msgstr "重新載入目錄" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:122 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:122 msgid "Add current feed to catalogs" msgstr "新增目前書源到目錄" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:123 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:123 msgid "HTTP authentication support" msgstr "支援 HTTP 身份驗證" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:125 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:125 msgid "Other changes:" msgstr "其他改變:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:127 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:127 msgid "" "Fixed unique identifier extraction for FictionBook (.fb2, .fb2.zip) files" msgstr "修正了 FictionBook (.fb2, .fb2.zip) 讀取獨特識別碼的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:128 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:128 msgid "Fixed newlines being ignored when copying text" msgstr "修正了複製文字時忽略換行字元的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:129 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:129 msgid "“Turn page on tap” is now disabled in non-paginated layouts" msgstr "捲動模式下將停用「點擊翻頁」" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:130 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:130 msgid "Opening a book from the library view now closes the library window" msgstr "從書庫檢視開啟書籍時,會關閉書庫視窗" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:131 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:131 msgid "Language and publication dates in metadata are now parsed and formatted" msgstr "解析與格式化書籍資料中的語言與出版日期" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:132 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:132 msgid "Export annotations from the library view" msgstr "從書庫檢視匯出註解" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:140 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:140 msgid "Fixed blurry book covers on HiDPI" msgstr "修正 HiDPI 上書籍封面模糊的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:141 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:141 msgid "Fixed OPDS links to Standard Ebooks and Project Gutenberg" msgstr "修正 Standard Ebooks 與古騰堡計劃的 OPDS 連結" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:142 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:142 msgid "Fixed wrong view icon on startup" msgstr "修正啟動時錯誤的檢視圖標" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:148 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:148 msgid "Library:" msgstr "書庫:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:150 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:150 msgid "A library view showing recent books and reading progress" msgstr "書庫檢視顯示最近閱讀的書籍和進度" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:151 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:151 msgid "Search books by metadata" msgstr "以不同屬性欄位搜尋書籍" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:152 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:152 msgid "E-book discovery with OPDS" msgstr "利用 OPDS 發掘書籍" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:154 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:154 msgid "New supported formats:" msgstr "新格式支援:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:156 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:156 msgid "FictionBook (.fb2, .fb2.zip)" msgstr "FictionBook 格式 (.fb2, .fb2.zip)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:157 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:157 msgid "Comic book archive (.cbr, .cbz, .cbt, .cb7)" msgstr "漫畫壓縮檔 (.cbr, .cbz, .cbt, .cb7)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:158 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:158 msgid "Plain text (.txt)" msgstr "純文字 (.txt)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:159 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:159 msgid "Unpacked EPUB files" msgstr "解壓縮的 EPUB 檔案" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:161 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:161 msgid "Layout:" msgstr "版面:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:163 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:163 msgid "Option to set maximum page width" msgstr "設定最大頁寬" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:164 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:164 msgid "" "The \"Automatic\" layout will now show four columns when the page width is " "wide" msgstr "頁面夠寬時,「自動」版面將顯示四欄文字" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:166 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:166 msgid "Image viewer:" msgstr "影像檢視器:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:168 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:168 msgid "" "Improved image viewer, with new shortcuts and the ability to rotate and " "invert images" msgstr "影像檢視器新增了新的捷徑鍵和旋轉、反轉顏色功能" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:169 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:169 msgid "" "Option to disable image viewer, or to open images on double, middle, or " "right click" msgstr "可停用影縣檢視器,或設定以雙擊、單擊、中鍵、右鍵開啟" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:171 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:171 msgid "Text-to-speech:" msgstr "文字轉語音:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:173 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:173 msgid "Improved text-to-speech configuration UI" msgstr "改善了文字轉語音設定的介面" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:174 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:174 msgid "Ability to set text-to-speech voice based on book language" msgstr "可基於書籍語言設定文字轉語音聲音" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:178 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:178 msgid "Import annotations from JSON" msgstr "從 JSON 匯入註解" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:179 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:179 msgid "Search in annotations" msgstr "搜尋註解" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:180 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:180 msgid "Annotations are now sorted in the same order as they appear in the book" msgstr "註解依照書中順序排序" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:182 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:182 msgid "Security:" msgstr "安全性:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:184 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:184 msgid "" "\"Allow Unsafe Content\" now only enables JavaScript; external content will " "no longer be loaded" msgstr "「允許不安全的內容」只會啟用 JavaScript,不會載入外部資源" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:185 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:185 msgid "WebKit processes are now sandboxed" msgstr "WebKit 程序現在會在沙盒中運行" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:187 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:187 msgid "Other featues and fixes:" msgstr "其他功能與修復的問題:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:189 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:189 msgid "Improved support for vertical and right-to-left books" msgstr "改善直排和右到左書籍的支援" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:190 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:190 msgid "Support for StarDict dictionaries" msgstr "支援星際譯王字典" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:191 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:191 msgid "Fixed current location not preserved when resizing" msgstr "修復了調整大小時沒有保持位置的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:192 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:192 msgid "Fixed auto-hiding header bar under some themes" msgstr "修復自動隱藏標題列在某些佈景主題下的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:193 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:193 msgid "Command-line options for showing version and adding books to library" msgstr "顯示版本和新增書籍的命令列選項" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:194 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:194 msgid "Option to clear or disable cache" msgstr "支援停用快取" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:195 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:195 msgid "" "When an HTML page contains invalid self-closing anchor tags, it is now " "parsed as XHTML" msgstr "當 HTML 頁面含有無效自關閉錨點標籤時,現在會被當作 XHTML 解析" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:201 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:217 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:295 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:362 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:402 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:201 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:217 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:295 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:362 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:402 msgid "Fixes:" msgstr "修復:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:203 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:203 msgid "Fixed wrong version number" msgstr "修正了錯誤的版本號" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:204 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:204 msgid "" "Fixed dictionary, translation, and Wikipedia not working in the Snap package" msgstr "修復了 Snap 包中字典、翻譯和維基百科無法使用的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:210 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:371 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:394 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:210 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:371 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:394 msgid "New features:" msgstr "新功能:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:212 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:212 msgid "New and improved icon" msgstr "改進的新圖標" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:213 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:213 msgid "Option to disable turn page on tap" msgstr "支援停用「點擊翻頁」" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:214 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:214 msgid "A menu on the welcome screen for opening recent files" msgstr "歡迎畫面新增開啟最近檔案選單" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:215 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:215 msgid "Restored shortcuts for showing ToC, annotations, and bookmarks" msgstr "還原了用於顯示目錄、註解和書籤的捷徑鍵" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:219 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:219 msgid "Fixed application not translated" msgstr "修復了程式未被翻譯的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:225 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:225 msgid "Interface:" msgstr "介面:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:227 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:227 msgid "A redesigned interface that works better for smaller screens" msgstr "全新設計的介面,可適用較小的螢幕" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:228 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:228 msgid "Improved fullscreen mode with an overlaid headerbar" msgstr "改進全螢幕模式,加入懸浮標題列" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:229 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:229 msgid "" "The headerbar and the progress bar now auto-hide, for a distraction-free " "reading experience" msgstr "自動隱藏標題列和進度列,以免打擾閱讀" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:230 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:230 msgid "" "Various location information, as well as a clock, can now be displayed in " "the footer" msgstr "頁尾可顯示多種位置訊息和時鐘" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:231 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:231 msgid "" "A new location popover (Ctrl + L) that shows reading time estimates and " "allows skipping to locations" msgstr "新的彈出選單 (Ctrl + L) 顯示預計閱讀時間,與跳轉到書中位置" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:232 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:232 msgid "" "E-reader style navigation: go to the previous or next page by tapping on the " "left or right part of the view; tap on the middle to toggle header bar and " @@ -3449,332 +3449,332 @@ "電子閱讀器風格的導航:點擊頁面左側前往上一頁,點擊頁面右側前往下一頁;點擊頁" "面中間顯示標題列和進度列" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:233 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:233 msgid "Annotations, bookmarks, and find results now show chapter titles" msgstr "註解、書籤和搜尋結果標示章節標題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:234 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:234 msgid "When looking up words in dictionaries, the query can now be edited" msgstr "查詢字典時,可編輯查詢內容" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:235 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:235 msgid "New shortcut for viewing metadata (Ctrl + I) and preferences (Ctrl + ,)" msgstr "新的鍵盤捷徑鍵:檢視書籍資訊 (Ctrl + I)、偏好設定(Ctrl + ,)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:236 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:236 msgid "" "A new traditional menubar, which may be displayed depending on the desktop " "environment" msgstr "新的傳統選單列,依桌面環境而顯示" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:237 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:237 msgid "" "Option to use a traditional titlebar and menubar instead of a headerbar " "(experimental)" msgstr "支援使用傳統標題列和選單列(實驗性)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:239 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:239 msgid "Reading:" msgstr "閱讀:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:241 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:241 msgid "Continuous scrolling layout" msgstr "連續捲動版面" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:242 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:242 msgid "" "Option to show decorative shadows that mimic the appearance of a real book" msgstr "支援介面模仿紙質書" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:243 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:243 msgid "Ability to zoom in and zoom out" msgstr "可放大/縮小" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:244 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:244 msgid "Improved image viewer with \"save as\" option" msgstr "改進了影像檢視器,可將影像另存新檔" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:245 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:245 msgid "Open copies of a book in new windows (Ctrl + N)" msgstr "在新視窗中開啟副本 (Ctrl + N)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:246 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:246 msgid "Reload book (Ctrl + R)" msgstr "重新載入書籍 (Ctrl + R)" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:247 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:247 msgid "New built-in themes: Gray, Solarized, Gruvbox, Nord" msgstr "新的預設主題:灰色、Solarized、Gruvbox、Nord" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:249 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:249 msgid "Text selection:" msgstr "選取文字:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:251 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:251 msgid "Ability to select text across pages" msgstr "能夠跨頁選取文字" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:252 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:252 msgid "Find selected text in book" msgstr "在書中搜尋選取的文字" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:253 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:253 msgid "Speak selected text or from the selected locatio" msgstr "朗讀選取的文字" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:255 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:255 msgid "Annotations:" msgstr "註解:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:257 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:257 msgid "Spellcheck notes" msgstr "檢查註解拼寫" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:258 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:258 msgid "Export annotations to Markdown" msgstr "以 Markdown 格式匯出註解" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:259 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:259 msgid "Options to use custom colors for highlights" msgstr "支援以自訂顏色標示" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:261 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:261 msgid "For publishers and developers:" msgstr "出版商和開發者功能:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:263 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:263 msgid "" "Support for Apple Books theme attribute, which allows books to detect themes " "without JavaScript" msgstr "支援 Apple Books 的主題屬性,可以不使用 JavaScript 偵測主題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:264 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:264 msgid "WebKit's developer tools can be enabled" msgstr "可啟用 WebKit 開發者工具" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:266 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:266 msgid "Breaking changes:" msgstr "不相容改變:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:268 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:268 msgid "The settings schemas has been reorganized" msgstr "重構了設定的 schema" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:269 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:269 msgid "The format for custom themes has changed" msgstr "改變了自訂主題的格式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:270 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:270 msgid "Locations are now 1024 characters in size" msgstr "位置大小改為 1024 個字元" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:272 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:272 msgid "Bug fixes:" msgstr "修復的問題:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:274 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:274 msgid "Fixed not restoring exact last location" msgstr "修復了無法準確恢復上次閱讀位置" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:275 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:275 msgid "Fixed navigation not working with scrolled layout" msgstr "修復了目錄在捲動版面下無法使用" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:276 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:276 msgid "Fixed font size not changing when the book uses absolute-size keywords" msgstr "修復了書籍使用絕對字體大小時無法調整字體大小" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:277 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:277 msgid "Fixed text cut off at margin edge" msgstr "修復了文字在邊界被截斷" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:278 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:278 msgid "Fixed unable to open books with \"#\" or \"?\" in the file name" msgstr "修復了無法開啟檔案名稱中有「#」或「?」的書籍" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:286 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:286 msgid "" "Fixed Flatpak version not being able to open .mobi, .azw, and .azw3 files" msgstr "修復了 Flatpak 無法開啟 mobi、azw 和 azw3 檔案" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:287 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:287 msgid "Improved Wiktionary lookup, now with links and example sentences" msgstr "改進了維基詞典搜尋,可顯示連結和例句" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:288 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:288 msgid "Improved popover footnote extraction and formatting" msgstr "改進了腳註預覽擷取和格式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:289 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:289 msgid "Added option to export annotations to BibTeX" msgstr "支援匯出註解為 BibTeX" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:297 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:297 msgid "Fixed table of contents navigation not working with some books" msgstr "修復了目錄在部分書中無法使用的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:298 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:298 msgid "Fixed not being able to zoom images with Kindle books" msgstr "修復了無法縮放 Kindle 電子書中的影像的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:299 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:299 msgid "Fixed not being able to open books with .epub3 filename extension" msgstr "修復了無法開啟 .epub3 檔案的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:300 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:300 msgid "Fixed temporary directory not being cleaned after closing" msgstr "修復了關閉時臨時目錄未刪除的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:308 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:308 msgid "Fixed F9 shortcut not working" msgstr "修復了鍵盤捷徑鍵 F9 無法使用的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:309 -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:344 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:309 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:344 msgid "Updated translations" msgstr "更新了翻譯" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:317 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:317 msgid "External resources and JavaScript are now blocked by default" msgstr "外部資源和 JavaScript 現在預設停用" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:318 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:318 msgid "Basic text-to-speech support" msgstr "基本的文字轉語音支援" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:319 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:319 msgid "Export annotations to HTML, plain text, or JSON" msgstr "匯出註解到 HTML、純文字或 JSON" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:320 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:320 msgid "Support for viewing .mobi, .azw, and .azw3 files" msgstr "支援檢視 mobi、azw 和 azw3 檔案" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:328 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:328 msgid "New alternative sidebar UI" msgstr "新的側邊欄 UI" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:329 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:329 msgid "Lookup words in Wikipedia and offline dictionaries" msgstr "在維基詞典和本地詞典中搜尋" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:330 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:330 msgid "Translate passages with Google Translate" msgstr "用 Google Translate 來翻譯頁面" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:331 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:331 msgid "Configure default action when words are selected" msgstr "設定選取單字時的預設動作" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:332 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:332 msgid "Experimental popup footnote support" msgstr "支援實驗性的腳註彈出選單" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:333 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:333 msgid "Ability to find within only the current chapter" msgstr "支援只在目前章節內搜尋" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:334 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:334 msgid "Fixed CPU spikes when left open" msgstr "修復了開啟時吃CPU的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:335 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:335 msgid "Fixed highlights not rendering at the correct positions" msgstr "修復了標示不在正確的地方顯示的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:343 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:343 msgid "Fixed crashing when opening files" msgstr "修復了開啟檔案時崩潰的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:352 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:352 msgid "Customize page margins and brightness" msgstr "自訂頁面邊界和亮度" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:353 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:353 msgid "Tweak the theme colors, or add your own custom themes" msgstr "改變主題顏色或添加自訂主題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:354 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:354 msgid "Ability to zoom and copy images" msgstr "支援縮放和復製影像" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:355 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:355 msgid "Option to auto-hide cursor" msgstr "支援自動隱藏游標" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:356 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:356 msgid "See reading time left by hovering over the reading progress slider" msgstr "在閱讀進度列上懸停以查看估計閱讀時間" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:364 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:364 msgid "Fixed some books not rendering sometimes" msgstr "修復了部分書籍無法渲染的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:365 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:365 msgid "Fixed images being too wide in some cases" msgstr "修復了影像有時太寬的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:374 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:374 msgid "Option to switch between left and full justification" msgstr "支援切換左對齊與兩端對齊" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:375 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:375 msgid "New layout option: single-column paginated view" msgstr "新的版面選項:單欄" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:377 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:377 msgid "Fixed:" msgstr "修復了:" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:379 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:379 msgid "" "Generated locations are now stored in the cache directory rather than " "localStorage" msgstr "產生的位置現在不使用 localStorage,而是儲存在快取目錄中" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:387 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:387 msgid "Allow font size adjustment when using publisher fonts" msgstr "使用出版社字體時,允許調整字體大小" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:388 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:388 msgid "" "Fixed reading progress slider not appearing after localStorage quota is " "exceeded" msgstr "修復閱讀進度滑桿在 localStorage 空間配額用滿後無法顯示的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:396 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:396 msgid "Touchpad gestures and ability to scroll through pages" msgstr "觸控板手勢與捲動翻頁" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:397 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:397 msgid "Fullscreen mode" msgstr "全螢幕模式" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:398 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:398 msgid "Option to hide reading progress bar" msgstr "支援隱藏閱讀進度列" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:399 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:399 msgid "Option to disable dictionary" msgstr "支援停字典" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:400 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:400 msgid "Option to use publisher font" msgstr "支援使用出版社字體" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:404 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:404 msgid "Restoring reading progress is now smooth and jank-free" msgstr "現在恢復閱讀進度變得順暢,且畫面不會閃爍" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:405 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:405 msgid "Fixed custom styles not applying in some cases" msgstr "修復了有時無法套用自訂顏色的問題" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:411 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:411 msgid "Fixed invalid AppData file" msgstr "修正了錯誤的 AppData 檔案" -#: data/com.github.johnfactotum.Foliate.appdata.xml.in:416 +#: data/com.github.johnfactotum.Foliate.metainfo.xml.in:416 msgid "Initial release" msgstr "首次發布" diff -Nru foliate-2.6.3ubuntu1/README.md foliate-2.6.4/README.md --- foliate-2.6.3ubuntu1/README.md 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/README.md 2022-01-13 19:59:57.000000000 +0000 @@ -60,11 +60,11 @@ For text-to-speech support, install `espeak-ng`, or `festival`, and packages for the individual voices. -To enable spellchecking for notes, `gspell` (`gir1.2-gspell-1` for Debian based distributions) is requried. +To enable spellchecking for notes, `gspell` (`gir1.2-gspell-1` for Debian based distributions) is required. `libhandy` (`gir1.2-handy-0.0`) is recommended to make the interface work better on larger as well as smaller screens. -If `tracker` (`gir1.2-tracker-2.0`) is installed, it can be used to track the locations of files. +If `tracker3` (`gir1.2-tracker-3.0`) is installed, it can be used to track the locations of files. ### Building manually from source diff -Nru foliate-2.6.3ubuntu1/src/contents.js foliate-2.6.4/src/contents.js --- foliate-2.6.3ubuntu1/src/contents.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/contents.js 2022-01-13 19:59:57.000000000 +0000 @@ -177,7 +177,7 @@ _updateAnnotations() { let model = this._annotations if (!model) return - const query = this._annotationsSearchEntry.text + const query = this._annotationsSearchEntry.text.toLowerCase() if (query) { const results = new Gio.ListStore() const n = model.get_n_items() diff -Nru foliate-2.6.3ubuntu1/src/epubcfi.js foliate-2.6.4/src/epubcfi.js --- foliate-2.6.3ubuntu1/src/epubcfi.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/epubcfi.js 2022-01-13 19:59:57.000000000 +0000 @@ -165,7 +165,7 @@ } if(cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length-1] === ")") { - // Remove intial epubcfi( and ending ) + // Remove initial epubcfi( and ending ) cfiStr = cfiStr.slice(8, cfiStr.length-1); } @@ -451,7 +451,7 @@ return -1; } - // Compare the charecter offset of the text node + // Compare the character offset of the text node if(terminalA.offset > terminalB.offset) { return 1; } diff -Nru foliate-2.6.3ubuntu1/src/library.js foliate-2.6.4/src/library.js --- foliate-2.6.3ubuntu1/src/library.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/library.js 2022-01-13 19:59:57.000000000 +0000 @@ -34,9 +34,10 @@ let trackerConnection if (settings.get_boolean('use-tracker')) { try { - imports.gi.versions.Tracker = '2.0' + imports.gi.versions.Tracker = '3.0' const Tracker = imports.gi.Tracker - trackerConnection = Tracker.SparqlConnection.get(null) + trackerConnection = Tracker.SparqlConnection.bus_new( + 'org.freedesktop.Tracker3.Miner.Files', null, null) } catch(e) {} } @@ -414,7 +415,17 @@ if (trackerConnection) { // get file url with Tracker try { - const sparql = `SELECT nie:url(?u) WHERE { ?u nie:identifier <${id}> }` + const sparql = ` + SELECT ?uri + WHERE { + SERVICE { + GRAPH tracker:Documents { + ?u rdf:type nfo:EBook . + ?u nie:isStoredAs ?uri . + ?u nie:identifier <${id}> . + } + } + }` const cursor = trackerConnection.query(sparql, null) cursor.next(null) const url = cursor.get_string(0)[0] diff -Nru foliate-2.6.3ubuntu1/src/main.js foliate-2.6.4/src/main.js --- foliate-2.6.3ubuntu1/src/main.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/main.js 2022-01-13 19:59:57.000000000 +0000 @@ -17,7 +17,8 @@ pkg.initFormat() pkg.require({ 'Gio': '2.0', - 'Gtk': '3.0' + 'Gtk': '3.0', + 'WebKit2': '4.0' }) const { Gio, Gtk, Gdk, GLib, WebKit2 } = imports.gi @@ -292,7 +293,7 @@ if (openHint) print(Math.round(progress / total * 100) + '%') if (progress === total && held) { // add a delay because of debouncing when writing metadata - // this doens't feel like the proper way but it's probably + // this doesn't feel like the proper way but it's probably // the easiest fix setTimeout(() => { application.release() @@ -329,6 +330,7 @@ ['app.quit', ['q']], ['app.open', ['o']], ['app.preferences', ['comma']], + ['app.library', ['h']], ['lib.list-view', ['1']], ['lib.grid-view', ['2']], diff -Nru foliate-2.6.3ubuntu1/src/opds.js foliate-2.6.4/src/opds.js --- foliate-2.6.3ubuntu1/src/opds.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/opds.js 2022-01-13 19:59:57.000000000 +0000 @@ -1261,7 +1261,7 @@ box.pack_end(buttonBox, false, true, 0) const paginationRels = { - fisrt: { icon: 'go-first-symbolic', label: _('First') }, + first: { icon: 'go-first-symbolic', label: _('First') }, previous: { icon: 'go-previous-symbolic', label: _('Previous') }, next: { icon: 'go-next-symbolic', label: _('Next') }, last: { icon: 'go-last-symbolic', label: _('Last') } diff -Nru foliate-2.6.3ubuntu1/src/ui/shortcutsWindow.ui foliate-2.6.4/src/ui/shortcutsWindow.ui --- foliate-2.6.3ubuntu1/src/ui/shortcutsWindow.ui 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/ui/shortcutsWindow.ui 2022-01-13 19:59:57.000000000 +0000 @@ -131,6 +131,13 @@ True + Library + app.library + + + + + True Close current window win.close diff -Nru foliate-2.6.3ubuntu1/src/utils.js foliate-2.6.4/src/utils.js --- foliate-2.6.3ubuntu1/src/utils.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/utils.js 2022-01-13 19:59:57.000000000 +0000 @@ -122,7 +122,7 @@ return String.fromCodePoint(...Array.from(code.toUpperCase()) .map(x => regionEmojiOffset + x.charCodeAt())) } -// get langauge names +// get language names // should perhaps use `Intl.DisplayNames()` instead once it becomes available var getLanguageDisplayName = (code, showEmoji) => { try { diff -Nru foliate-2.6.3ubuntu1/src/web/epub.js foliate-2.6.4/src/web/epub.js --- foliate-2.6.3ubuntu1/src/web/epub.js 2021-04-01 08:47:06.000000000 +0000 +++ foliate-2.6.4/src/web/epub.js 2022-01-13 19:59:57.000000000 +0000 @@ -1,13 +1,13 @@ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("xmldom"), require("JSZip")); + module.exports = factory(require("JSZip")); else if(typeof define === 'function' && define.amd) - define(["xmldom", "JSZip"], factory); + define(["JSZip"], factory); else if(typeof exports === 'object') - exports["ePub"] = factory(require("xmldom"), require("JSZip")); + exports["ePub"] = factory(require("JSZip")); else - root["ePub"] = factory(root["xmldom"], root["JSZip"]); -})(window, function(__WEBPACK_EXTERNAL_MODULE__38__, __WEBPACK_EXTERNAL_MODULE__85__) { + root["ePub"] = factory(root["JSZip"]); +})(window, function(__WEBPACK_EXTERNAL_MODULE__29__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; @@ -91,7 +91,7 @@ /******/ /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 86); +/******/ return __webpack_require__(__webpack_require__.s = 30); /******/ }) /************************************************************************/ /******/ ([ @@ -140,18 +140,8 @@ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filterChildren", function() { return filterChildren; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getParentByTagName", function() { return getParentByTagName; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RangeObject", function() { return RangeObject; }); -/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24); -/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20); -/* harmony import */ var core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var xmldom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(38); -/* harmony import */ var xmldom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(xmldom__WEBPACK_IMPORTED_MODULE_3__); - - - - +/* harmony import */ var _xmldom_xmldom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15); +/* harmony import */ var _xmldom_xmldom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_xmldom_xmldom__WEBPACK_IMPORTED_MODULE_0__); /** * Core Utilities and Helpers * @module Core @@ -473,7 +463,7 @@ return elPos; } /** - * Find the equivelent of getBoundingClientRect of a browser window + * Find the equivalent of getBoundingClientRect of a browser window * @returns {{ width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number }} * @memberof Core */ @@ -627,7 +617,7 @@ var Parser; if (typeof DOMParser === "undefined" || forceXMLDom) { - Parser = xmldom__WEBPACK_IMPORTED_MODULE_3__["DOMParser"]; + Parser = _xmldom_xmldom__WEBPACK_IMPORTED_MODULE_0__["DOMParser"]; } else { Parser = DOMParser; } // Remove byte order mark before parsing @@ -745,7 +735,7 @@ * @memberof Core * @param {element} root element to start with * @param {function} func function to run on each element - * @param {function | object} filter funtion or object to filter with + * @param {function | object} filter function or object to filter with */ function treeWalker(root, func, filter) { @@ -813,7 +803,7 @@ * of Promise passed as value. */ this.resolve = null; - /* A method to reject the assocaited Promise with the value passed. + /* A method to reject the associated Promise with the value passed. * If the promise is already settled it does nothing. * * @param {anything} reason: The reason for the rejection of the Promise. @@ -863,7 +853,7 @@ } } /** - * Find direct decendents of an element + * Find direct descendents of an element * @param {element} el * @returns {element[]} children * @memberof Core @@ -900,7 +890,7 @@ return nodes; } /** - * Find all direct decendents of a specific type + * Find all direct descendents of a specific type * @param {element} el * @param {string} nodeName * @param {boolean} [single] @@ -1228,7 +1218,7 @@ } if (cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length - 1] === ")") { - // Remove intial epubcfi( and ending ) + // Remove initial epubcfi( and ending ) cfiStr = cfiStr.slice(8, cfiStr.length - 1); } @@ -1499,7 +1489,7 @@ if (stepsA.length < stepsB.length) { return -1; - } // Compare the charecter offset of the text node + } // Compare the character offset of the text node if (terminalA.offset > terminalB.offset) { @@ -2123,8 +2113,8 @@ "use strict"; -var d = __webpack_require__(108) - , callable = __webpack_require__(122) +var d = __webpack_require__(31) + , callable = __webpack_require__(45) , apply = Function.prototype.apply, call = Function.prototype.call , create = Object.create, defineProperty = Object.defineProperty @@ -2260,14 +2250,8 @@ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11); -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); -/* harmony import */ var core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); -/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path_webpack__WEBPACK_IMPORTED_MODULE_2__); - - +/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); +/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path_webpack__WEBPACK_IMPORTED_MODULE_0__); /** * Creates a Path object for parsing and manipulation of a path strings @@ -2307,7 +2291,7 @@ parse(what) { - return path_webpack__WEBPACK_IMPORTED_MODULE_2___default.a.parse(what); + return path_webpack__WEBPACK_IMPORTED_MODULE_0___default.a.parse(what); } /** * @param {string} what @@ -2316,7 +2300,7 @@ isAbsolute(what) { - return path_webpack__WEBPACK_IMPORTED_MODULE_2___default.a.isAbsolute(what || this.path); + return path_webpack__WEBPACK_IMPORTED_MODULE_0___default.a.isAbsolute(what || this.path); } /** * Check if path ends with a directory @@ -2338,7 +2322,7 @@ resolve(what) { - return path_webpack__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.directory, what); + return path_webpack__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(this.directory, what); } /** * Resolve a path relative to the directory of the Path @@ -2356,7 +2340,7 @@ return what; } - return path_webpack__WEBPACK_IMPORTED_MODULE_2___default.a.relative(this.directory, what); + return path_webpack__WEBPACK_IMPORTED_MODULE_0___default.a.relative(this.directory, what); } splitPath(filename) { @@ -2381,15 +2365,9 @@ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11); -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); -/* harmony import */ var core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); -/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9); -/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path_webpack__WEBPACK_IMPORTED_MODULE_3__); - - +/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7); +/* harmony import */ var path_webpack__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path_webpack__WEBPACK_IMPORTED_MODULE_1__); /** @@ -2438,13 +2416,13 @@ this.Url = undefined; // resolve the pathname from the base if (this.base) { - basePath = new _path__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](this.base); + basePath = new _path__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](this.base); pathname = basePath.resolve(pathname); } } } - this.Path = new _path__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](pathname); + this.Path = new _path__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](pathname); this.directory = this.Path.directory; this.filename = this.Path.filename; this.extension = this.Path.extension; @@ -2472,7 +2450,7 @@ return what; } - fullpath = path_webpack__WEBPACK_IMPORTED_MODULE_3___default.a.resolve(this.directory, what); + fullpath = path_webpack__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.directory, what); return (this.origin === 'null' ? 'file://' : this.origin) + fullpath; } /** @@ -2483,7 +2461,7 @@ relative(what) { - return path_webpack__WEBPACK_IMPORTED_MODULE_3___default.a.relative(what, this.directory); + return path_webpack__WEBPACK_IMPORTED_MODULE_1___default.a.relative(what, this.directory); } /** * @returns {string} @@ -2503,14 +2481,10 @@ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11); -/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_0__); - - /** * Hooks allow for injecting functions that must all complete in order before finishing * They will execute in parallel but all must finish before continuing - * Functions may return a promise if they are asycn. + * Functions may return a promise if they are async. * @param {any} context scope of this * @example this.content = new EPUBJS.Hook(this); */ @@ -2598,49 +2572,6 @@ /* 7 */ /***/ (function(module, exports, __webpack_require__) { -/* WEBPACK VAR INJECTION */(function(global) {var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line no-undef - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - check(typeof self == 'object' && self) || - check(typeof global == 'object' && global) || - // eslint-disable-next-line no-new-func - Function('return this')(); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30))) - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(7); -var shared = __webpack_require__(66); -var has = __webpack_require__(10); -var uid = __webpack_require__(67); -var NATIVE_SYMBOL = __webpack_require__(70); -var USE_SYMBOL_AS_UID = __webpack_require__(99); - -var WellKnownSymbolsStore = shared('wks'); -var Symbol = global.Symbol; -var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; - -module.exports = function (name) { - if (!has(WellKnownSymbolsStore, name)) { - if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name]; - else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name); - } return WellKnownSymbolsStore[name]; -}; - - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; @@ -3199,57 +3130,7 @@ /***/ }), -/* 10 */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; - -module.exports = function (it, key) { - return hasOwnProperty.call(it, key); -}; - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(7); -var DOMIterables = __webpack_require__(102); -var ArrayIteratorMethods = __webpack_require__(71); -var createNonEnumerableProperty = __webpack_require__(15); -var wellKnownSymbol = __webpack_require__(8); - -var ITERATOR = wellKnownSymbol('iterator'); -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var ArrayValues = ArrayIteratorMethods.values; - -for (var COLLECTION_NAME in DOMIterables) { - var Collection = global[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - if (CollectionPrototype) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype[ITERATOR] !== ArrayValues) try { - createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues); - } catch (error) { - CollectionPrototype[ITERATOR] = ArrayValues; - } - if (!CollectionPrototype[TO_STRING_TAG]) { - createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); - } - if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { - createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); - } catch (error) { - CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; - } - } - } -} - - -/***/ }), -/* 12 */ +/* 8 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -3258,12 +3139,9 @@ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return replaceMeta; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return replaceLinks; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return substitute; }); -/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24); -/* harmony import */ var core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0); -/* harmony import */ var _url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5); -/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); - +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); +/* harmony import */ var _url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); +/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); @@ -3277,8 +3155,8 @@ return; } - head = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(doc, "head"); - base = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(head, "base"); + head = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(doc, "head"); + base = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(head, "base"); if (!base) { base = doc.createElement("base"); @@ -3301,8 +3179,8 @@ return; } - head = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(doc, "head"); - link = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(head, "link[rel='canonical']"); + head = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(doc, "head"); + link = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(head, "link[rel='canonical']"); if (link) { link.setAttribute("href", url); @@ -3322,8 +3200,8 @@ return; } - head = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(doc, "head"); - meta = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(head, "link[property='dc.identifier']"); + head = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(doc, "head"); + meta = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(head, "link[property='dc.identifier']"); if (meta) { meta.setAttribute("content", id); @@ -3342,7 +3220,7 @@ return; } - var base = Object(_core__WEBPACK_IMPORTED_MODULE_1__["qs"])(contents.ownerDocument, "base"); + var base = Object(_core__WEBPACK_IMPORTED_MODULE_0__["qs"])(contents.ownerDocument, "base"); var location = base ? base.getAttribute("href") : undefined; var replaceLink = function (link) { @@ -3360,7 +3238,7 @@ var linkUrl; try { - linkUrl = new _url__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](href, location); + linkUrl = new _url__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](href, location); } catch (error) {// NOOP } @@ -3395,11555 +3273,9096 @@ } /***/ }), -/* 13 */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { +/* 9 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -var isObject = __webpack_require__(17); +"use strict"; +/* unused harmony export Task */ +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); -module.exports = function (it) { - if (!isObject(it)) { - throw TypeError(String(it) + ' is not an object'); - } return it; -}; +/** + * Queue for handling tasks one at a time + * @class + * @param {scope} context what this will resolve to in the tasks + */ +class Queue { + constructor(context) { + this._q = []; + this.context = context; + this.tick = _core__WEBPACK_IMPORTED_MODULE_0__["requestAnimationFrame"]; + this.running = false; + this.paused = false; + } + /** + * Add an item to the queue + * @return {Promise} + */ -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { -var DESCRIPTORS = __webpack_require__(16); -var definePropertyModule = __webpack_require__(18); -var createPropertyDescriptor = __webpack_require__(25); - -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; + enqueue() { + var deferred, promise; + var queued; + var task = [].shift.call(arguments); + var args = arguments; // Handle single args without context + // if(args && !Array.isArray(args)) { + // args = [args]; + // } + if (!task) { + throw new Error("No Task Provided"); + } -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof task === "function") { + deferred = new _core__WEBPACK_IMPORTED_MODULE_0__["defer"](); + promise = deferred.promise; + queued = { + "task": task, + "args": args, + //"context" : context, + "deferred": deferred, + "promise": promise + }; + } else { + // Task is a promise + queued = { + "promise": task + }; + } -var fails = __webpack_require__(13); + this._q.push(queued); // Wait to start queue flush -// Thank's IE8 for his funny defineProperty -module.exports = !fails(function () { - return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; -}); + if (this.paused == false && !this.running) { + // setTimeout(this.flush.bind(this), 0); + // this.tick.call(window, this.run.bind(this)); + this.run(); + } -/***/ }), -/* 17 */ -/***/ (function(module, exports) { + return queued.promise; + } + /** + * Run one item + * @return {Promise} + */ -module.exports = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; + dequeue() { + var inwait, task, result; -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { + if (this._q.length && !this.paused) { + inwait = this._q.shift(); + task = inwait.task; -var DESCRIPTORS = __webpack_require__(16); -var IE8_DOM_DEFINE = __webpack_require__(62); -var anObject = __webpack_require__(14); -var toPrimitive = __webpack_require__(41); - -var nativeDefineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.github.io/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return nativeDefineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; + if (task) { + // console.log(task) + result = task.apply(this.context, inwait.args); + if (result && typeof result["then"] === "function") { + // Task is a function that returns a promise + return result.then(function () { + inwait.deferred.resolve.apply(this.context, arguments); + }.bind(this), function () { + inwait.deferred.reject.apply(this.context, arguments); + }.bind(this)); + } else { + // Task resolves immediately + inwait.deferred.resolve.apply(this.context, result); + return inwait.promise; + } + } else if (inwait.promise) { + // Task is a promise + return inwait.promise; + } + } else { + inwait = new _core__WEBPACK_IMPORTED_MODULE_0__["defer"](); + inwait.deferred.resolve(); + return inwait.promise; + } + } // Run All Immediately -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { -var global = __webpack_require__(7); -var createNonEnumerableProperty = __webpack_require__(15); -var has = __webpack_require__(10); -var setGlobal = __webpack_require__(42); -var inspectSource = __webpack_require__(64); -var InternalStateModule = __webpack_require__(26); - -var getInternalState = InternalStateModule.get; -var enforceInternalState = InternalStateModule.enforce; -var TEMPLATE = String(String).split('String'); - -(module.exports = function (O, key, value, options) { - var unsafe = options ? !!options.unsafe : false; - var simple = options ? !!options.enumerable : false; - var noTargetGet = options ? !!options.noTargetGet : false; - if (typeof value == 'function') { - if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key); - enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); - } - if (O === global) { - if (simple) O[key] = value; - else setGlobal(key, value); - return; - } else if (!unsafe) { - delete O[key]; - } else if (!noTargetGet && O[key]) { - simple = true; - } - if (simple) O[key] = value; - else createNonEnumerableProperty(O, key, value); -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, 'toString', function toString() { - return typeof this == 'function' && getInternalState(this).source || inspectSource(this); -}); + dump() { + while (this._q.length) { + this.dequeue(); + } + } + /** + * Run all tasks sequentially, at convince + * @return {Promise} + */ -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { + run() { + if (!this.running) { + this.running = true; + this.defered = new _core__WEBPACK_IMPORTED_MODULE_0__["defer"](); + } -"use strict"; + this.tick.call(window, () => { + if (this._q.length) { + this.dequeue().then(function () { + this.run(); + }.bind(this)); + } else { + this.defered.resolve(); + this.running = undefined; + } + }); // Unpause -// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` -__webpack_require__(123); -var $ = __webpack_require__(31); -var DESCRIPTORS = __webpack_require__(16); -var USE_NATIVE_URL = __webpack_require__(78); -var global = __webpack_require__(7); -var defineProperties = __webpack_require__(72); -var redefine = __webpack_require__(19); -var anInstance = __webpack_require__(79); -var has = __webpack_require__(10); -var assign = __webpack_require__(124); -var arrayFrom = __webpack_require__(125); -var codeAt = __webpack_require__(49).codeAt; -var toASCII = __webpack_require__(131); -var setToStringTag = __webpack_require__(37); -var URLSearchParamsModule = __webpack_require__(132); -var InternalStateModule = __webpack_require__(26); - -var NativeURL = global.URL; -var URLSearchParams = URLSearchParamsModule.URLSearchParams; -var getInternalSearchParamsState = URLSearchParamsModule.getState; -var setInternalState = InternalStateModule.set; -var getInternalURLState = InternalStateModule.getterFor('URL'); -var floor = Math.floor; -var pow = Math.pow; - -var INVALID_AUTHORITY = 'Invalid authority'; -var INVALID_SCHEME = 'Invalid scheme'; -var INVALID_HOST = 'Invalid host'; -var INVALID_PORT = 'Invalid port'; - -var ALPHA = /[A-Za-z]/; -var ALPHANUMERIC = /[\d+-.A-Za-z]/; -var DIGIT = /\d/; -var HEX_START = /^(0x|0X)/; -var OCT = /^[0-7]+$/; -var DEC = /^\d+$/; -var HEX = /^[\dA-Fa-f]+$/; -// eslint-disable-next-line no-control-regex -var FORBIDDEN_HOST_CODE_POINT = /[\u0000\u0009\u000A\u000D #%/:?@[\\]]/; -// eslint-disable-next-line no-control-regex -var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\u0000\u0009\u000A\u000D #/:?@[\\]]/; -// eslint-disable-next-line no-control-regex -var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g; -// eslint-disable-next-line no-control-regex -var TAB_AND_NEW_LINE = /[\u0009\u000A\u000D]/g; -var EOF; - -var parseHost = function (url, input) { - var result, codePoints, index; - if (input.charAt(0) == '[') { - if (input.charAt(input.length - 1) != ']') return INVALID_HOST; - result = parseIPv6(input.slice(1, -1)); - if (!result) return INVALID_HOST; - url.host = result; - // opaque host - } else if (!isSpecial(url)) { - if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST; - result = ''; - codePoints = arrayFrom(input); - for (index = 0; index < codePoints.length; index++) { - result += percentEncode(codePoints[index], C0ControlPercentEncodeSet); + if (this.paused == true) { + this.paused = false; } - url.host = result; - } else { - input = toASCII(input); - if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST; - result = parseIPv4(input); - if (result === null) return INVALID_HOST; - url.host = result; - } -}; -var parseIPv4 = function (input) { - var parts = input.split('.'); - var partsLength, numbers, index, part, radix, number, ipv4; - if (parts.length && parts[parts.length - 1] == '') { - parts.pop(); - } - partsLength = parts.length; - if (partsLength > 4) return input; - numbers = []; - for (index = 0; index < partsLength; index++) { - part = parts[index]; - if (part == '') return input; - radix = 10; - if (part.length > 1 && part.charAt(0) == '0') { - radix = HEX_START.test(part) ? 16 : 8; - part = part.slice(radix == 8 ? 1 : 2); - } - if (part === '') { - number = 0; - } else { - if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input; - number = parseInt(part, radix); - } - numbers.push(number); - } - for (index = 0; index < partsLength; index++) { - number = numbers[index]; - if (index == partsLength - 1) { - if (number >= pow(256, 5 - partsLength)) return null; - } else if (number > 255) return null; - } - ipv4 = numbers.pop(); - for (index = 0; index < numbers.length; index++) { - ipv4 += numbers[index] * pow(256, 3 - index); + return this.defered.promise; } - return ipv4; -}; - -// eslint-disable-next-line max-statements -var parseIPv6 = function (input) { - var address = [0, 0, 0, 0, 0, 0, 0, 0]; - var pieceIndex = 0; - var compress = null; - var pointer = 0; - var value, length, numbersSeen, ipv4Piece, number, swaps, swap; + /** + * Flush all, as quickly as possible + * @return {Promise} + */ - var char = function () { - return input.charAt(pointer); - }; - if (char() == ':') { - if (input.charAt(1) != ':') return; - pointer += 2; - pieceIndex++; - compress = pieceIndex; - } - while (char()) { - if (pieceIndex == 8) return; - if (char() == ':') { - if (compress !== null) return; - pointer++; - pieceIndex++; - compress = pieceIndex; - continue; - } - value = length = 0; - while (length < 4 && HEX.test(char())) { - value = value * 16 + parseInt(char(), 16); - pointer++; - length++; - } - if (char() == '.') { - if (length == 0) return; - pointer -= length; - if (pieceIndex > 6) return; - numbersSeen = 0; - while (char()) { - ipv4Piece = null; - if (numbersSeen > 0) { - if (char() == '.' && numbersSeen < 4) pointer++; - else return; - } - if (!DIGIT.test(char())) return; - while (DIGIT.test(char())) { - number = parseInt(char(), 10); - if (ipv4Piece === null) ipv4Piece = number; - else if (ipv4Piece == 0) return; - else ipv4Piece = ipv4Piece * 10 + number; - if (ipv4Piece > 255) return; - pointer++; - } - address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece; - numbersSeen++; - if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++; - } - if (numbersSeen != 4) return; - break; - } else if (char() == ':') { - pointer++; - if (!char()) return; - } else if (char()) return; - address[pieceIndex++] = value; - } - if (compress !== null) { - swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex != 0 && swaps > 0) { - swap = address[pieceIndex]; - address[pieceIndex--] = address[compress + swaps - 1]; - address[compress + --swaps] = swap; + flush() { + if (this.running) { + return this.running; } - } else if (pieceIndex != 8) return; - return address; -}; -var findLongestZeroSequence = function (ipv6) { - var maxIndex = null; - var maxLength = 1; - var currStart = null; - var currLength = 0; - var index = 0; - for (; index < 8; index++) { - if (ipv6[index] !== 0) { - if (currLength > maxLength) { - maxIndex = currStart; - maxLength = currLength; - } - currStart = null; - currLength = 0; - } else { - if (currStart === null) currStart = index; - ++currLength; - } - } - if (currLength > maxLength) { - maxIndex = currStart; - maxLength = currLength; + if (this._q.length) { + this.running = this.dequeue().then(function () { + this.running = undefined; + return this.flush(); + }.bind(this)); + return this.running; + } } - return maxIndex; -}; + /** + * Clear all items in wait + */ -var serializeHost = function (host) { - var result, index, compress, ignore0; - // ipv4 - if (typeof host == 'number') { - result = []; - for (index = 0; index < 4; index++) { - result.unshift(host % 256); - host = floor(host / 256); - } return result.join('.'); - // ipv6 - } else if (typeof host == 'object') { - result = ''; - compress = findLongestZeroSequence(host); - for (index = 0; index < 8; index++) { - if (ignore0 && host[index] === 0) continue; - if (ignore0) ignore0 = false; - if (compress === index) { - result += index ? ':' : '::'; - ignore0 = true; - } else { - result += host[index].toString(16); - if (index < 7) result += ':'; - } - } - return '[' + result + ']'; - } return host; -}; -var C0ControlPercentEncodeSet = {}; -var fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, { - ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1 -}); -var pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, { - '#': 1, '?': 1, '{': 1, '}': 1 -}); -var userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, { - '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1 -}); + clear() { + this._q = []; + } + /** + * Get the number of tasks in the queue + * @return {number} tasks + */ -var percentEncode = function (char, set) { - var code = codeAt(char, 0); - return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char); -}; -var specialSchemes = { - ftp: 21, - file: null, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; + length() { + return this._q.length; + } + /** + * Pause a running queue + */ -var isSpecial = function (url) { - return has(specialSchemes, url.scheme); -}; -var includesCredentials = function (url) { - return url.username != '' || url.password != ''; -}; - -var cannotHaveUsernamePasswordPort = function (url) { - return !url.host || url.cannotBeABaseURL || url.scheme == 'file'; -}; - -var isWindowsDriveLetter = function (string, normalized) { - var second; - return string.length == 2 && ALPHA.test(string.charAt(0)) - && ((second = string.charAt(1)) == ':' || (!normalized && second == '|')); -}; + pause() { + this.paused = true; + } + /** + * End the queue + */ -var startsWithWindowsDriveLetter = function (string) { - var third; - return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && ( - string.length == 2 || - ((third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#') - ); -}; -var shortenURLsPath = function (url) { - var path = url.path; - var pathSize = path.length; - if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) { - path.pop(); + stop() { + this._q = []; + this.running = false; + this.paused = true; } -}; -var isSingleDot = function (segment) { - return segment === '.' || segment.toLowerCase() === '%2e'; -}; - -var isDoubleDot = function (segment) { - segment = segment.toLowerCase(); - return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e'; -}; +} +/** + * Create a new task from a callback + * @class + * @private + * @param {function} task + * @param {array} args + * @param {scope} context + * @return {function} task + */ -// States: -var SCHEME_START = {}; -var SCHEME = {}; -var NO_SCHEME = {}; -var SPECIAL_RELATIVE_OR_AUTHORITY = {}; -var PATH_OR_AUTHORITY = {}; -var RELATIVE = {}; -var RELATIVE_SLASH = {}; -var SPECIAL_AUTHORITY_SLASHES = {}; -var SPECIAL_AUTHORITY_IGNORE_SLASHES = {}; -var AUTHORITY = {}; -var HOST = {}; -var HOSTNAME = {}; -var PORT = {}; -var FILE = {}; -var FILE_SLASH = {}; -var FILE_HOST = {}; -var PATH_START = {}; -var PATH = {}; -var CANNOT_BE_A_BASE_URL_PATH = {}; -var QUERY = {}; -var FRAGMENT = {}; - -// eslint-disable-next-line max-statements -var parseURL = function (url, input, stateOverride, base) { - var state = stateOverride || SCHEME_START; - var pointer = 0; - var buffer = ''; - var seenAt = false; - var seenBracket = false; - var seenPasswordToken = false; - var codePoints, char, bufferCodePoints, failure; - - if (!stateOverride) { - url.scheme = ''; - url.username = ''; - url.password = ''; - url.host = null; - url.port = null; - url.path = []; - url.query = null; - url.fragment = null; - url.cannotBeABaseURL = false; - input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, ''); - } - - input = input.replace(TAB_AND_NEW_LINE, ''); - - codePoints = arrayFrom(input); - - while (pointer <= codePoints.length) { - char = codePoints[pointer]; - switch (state) { - case SCHEME_START: - if (char && ALPHA.test(char)) { - buffer += char.toLowerCase(); - state = SCHEME; - } else if (!stateOverride) { - state = NO_SCHEME; - continue; - } else return INVALID_SCHEME; - break; - case SCHEME: - if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) { - buffer += char.toLowerCase(); - } else if (char == ':') { - if (stateOverride && ( - (isSpecial(url) != has(specialSchemes, buffer)) || - (buffer == 'file' && (includesCredentials(url) || url.port !== null)) || - (url.scheme == 'file' && !url.host) - )) return; - url.scheme = buffer; - if (stateOverride) { - if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null; - return; - } - buffer = ''; - if (url.scheme == 'file') { - state = FILE; - } else if (isSpecial(url) && base && base.scheme == url.scheme) { - state = SPECIAL_RELATIVE_OR_AUTHORITY; - } else if (isSpecial(url)) { - state = SPECIAL_AUTHORITY_SLASHES; - } else if (codePoints[pointer + 1] == '/') { - state = PATH_OR_AUTHORITY; - pointer++; +class Task { + constructor(task, args, context) { + return function () { + var toApply = arguments || []; + return new Promise((resolve, reject) => { + var callback = function (value, err) { + if (!value && err) { + reject(err); } else { - url.cannotBeABaseURL = true; - url.path.push(''); - state = CANNOT_BE_A_BASE_URL_PATH; + resolve(value); } - } else if (!stateOverride) { - buffer = ''; - state = NO_SCHEME; - pointer = 0; - continue; - } else return INVALID_SCHEME; - break; + }; // Add the callback to the arguments list - case NO_SCHEME: - if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME; - if (base.cannotBeABaseURL && char == '#') { - url.scheme = base.scheme; - url.path = base.path.slice(); - url.query = base.query; - url.fragment = ''; - url.cannotBeABaseURL = true; - state = FRAGMENT; - break; - } - state = base.scheme == 'file' ? FILE : RELATIVE; - continue; - case SPECIAL_RELATIVE_OR_AUTHORITY: - if (char == '/' && codePoints[pointer + 1] == '/') { - state = SPECIAL_AUTHORITY_IGNORE_SLASHES; - pointer++; - } else { - state = RELATIVE; - continue; - } break; - - case PATH_OR_AUTHORITY: - if (char == '/') { - state = AUTHORITY; - break; - } else { - state = PATH; - continue; - } + toApply.push(callback); // Apply all arguments to the functions - case RELATIVE: - url.scheme = base.scheme; - if (char == EOF) { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.query = base.query; - } else if (char == '/' || (char == '\\' && isSpecial(url))) { - state = RELATIVE_SLASH; - } else if (char == '?') { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.query = base.query; - url.fragment = ''; - state = FRAGMENT; - } else { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.path.pop(); - state = PATH; - continue; - } break; - - case RELATIVE_SLASH: - if (isSpecial(url) && (char == '/' || char == '\\')) { - state = SPECIAL_AUTHORITY_IGNORE_SLASHES; - } else if (char == '/') { - state = AUTHORITY; - } else { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - state = PATH; - continue; - } break; - - case SPECIAL_AUTHORITY_SLASHES: - state = SPECIAL_AUTHORITY_IGNORE_SLASHES; - if (char != '/' || buffer.charAt(pointer + 1) != '/') continue; - pointer++; - break; + task.apply(context || this, toApply); + }); + }; + } - case SPECIAL_AUTHORITY_IGNORE_SLASHES: - if (char != '/' && char != '\\') { - state = AUTHORITY; - continue; - } break; - - case AUTHORITY: - if (char == '@') { - if (seenAt) buffer = '%40' + buffer; - seenAt = true; - bufferCodePoints = arrayFrom(buffer); - for (var i = 0; i < bufferCodePoints.length; i++) { - var codePoint = bufferCodePoints[i]; - if (codePoint == ':' && !seenPasswordToken) { - seenPasswordToken = true; - continue; - } - var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet); - if (seenPasswordToken) url.password += encodedCodePoints; - else url.username += encodedCodePoints; - } - buffer = ''; - } else if ( - char == EOF || char == '/' || char == '?' || char == '#' || - (char == '\\' && isSpecial(url)) - ) { - if (seenAt && buffer == '') return INVALID_AUTHORITY; - pointer -= arrayFrom(buffer).length + 1; - buffer = ''; - state = HOST; - } else buffer += char; - break; +} - case HOST: - case HOSTNAME: - if (stateOverride && url.scheme == 'file') { - state = FILE_HOST; - continue; - } else if (char == ':' && !seenBracket) { - if (buffer == '') return INVALID_HOST; - failure = parseHost(url, buffer); - if (failure) return failure; - buffer = ''; - state = PORT; - if (stateOverride == HOSTNAME) return; - } else if ( - char == EOF || char == '/' || char == '?' || char == '#' || - (char == '\\' && isSpecial(url)) - ) { - if (isSpecial(url) && buffer == '') return INVALID_HOST; - if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return; - failure = parseHost(url, buffer); - if (failure) return failure; - buffer = ''; - state = PATH_START; - if (stateOverride) return; - continue; - } else { - if (char == '[') seenBracket = true; - else if (char == ']') seenBracket = false; - buffer += char; - } break; - - case PORT: - if (DIGIT.test(char)) { - buffer += char; - } else if ( - char == EOF || char == '/' || char == '?' || char == '#' || - (char == '\\' && isSpecial(url)) || - stateOverride - ) { - if (buffer != '') { - var port = parseInt(buffer, 10); - if (port > 0xFFFF) return INVALID_PORT; - url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port; - buffer = ''; - } - if (stateOverride) return; - state = PATH_START; - continue; - } else return INVALID_PORT; - break; +/* harmony default export */ __webpack_exports__["a"] = (Queue); - case FILE: - url.scheme = 'file'; - if (char == '/' || char == '\\') state = FILE_SLASH; - else if (base && base.scheme == 'file') { - if (char == EOF) { - url.host = base.host; - url.path = base.path.slice(); - url.query = base.query; - } else if (char == '?') { - url.host = base.host; - url.path = base.path.slice(); - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.host = base.host; - url.path = base.path.slice(); - url.query = base.query; - url.fragment = ''; - state = FRAGMENT; - } else { - if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) { - url.host = base.host; - url.path = base.path.slice(); - shortenURLsPath(url); - } - state = PATH; - continue; - } - } else { - state = PATH; - continue; - } break; - - case FILE_SLASH: - if (char == '/' || char == '\\') { - state = FILE_HOST; - break; - } - if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) { - if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]); - else url.host = base.host; - } - state = PATH; - continue; - case FILE_HOST: - if (char == EOF || char == '/' || char == '\\' || char == '?' || char == '#') { - if (!stateOverride && isWindowsDriveLetter(buffer)) { - state = PATH; - } else if (buffer == '') { - url.host = ''; - if (stateOverride) return; - state = PATH_START; - } else { - failure = parseHost(url, buffer); - if (failure) return failure; - if (url.host == 'localhost') url.host = ''; - if (stateOverride) return; - buffer = ''; - state = PATH_START; - } continue; - } else buffer += char; - break; +/***/ }), +/* 10 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - case PATH_START: - if (isSpecial(url)) { - state = PATH; - if (char != '/' && char != '\\') continue; - } else if (!stateOverride && char == '?') { - url.query = ''; - state = QUERY; - } else if (!stateOverride && char == '#') { - url.fragment = ''; - state = FRAGMENT; - } else if (char != EOF) { - state = PATH; - if (char != '/') continue; - } break; - - case PATH: - if ( - char == EOF || char == '/' || - (char == '\\' && isSpecial(url)) || - (!stateOverride && (char == '?' || char == '#')) - ) { - if (isDoubleDot(buffer)) { - shortenURLsPath(url); - if (char != '/' && !(char == '\\' && isSpecial(url))) { - url.path.push(''); - } - } else if (isSingleDot(buffer)) { - if (char != '/' && !(char == '\\' && isSpecial(url))) { - url.path.push(''); - } - } else { - if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) { - if (url.host) url.host = ''; - buffer = buffer.charAt(0) + ':'; // normalize windows drive letter - } - url.path.push(buffer); - } - buffer = ''; - if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) { - while (url.path.length > 1 && url.path[0] === '') { - url.path.shift(); - } - } - if (char == '?') { - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.fragment = ''; - state = FRAGMENT; - } - } else { - buffer += percentEncode(char, pathPercentEncodeSet); - } break; +"use strict"; - case CANNOT_BE_A_BASE_URL_PATH: - if (char == '?') { - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.fragment = ''; - state = FRAGMENT; - } else if (char != EOF) { - url.path[0] += percentEncode(char, C0ControlPercentEncodeSet); - } break; - - case QUERY: - if (!stateOverride && char == '#') { - url.fragment = ''; - state = FRAGMENT; - } else if (char != EOF) { - if (char == "'" && isSpecial(url)) url.query += '%27'; - else if (char == '#') url.query += '%23'; - else url.query += percentEncode(char, C0ControlPercentEncodeSet); - } break; +// EXTERNAL MODULE: ./node_modules/event-emitter/index.js +var event_emitter = __webpack_require__(3); +var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); - case FRAGMENT: - if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet); - break; - } +// EXTERNAL MODULE: ./src/utils/core.js +var core = __webpack_require__(0); - pointer++; - } -}; +// CONCATENATED MODULE: ./src/utils/scrolltype.js +// Detect RTL scroll type +// Based on https://github.com/othree/jquery.rtl-scroll-type/blob/master/src/jquery.rtl-scroll.js +function scrollType() { + var type = "reverse"; + var definer = createDefiner(); + document.body.appendChild(definer); -// `URL` constructor -// https://url.spec.whatwg.org/#url-class -var URLConstructor = function URL(url /* , base */) { - var that = anInstance(this, URLConstructor, 'URL'); - var base = arguments.length > 1 ? arguments[1] : undefined; - var urlString = String(url); - var state = setInternalState(that, { type: 'URL' }); - var baseState, failure; - if (base !== undefined) { - if (base instanceof URLConstructor) baseState = getInternalURLState(base); - else { - failure = parseURL(baseState = {}, String(base)); - if (failure) throw TypeError(failure); + if (definer.scrollLeft > 0) { + type = "default"; + } else { + if (typeof Element !== 'undefined' && Element.prototype.scrollIntoView) { + definer.children[0].children[1].scrollIntoView(); + + if (definer.scrollLeft < 0) { + type = "negative"; + } + } else { + definer.scrollLeft = 1; + + if (definer.scrollLeft === 0) { + type = "negative"; + } } } - failure = parseURL(state, urlString, null, baseState); - if (failure) throw TypeError(failure); - var searchParams = state.searchParams = new URLSearchParams(); - var searchParamsState = getInternalSearchParamsState(searchParams); - searchParamsState.updateSearchParams(state.query); - searchParamsState.updateURL = function () { - state.query = String(searchParams) || null; - }; - if (!DESCRIPTORS) { - that.href = serializeURL.call(that); - that.origin = getOrigin.call(that); - that.protocol = getProtocol.call(that); - that.username = getUsername.call(that); - that.password = getPassword.call(that); - that.host = getHost.call(that); - that.hostname = getHostname.call(that); - that.port = getPort.call(that); - that.pathname = getPathname.call(that); - that.search = getSearch.call(that); - that.searchParams = getSearchParams.call(that); - that.hash = getHash.call(that); - } -}; -var URLPrototype = URLConstructor.prototype; + document.body.removeChild(definer); + return type; +} +function createDefiner() { + var definer = document.createElement('div'); + definer.dir = "rtl"; + definer.style.position = "fixed"; + definer.style.width = "1px"; + definer.style.height = "1px"; + definer.style.top = "0px"; + definer.style.left = "0px"; + definer.style.overflow = "hidden"; + var innerDiv = document.createElement('div'); + innerDiv.style.width = "2px"; + var spanA = document.createElement('span'); + spanA.style.width = "1px"; + spanA.style.display = "inline-block"; + var spanB = document.createElement('span'); + spanB.style.width = "1px"; + spanB.style.display = "inline-block"; + innerDiv.appendChild(spanA); + innerDiv.appendChild(spanB); + definer.appendChild(innerDiv); + return definer; +} +// EXTERNAL MODULE: ./src/mapping.js +var mapping = __webpack_require__(11); -var serializeURL = function () { - var url = getInternalURLState(this); - var scheme = url.scheme; - var username = url.username; - var password = url.password; - var host = url.host; - var port = url.port; - var path = url.path; - var query = url.query; - var fragment = url.fragment; - var output = scheme + ':'; - if (host !== null) { - output += '//'; - if (includesCredentials(url)) { - output += username + (password ? ':' + password : '') + '@'; - } - output += serializeHost(host); - if (port !== null) output += ':' + port; - } else if (scheme == 'file') output += '//'; - output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : ''; - if (query !== null) output += '?' + query; - if (fragment !== null) output += '#' + fragment; - return output; -}; +// EXTERNAL MODULE: ./src/utils/queue.js +var queue = __webpack_require__(9); -var getOrigin = function () { - var url = getInternalURLState(this); - var scheme = url.scheme; - var port = url.port; - if (scheme == 'blob') try { - return new URL(scheme.path[0]).origin; - } catch (error) { - return 'null'; - } - if (scheme == 'file' || !isSpecial(url)) return 'null'; - return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : ''); -}; +// EXTERNAL MODULE: ./node_modules/lodash/throttle.js +var throttle = __webpack_require__(28); +var throttle_default = /*#__PURE__*/__webpack_require__.n(throttle); -var getProtocol = function () { - return getInternalURLState(this).scheme + ':'; -}; +// CONCATENATED MODULE: ./src/managers/helpers/stage.js -var getUsername = function () { - return getInternalURLState(this).username; -}; -var getPassword = function () { - return getInternalURLState(this).password; -}; -var getHost = function () { - var url = getInternalURLState(this); - var host = url.host; - var port = url.port; - return host === null ? '' - : port === null ? serializeHost(host) - : serializeHost(host) + ':' + port; -}; +class stage_Stage { + constructor(_options) { + this.settings = _options || {}; + this.id = "epubjs-container-" + Object(core["uuid"])(); + this.container = this.create(this.settings); -var getHostname = function () { - var host = getInternalURLState(this).host; - return host === null ? '' : serializeHost(host); -}; + if (this.settings.hidden) { + this.wrapper = this.wrap(this.container); + } + } + /* + * Creates an element to render to. + * Resizes to passed width and height or to the elements size + */ -var getPort = function () { - var port = getInternalURLState(this).port; - return port === null ? '' : String(port); -}; -var getPathname = function () { - var url = getInternalURLState(this); - var path = url.path; - return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : ''; -}; + create(options) { + let height = options.height; // !== false ? options.height : "100%"; -var getSearch = function () { - var query = getInternalURLState(this).query; - return query ? '?' + query : ''; -}; + let width = options.width; // !== false ? options.width : "100%"; -var getSearchParams = function () { - return getInternalURLState(this).searchParams; -}; + let overflow = options.overflow || false; + let axis = options.axis || "vertical"; + let direction = options.direction; + Object(core["extend"])(this.settings, options); -var getHash = function () { - var fragment = getInternalURLState(this).fragment; - return fragment ? '#' + fragment : ''; -}; + if (options.height && Object(core["isNumber"])(options.height)) { + height = options.height + "px"; + } -var accessorDescriptor = function (getter, setter) { - return { get: getter, set: setter, configurable: true, enumerable: true }; -}; + if (options.width && Object(core["isNumber"])(options.width)) { + width = options.width + "px"; + } // Create new container element -if (DESCRIPTORS) { - defineProperties(URLPrototype, { - // `URL.prototype.href` accessors pair - // https://url.spec.whatwg.org/#dom-url-href - href: accessorDescriptor(serializeURL, function (href) { - var url = getInternalURLState(this); - var urlString = String(href); - var failure = parseURL(url, urlString); - if (failure) throw TypeError(failure); - getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); - }), - // `URL.prototype.origin` getter - // https://url.spec.whatwg.org/#dom-url-origin - origin: accessorDescriptor(getOrigin), - // `URL.prototype.protocol` accessors pair - // https://url.spec.whatwg.org/#dom-url-protocol - protocol: accessorDescriptor(getProtocol, function (protocol) { - var url = getInternalURLState(this); - parseURL(url, String(protocol) + ':', SCHEME_START); - }), - // `URL.prototype.username` accessors pair - // https://url.spec.whatwg.org/#dom-url-username - username: accessorDescriptor(getUsername, function (username) { - var url = getInternalURLState(this); - var codePoints = arrayFrom(String(username)); - if (cannotHaveUsernamePasswordPort(url)) return; - url.username = ''; - for (var i = 0; i < codePoints.length; i++) { - url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet); - } - }), - // `URL.prototype.password` accessors pair - // https://url.spec.whatwg.org/#dom-url-password - password: accessorDescriptor(getPassword, function (password) { - var url = getInternalURLState(this); - var codePoints = arrayFrom(String(password)); - if (cannotHaveUsernamePasswordPort(url)) return; - url.password = ''; - for (var i = 0; i < codePoints.length; i++) { - url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet); - } - }), - // `URL.prototype.host` accessors pair - // https://url.spec.whatwg.org/#dom-url-host - host: accessorDescriptor(getHost, function (host) { - var url = getInternalURLState(this); - if (url.cannotBeABaseURL) return; - parseURL(url, String(host), HOST); - }), - // `URL.prototype.hostname` accessors pair - // https://url.spec.whatwg.org/#dom-url-hostname - hostname: accessorDescriptor(getHostname, function (hostname) { - var url = getInternalURLState(this); - if (url.cannotBeABaseURL) return; - parseURL(url, String(hostname), HOSTNAME); - }), - // `URL.prototype.port` accessors pair - // https://url.spec.whatwg.org/#dom-url-port - port: accessorDescriptor(getPort, function (port) { - var url = getInternalURLState(this); - if (cannotHaveUsernamePasswordPort(url)) return; - port = String(port); - if (port == '') url.port = null; - else parseURL(url, port, PORT); - }), - // `URL.prototype.pathname` accessors pair - // https://url.spec.whatwg.org/#dom-url-pathname - pathname: accessorDescriptor(getPathname, function (pathname) { - var url = getInternalURLState(this); - if (url.cannotBeABaseURL) return; - url.path = []; - parseURL(url, pathname + '', PATH_START); - }), - // `URL.prototype.search` accessors pair - // https://url.spec.whatwg.org/#dom-url-search - search: accessorDescriptor(getSearch, function (search) { - var url = getInternalURLState(this); - search = String(search); - if (search == '') { - url.query = null; - } else { - if ('?' == search.charAt(0)) search = search.slice(1); - url.query = ''; - parseURL(url, search, QUERY); - } - getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); - }), - // `URL.prototype.searchParams` getter - // https://url.spec.whatwg.org/#dom-url-searchparams - searchParams: accessorDescriptor(getSearchParams), - // `URL.prototype.hash` accessors pair - // https://url.spec.whatwg.org/#dom-url-hash - hash: accessorDescriptor(getHash, function (hash) { - var url = getInternalURLState(this); - hash = String(hash); - if (hash == '') { - url.fragment = null; - return; - } - if ('#' == hash.charAt(0)) hash = hash.slice(1); - url.fragment = ''; - parseURL(url, hash, FRAGMENT); - }) - }); -} -// `URL.prototype.toJSON` method -// https://url.spec.whatwg.org/#dom-url-tojson -redefine(URLPrototype, 'toJSON', function toJSON() { - return serializeURL.call(this); -}, { enumerable: true }); - -// `URL.prototype.toString` method -// https://url.spec.whatwg.org/#URL-stringification-behavior -redefine(URLPrototype, 'toString', function toString() { - return serializeURL.call(this); -}, { enumerable: true }); - -if (NativeURL) { - var nativeCreateObjectURL = NativeURL.createObjectURL; - var nativeRevokeObjectURL = NativeURL.revokeObjectURL; - // `URL.createObjectURL` method - // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL - // eslint-disable-next-line no-unused-vars - if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) { - return nativeCreateObjectURL.apply(NativeURL, arguments); - }); - // `URL.revokeObjectURL` method - // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL - // eslint-disable-next-line no-unused-vars - if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) { - return nativeRevokeObjectURL.apply(NativeURL, arguments); - }); -} + let container = document.createElement("div"); + container.id = this.id; + container.classList.add("epub-container"); // Style Element + // container.style.fontSize = "0"; -setToStringTag(URLConstructor, 'URL'); + container.style.wordSpacing = "0"; + container.style.lineHeight = "0"; + container.style.verticalAlign = "top"; + container.style.position = "relative"; -$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, { - URL: URLConstructor -}); + if (axis === "horizontal") { + // container.style.whiteSpace = "nowrap"; + container.style.display = "flex"; + container.style.flexDirection = "row"; + container.style.flexWrap = "nowrap"; + } + if (width) { + container.style.width = width; + } -/***/ }), -/* 21 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (height) { + container.style.height = height; + } -"use strict"; -/* unused harmony export Task */ -/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); + if (overflow) { + if (overflow === "scroll" && axis === "vertical") { + container.style["overflow-y"] = overflow; + container.style["overflow-x"] = "hidden"; + } else if (overflow === "scroll" && axis === "horizontal") { + container.style["overflow-y"] = "hidden"; + container.style["overflow-x"] = overflow; + } else { + container.style["overflow"] = overflow; + } + } -/** - * Queue for handling tasks one at a time - * @class - * @param {scope} context what this will resolve to in the tasks - */ + if (direction) { + container.dir = direction; + container.style["direction"] = direction; + } -class Queue { - constructor(context) { - this._q = []; - this.context = context; - this.tick = _core__WEBPACK_IMPORTED_MODULE_0__["requestAnimationFrame"]; - this.running = false; - this.paused = false; + if (direction && this.settings.fullsize) { + document.body.style["direction"] = direction; + } + + return container; } - /** - * Add an item to the queue - * @return {Promise} - */ + wrap(container) { + var wrapper = document.createElement("div"); + wrapper.style.visibility = "hidden"; + wrapper.style.overflow = "hidden"; + wrapper.style.width = "0"; + wrapper.style.height = "0"; + wrapper.appendChild(container); + return wrapper; + } - enqueue() { - var deferred, promise; - var queued; - var task = [].shift.call(arguments); - var args = arguments; // Handle single args without context - // if(args && !Array.isArray(args)) { - // args = [args]; - // } + getElement(_element) { + var element; - if (!task) { - throw new Error("No Task Provided"); + if (Object(core["isElement"])(_element)) { + element = _element; + } else if (typeof _element === "string") { + element = document.getElementById(_element); } - if (typeof task === "function") { - deferred = new _core__WEBPACK_IMPORTED_MODULE_0__["defer"](); - promise = deferred.promise; - queued = { - "task": task, - "args": args, - //"context" : context, - "deferred": deferred, - "promise": promise - }; + if (!element) { + throw new Error("Not an Element"); + } + + return element; + } + + attachTo(what) { + var element = this.getElement(what); + var base; + + if (!element) { + return; + } + + if (this.settings.hidden) { + base = this.wrapper; } else { - // Task is a promise - queued = { - "promise": task - }; + base = this.container; } - this._q.push(queued); // Wait to start queue flush + element.appendChild(base); + this.element = element; + return element; + } + getContainer() { + return this.container; + } - if (this.paused == false && !this.running) { - // setTimeout(this.flush.bind(this), 0); - // this.tick.call(window, this.run.bind(this)); - this.run(); + onResize(func) { + // Only listen to window for resize event if width and height are not fixed. + // This applies if it is set to a percent or auto. + if (!Object(core["isNumber"])(this.settings.width) || !Object(core["isNumber"])(this.settings.height)) { + this.resizeFunc = throttle_default()(func, 50); + window.addEventListener("resize", this.resizeFunc, false); } + } - return queued.promise; + onOrientationChange(func) { + this.orientationChangeFunc = func; + window.addEventListener("orientationchange", this.orientationChangeFunc, false); } - /** - * Run one item - * @return {Promise} - */ + size(width, height) { + var bounds; + + let _width = width || this.settings.width; - dequeue() { - var inwait, task, result; + let _height = height || this.settings.height; // If width or height are set to false, inherit them from containing element - if (this._q.length && !this.paused) { - inwait = this._q.shift(); - task = inwait.task; - if (task) { - // console.log(task) - result = task.apply(this.context, inwait.args); + if (width === null) { + bounds = this.element.getBoundingClientRect(); - if (result && typeof result["then"] === "function") { - // Task is a function that returns a promise - return result.then(function () { - inwait.deferred.resolve.apply(this.context, arguments); - }.bind(this), function () { - inwait.deferred.reject.apply(this.context, arguments); - }.bind(this)); - } else { - // Task resolves immediately - inwait.deferred.resolve.apply(this.context, result); - return inwait.promise; - } - } else if (inwait.promise) { - // Task is a promise - return inwait.promise; + if (bounds.width) { + width = Math.floor(bounds.width); + this.container.style.width = width + "px"; } } else { - inwait = new _core__WEBPACK_IMPORTED_MODULE_0__["defer"](); - inwait.deferred.resolve(); - return inwait.promise; + if (Object(core["isNumber"])(width)) { + this.container.style.width = width + "px"; + } else { + this.container.style.width = width; + } } - } // Run All Immediately + if (height === null) { + bounds = bounds || this.element.getBoundingClientRect(); - dump() { - while (this._q.length) { - this.dequeue(); + if (bounds.height) { + height = bounds.height; + this.container.style.height = height + "px"; + } + } else { + if (Object(core["isNumber"])(height)) { + this.container.style.height = height + "px"; + } else { + this.container.style.height = height; + } } - } - /** - * Run all tasks sequentially, at convince - * @return {Promise} - */ + if (!Object(core["isNumber"])(width)) { + width = this.container.clientWidth; + } - run() { - if (!this.running) { - this.running = true; - this.defered = new _core__WEBPACK_IMPORTED_MODULE_0__["defer"](); + if (!Object(core["isNumber"])(height)) { + height = this.container.clientHeight; } - this.tick.call(window, () => { - if (this._q.length) { - this.dequeue().then(function () { - this.run(); - }.bind(this)); - } else { - this.defered.resolve(); - this.running = undefined; - } - }); // Unpause + this.containerStyles = window.getComputedStyle(this.container); + this.containerPadding = { + left: parseFloat(this.containerStyles["padding-left"]) || 0, + right: parseFloat(this.containerStyles["padding-right"]) || 0, + top: parseFloat(this.containerStyles["padding-top"]) || 0, + bottom: parseFloat(this.containerStyles["padding-bottom"]) || 0 + }; // Bounds not set, get them from window - if (this.paused == true) { - this.paused = false; + let _windowBounds = Object(core["windowBounds"])(); + + let bodyStyles = window.getComputedStyle(document.body); + let bodyPadding = { + left: parseFloat(bodyStyles["padding-left"]) || 0, + right: parseFloat(bodyStyles["padding-right"]) || 0, + top: parseFloat(bodyStyles["padding-top"]) || 0, + bottom: parseFloat(bodyStyles["padding-bottom"]) || 0 + }; + + if (!_width) { + width = _windowBounds.width - bodyPadding.left - bodyPadding.right; } - return this.defered.promise; + if (this.settings.fullsize && !_height || !_height) { + height = _windowBounds.height - bodyPadding.top - bodyPadding.bottom; + } + + return { + width: width - this.containerPadding.left - this.containerPadding.right, + height: height - this.containerPadding.top - this.containerPadding.bottom + }; } - /** - * Flush all, as quickly as possible - * @return {Promise} - */ + bounds() { + let box; - flush() { - if (this.running) { - return this.running; + if (this.container.style.overflow !== "visible") { + box = this.container && this.container.getBoundingClientRect(); } - if (this._q.length) { - this.running = this.dequeue().then(function () { - this.running = undefined; - return this.flush(); - }.bind(this)); - return this.running; + if (!box || !box.width || !box.height) { + return Object(core["windowBounds"])(); + } else { + return box; } } - /** - * Clear all items in wait - */ + getSheet() { + var style = document.createElement("style"); // WebKit hack --> https://davidwalsh.name/add-rules-stylesheets - clear() { - this._q = []; + style.appendChild(document.createTextNode("")); + document.head.appendChild(style); + return style.sheet; } - /** - * Get the number of tasks in the queue - * @return {number} tasks - */ - - length() { - return this._q.length; - } - /** - * Pause a running queue - */ + addStyleRules(selector, rulesArray) { + var scope = "#" + this.id + " "; + var rules = ""; + if (!this.sheet) { + this.sheet = this.getSheet(); + } - pause() { - this.paused = true; + rulesArray.forEach(function (set) { + for (var prop in set) { + if (set.hasOwnProperty(prop)) { + rules += prop + ":" + set[prop] + ";"; + } + } + }); + this.sheet.insertRule(scope + selector + " {" + rules + "}", 0); } - /** - * End the queue - */ + axis(axis) { + if (axis === "horizontal") { + this.container.style.display = "flex"; + this.container.style.flexDirection = "row"; + this.container.style.flexWrap = "nowrap"; + } else { + this.container.style.display = "block"; + } - stop() { - this._q = []; - this.running = false; - this.paused = true; - } + this.settings.axis = axis; + } // orientation(orientation) { + // if (orientation === "landscape") { + // + // } else { + // + // } + // + // this.orientation = orientation; + // } -} -/** - * Create a new task from a callback - * @class - * @private - * @param {function} task - * @param {array} args - * @param {scope} context - * @return {function} task - */ + direction(dir) { + if (this.container) { + this.container.dir = dir; + this.container.style["direction"] = dir; + } -class Task { - constructor(task, args, context) { - return function () { - var toApply = arguments || []; - return new Promise((resolve, reject) => { - var callback = function (value, err) { - if (!value && err) { - reject(err); - } else { - resolve(value); - } - }; // Add the callback to the arguments list + if (this.settings.fullsize) { + document.body.style["direction"] = dir; + } + this.settings.dir = dir; + } - toApply.push(callback); // Apply all arguments to the functions + overflow(overflow) { + if (this.container) { + if (overflow === "scroll" && this.settings.axis === "vertical") { + this.container.style["overflow-y"] = overflow; + this.container.style["overflow-x"] = "hidden"; + } else if (overflow === "scroll" && this.settings.axis === "horizontal") { + this.container.style["overflow-y"] = "hidden"; + this.container.style["overflow-x"] = overflow; + } else { + this.container.style["overflow"] = overflow; + } + } - task.apply(context || this, toApply); - }); - }; + this.settings.overflow = overflow; } -} + destroy() { + var base; -/* harmony default export */ __webpack_exports__["a"] = (Queue); + if (this.element) { + if (this.settings.hidden) { + base = this.wrapper; + } else { + base = this.container; + } + if (this.element.contains(this.container)) { + this.element.removeChild(this.container); + } -/***/ }), -/* 22 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + window.removeEventListener("resize", this.resizeFunc); + window.removeEventListener("orientationChange", this.orientationChangeFunc); + } + } -"use strict"; +} -// EXTERNAL MODULE: ./node_modules/event-emitter/index.js -var event_emitter = __webpack_require__(3); -var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); +/* harmony default export */ var stage = (stage_Stage); +// CONCATENATED MODULE: ./src/managers/helpers/views.js +class Views { + constructor(container) { + this.container = container; + this._views = []; + this.length = 0; + this.hidden = false; + } -// EXTERNAL MODULE: ./src/utils/core.js -var core = __webpack_require__(0); + all() { + return this._views; + } -// CONCATENATED MODULE: ./src/utils/scrolltype.js -// Detect RTL scroll type -// Based on https://github.com/othree/jquery.rtl-scroll-type/blob/master/src/jquery.rtl-scroll.js -function scrollType() { - var type = "reverse"; - var definer = createDefiner(); - document.body.appendChild(definer); + first() { + return this._views[0]; + } - if (definer.scrollLeft > 0) { - type = "default"; - } else { - if (typeof Element !== 'undefined' && Element.prototype.scrollIntoView) { - definer.children[0].children[1].scrollIntoView(); + last() { + return this._views[this._views.length - 1]; + } - if (definer.scrollLeft < 0) { - type = "negative"; - } - } else { - definer.scrollLeft = 1; + indexOf(view) { + return this._views.indexOf(view); + } - if (definer.scrollLeft === 0) { - type = "negative"; - } - } + slice() { + return this._views.slice.apply(this._views, arguments); } - document.body.removeChild(definer); - return type; -} -function createDefiner() { - var definer = document.createElement('div'); - definer.dir = "rtl"; - definer.style.position = "fixed"; - definer.style.width = "1px"; - definer.style.height = "1px"; - definer.style.top = "0px"; - definer.style.left = "0px"; - definer.style.overflow = "hidden"; - var innerDiv = document.createElement('div'); - innerDiv.style.width = "2px"; - var spanA = document.createElement('span'); - spanA.style.width = "1px"; - spanA.style.display = "inline-block"; - var spanB = document.createElement('span'); - spanB.style.width = "1px"; - spanB.style.display = "inline-block"; - innerDiv.appendChild(spanA); - innerDiv.appendChild(spanB); - definer.appendChild(innerDiv); - return definer; -} -// EXTERNAL MODULE: ./src/mapping.js -var mapping = __webpack_require__(23); + get(i) { + return this._views[i]; + } -// EXTERNAL MODULE: ./src/utils/queue.js -var queue = __webpack_require__(21); + append(view) { + this._views.push(view); -// EXTERNAL MODULE: ./node_modules/lodash/throttle.js -var throttle = __webpack_require__(84); -var throttle_default = /*#__PURE__*/__webpack_require__.n(throttle); + if (this.container) { + this.container.appendChild(view.element); + } -// CONCATENATED MODULE: ./src/managers/helpers/stage.js + this.length++; + return view; + } + prepend(view) { + this._views.unshift(view); + if (this.container) { + this.container.insertBefore(view.element, this.container.firstChild); + } -class stage_Stage { - constructor(_options) { - this.settings = _options || {}; - this.id = "epubjs-container-" + Object(core["uuid"])(); - this.container = this.create(this.settings); + this.length++; + return view; + } - if (this.settings.hidden) { - this.wrapper = this.wrap(this.container); + insert(view, index) { + this._views.splice(index, 0, view); + + if (this.container) { + if (index < this.container.children.length) { + this.container.insertBefore(view.element, this.container.children[index]); + } else { + this.container.appendChild(view.element); + } } + + this.length++; + return view; } - /* - * Creates an element to render to. - * Resizes to passed width and height or to the elements size - */ + remove(view) { + var index = this._views.indexOf(view); - create(options) { - let height = options.height; // !== false ? options.height : "100%"; + if (index > -1) { + this._views.splice(index, 1); + } - let width = options.width; // !== false ? options.width : "100%"; + this.destroy(view); + this.length--; + } - let overflow = options.overflow || false; - let axis = options.axis || "vertical"; - let direction = options.direction; - Object(core["extend"])(this.settings, options); + destroy(view) { + if (view.displayed) { + view.destroy(); + } - if (options.height && Object(core["isNumber"])(options.height)) { - height = options.height + "px"; + if (this.container) { + this.container.removeChild(view.element); } - if (options.width && Object(core["isNumber"])(options.width)) { - width = options.width + "px"; - } // Create new container element + view = null; + } // Iterators - let container = document.createElement("div"); - container.id = this.id; - container.classList.add("epub-container"); // Style Element - // container.style.fontSize = "0"; - - container.style.wordSpacing = "0"; - container.style.lineHeight = "0"; - container.style.verticalAlign = "top"; - container.style.position = "relative"; + forEach() { + return this._views.forEach.apply(this._views, arguments); + } - if (axis === "horizontal") { - // container.style.whiteSpace = "nowrap"; - container.style.display = "flex"; - container.style.flexDirection = "row"; - container.style.flexWrap = "nowrap"; - } + clear() { + // Remove all views + var view; + var len = this.length; + if (!this.length) return; - if (width) { - container.style.width = width; + for (var i = 0; i < len; i++) { + view = this._views[i]; + this.destroy(view); } - if (height) { - container.style.height = height; - } + this._views = []; + this.length = 0; + } - if (overflow) { - if (overflow === "scroll" && axis === "vertical") { - container.style["overflow-y"] = overflow; - container.style["overflow-x"] = "hidden"; - } else if (overflow === "scroll" && axis === "horizontal") { - container.style["overflow-y"] = "hidden"; - container.style["overflow-x"] = overflow; - } else { - container.style["overflow"] = overflow; - } - } + find(section) { + var view; + var len = this.length; - if (direction) { - container.dir = direction; - container.style["direction"] = direction; - } + for (var i = 0; i < len; i++) { + view = this._views[i]; - if (direction && this.settings.fullsize) { - document.body.style["direction"] = direction; + if (view.displayed && view.section.index == section.index) { + return view; + } } - - return container; - } - - wrap(container) { - var wrapper = document.createElement("div"); - wrapper.style.visibility = "hidden"; - wrapper.style.overflow = "hidden"; - wrapper.style.width = "0"; - wrapper.style.height = "0"; - wrapper.appendChild(container); - return wrapper; } - getElement(_element) { - var element; + displayed() { + var displayed = []; + var view; + var len = this.length; - if (Object(core["isElement"])(_element)) { - element = _element; - } else if (typeof _element === "string") { - element = document.getElementById(_element); - } + for (var i = 0; i < len; i++) { + view = this._views[i]; - if (!element) { - throw new Error("Not an Element"); + if (view.displayed) { + displayed.push(view); + } } - return element; + return displayed; } - attachTo(what) { - var element = this.getElement(what); - var base; + show() { + var view; + var len = this.length; - if (!element) { - return; - } + for (var i = 0; i < len; i++) { + view = this._views[i]; - if (this.settings.hidden) { - base = this.wrapper; - } else { - base = this.container; + if (view.displayed) { + view.show(); + } } - element.appendChild(base); - this.element = element; - return element; + this.hidden = false; } - getContainer() { - return this.container; - } + hide() { + var view; + var len = this.length; - onResize(func) { - // Only listen to window for resize event if width and height are not fixed. - // This applies if it is set to a percent or auto. - if (!Object(core["isNumber"])(this.settings.width) || !Object(core["isNumber"])(this.settings.height)) { - this.resizeFunc = throttle_default()(func, 50); - window.addEventListener("resize", this.resizeFunc, false); + for (var i = 0; i < len; i++) { + view = this._views[i]; + + if (view.displayed) { + view.hide(); + } } - } - onOrientationChange(func) { - this.orientationChangeFunc = func; - window.addEventListener("orientationchange", this.orientationChangeFunc, false); + this.hidden = true; } - size(width, height) { - var bounds; - - let _width = width || this.settings.width; - - let _height = height || this.settings.height; // If width or height are set to false, inherit them from containing element - - - if (width === null) { - bounds = this.element.getBoundingClientRect(); +} - if (bounds.width) { - width = Math.floor(bounds.width); - this.container.style.width = width + "px"; - } - } else { - if (Object(core["isNumber"])(width)) { - this.container.style.width = width + "px"; - } else { - this.container.style.width = width; - } - } +/* harmony default export */ var views = (Views); +// EXTERNAL MODULE: ./src/utils/constants.js +var constants = __webpack_require__(1); - if (height === null) { - bounds = bounds || this.element.getBoundingClientRect(); +// CONCATENATED MODULE: ./src/managers/default/index.js - if (bounds.height) { - height = bounds.height; - this.container.style.height = height + "px"; - } - } else { - if (Object(core["isNumber"])(height)) { - this.container.style.height = height + "px"; - } else { - this.container.style.height = height; - } - } - if (!Object(core["isNumber"])(width)) { - width = this.container.clientWidth; - } - if (!Object(core["isNumber"])(height)) { - height = this.container.clientHeight; - } - this.containerStyles = window.getComputedStyle(this.container); - this.containerPadding = { - left: parseFloat(this.containerStyles["padding-left"]) || 0, - right: parseFloat(this.containerStyles["padding-right"]) || 0, - top: parseFloat(this.containerStyles["padding-top"]) || 0, - bottom: parseFloat(this.containerStyles["padding-bottom"]) || 0 - }; // Bounds not set, get them from window - let _windowBounds = Object(core["windowBounds"])(); - let bodyStyles = window.getComputedStyle(document.body); - let bodyPadding = { - left: parseFloat(bodyStyles["padding-left"]) || 0, - right: parseFloat(bodyStyles["padding-right"]) || 0, - top: parseFloat(bodyStyles["padding-top"]) || 0, - bottom: parseFloat(bodyStyles["padding-bottom"]) || 0 - }; - if (!_width) { - width = _windowBounds.width - bodyPadding.left - bodyPadding.right; - } - if (this.settings.fullsize && !_height || !_height) { - height = _windowBounds.height - bodyPadding.top - bodyPadding.bottom; - } - return { - width: width - this.containerPadding.left - this.containerPadding.right, - height: height - this.containerPadding.top - this.containerPadding.bottom +class default_DefaultViewManager { + constructor(options) { + this.name = "default"; + this.optsSettings = options.settings; + this.View = options.view; + this.request = options.request; + this.renditionQueue = options.queue; + this.q = new queue["a" /* default */](this); + this.settings = Object(core["extend"])(this.settings || {}, { + infinite: true, + hidden: false, + width: undefined, + height: undefined, + axis: undefined, + writingMode: undefined, + flow: "scrolled", + ignoreClass: "", + fullsize: undefined, + allowScriptedContent: false + }); + Object(core["extend"])(this.settings, options.settings || {}); + this.viewSettings = { + ignoreClass: this.settings.ignoreClass, + axis: this.settings.axis, + flow: this.settings.flow, + layout: this.layout, + method: this.settings.method, + // srcdoc, blobUrl, write + width: 0, + height: 0, + forceEvenPages: true, + allowScriptedContent: this.settings.allowScriptedContent }; + this.rendered = false; } - bounds() { - let box; + render(element, size) { + let tag = element.tagName; - if (this.container.style.overflow !== "visible") { - box = this.container && this.container.getBoundingClientRect(); + if (typeof this.settings.fullsize === "undefined" && tag && (tag.toLowerCase() == "body" || tag.toLowerCase() == "html")) { + this.settings.fullsize = true; } - if (!box || !box.width || !box.height) { - return Object(core["windowBounds"])(); - } else { - return box; + if (this.settings.fullsize) { + this.settings.overflow = "visible"; + this.overflow = this.settings.overflow; } - } - getSheet() { - var style = document.createElement("style"); // WebKit hack --> https://davidwalsh.name/add-rules-stylesheets + this.settings.size = size; + this.settings.rtlScrollType = scrollType(); // Save the stage - style.appendChild(document.createTextNode("")); - document.head.appendChild(style); - return style.sheet; - } + this.stage = new stage({ + width: size.width, + height: size.height, + overflow: this.overflow, + hidden: this.settings.hidden, + axis: this.settings.axis, + fullsize: this.settings.fullsize, + direction: this.settings.direction + }); + this.stage.attachTo(element); // Get this stage container div - addStyleRules(selector, rulesArray) { - var scope = "#" + this.id + " "; - var rules = ""; + this.container = this.stage.getContainer(); // Views array methods - if (!this.sheet) { - this.sheet = this.getSheet(); - } + this.views = new views(this.container); // Calculate Stage Size - rulesArray.forEach(function (set) { - for (var prop in set) { - if (set.hasOwnProperty(prop)) { - rules += prop + ":" + set[prop] + ";"; - } - } - }); - this.sheet.insertRule(scope + selector + " {" + rules + "}", 0); - } + this._bounds = this.bounds(); + this._stageSize = this.stage.size(); // Set the dimensions for views - axis(axis) { - if (axis === "horizontal") { - this.container.style.display = "flex"; - this.container.style.flexDirection = "row"; - this.container.style.flexWrap = "nowrap"; - } else { - this.container.style.display = "block"; - } + this.viewSettings.width = this._stageSize.width; + this.viewSettings.height = this._stageSize.height; // Function to handle a resize event. + // Will only attach if width and height are both fixed. - this.settings.axis = axis; - } // orientation(orientation) { - // if (orientation === "landscape") { - // - // } else { - // - // } - // - // this.orientation = orientation; - // } + this.stage.onResize(this.onResized.bind(this)); + this.stage.onOrientationChange(this.onOrientationChange.bind(this)); // Add Event Listeners + this.addEventListeners(); // Add Layout method + // this.applyLayoutMethod(); - direction(dir) { - if (this.container) { - this.container.dir = dir; - this.container.style["direction"] = dir; + if (this.layout) { + this.updateLayout(); } - if (this.settings.fullsize) { - document.body.style["direction"] = dir; + this.rendered = true; + } + + addEventListeners() { + var scroller; + window.addEventListener("unload", function (e) { + this.destroy(); + }.bind(this)); + + if (!this.settings.fullsize) { + scroller = this.container; + } else { + scroller = window; } - this.settings.dir = dir; + this._onScroll = this.onScroll.bind(this); + scroller.addEventListener("scroll", this._onScroll); } - overflow(overflow) { - if (this.container) { - if (overflow === "scroll" && this.settings.axis === "vertical") { - this.container.style["overflow-y"] = overflow; - this.container.style["overflow-x"] = "hidden"; - } else if (overflow === "scroll" && this.settings.axis === "horizontal") { - this.container.style["overflow-y"] = "hidden"; - this.container.style["overflow-x"] = overflow; - } else { - this.container.style["overflow"] = overflow; - } + removeEventListeners() { + var scroller; + + if (!this.settings.fullsize) { + scroller = this.container; + } else { + scroller = window; } - this.settings.overflow = overflow; + scroller.removeEventListener("scroll", this._onScroll); + this._onScroll = undefined; } destroy() { - var base; + clearTimeout(this.orientationTimeout); + clearTimeout(this.resizeTimeout); + clearTimeout(this.afterScrolled); + this.clear(); + this.removeEventListeners(); + this.stage.destroy(); + this.rendered = false; + /* + clearTimeout(this.trimTimeout); + if(this.settings.hidden) { + this.element.removeChild(this.wrapper); + } else { + this.element.removeChild(this.container); + } + */ + } - if (this.element) { - if (this.settings.hidden) { - base = this.wrapper; - } else { - base = this.container; - } + onOrientationChange(e) { + let { + orientation + } = window; - if (this.element.contains(this.container)) { - this.element.removeChild(this.container); - } + if (this.optsSettings.resizeOnOrientationChange) { + this.resize(); + } // Per ampproject: + // In IOS 10.3, the measured size of an element is incorrect if the + // element size depends on window size directly and the measurement + // happens in window.resize event. Adding a timeout for correct + // measurement. See https://github.com/ampproject/amphtml/issues/8479 - window.removeEventListener("resize", this.resizeFunc); - window.removeEventListener("orientationChange", this.orientationChangeFunc); - } - } -} + clearTimeout(this.orientationTimeout); + this.orientationTimeout = setTimeout(function () { + this.orientationTimeout = undefined; -/* harmony default export */ var stage = (stage_Stage); -// CONCATENATED MODULE: ./src/managers/helpers/views.js -class Views { - constructor(container) { - this.container = container; - this._views = []; - this.length = 0; - this.hidden = false; - } + if (this.optsSettings.resizeOnOrientationChange) { + this.resize(); + } - all() { - return this._views; + this.emit(constants["c" /* EVENTS */].MANAGERS.ORIENTATION_CHANGE, orientation); + }.bind(this), 500); } - first() { - return this._views[0]; + onResized(e) { + this.resize(); } - last() { - return this._views[this._views.length - 1]; - } + resize(width, height, epubcfi) { + let stageSize = this.stage.size(width, height); // For Safari, wait for orientation to catch up + // if the window is a square - indexOf(view) { - return this._views.indexOf(view); - } + this.winBounds = Object(core["windowBounds"])(); - slice() { - return this._views.slice.apply(this._views, arguments); - } + if (this.orientationTimeout && this.winBounds.width === this.winBounds.height) { + // reset the stage size for next resize + this._stageSize = undefined; + return; + } - get(i) { - return this._views[i]; - } + if (this._stageSize && this._stageSize.width === stageSize.width && this._stageSize.height === stageSize.height) { + // Size is the same, no need to resize + return; + } - append(view) { - this._views.push(view); + this._stageSize = stageSize; + this._bounds = this.bounds(); // Clear current views - if (this.container) { - this.container.appendChild(view.element); - } + this.clear(); // Update for new views - this.length++; - return view; + this.viewSettings.width = this._stageSize.width; + this.viewSettings.height = this._stageSize.height; + this.updateLayout(); + this.emit(constants["c" /* EVENTS */].MANAGERS.RESIZED, { + width: this._stageSize.width, + height: this._stageSize.height + }, epubcfi); } - prepend(view) { - this._views.unshift(view); + createView(section, forceRight) { + return new this.View(section, Object(core["extend"])(this.viewSettings, { + forceRight + })); + } - if (this.container) { - this.container.insertBefore(view.element, this.container.firstChild); - } + handleNextPrePaginated(forceRight, section, action) { + let next; - this.length++; - return view; - } + if (this.layout.name === "pre-paginated" && this.layout.divisor > 1) { + if (forceRight || section.index === 0) { + // First page (cover) should stand alone for pre-paginated books + return; + } - insert(view, index) { - this._views.splice(index, 0, view); + next = section.next(); - if (this.container) { - if (index < this.container.children.length) { - this.container.insertBefore(view.element, this.container.children[index]); - } else { - this.container.appendChild(view.element); + if (next && !next.properties.includes("page-spread-left")) { + return action.call(this, next); } } - - this.length++; - return view; } - remove(view) { - var index = this._views.indexOf(view); + display(section, target) { + var displaying = new core["defer"](); + var displayed = displaying.promise; // Check if moving to target is needed - if (index > -1) { - this._views.splice(index, 1); - } + if (target === section.href || Object(core["isNumber"])(target)) { + target = undefined; + } // Check to make sure the section we want isn't already shown - this.destroy(view); - this.length--; - } - destroy(view) { - if (view.displayed) { - view.destroy(); - } + var visible = this.views.find(section); // View is already shown, just move to correct location in view - if (this.container) { - this.container.removeChild(view.element); - } + if (visible && section && this.layout.name !== "pre-paginated") { + let offset = visible.offset(); - view = null; - } // Iterators + if (this.settings.direction === "ltr") { + this.scrollTo(offset.left, offset.top, true); + } else { + let width = visible.width(); + this.scrollTo(offset.left + width, offset.top, true); + } + if (target) { + let offset = visible.locationOf(target); + let width = visible.width(); + this.moveTo(offset, width); + } - forEach() { - return this._views.forEach.apply(this._views, arguments); - } + displaying.resolve(); + return displayed; + } // Hide all current views - clear() { - // Remove all views - var view; - var len = this.length; - if (!this.length) return; - for (var i = 0; i < len; i++) { - view = this._views[i]; - this.destroy(view); + this.clear(); + let forceRight = false; + + if (this.layout.name === "pre-paginated" && this.layout.divisor === 2 && section.properties.includes("page-spread-right")) { + forceRight = true; } - this._views = []; - this.length = 0; - } + this.add(section, forceRight).then(function (view) { + // Move to correct place within the section, if needed + if (target) { + let offset = view.locationOf(target); + let width = view.width(); + this.moveTo(offset, width); + } + }.bind(this), err => { + displaying.reject(err); + }).then(function () { + return this.handleNextPrePaginated(forceRight, section, this.add); + }.bind(this)).then(function () { + this.views.show(); + displaying.resolve(); + }.bind(this)); // .then(function(){ + // return this.hooks.display.trigger(view); + // }.bind(this)) + // .then(function(){ + // this.views.show(); + // }.bind(this)); - find(section) { - var view; - var len = this.length; + return displayed; + } - for (var i = 0; i < len; i++) { - view = this._views[i]; + afterDisplayed(view) { + this.emit(constants["c" /* EVENTS */].MANAGERS.ADDED, view); + } - if (view.displayed && view.section.index == section.index) { - return view; - } - } + afterResized(view) { + this.emit(constants["c" /* EVENTS */].MANAGERS.RESIZE, view.section); } - displayed() { - var displayed = []; - var view; - var len = this.length; + moveTo(offset, width) { + var distX = 0, + distY = 0; - for (var i = 0; i < len; i++) { - view = this._views[i]; + if (!this.isPaginated) { + distY = offset.top; + } else { + distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; - if (view.displayed) { - displayed.push(view); + if (distX + this.layout.delta > this.container.scrollWidth) { + distX = this.container.scrollWidth - this.layout.delta; } - } - return displayed; - } - - show() { - var view; - var len = this.length; - - for (var i = 0; i < len; i++) { - view = this._views[i]; + distY = Math.floor(offset.top / this.layout.delta) * this.layout.delta; - if (view.displayed) { - view.show(); + if (distY + this.layout.delta > this.container.scrollHeight) { + distY = this.container.scrollHeight - this.layout.delta; } } - this.hidden = false; + if (this.settings.direction === 'rtl') { + /*** + the `floor` function above (L343) is on positive values, so we should add one `layout.delta` + to distX or use `Math.ceil` function, or multiply offset.left by -1 + before `Math.floor` + */ + distX = distX + this.layout.delta; + distX = distX - width; + } + + this.scrollTo(distX, distY, true); } - hide() { - var view; - var len = this.length; + add(section, forceRight) { + var view = this.createView(section, forceRight); + this.views.append(view); // view.on(EVENTS.VIEWS.SHOWN, this.afterDisplayed.bind(this)); - for (var i = 0; i < len; i++) { - view = this._views[i]; + view.onDisplayed = this.afterDisplayed.bind(this); + view.onResize = this.afterResized.bind(this); + view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { + this.updateAxis(axis); + }); + view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { + this.updateWritingMode(mode); + }); + return view.display(this.request); + } - if (view.displayed) { - view.hide(); - } - } + append(section, forceRight) { + var view = this.createView(section, forceRight); + this.views.append(view); + view.onDisplayed = this.afterDisplayed.bind(this); + view.onResize = this.afterResized.bind(this); + view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { + this.updateAxis(axis); + }); + view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { + this.updateWritingMode(mode); + }); + return view.display(this.request); + } - this.hidden = true; + prepend(section, forceRight) { + var view = this.createView(section, forceRight); + view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { + this.counter(bounds); + }); + this.views.prepend(view); + view.onDisplayed = this.afterDisplayed.bind(this); + view.onResize = this.afterResized.bind(this); + view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { + this.updateAxis(axis); + }); + view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { + this.updateWritingMode(mode); + }); + return view.display(this.request); } -} + counter(bounds) { + if (this.settings.axis === "vertical") { + this.scrollBy(0, bounds.heightDelta, true); + } else { + this.scrollBy(bounds.widthDelta, 0, true); + } + } // resizeView(view) { + // + // if(this.settings.globalLayoutProperties.layout === "pre-paginated") { + // view.lock("both", this.bounds.width, this.bounds.height); + // } else { + // view.lock("width", this.bounds.width, this.bounds.height); + // } + // + // }; -/* harmony default export */ var views = (Views); -// EXTERNAL MODULE: ./src/utils/constants.js -var constants = __webpack_require__(1); -// CONCATENATED MODULE: ./src/managers/default/index.js + next() { + var next; + var left; + let dir = this.settings.direction; + if (!this.views.length) return; + if (this.isPaginated && this.settings.axis === "horizontal" && (!dir || dir === "ltr")) { + this.scrollLeft = this.container.scrollLeft; + left = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta; + if (left <= this.container.scrollWidth) { + this.scrollBy(this.layout.delta, 0, true); + } else { + next = this.views.last().section.next(); + } + } else if (this.isPaginated && this.settings.axis === "horizontal" && dir === "rtl") { + this.scrollLeft = this.container.scrollLeft; + if (this.settings.rtlScrollType === "default") { + left = this.container.scrollLeft; + if (left > 0) { + this.scrollBy(this.layout.delta, 0, true); + } else { + next = this.views.last().section.next(); + } + } else { + left = this.container.scrollLeft + this.layout.delta * -1; + if (left > this.container.scrollWidth * -1) { + this.scrollBy(this.layout.delta, 0, true); + } else { + next = this.views.last().section.next(); + } + } + } else if (this.isPaginated && this.settings.axis === "vertical") { + this.scrollTop = this.container.scrollTop; + let top = this.container.scrollTop + this.container.offsetHeight; + if (top < this.container.scrollHeight) { + this.scrollBy(0, this.layout.height, true); + } else { + next = this.views.last().section.next(); + } + } else { + next = this.views.last().section.next(); + } + if (next) { + this.clear(); // The new section may have a different writing-mode from the old section. Thus, we need to update layout. + this.updateLayout(); + let forceRight = false; -class default_DefaultViewManager { - constructor(options) { - this.name = "default"; - this.optsSettings = options.settings; - this.View = options.view; - this.request = options.request; - this.renditionQueue = options.queue; - this.q = new queue["a" /* default */](this); - this.settings = Object(core["extend"])(this.settings || {}, { - infinite: true, - hidden: false, - width: undefined, - height: undefined, - axis: undefined, - writingMode: undefined, - flow: "scrolled", - ignoreClass: "", - fullsize: undefined - }); - Object(core["extend"])(this.settings, options.settings || {}); - this.viewSettings = { - ignoreClass: this.settings.ignoreClass, - axis: this.settings.axis, - flow: this.settings.flow, - layout: this.layout, - method: this.settings.method, - // srcdoc, blobUrl, write - width: 0, - height: 0, - forceEvenPages: true - }; - this.rendered = false; - } - - render(element, size) { - let tag = element.tagName; + if (this.layout.name === "pre-paginated" && this.layout.divisor === 2 && next.properties.includes("page-spread-right")) { + forceRight = true; + } - if (typeof this.settings.fullsize === "undefined" && tag && (tag.toLowerCase() == "body" || tag.toLowerCase() == "html")) { - this.settings.fullsize = true; - } + return this.append(next, forceRight).then(function () { + return this.handleNextPrePaginated(forceRight, next, this.append); + }.bind(this), err => { + return err; + }).then(function () { + // Reset position to start for scrolled-doc vertical-rl in default mode + if (!this.isPaginated && this.settings.axis === "horizontal" && this.settings.direction === "rtl" && this.settings.rtlScrollType === "default") { + this.scrollTo(this.container.scrollWidth, 0, true); + } - if (this.settings.fullsize) { - this.settings.overflow = "visible"; - this.overflow = this.settings.overflow; + this.views.show(); + }.bind(this)); } + } - this.settings.size = size; - this.settings.rtlScrollType = scrollType(); // Save the stage + prev() { + var prev; + var left; + let dir = this.settings.direction; + if (!this.views.length) return; - this.stage = new stage({ - width: size.width, - height: size.height, - overflow: this.overflow, - hidden: this.settings.hidden, - axis: this.settings.axis, - fullsize: this.settings.fullsize, - direction: this.settings.direction - }); - this.stage.attachTo(element); // Get this stage container div + if (this.isPaginated && this.settings.axis === "horizontal" && (!dir || dir === "ltr")) { + this.scrollLeft = this.container.scrollLeft; + left = this.container.scrollLeft; - this.container = this.stage.getContainer(); // Views array methods + if (left > 0) { + this.scrollBy(-this.layout.delta, 0, true); + } else { + prev = this.views.first().section.prev(); + } + } else if (this.isPaginated && this.settings.axis === "horizontal" && dir === "rtl") { + this.scrollLeft = this.container.scrollLeft; - this.views = new views(this.container); // Calculate Stage Size + if (this.settings.rtlScrollType === "default") { + left = this.container.scrollLeft + this.container.offsetWidth; - this._bounds = this.bounds(); - this._stageSize = this.stage.size(); // Set the dimensions for views + if (left < this.container.scrollWidth) { + this.scrollBy(-this.layout.delta, 0, true); + } else { + prev = this.views.first().section.prev(); + } + } else { + left = this.container.scrollLeft; - this.viewSettings.width = this._stageSize.width; - this.viewSettings.height = this._stageSize.height; // Function to handle a resize event. - // Will only attach if width and height are both fixed. + if (left < 0) { + this.scrollBy(-this.layout.delta, 0, true); + } else { + prev = this.views.first().section.prev(); + } + } + } else if (this.isPaginated && this.settings.axis === "vertical") { + this.scrollTop = this.container.scrollTop; + let top = this.container.scrollTop; - this.stage.onResize(this.onResized.bind(this)); - this.stage.onOrientationChange(this.onOrientationChange.bind(this)); // Add Event Listeners + if (top > 0) { + this.scrollBy(0, -this.layout.height, true); + } else { + prev = this.views.first().section.prev(); + } + } else { + prev = this.views.first().section.prev(); + } - this.addEventListeners(); // Add Layout method - // this.applyLayoutMethod(); + if (prev) { + this.clear(); // The new section may have a different writing-mode from the old section. Thus, we need to update layout. - if (this.layout) { this.updateLayout(); - } + let forceRight = false; - this.rendered = true; - } + if (this.layout.name === "pre-paginated" && this.layout.divisor === 2 && typeof prev.prev() !== "object") { + forceRight = true; + } - addEventListeners() { - var scroller; - window.addEventListener("unload", function (e) { - this.destroy(); - }.bind(this)); + return this.prepend(prev, forceRight).then(function () { + var left; - if (!this.settings.fullsize) { - scroller = this.container; - } else { - scroller = window; - } + if (this.layout.name === "pre-paginated" && this.layout.divisor > 1) { + left = prev.prev(); - this._onScroll = this.onScroll.bind(this); - scroller.addEventListener("scroll", this._onScroll); + if (left) { + return this.prepend(left); + } + } + }.bind(this), err => { + return err; + }).then(function () { + if (this.isPaginated && this.settings.axis === "horizontal") { + if (this.settings.direction === "rtl") { + if (this.settings.rtlScrollType === "default") { + this.scrollTo(0, 0, true); + } else { + this.scrollTo(this.container.scrollWidth * -1 + this.layout.delta, 0, true); + } + } else { + this.scrollTo(this.container.scrollWidth - this.layout.delta, 0, true); + } + } + + this.views.show(); + }.bind(this)); + } } - removeEventListeners() { - var scroller; + current() { + var visible = this.visible(); - if (!this.settings.fullsize) { - scroller = this.container; - } else { - scroller = window; + if (visible.length) { + // Current is the last visible view + return visible[visible.length - 1]; } - scroller.removeEventListener("scroll", this._onScroll); - this._onScroll = undefined; + return null; } - destroy() { - clearTimeout(this.orientationTimeout); - clearTimeout(this.resizeTimeout); - clearTimeout(this.afterScrolled); - this.clear(); - this.removeEventListeners(); - this.stage.destroy(); - this.rendered = false; - /* - clearTimeout(this.trimTimeout); - if(this.settings.hidden) { - this.element.removeChild(this.wrapper); - } else { - this.element.removeChild(this.container); - } - */ + clear() { + // this.q.clear(); + if (this.views) { + this.views.hide(); + this.scrollTo(0, 0, true); + this.views.clear(); + } } - onOrientationChange(e) { - let { - orientation - } = window; - - if (this.optsSettings.resizeOnOrientationChange) { - this.resize(); - } // Per ampproject: - // In IOS 10.3, the measured size of an element is incorrect if the - // element size depends on window size directly and the measurement - // happens in window.resize event. Adding a timeout for correct - // measurement. See https://github.com/ampproject/amphtml/issues/8479 - - - clearTimeout(this.orientationTimeout); - this.orientationTimeout = setTimeout(function () { - this.orientationTimeout = undefined; - - if (this.optsSettings.resizeOnOrientationChange) { - this.resize(); - } + currentLocation() { + this.updateLayout(); - this.emit(constants["c" /* EVENTS */].MANAGERS.ORIENTATION_CHANGE, orientation); - }.bind(this), 500); - } + if (this.isPaginated && this.settings.axis === "horizontal") { + this.location = this.paginatedLocation(); + } else { + this.location = this.scrolledLocation(); + } - onResized(e) { - this.resize(); + return this.location; } - resize(width, height, epubcfi) { - let stageSize = this.stage.size(width, height); // For Safari, wait for orientation to catch up - // if the window is a square - - this.winBounds = Object(core["windowBounds"])(); + scrolledLocation() { + let visible = this.visible(); + let container = this.container.getBoundingClientRect(); + let pageHeight = container.height < window.innerHeight ? container.height : window.innerHeight; + let pageWidth = container.width < window.innerWidth ? container.width : window.innerWidth; + let vertical = this.settings.axis === "vertical"; + let rtl = this.settings.direction === "rtl"; + let offset = 0; + let used = 0; - if (this.orientationTimeout && this.winBounds.width === this.winBounds.height) { - // reset the stage size for next resize - this._stageSize = undefined; - return; + if (this.settings.fullsize) { + offset = vertical ? window.scrollY : window.scrollX; } - if (this._stageSize && this._stageSize.width === stageSize.width && this._stageSize.height === stageSize.height) { - // Size is the same, no need to resize - return; - } + let sections = visible.map(view => { + let { + index, + href + } = view.section; + let position = view.position(); + let width = view.width(); + let height = view.height(); + let startPos; + let endPos; + let stopPos; + let totalPages; - this._stageSize = stageSize; - this._bounds = this.bounds(); // Clear current views - - this.clear(); // Update for new views - - this.viewSettings.width = this._stageSize.width; - this.viewSettings.height = this._stageSize.height; - this.updateLayout(); - this.emit(constants["c" /* EVENTS */].MANAGERS.RESIZED, { - width: this._stageSize.width, - height: this._stageSize.height - }, epubcfi); - } - - createView(section, forceRight) { - return new this.View(section, Object(core["extend"])(this.viewSettings, { - forceRight - })); - } + if (vertical) { + startPos = offset + container.top - position.top + used; + endPos = startPos + pageHeight - used; + totalPages = this.layout.count(height, pageHeight).pages; + stopPos = pageHeight; + } else { + startPos = offset + container.left - position.left + used; + endPos = startPos + pageWidth - used; + totalPages = this.layout.count(width, pageWidth).pages; + stopPos = pageWidth; + } - handleNextPrePaginated(forceRight, section, action) { - let next; + let currPage = Math.ceil(startPos / stopPos); + let pages = []; + let endPage = Math.ceil(endPos / stopPos); // Reverse page counts for horizontal rtl - if (this.layout.name === "pre-paginated" && this.layout.divisor > 1) { - if (forceRight || section.index === 0) { - // First page (cover) should stand alone for pre-paginated books - return; + if (this.settings.direction === "rtl" && !vertical) { + let tempStartPage = currPage; + currPage = totalPages - endPage; + endPage = totalPages - tempStartPage; } - next = section.next(); + pages = []; - if (next && !next.properties.includes("page-spread-left")) { - return action.call(this, next); + for (var i = currPage; i <= endPage; i++) { + let pg = i + 1; + pages.push(pg); } - } - } - display(section, target) { - var displaying = new core["defer"](); - var displayed = displaying.promise; // Check if moving to target is needed + let mapping = this.mapping.page(view.contents, view.section.cfiBase, startPos, endPos); + return { + index, + href, + pages, + totalPages, + mapping + }; + }); + return sections; + } - if (target === section.href || Object(core["isNumber"])(target)) { - target = undefined; - } // Check to make sure the section we want isn't already shown + paginatedLocation() { + let visible = this.visible(); + let container = this.container.getBoundingClientRect(); + let left = 0; + let used = 0; + if (this.settings.fullsize) { + left = window.scrollX; + } - var visible = this.views.find(section); // View is already shown, just move to correct location in view + let sections = visible.map(view => { + let { + index, + href + } = view.section; + let offset; + let position = view.position(); + let width = view.width(); // Find mapping - if (visible && section && this.layout.name !== "pre-paginated") { - let offset = visible.offset(); + let start; + let end; + let pageWidth; - if (this.settings.direction === "ltr") { - this.scrollTo(offset.left, offset.top, true); + if (this.settings.direction === "rtl") { + offset = container.right - left; + pageWidth = Math.min(Math.abs(offset - position.left), this.layout.width) - used; + end = position.width - (position.right - offset) - used; + start = end - pageWidth; } else { - let width = visible.width(); - this.scrollTo(offset.left + width, offset.top, true); - } - - if (target) { - let offset = visible.locationOf(target); - let width = visible.width(); - this.moveTo(offset, width); + offset = container.left + left; + pageWidth = Math.min(position.right - offset, this.layout.width) - used; + start = offset - position.left + used; + end = start + pageWidth; } - displaying.resolve(); - return displayed; - } // Hide all current views + used += pageWidth; + let mapping = this.mapping.page(view.contents, view.section.cfiBase, start, end); + let totalPages = this.layout.count(width).pages; + let startPage = Math.floor(start / this.layout.pageWidth); + let pages = []; + let endPage = Math.floor(end / this.layout.pageWidth); // start page should not be negative + if (startPage < 0) { + startPage = 0; + endPage = endPage + 1; + } // Reverse page counts for rtl - this.clear(); - let forceRight = false; - if (this.layout.name === "pre-paginated" && this.layout.divisor === 2 && section.properties.includes("page-spread-right")) { - forceRight = true; - } + if (this.settings.direction === "rtl") { + let tempStartPage = startPage; + startPage = totalPages - endPage; + endPage = totalPages - tempStartPage; + } - this.add(section, forceRight).then(function (view) { - // Move to correct place within the section, if needed - if (target) { - let offset = view.locationOf(target); - let width = view.width(); - this.moveTo(offset, width); + for (var i = startPage + 1; i <= endPage; i++) { + let pg = i; + pages.push(pg); } - }.bind(this), err => { - displaying.reject(err); - }).then(function () { - return this.handleNextPrePaginated(forceRight, section, this.add); - }.bind(this)).then(function () { - this.views.show(); - displaying.resolve(); - }.bind(this)); // .then(function(){ - // return this.hooks.display.trigger(view); - // }.bind(this)) - // .then(function(){ - // this.views.show(); - // }.bind(this)); - return displayed; + return { + index, + href, + pages, + totalPages, + mapping + }; + }); + return sections; } - afterDisplayed(view) { - this.emit(constants["c" /* EVENTS */].MANAGERS.ADDED, view); - } + isVisible(view, offsetPrev, offsetNext, _container) { + var position = view.position(); - afterResized(view) { - this.emit(constants["c" /* EVENTS */].MANAGERS.RESIZE, view.section); + var container = _container || this.bounds(); + + if (this.settings.axis === "horizontal" && position.right > container.left - offsetPrev && position.left < container.right + offsetNext) { + return true; + } else if (this.settings.axis === "vertical" && position.bottom > container.top - offsetPrev && position.top < container.bottom + offsetNext) { + return true; + } + + return false; } - moveTo(offset, width) { - var distX = 0, - distY = 0; + visible() { + var container = this.bounds(); + var views = this.views.displayed(); + var viewsLength = views.length; + var visible = []; + var isVisible; + var view; - if (!this.isPaginated) { - distY = offset.top; - } else { - distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; + for (var i = 0; i < viewsLength; i++) { + view = views[i]; + isVisible = this.isVisible(view, 0, 0, container); - if (distX + this.layout.delta > this.container.scrollWidth) { - distX = this.container.scrollWidth - this.layout.delta; + if (isVisible === true) { + visible.push(view); } + } - distY = Math.floor(offset.top / this.layout.delta) * this.layout.delta; + return visible; + } - if (distY + this.layout.delta > this.container.scrollHeight) { - distY = this.container.scrollHeight - this.layout.delta; - } + scrollBy(x, y, silent) { + let dir = this.settings.direction === "rtl" ? -1 : 1; + + if (silent) { + this.ignore = true; } - if (this.settings.direction === 'rtl') { - /*** - the `floor` function above (L343) is on positive values, so we should add one `layout.delta` - to distX or use `Math.ceil` function, or multiply offset.left by -1 - before `Math.floor` - */ - distX = distX + this.layout.delta; - distX = distX - width; + if (!this.settings.fullsize) { + if (x) this.container.scrollLeft += x * dir; + if (y) this.container.scrollTop += y; + } else { + window.scrollBy(x * dir, y * dir); } - this.scrollTo(distX, distY, true); + this.scrolled = true; } - add(section, forceRight) { - var view = this.createView(section, forceRight); - this.views.append(view); // view.on(EVENTS.VIEWS.SHOWN, this.afterDisplayed.bind(this)); + scrollTo(x, y, silent) { + if (silent) { + this.ignore = true; + } - view.onDisplayed = this.afterDisplayed.bind(this); - view.onResize = this.afterResized.bind(this); - view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { - this.updateAxis(axis); - }); - view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { - this.updateWritingMode(mode); - }); - return view.display(this.request); + if (!this.settings.fullsize) { + this.container.scrollLeft = x; + this.container.scrollTop = y; + } else { + window.scrollTo(x, y); + } + + this.scrolled = true; } - append(section, forceRight) { - var view = this.createView(section, forceRight); - this.views.append(view); - view.onDisplayed = this.afterDisplayed.bind(this); - view.onResize = this.afterResized.bind(this); - view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { - this.updateAxis(axis); - }); - view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { - this.updateWritingMode(mode); - }); - return view.display(this.request); - } - - prepend(section, forceRight) { - var view = this.createView(section, forceRight); - view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { - this.counter(bounds); - }); - this.views.prepend(view); - view.onDisplayed = this.afterDisplayed.bind(this); - view.onResize = this.afterResized.bind(this); - view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { - this.updateAxis(axis); - }); - view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { - this.updateWritingMode(mode); - }); - return view.display(this.request); - } + onScroll() { + let scrollTop; + let scrollLeft; - counter(bounds) { - if (this.settings.axis === "vertical") { - this.scrollBy(0, bounds.heightDelta, true); + if (!this.settings.fullsize) { + scrollTop = this.container.scrollTop; + scrollLeft = this.container.scrollLeft; } else { - this.scrollBy(bounds.widthDelta, 0, true); + scrollTop = window.scrollY; + scrollLeft = window.scrollX; } - } // resizeView(view) { - // - // if(this.settings.globalLayoutProperties.layout === "pre-paginated") { - // view.lock("both", this.bounds.width, this.bounds.height); - // } else { - // view.lock("width", this.bounds.width, this.bounds.height); - // } - // - // }; + this.scrollTop = scrollTop; + this.scrollLeft = scrollLeft; - next() { - var next; - var left; - let dir = this.settings.direction; - if (!this.views.length) return; + if (!this.ignore) { + this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLL, { + top: scrollTop, + left: scrollLeft + }); + clearTimeout(this.afterScrolled); + this.afterScrolled = setTimeout(function () { + this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLLED, { + top: this.scrollTop, + left: this.scrollLeft + }); + }.bind(this), 20); + } else { + this.ignore = false; + } + } - if (this.isPaginated && this.settings.axis === "horizontal" && (!dir || dir === "ltr")) { - this.scrollLeft = this.container.scrollLeft; - left = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta; + bounds() { + var bounds; + bounds = this.stage.bounds(); + return bounds; + } - if (left <= this.container.scrollWidth) { - this.scrollBy(this.layout.delta, 0, true); - } else { - next = this.views.last().section.next(); - } - } else if (this.isPaginated && this.settings.axis === "horizontal" && dir === "rtl") { - this.scrollLeft = this.container.scrollLeft; + applyLayout(layout) { + this.layout = layout; + this.updateLayout(); - if (this.settings.rtlScrollType === "default") { - left = this.container.scrollLeft; + if (this.views && this.views.length > 0 && this.layout.name === "pre-paginated") { + this.display(this.views.first().section); + } // this.manager.layout(this.layout.format); - if (left > 0) { - this.scrollBy(this.layout.delta, 0, true); - } else { - next = this.views.last().section.next(); - } - } else { - left = this.container.scrollLeft + this.layout.delta * -1; + } - if (left > this.container.scrollWidth * -1) { - this.scrollBy(this.layout.delta, 0, true); - } else { - next = this.views.last().section.next(); - } - } - } else if (this.isPaginated && this.settings.axis === "vertical") { - this.scrollTop = this.container.scrollTop; - let top = this.container.scrollTop + this.container.offsetHeight; + updateLayout() { + if (!this.stage) { + return; + } - if (top < this.container.scrollHeight) { - this.scrollBy(0, this.layout.height, true); - } else { - next = this.views.last().section.next(); - } + this._stageSize = this.stage.size(); + + if (!this.isPaginated) { + this.layout.calculate(this._stageSize.width, this._stageSize.height); } else { - next = this.views.last().section.next(); - } + this.layout.calculate(this._stageSize.width, this._stageSize.height, this.settings.gap); // Set the look ahead offset for what is visible - if (next) { - this.clear(); // The new section may have a different writing-mode from the old section. Thus, we need to update layout. + this.settings.offset = this.layout.delta / this.layout.divisor; // this.stage.addStyleRules("iframe", [{"margin-right" : this.layout.gap + "px"}]); + } // Set the dimensions for views - this.updateLayout(); - let forceRight = false; - if (this.layout.name === "pre-paginated" && this.layout.divisor === 2 && next.properties.includes("page-spread-right")) { - forceRight = true; - } + this.viewSettings.width = this.layout.width; + this.viewSettings.height = this.layout.height; + this.setLayout(this.layout); + } - return this.append(next, forceRight).then(function () { - return this.handleNextPrePaginated(forceRight, next, this.append); - }.bind(this), err => { - return err; - }).then(function () { - // Reset position to start for scrolled-doc vertical-rl in default mode - if (!this.isPaginated && this.settings.axis === "horizontal" && this.settings.direction === "rtl" && this.settings.rtlScrollType === "default") { - this.scrollTo(this.container.scrollWidth, 0, true); - } + setLayout(layout) { + this.viewSettings.layout = layout; + this.mapping = new mapping["a" /* default */](layout.props, this.settings.direction, this.settings.axis); - this.views.show(); - }.bind(this)); + if (this.views) { + this.views.forEach(function (view) { + if (view) { + view.setLayout(layout); + } + }); } } - prev() { - var prev; - var left; - let dir = this.settings.direction; - if (!this.views.length) return; + updateWritingMode(mode) { + this.writingMode = mode; + } - if (this.isPaginated && this.settings.axis === "horizontal" && (!dir || dir === "ltr")) { - this.scrollLeft = this.container.scrollLeft; - left = this.container.scrollLeft; + updateAxis(axis, forceUpdate) { + if (!forceUpdate && axis === this.settings.axis) { + return; + } - if (left > 0) { - this.scrollBy(-this.layout.delta, 0, true); - } else { - prev = this.views.first().section.prev(); - } - } else if (this.isPaginated && this.settings.axis === "horizontal" && dir === "rtl") { - this.scrollLeft = this.container.scrollLeft; + this.settings.axis = axis; + this.stage && this.stage.axis(axis); + this.viewSettings.axis = axis; - if (this.settings.rtlScrollType === "default") { - left = this.container.scrollLeft + this.container.offsetWidth; + if (this.mapping) { + this.mapping = new mapping["a" /* default */](this.layout.props, this.settings.direction, this.settings.axis); + } - if (left < this.container.scrollWidth) { - this.scrollBy(-this.layout.delta, 0, true); - } else { - prev = this.views.first().section.prev(); - } + if (this.layout) { + if (axis === "vertical") { + this.layout.spread("none"); } else { - left = this.container.scrollLeft; - - if (left < 0) { - this.scrollBy(-this.layout.delta, 0, true); - } else { - prev = this.views.first().section.prev(); - } + this.layout.spread(this.layout.settings.spread); } - } else if (this.isPaginated && this.settings.axis === "vertical") { - this.scrollTop = this.container.scrollTop; - let top = this.container.scrollTop; + } + } - if (top > 0) { - this.scrollBy(0, -this.layout.height, true); - } else { - prev = this.views.first().section.prev(); - } + updateFlow(flow, defaultScrolledOverflow = "auto") { + let isPaginated = flow === "paginated" || flow === "auto"; + this.isPaginated = isPaginated; + + if (flow === "scrolled-doc" || flow === "scrolled-continuous" || flow === "scrolled") { + this.updateAxis("vertical"); } else { - prev = this.views.first().section.prev(); + this.updateAxis("horizontal"); } - if (prev) { - this.clear(); // The new section may have a different writing-mode from the old section. Thus, we need to update layout. + this.viewSettings.flow = flow; - this.updateLayout(); - let forceRight = false; + if (!this.settings.overflow) { + this.overflow = isPaginated ? "hidden" : defaultScrolledOverflow; + } else { + this.overflow = this.settings.overflow; + } - if (this.layout.name === "pre-paginated" && this.layout.divisor === 2 && typeof prev.prev() !== "object") { - forceRight = true; - } + this.stage && this.stage.overflow(this.overflow); + this.updateLayout(); + } - return this.prepend(prev, forceRight).then(function () { - var left; + getContents() { + var contents = []; - if (this.layout.name === "pre-paginated" && this.layout.divisor > 1) { - left = prev.prev(); + if (!this.views) { + return contents; + } - if (left) { - return this.prepend(left); - } - } - }.bind(this), err => { - return err; - }).then(function () { - if (this.isPaginated && this.settings.axis === "horizontal") { - if (this.settings.direction === "rtl") { - if (this.settings.rtlScrollType === "default") { - this.scrollTo(0, 0, true); - } else { - this.scrollTo(this.container.scrollWidth * -1 + this.layout.delta, 0, true); - } - } else { - this.scrollTo(this.container.scrollWidth - this.layout.delta, 0, true); - } - } + this.views.forEach(function (view) { + const viewContents = view && view.contents; - this.views.show(); - }.bind(this)); - } + if (viewContents) { + contents.push(viewContents); + } + }); + return contents; } - current() { - var visible = this.visible(); - - if (visible.length) { - // Current is the last visible view - return visible[visible.length - 1]; - } - - return null; + direction(dir = "ltr") { + this.settings.direction = dir; + this.stage && this.stage.direction(dir); + this.viewSettings.direction = dir; + this.updateLayout(); } - clear() { - // this.q.clear(); - if (this.views) { - this.views.hide(); - this.scrollTo(0, 0, true); - this.views.clear(); - } + isRendered() { + return this.rendered; } - currentLocation() { - this.updateLayout(); - - if (this.isPaginated && this.settings.axis === "horizontal") { - this.location = this.paginatedLocation(); - } else { - this.location = this.scrolledLocation(); - } - - return this.location; - } +} //-- Enable binding events to Manager - scrolledLocation() { - let visible = this.visible(); - let container = this.container.getBoundingClientRect(); - let pageHeight = container.height < window.innerHeight ? container.height : window.innerHeight; - let pageWidth = container.width < window.innerWidth ? container.width : window.innerWidth; - let vertical = this.settings.axis === "vertical"; - let rtl = this.settings.direction === "rtl"; - let offset = 0; - let used = 0; - if (this.settings.fullsize) { - offset = vertical ? window.scrollY : window.scrollX; - } +event_emitter_default()(default_DefaultViewManager.prototype); +/* harmony default export */ var managers_default = __webpack_exports__["a"] = (default_DefaultViewManager); - let sections = visible.map(view => { - let { - index, - href - } = view.section; - let position = view.position(); - let width = view.width(); - let height = view.height(); - let startPos; - let endPos; - let stopPos; - let totalPages; +/***/ }), +/* 11 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (vertical) { - startPos = offset + container.top - position.top + used; - endPos = startPos + pageHeight - used; - totalPages = this.layout.count(height, pageHeight).pages; - stopPos = pageHeight; - } else { - startPos = offset + container.left - position.left + used; - endPos = startPos + pageWidth - used; - totalPages = this.layout.count(width, pageWidth).pages; - stopPos = pageWidth; - } +"use strict"; +/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0); - let currPage = Math.ceil(startPos / stopPos); - let pages = []; - let endPage = Math.ceil(endPos / stopPos); // Reverse page counts for horizontal rtl - if (this.settings.direction === "rtl" && !vertical) { - let tempStartPage = currPage; - currPage = totalPages - endPage; - endPage = totalPages - tempStartPage; - } +/** + * Map text locations to CFI ranges + * @class + * @param {Layout} layout Layout to apply + * @param {string} [direction="ltr"] Text direction + * @param {string} [axis="horizontal"] vertical or horizontal axis + * @param {boolean} [dev] toggle developer highlighting + */ - pages = []; +class Mapping { + constructor(layout, direction, axis, dev = false) { + this.layout = layout; + this.horizontal = axis === "horizontal" ? true : false; + this.direction = direction || "ltr"; + this._dev = dev; + } + /** + * Find CFI pairs for entire section at once + */ - for (var i = currPage; i <= endPage; i++) { - let pg = i + 1; - pages.push(pg); - } - let mapping = this.mapping.page(view.contents, view.section.cfiBase, startPos, endPos); - return { - index, - href, - pages, - totalPages, - mapping - }; - }); - return sections; + section(view) { + var ranges = this.findRanges(view); + var map = this.rangeListToCfiList(view.section.cfiBase, ranges); + return map; } + /** + * Find CFI pairs for a page + * @param {Contents} contents Contents from view + * @param {string} cfiBase string of the base for a cfi + * @param {number} start position to start at + * @param {number} end position to end at + */ - paginatedLocation() { - let visible = this.visible(); - let container = this.container.getBoundingClientRect(); - let left = 0; - let used = 0; - if (this.settings.fullsize) { - left = window.scrollX; + page(contents, cfiBase, start, end) { + var root = contents && contents.document ? contents.document.body : false; + var result; + + if (!root) { + return; } - let sections = visible.map(view => { - let { - index, - href - } = view.section; - let offset; - let position = view.position(); - let width = view.width(); // Find mapping + result = this.rangePairToCfiPair(cfiBase, { + start: this.findStart(root, start, end), + end: this.findEnd(root, start, end) + }); - let start; - let end; - let pageWidth; + if (this._dev === true) { + let doc = contents.document; + let startRange = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](result.start).toRange(doc); + let endRange = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](result.end).toRange(doc); + let selection = doc.defaultView.getSelection(); + let r = doc.createRange(); + selection.removeAllRanges(); + r.setStart(startRange.startContainer, startRange.startOffset); + r.setEnd(endRange.endContainer, endRange.endOffset); + selection.addRange(r); + } - if (this.settings.direction === "rtl") { - offset = container.right - left; - pageWidth = Math.min(Math.abs(offset - position.left), this.layout.width) - used; - end = position.width - (position.right - offset) - used; - start = end - pageWidth; - } else { - offset = container.left + left; - pageWidth = Math.min(position.right - offset, this.layout.width) - used; - start = offset - position.left + used; - end = start + pageWidth; - } + return result; + } + /** + * Walk a node, preforming a function on each node it finds + * @private + * @param {Node} root Node to walkToNode + * @param {function} func walk function + * @return {*} returns the result of the walk function + */ - used += pageWidth; - let mapping = this.mapping.page(view.contents, view.section.cfiBase, start, end); - let totalPages = this.layout.count(width).pages; - let startPage = Math.floor(start / this.layout.pageWidth); - let pages = []; - let endPage = Math.floor(end / this.layout.pageWidth); // start page should not be negative - if (startPage < 0) { - startPage = 0; - endPage = endPage + 1; - } // Reverse page counts for rtl + walk(root, func) { + // IE11 has strange issue, if root is text node IE throws exception on + // calling treeWalker.nextNode(), saying + // Unexpected call to method or property access instead of returning null value + if (root && root.nodeType === Node.TEXT_NODE) { + return; + } // safeFilter is required so that it can work in IE as filter is a function for IE + // and for other browser filter is an object. - if (this.settings.direction === "rtl") { - let tempStartPage = startPage; - startPage = totalPages - endPage; - endPage = totalPages - tempStartPage; + var filter = { + acceptNode: function (node) { + if (node.data.trim().length > 0) { + return NodeFilter.FILTER_ACCEPT; + } else { + return NodeFilter.FILTER_REJECT; + } } + }; + var safeFilter = filter.acceptNode; + safeFilter.acceptNode = filter.acceptNode; + var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, safeFilter, false); + var node; + var result; - for (var i = startPage + 1; i <= endPage; i++) { - let pg = i; - pages.push(pg); - } + while (node = treeWalker.nextNode()) { + result = func(node); + if (result) break; + } - return { - index, - href, - pages, - totalPages, - mapping - }; - }); - return sections; + return result; } - isVisible(view, offsetPrev, offsetNext, _container) { - var position = view.position(); - - var container = _container || this.bounds(); + findRanges(view) { + var columns = []; + var scrollWidth = view.contents.scrollWidth(); + var spreads = Math.ceil(scrollWidth / this.layout.spreadWidth); + var count = spreads * this.layout.divisor; + var columnWidth = this.layout.columnWidth; + var gap = this.layout.gap; + var start, end; - if (this.settings.axis === "horizontal" && position.right > container.left - offsetPrev && position.left < container.right + offsetNext) { - return true; - } else if (this.settings.axis === "vertical" && position.bottom > container.top - offsetPrev && position.top < container.bottom + offsetNext) { - return true; + for (var i = 0; i < count.pages; i++) { + start = (columnWidth + gap) * i; + end = columnWidth * (i + 1) + gap * i; + columns.push({ + start: this.findStart(view.document.body, start, end), + end: this.findEnd(view.document.body, start, end) + }); } - return false; + return columns; } + /** + * Find Start Range + * @private + * @param {Node} root root node + * @param {number} start position to start at + * @param {number} end position to end at + * @return {Range} + */ - visible() { - var container = this.bounds(); - var views = this.views.displayed(); - var viewsLength = views.length; - var visible = []; - var isVisible; - var view; - for (var i = 0; i < viewsLength; i++) { - view = views[i]; - isVisible = this.isVisible(view, 0, 0, container); + findStart(root, start, end) { + var stack = [root]; + var $el; + var found; + var $prev = root; - if (isVisible === true) { - visible.push(view); - } - } + while (stack.length) { + $el = stack.shift(); + found = this.walk($el, node => { + var left, right, top, bottom; + var elPos; + var elRange; + elPos = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["nodeBounds"])(node); - return visible; - } + if (this.horizontal && this.direction === "ltr") { + left = this.horizontal ? elPos.left : elPos.top; + right = this.horizontal ? elPos.right : elPos.bottom; - scrollBy(x, y, silent) { - let dir = this.settings.direction === "rtl" ? -1 : 1; + if (left >= start && left <= end) { + return node; + } else if (right > start) { + return node; + } else { + $prev = node; + stack.push(node); + } + } else if (this.horizontal && this.direction === "rtl") { + left = elPos.left; + right = elPos.right; - if (silent) { - this.ignore = true; - } + if (right <= end && right >= start) { + return node; + } else if (left < end) { + return node; + } else { + $prev = node; + stack.push(node); + } + } else { + top = elPos.top; + bottom = elPos.bottom; - if (!this.settings.fullsize) { - if (x) this.container.scrollLeft += x * dir; - if (y) this.container.scrollTop += y; - } else { - window.scrollBy(x * dir, y * dir); - } + if (top >= start && top <= end) { + return node; + } else if (bottom > start) { + return node; + } else { + $prev = node; + stack.push(node); + } + } + }); - this.scrolled = true; + if (found) { + return this.findTextStartRange(found, start, end); + } + } // Return last element + + + return this.findTextStartRange($prev, start, end); } + /** + * Find End Range + * @private + * @param {Node} root root node + * @param {number} start position to start at + * @param {number} end position to end at + * @return {Range} + */ - scrollTo(x, y, silent) { - if (silent) { - this.ignore = true; - } - if (!this.settings.fullsize) { - this.container.scrollLeft = x; - this.container.scrollTop = y; - } else { - window.scrollTo(x, y); - } + findEnd(root, start, end) { + var stack = [root]; + var $el; + var $prev = root; + var found; - this.scrolled = true; - } + while (stack.length) { + $el = stack.shift(); + found = this.walk($el, node => { + var left, right, top, bottom; + var elPos; + var elRange; + elPos = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["nodeBounds"])(node); - onScroll() { - let scrollTop; - let scrollLeft; + if (this.horizontal && this.direction === "ltr") { + left = Math.round(elPos.left); + right = Math.round(elPos.right); - if (!this.settings.fullsize) { - scrollTop = this.container.scrollTop; - scrollLeft = this.container.scrollLeft; - } else { - scrollTop = window.scrollY; - scrollLeft = window.scrollX; - } + if (left > end && $prev) { + return $prev; + } else if (right > end) { + return node; + } else { + $prev = node; + stack.push(node); + } + } else if (this.horizontal && this.direction === "rtl") { + left = Math.round(this.horizontal ? elPos.left : elPos.top); + right = Math.round(this.horizontal ? elPos.right : elPos.bottom); - this.scrollTop = scrollTop; - this.scrollLeft = scrollLeft; + if (right < start && $prev) { + return $prev; + } else if (left < start) { + return node; + } else { + $prev = node; + stack.push(node); + } + } else { + top = Math.round(elPos.top); + bottom = Math.round(elPos.bottom); - if (!this.ignore) { - this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLL, { - top: scrollTop, - left: scrollLeft + if (top > end && $prev) { + return $prev; + } else if (bottom > end) { + return node; + } else { + $prev = node; + stack.push(node); + } + } }); - clearTimeout(this.afterScrolled); - this.afterScrolled = setTimeout(function () { - this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLLED, { - top: this.scrollTop, - left: this.scrollLeft - }); - }.bind(this), 20); - } else { - this.ignore = false; - } - } - - bounds() { - var bounds; - bounds = this.stage.bounds(); - return bounds; - } - applyLayout(layout) { - this.layout = layout; - this.updateLayout(); + if (found) { + return this.findTextEndRange(found, start, end); + } + } // end of chapter - if (this.views && this.views.length > 0 && this.layout.name === "pre-paginated") { - this.display(this.views.first().section); - } // this.manager.layout(this.layout.format); + return this.findTextEndRange($prev, start, end); } + /** + * Find Text Start Range + * @private + * @param {Node} root root node + * @param {number} start position to start at + * @param {number} end position to end at + * @return {Range} + */ - updateLayout() { - if (!this.stage) { - return; - } - this._stageSize = this.stage.size(); + findTextStartRange(node, start, end) { + var ranges = this.splitTextNodeIntoRanges(node); + var range; + var pos; + var left, top, right; - if (!this.isPaginated) { - this.layout.calculate(this._stageSize.width, this._stageSize.height); - } else { - this.layout.calculate(this._stageSize.width, this._stageSize.height, this.settings.gap); // Set the look ahead offset for what is visible - - this.settings.offset = this.layout.delta / this.layout.divisor; // this.stage.addStyleRules("iframe", [{"margin-right" : this.layout.gap + "px"}]); - } // Set the dimensions for views + for (var i = 0; i < ranges.length; i++) { + range = ranges[i]; + pos = range.getBoundingClientRect(); + if (this.horizontal && this.direction === "ltr") { + left = pos.left; - this.viewSettings.width = this.layout.width; - this.viewSettings.height = this.layout.height; - this.setLayout(this.layout); - } + if (left >= start) { + return range; + } + } else if (this.horizontal && this.direction === "rtl") { + right = pos.right; - setLayout(layout) { - this.viewSettings.layout = layout; - this.mapping = new mapping["a" /* default */](layout.props, this.settings.direction, this.settings.axis); + if (right <= end) { + return range; + } + } else { + top = pos.top; - if (this.views) { - this.views.forEach(function (view) { - if (view) { - view.setLayout(layout); + if (top >= start) { + return range; } - }); + } // prev = range; + } - } - updateWritingMode(mode) { - this.writingMode = mode; + return ranges[0]; } + /** + * Find Text End Range + * @private + * @param {Node} root root node + * @param {number} start position to start at + * @param {number} end position to end at + * @return {Range} + */ - updateAxis(axis, forceUpdate) { - if (!forceUpdate && axis === this.settings.axis) { - return; - } - this.settings.axis = axis; - this.stage && this.stage.axis(axis); - this.viewSettings.axis = axis; + findTextEndRange(node, start, end) { + var ranges = this.splitTextNodeIntoRanges(node); + var prev; + var range; + var pos; + var left, right, top, bottom; - if (this.mapping) { - this.mapping = new mapping["a" /* default */](this.layout.props, this.settings.direction, this.settings.axis); - } + for (var i = 0; i < ranges.length; i++) { + range = ranges[i]; + pos = range.getBoundingClientRect(); - if (this.layout) { - if (axis === "vertical") { - this.layout.spread("none"); + if (this.horizontal && this.direction === "ltr") { + left = pos.left; + right = pos.right; + + if (left > end && prev) { + return prev; + } else if (right > end) { + return range; + } + } else if (this.horizontal && this.direction === "rtl") { + left = pos.left; + right = pos.right; + + if (right < start && prev) { + return prev; + } else if (left < start) { + return range; + } } else { - this.layout.spread(this.layout.settings.spread); + top = pos.top; + bottom = pos.bottom; + + if (top > end && prev) { + return prev; + } else if (bottom > end) { + return range; + } } - } - } - updateFlow(flow, defaultScrolledOverflow = "auto") { - let isPaginated = flow === "paginated" || flow === "auto"; - this.isPaginated = isPaginated; + prev = range; + } // Ends before limit - if (flow === "scrolled-doc" || flow === "scrolled-continuous" || flow === "scrolled") { - this.updateAxis("vertical"); - } else { - this.updateAxis("horizontal"); - } - this.viewSettings.flow = flow; + return ranges[ranges.length - 1]; + } + /** + * Split up a text node into ranges for each word + * @private + * @param {Node} root root node + * @param {string} [_splitter] what to split on + * @return {Range[]} + */ - if (!this.settings.overflow) { - this.overflow = isPaginated ? "hidden" : defaultScrolledOverflow; - } else { - this.overflow = this.settings.overflow; + + splitTextNodeIntoRanges(node, _splitter) { + var ranges = []; + var textContent = node.textContent || ""; + var text = textContent.trim(); + var range; + var doc = node.ownerDocument; + var splitter = _splitter || " "; + var pos = text.indexOf(splitter); + + if (pos === -1 || node.nodeType != Node.TEXT_NODE) { + range = doc.createRange(); + range.selectNodeContents(node); + return [range]; } - this.stage && this.stage.overflow(this.overflow); - this.updateLayout(); - } + range = doc.createRange(); + range.setStart(node, 0); + range.setEnd(node, pos); + ranges.push(range); + range = false; - getContents() { - var contents = []; + while (pos != -1) { + pos = text.indexOf(splitter, pos + 1); - if (!this.views) { - return contents; + if (pos > 0) { + if (range) { + range.setEnd(node, pos); + ranges.push(range); + } + + range = doc.createRange(); + range.setStart(node, pos + 1); + } } - this.views.forEach(function (view) { - const viewContents = view && view.contents; + if (range) { + range.setEnd(node, text.length); + ranges.push(range); + } - if (viewContents) { - contents.push(viewContents); - } - }); - return contents; + return ranges; } + /** + * Turn a pair of ranges into a pair of CFIs + * @private + * @param {string} cfiBase base string for an EpubCFI + * @param {object} rangePair { start: Range, end: Range } + * @return {object} { start: "epubcfi(...)", end: "epubcfi(...)" } + */ - direction(dir = "ltr") { - this.settings.direction = dir; - this.stage && this.stage.direction(dir); - this.viewSettings.direction = dir; - this.updateLayout(); + + rangePairToCfiPair(cfiBase, rangePair) { + var startRange = rangePair.start; + var endRange = rangePair.end; + startRange.collapse(true); + endRange.collapse(false); + let startCfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](startRange, cfiBase).toString(); + let endCfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](endRange, cfiBase).toString(); + return { + start: startCfi, + end: endCfi + }; } - isRendered() { - return this.rendered; + rangeListToCfiList(cfiBase, columns) { + var map = []; + var cifPair; + + for (var i = 0; i < columns.length; i++) { + cifPair = this.rangePairToCfiPair(cfiBase, columns[i]); + map.push(cifPair); + } + + return map; } + /** + * Set the axis for mapping + * @param {string} axis horizontal | vertical + * @return {boolean} is it horizontal? + */ -} //-- Enable binding events to Manager + axis(axis) { + if (axis) { + this.horizontal = axis === "horizontal" ? true : false; + } -event_emitter_default()(default_DefaultViewManager.prototype); -/* harmony default export */ var managers_default = __webpack_exports__["a"] = (default_DefaultViewManager); + return this.horizontal; + } + +} + +/* harmony default export */ __webpack_exports__["a"] = (Mapping); /***/ }), -/* 23 */ +/* 12 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); +/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(event_emitter__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0); +/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2); +/* harmony import */ var _mapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); +/* harmony import */ var _utils_replacements__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8); +/* harmony import */ var _utils_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1); -/** - * Map text locations to CFI ranges - * @class - * @param {Layout} layout Layout to apply - * @param {string} [direction="ltr"] Text direction - * @param {string} [axis="horizontal"] vertical or horizontal axis - * @param {boolean} [dev] toggle developer highlighting - */ -class Mapping { - constructor(layout, direction, axis, dev = false) { - this.layout = layout; - this.horizontal = axis === "horizontal" ? true : false; - this.direction = direction || "ltr"; - this._dev = dev; - } - /** - * Find CFI pairs for entire section at once - */ - section(view) { - var ranges = this.findRanges(view); - var map = this.rangeListToCfiList(view.section.cfiBase, ranges); - return map; - } - /** - * Find CFI pairs for a page - * @param {Contents} contents Contents from view - * @param {string} cfiBase string of the base for a cfi - * @param {number} start position to start at - * @param {number} end position to end at - */ +const hasNavigator = typeof navigator !== "undefined"; +const isChrome = hasNavigator && /Chrome/.test(navigator.userAgent); +const isWebkit = hasNavigator && !isChrome && /AppleWebKit/.test(navigator.userAgent); +const ELEMENT_NODE = 1; +const TEXT_NODE = 3; +/** + * Handles DOM manipulation, queries and events for View contents + * @class + * @param {document} doc Document + * @param {element} content Parent Element (typically Body) + * @param {string} cfiBase Section component of CFIs + * @param {number} sectionIndex Index in Spine of Conntent's Section + */ - page(contents, cfiBase, start, end) { - var root = contents && contents.document ? contents.document.body : false; - var result; +class Contents { + constructor(doc, content, cfiBase, sectionIndex) { + // Blank Cfi for Parsing + this.epubcfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](); + this.document = doc; + this.documentElement = this.document.documentElement; + this.content = content || this.document.body; + this.window = this.document.defaultView; + this._size = { + width: 0, + height: 0 + }; + this.sectionIndex = sectionIndex || 0; + this.cfiBase = cfiBase || ""; + this.epubReadingSystem("epub.js", _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EPUBJS_VERSION */ "b"]); + this.called = 0; + this.active = true; + this.listeners(); + } + /** + * Get DOM events that are listened for and passed along + */ - if (!root) { - return; - } - result = this.rangePairToCfiPair(cfiBase, { - start: this.findStart(root, start, end), - end: this.findEnd(root, start, end) - }); + static get listenedEvents() { + return _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* DOM_EVENTS */ "a"]; + } + /** + * Get or Set width + * @param {number} [w] + * @returns {number} width + */ - if (this._dev === true) { - let doc = contents.document; - let startRange = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](result.start).toRange(doc); - let endRange = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](result.end).toRange(doc); - let selection = doc.defaultView.getSelection(); - let r = doc.createRange(); - selection.removeAllRanges(); - r.setStart(startRange.startContainer, startRange.startOffset); - r.setEnd(endRange.endContainer, endRange.endOffset); - selection.addRange(r); + + width(w) { + // var frame = this.documentElement; + var frame = this.content; + + if (w && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(w)) { + w = w + "px"; } - return result; + if (w) { + frame.style.width = w; // this.content.style.width = w; + } + + return parseInt(this.window.getComputedStyle(frame)["width"]); } /** - * Walk a node, preforming a function on each node it finds - * @private - * @param {Node} root Node to walkToNode - * @param {function} func walk function - * @return {*} returns the result of the walk function - */ - + * Get or Set height + * @param {number} [h] + * @returns {number} height + */ - walk(root, func) { - // IE11 has strange issue, if root is text node IE throws exception on - // calling treeWalker.nextNode(), saying - // Unexpected call to method or property access instead of returing null value - if (root && root.nodeType === Node.TEXT_NODE) { - return; - } // safeFilter is required so that it can work in IE as filter is a function for IE - // and for other browser filter is an object. + height(h) { + // var frame = this.documentElement; + var frame = this.content; - var filter = { - acceptNode: function (node) { - if (node.data.trim().length > 0) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; - } - } - }; - var safeFilter = filter.acceptNode; - safeFilter.acceptNode = filter.acceptNode; - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, safeFilter, false); - var node; - var result; + if (h && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(h)) { + h = h + "px"; + } - while (node = treeWalker.nextNode()) { - result = func(node); - if (result) break; + if (h) { + frame.style.height = h; // this.content.style.height = h; } - return result; + return parseInt(this.window.getComputedStyle(frame)["height"]); } + /** + * Get or Set width of the contents + * @param {number} [w] + * @returns {number} width + */ - findRanges(view) { - var columns = []; - var scrollWidth = view.contents.scrollWidth(); - var spreads = Math.ceil(scrollWidth / this.layout.spreadWidth); - var count = spreads * this.layout.divisor; - var columnWidth = this.layout.columnWidth; - var gap = this.layout.gap; - var start, end; - for (var i = 0; i < count.pages; i++) { - start = (columnWidth + gap) * i; - end = columnWidth * (i + 1) + gap * i; - columns.push({ - start: this.findStart(view.document.body, start, end), - end: this.findEnd(view.document.body, start, end) - }); + contentWidth(w) { + var content = this.content || this.document.body; + + if (w && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(w)) { + w = w + "px"; } - return columns; + if (w) { + content.style.width = w; + } + + return parseInt(this.window.getComputedStyle(content)["width"]); } /** - * Find Start Range - * @private - * @param {Node} root root node - * @param {number} start position to start at - * @param {number} end position to end at - * @return {Range} - */ + * Get or Set height of the contents + * @param {number} [h] + * @returns {number} height + */ - findStart(root, start, end) { - var stack = [root]; - var $el; - var found; - var $prev = root; + contentHeight(h) { + var content = this.content || this.document.body; - while (stack.length) { - $el = stack.shift(); - found = this.walk($el, node => { - var left, right, top, bottom; - var elPos; - var elRange; - elPos = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["nodeBounds"])(node); + if (h && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(h)) { + h = h + "px"; + } - if (this.horizontal && this.direction === "ltr") { - left = this.horizontal ? elPos.left : elPos.top; - right = this.horizontal ? elPos.right : elPos.bottom; + if (h) { + content.style.height = h; + } - if (left >= start && left <= end) { - return node; - } else if (right > start) { - return node; - } else { - $prev = node; - stack.push(node); - } - } else if (this.horizontal && this.direction === "rtl") { - left = elPos.left; - right = elPos.right; + return parseInt(this.window.getComputedStyle(content)["height"]); + } + /** + * Get the width of the text using Range + * @returns {number} width + */ - if (right <= end && right >= start) { - return node; - } else if (left < end) { - return node; - } else { - $prev = node; - stack.push(node); - } - } else { - top = elPos.top; - bottom = elPos.bottom; - if (top >= start && top <= end) { - return node; - } else if (bottom > start) { - return node; - } else { - $prev = node; - stack.push(node); - } - } - }); + textWidth() { + let rect; + let width; + let range = this.document.createRange(); + let content = this.content || this.document.body; + let border = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["borders"])(content); // Select the contents of frame - if (found) { - return this.findTextStartRange(found, start, end); - } - } // Return last element + range.selectNodeContents(content); // get the width of the text content + rect = range.getBoundingClientRect(); + width = rect.width; - return this.findTextStartRange($prev, start, end); + if (border && border.width) { + width += border.width; + } + + return Math.round(width); } /** - * Find End Range - * @private - * @param {Node} root root node - * @param {number} start position to start at - * @param {number} end position to end at - * @return {Range} - */ + * Get the height of the text using Range + * @returns {number} height + */ - findEnd(root, start, end) { - var stack = [root]; - var $el; - var $prev = root; - var found; - - while (stack.length) { - $el = stack.shift(); - found = this.walk($el, node => { - var left, right, top, bottom; - var elPos; - var elRange; - elPos = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["nodeBounds"])(node); + textHeight() { + let rect; + let height; + let range = this.document.createRange(); + let content = this.content || this.document.body; + range.selectNodeContents(content); + rect = range.getBoundingClientRect(); + height = rect.bottom; + return Math.round(height); + } + /** + * Get documentElement scrollWidth + * @returns {number} width + */ - if (this.horizontal && this.direction === "ltr") { - left = Math.round(elPos.left); - right = Math.round(elPos.right); - if (left > end && $prev) { - return $prev; - } else if (right > end) { - return node; - } else { - $prev = node; - stack.push(node); - } - } else if (this.horizontal && this.direction === "rtl") { - left = Math.round(this.horizontal ? elPos.left : elPos.top); - right = Math.round(this.horizontal ? elPos.right : elPos.bottom); + scrollWidth() { + var width = this.documentElement.scrollWidth; + return width; + } + /** + * Get documentElement scrollHeight + * @returns {number} height + */ - if (right < start && $prev) { - return $prev; - } else if (left < start) { - return node; - } else { - $prev = node; - stack.push(node); - } - } else { - top = Math.round(elPos.top); - bottom = Math.round(elPos.bottom); - if (top > end && $prev) { - return $prev; - } else if (bottom > end) { - return node; - } else { - $prev = node; - stack.push(node); - } - } - }); + scrollHeight() { + var height = this.documentElement.scrollHeight; + return height; + } + /** + * Set overflow css style of the contents + * @param {string} [overflow] + */ - if (found) { - return this.findTextEndRange(found, start, end); - } - } // end of chapter + overflow(overflow) { + if (overflow) { + this.documentElement.style.overflow = overflow; + } - return this.findTextEndRange($prev, start, end); + return this.window.getComputedStyle(this.documentElement)["overflow"]; } /** - * Find Text Start Range - * @private - * @param {Node} root root node - * @param {number} start position to start at - * @param {number} end position to end at - * @return {Range} - */ + * Set overflowX css style of the documentElement + * @param {string} [overflow] + */ - findTextStartRange(node, start, end) { - var ranges = this.splitTextNodeIntoRanges(node); - var range; - var pos; - var left, top, right; + overflowX(overflow) { + if (overflow) { + this.documentElement.style.overflowX = overflow; + } - for (var i = 0; i < ranges.length; i++) { - range = ranges[i]; - pos = range.getBoundingClientRect(); + return this.window.getComputedStyle(this.documentElement)["overflowX"]; + } + /** + * Set overflowY css style of the documentElement + * @param {string} [overflow] + */ - if (this.horizontal && this.direction === "ltr") { - left = pos.left; - if (left >= start) { - return range; - } - } else if (this.horizontal && this.direction === "rtl") { - right = pos.right; + overflowY(overflow) { + if (overflow) { + this.documentElement.style.overflowY = overflow; + } - if (right <= end) { - return range; - } - } else { - top = pos.top; + return this.window.getComputedStyle(this.documentElement)["overflowY"]; + } + /** + * Set Css styles on the contents element (typically Body) + * @param {string} property + * @param {string} value + * @param {boolean} [priority] set as "important" + */ - if (top >= start) { - return range; - } - } // prev = range; + css(property, value, priority) { + var content = this.content || this.document.body; + + if (value) { + content.style.setProperty(property, value, priority ? "important" : ""); + } else { + content.style.removeProperty(property); } - return ranges[0]; + return this.window.getComputedStyle(content)[property]; } /** - * Find Text End Range - * @private - * @param {Node} root root node - * @param {number} start position to start at - * @param {number} end position to end at - * @return {Range} - */ - + * Get or Set the viewport element + * @param {object} [options] + * @param {string} [options.width] + * @param {string} [options.height] + * @param {string} [options.scale] + * @param {string} [options.minimum] + * @param {string} [options.maximum] + * @param {string} [options.scalable] + */ - findTextEndRange(node, start, end) { - var ranges = this.splitTextNodeIntoRanges(node); - var prev; - var range; - var pos; - var left, right, top, bottom; - for (var i = 0; i < ranges.length; i++) { - range = ranges[i]; - pos = range.getBoundingClientRect(); + viewport(options) { + var _width, _height, _scale, _minimum, _maximum, _scalable; // var width, height, scale, minimum, maximum, scalable; - if (this.horizontal && this.direction === "ltr") { - left = pos.left; - right = pos.right; - if (left > end && prev) { - return prev; - } else if (right > end) { - return range; - } - } else if (this.horizontal && this.direction === "rtl") { - left = pos.left; - right = pos.right; + var $viewport = this.document.querySelector("meta[name='viewport']"); + var parsed = { + "width": undefined, + "height": undefined, + "scale": undefined, + "minimum": undefined, + "maximum": undefined, + "scalable": undefined + }; + var newContent = []; + var settings = {}; + /* + * check for the viewport size + * + */ - if (right < start && prev) { - return prev; - } else if (left < start) { - return range; - } - } else { - top = pos.top; - bottom = pos.bottom; + if ($viewport && $viewport.hasAttribute("content")) { + let content = $viewport.getAttribute("content"); - if (top > end && prev) { - return prev; - } else if (bottom > end) { - return range; - } - } + let _width = content.match(/width\s*=\s*([^,]*)/); - prev = range; - } // Ends before limit + let _height = content.match(/height\s*=\s*([^,]*)/); + let _scale = content.match(/initial-scale\s*=\s*([^,]*)/); - return ranges[ranges.length - 1]; - } - /** - * Split up a text node into ranges for each word - * @private - * @param {Node} root root node - * @param {string} [_splitter] what to split on - * @return {Range[]} - */ + let _minimum = content.match(/minimum-scale\s*=\s*([^,]*)/); + let _maximum = content.match(/maximum-scale\s*=\s*([^,]*)/); - splitTextNodeIntoRanges(node, _splitter) { - var ranges = []; - var textContent = node.textContent || ""; - var text = textContent.trim(); - var range; - var doc = node.ownerDocument; - var splitter = _splitter || " "; - var pos = text.indexOf(splitter); + let _scalable = content.match(/user-scalable\s*=\s*([^,]*)/); - if (pos === -1 || node.nodeType != Node.TEXT_NODE) { - range = doc.createRange(); - range.selectNodeContents(node); - return [range]; - } + if (_width && _width.length && typeof _width[1] !== "undefined") { + parsed.width = _width[1]; + } - range = doc.createRange(); - range.setStart(node, 0); - range.setEnd(node, pos); - ranges.push(range); - range = false; + if (_height && _height.length && typeof _height[1] !== "undefined") { + parsed.height = _height[1]; + } - while (pos != -1) { - pos = text.indexOf(splitter, pos + 1); + if (_scale && _scale.length && typeof _scale[1] !== "undefined") { + parsed.scale = _scale[1]; + } - if (pos > 0) { - if (range) { - range.setEnd(node, pos); - ranges.push(range); - } + if (_minimum && _minimum.length && typeof _minimum[1] !== "undefined") { + parsed.minimum = _minimum[1]; + } - range = doc.createRange(); - range.setStart(node, pos + 1); + if (_maximum && _maximum.length && typeof _maximum[1] !== "undefined") { + parsed.maximum = _maximum[1]; + } + + if (_scalable && _scalable.length && typeof _scalable[1] !== "undefined") { + parsed.scalable = _scalable[1]; } } - if (range) { - range.setEnd(node, text.length); - ranges.push(range); + settings = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["defaults"])(options || {}, parsed); + + if (options) { + if (settings.width) { + newContent.push("width=" + settings.width); + } + + if (settings.height) { + newContent.push("height=" + settings.height); + } + + if (settings.scale) { + newContent.push("initial-scale=" + settings.scale); + } + + if (settings.scalable === "no") { + newContent.push("minimum-scale=" + settings.scale); + newContent.push("maximum-scale=" + settings.scale); + newContent.push("user-scalable=" + settings.scalable); + } else { + if (settings.scalable) { + newContent.push("user-scalable=" + settings.scalable); + } + + if (settings.minimum) { + newContent.push("minimum-scale=" + settings.minimum); + } + + if (settings.maximum) { + newContent.push("minimum-scale=" + settings.maximum); + } + } + + if (!$viewport) { + $viewport = this.document.createElement("meta"); + $viewport.setAttribute("name", "viewport"); + this.document.querySelector("head").appendChild($viewport); + } + + $viewport.setAttribute("content", newContent.join(", ")); + this.window.scrollTo(0, 0); } - return ranges; + return settings; } /** - * Turn a pair of ranges into a pair of CFIs + * Event emitter for when the contents has expanded * @private - * @param {string} cfiBase base string for an EpubCFI - * @param {object} rangePair { start: Range, end: Range } - * @return {object} { start: "epubcfi(...)", end: "epubcfi(...)" } */ - rangePairToCfiPair(cfiBase, rangePair) { - var startRange = rangePair.start; - var endRange = rangePair.end; - startRange.collapse(true); - endRange.collapse(false); - let startCfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](startRange, cfiBase).toString(); - let endCfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](endRange, cfiBase).toString(); - return { - start: startCfi, - end: endCfi - }; + expand() { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.EXPAND); } + /** + * Add DOM listeners + * @private + */ - rangeListToCfiList(cfiBase, columns) { - var map = []; - var cifPair; - for (var i = 0; i < columns.length; i++) { - cifPair = this.rangePairToCfiPair(cfiBase, columns[i]); - map.push(cifPair); - } + listeners() { + this.imageLoadListeners(); + this.mediaQueryListeners(); // this.fontLoadListeners(); - return map; + this.addEventListeners(); + this.addSelectionListeners(); // this.transitionListeners(); + + if (typeof ResizeObserver === "undefined") { + this.resizeListeners(); + this.visibilityListeners(); + } else { + this.resizeObservers(); + } // this.mutationObservers(); + + + this.linksHandler(); } /** - * Set the axis for mapping - * @param {string} axis horizontal | vertical - * @return {boolean} is it horizontal? + * Remove DOM listeners + * @private */ - axis(axis) { - if (axis) { - this.horizontal = axis === "horizontal" ? true : false; + removeListeners() { + this.removeEventListeners(); + this.removeSelectionListeners(); + + if (this.observer) { + this.observer.disconnect(); } - return this.horizontal; + clearTimeout(this.expanding); } + /** + * Check if size of contents has changed and + * emit 'resize' event if it has. + * @private + */ -} -/* harmony default export */ __webpack_exports__["a"] = (Mapping); + resizeCheck() { + let width = this.textWidth(); + let height = this.textHeight(); -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { + if (width != this._size.width || height != this._size.height) { + this._size = { + width: width, + height: height + }; + this.onResize && this.onResize(this._size); + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.RESIZE, this._size); + } + } + /** + * Poll for resize detection + * @private + */ -"use strict"; -var fixRegExpWellKnownSymbolLogic = __webpack_require__(87); -var anObject = __webpack_require__(14); -var toObject = __webpack_require__(36); -var toLength = __webpack_require__(46); -var toInteger = __webpack_require__(35); -var requireObjectCoercible = __webpack_require__(33); -var advanceStringIndex = __webpack_require__(100); -var regExpExec = __webpack_require__(101); - -var max = Math.max; -var min = Math.min; -var floor = Math.floor; -var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d\d?|<[^>]*>)/g; -var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d\d?)/g; + resizeListeners() { + var width, height; // Test size again -var maybeToString = function (it) { - return it === undefined ? it : String(it); -}; + clearTimeout(this.expanding); + requestAnimationFrame(this.resizeCheck.bind(this)); + this.expanding = setTimeout(this.resizeListeners.bind(this), 350); + } + /** + * Listen for visibility of tab to change + * @private + */ -// @@replace logic -fixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) { - var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE; - var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0; - var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0'; - - return [ - // `String.prototype.replace` method - // https://tc39.github.io/ecma262/#sec-string.prototype.replace - function replace(searchValue, replaceValue) { - var O = requireObjectCoercible(this); - var replacer = searchValue == undefined ? undefined : searchValue[REPLACE]; - return replacer !== undefined - ? replacer.call(searchValue, O, replaceValue) - : nativeReplace.call(String(O), searchValue, replaceValue); - }, - // `RegExp.prototype[@@replace]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace - function (regexp, replaceValue) { - if ( - (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) || - (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1) - ) { - var res = maybeCallNative(nativeReplace, regexp, this, replaceValue); - if (res.done) return res.value; - } - - var rx = anObject(regexp); - var S = String(this); - - var functionalReplace = typeof replaceValue === 'function'; - if (!functionalReplace) replaceValue = String(replaceValue); - - var global = rx.global; - if (global) { - var fullUnicode = rx.unicode; - rx.lastIndex = 0; - } - var results = []; - while (true) { - var result = regExpExec(rx, S); - if (result === null) break; - - results.push(result); - if (!global) break; - - var matchStr = String(result[0]); - if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); - } - - var accumulatedResult = ''; - var nextSourcePosition = 0; - for (var i = 0; i < results.length; i++) { - result = results[i]; - - var matched = String(result[0]); - var position = max(min(toInteger(result.index), S.length), 0); - var captures = []; - // NOTE: This is equivalent to - // captures = result.slice(1).map(maybeToString) - // but for some reason `nativeSlice.call(result, 1, result.length)` (called in - // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and - // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. - for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); - var namedCaptures = result.groups; - if (functionalReplace) { - var replacerArgs = [matched].concat(captures, position, S); - if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); - var replacement = String(replaceValue.apply(undefined, replacerArgs)); - } else { - replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); - } - if (position >= nextSourcePosition) { - accumulatedResult += S.slice(nextSourcePosition, position) + replacement; - nextSourcePosition = position + matched.length; - } - } - return accumulatedResult + S.slice(nextSourcePosition); - } - ]; - - // https://tc39.github.io/ecma262/#sec-getsubstitution - function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { - var tailPos = position + matched.length; - var m = captures.length; - var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; - if (namedCaptures !== undefined) { - namedCaptures = toObject(namedCaptures); - symbols = SUBSTITUTION_SYMBOLS; - } - return nativeReplace.call(replacement, symbols, function (match, ch) { - var capture; - switch (ch.charAt(0)) { - case '$': return '$'; - case '&': return matched; - case '`': return str.slice(0, position); - case "'": return str.slice(tailPos); - case '<': - capture = namedCaptures[ch.slice(1, -1)]; - break; - default: // \d\d? - var n = +ch; - if (n === 0) return match; - if (n > m) { - var f = floor(n / 10); - if (f === 0) return match; - if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); - return match; - } - capture = captures[n - 1]; + + visibilityListeners() { + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "visible" && this.active === false) { + this.active = true; + this.resizeListeners(); + } else { + this.active = false; + clearTimeout(this.expanding); } - return capture === undefined ? '' : capture; }); } -}); + /** + * Use css transitions to detect resize + * @private + */ -/***/ }), -/* 25 */ -/***/ (function(module, exports) { + transitionListeners() { + let body = this.content; + body.style['transitionProperty'] = "font, font-size, font-size-adjust, font-stretch, font-variation-settings, font-weight, width, height"; + body.style['transitionDuration'] = "0.001ms"; + body.style['transitionTimingFunction'] = "linear"; + body.style['transitionDelay'] = "0"; + this._resizeCheck = this.resizeCheck.bind(this); + this.document.addEventListener('transitionend', this._resizeCheck); + } + /** + * Listen for media query changes and emit 'expand' event + * Adapted from: https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js + * @private + */ -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; + mediaQueryListeners() { + var sheets = this.document.styleSheets; -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { + var mediaChangeHandler = function (m) { + if (m.matches && !this._expanding) { + setTimeout(this.expand.bind(this), 1); + } + }.bind(this); -var NATIVE_WEAK_MAP = __webpack_require__(89); -var global = __webpack_require__(7); -var isObject = __webpack_require__(17); -var createNonEnumerableProperty = __webpack_require__(15); -var objectHas = __webpack_require__(10); -var sharedKey = __webpack_require__(43); -var hiddenKeys = __webpack_require__(44); + for (var i = 0; i < sheets.length; i += 1) { + var rules; // Firefox errors if we access cssRules cross-domain -var WeakMap = global.WeakMap; -var set, get, has; + try { + rules = sheets[i].cssRules; + } catch (e) { + return; + } -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; + if (!rules) return; // Stylesheets changed -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; + for (var j = 0; j < rules.length; j += 1) { + //if (rules[j].constructor === CSSMediaRule) { + if (rules[j].media) { + var mql = this.window.matchMedia(rules[j].media.mediaText); + mql.addListener(mediaChangeHandler); //mql.onchange = mediaChangeHandler; + } + } + } + } + /** + * Use ResizeObserver to listen for changes in the DOM and check for resize + * @private + */ -if (NATIVE_WEAK_MAP) { - var store = new WeakMap(); - var wmget = store.get; - var wmhas = store.has; - var wmset = store.set; - set = function (it, metadata) { - wmset.call(store, it, metadata); - return metadata; - }; - get = function (it) { - return wmget.call(store, it) || {}; - }; - has = function (it) { - return wmhas.call(store, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return objectHas(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return objectHas(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; + resizeObservers() { + // create an observer instance + this.observer = new ResizeObserver(e => { + requestAnimationFrame(this.resizeCheck.bind(this)); + }); // pass in the target node -/***/ }), -/* 27 */ -/***/ (function(module, exports) { + this.observer.observe(this.document.documentElement); + } + /** + * Use MutationObserver to listen for changes in the DOM and check for resize + * @private + */ -module.exports = {}; + mutationObservers() { + // create an observer instance + this.observer = new MutationObserver(mutations => { + this.resizeCheck(); + }); // configuration of the observer: -/***/ }), -/* 28 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + let config = { + attributes: true, + childList: true, + characterData: true, + subtree: true + }; // pass in the target node, as well as the observer options -"use strict"; -/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); -/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(event_emitter__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0); -/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2); -/* harmony import */ var _mapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(23); -/* harmony import */ var _utils_replacements__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12); -/* harmony import */ var _utils_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1); + this.observer.observe(this.document, config); + } + /** + * Test if images are loaded or add listener for when they load + * @private + */ + imageLoadListeners() { + var images = this.document.querySelectorAll("img"); + var img; + for (var i = 0; i < images.length; i++) { + img = images[i]; + if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) { + img.onload = this.expand.bind(this); + } + } + } + /** + * Listen for font load and check for resize when loaded + * @private + */ -const hasNavigator = typeof navigator !== "undefined"; -const isChrome = hasNavigator && /Chrome/.test(navigator.userAgent); -const isWebkit = hasNavigator && !isChrome && /AppleWebKit/.test(navigator.userAgent); -const ELEMENT_NODE = 1; -const TEXT_NODE = 3; -/** - * Handles DOM manipulation, queries and events for View contents - * @class - * @param {document} doc Document - * @param {element} content Parent Element (typically Body) - * @param {string} cfiBase Section component of CFIs - * @param {number} sectionIndex Index in Spine of Conntent's Section - */ + fontLoadListeners() { + if (!this.document || !this.document.fonts) { + return; + } -class Contents { - constructor(doc, content, cfiBase, sectionIndex) { - // Blank Cfi for Parsing - this.epubcfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](); - this.document = doc; - this.documentElement = this.document.documentElement; - this.content = content || this.document.body; - this.window = this.document.defaultView; - this._size = { - width: 0, - height: 0 - }; - this.sectionIndex = sectionIndex || 0; - this.cfiBase = cfiBase || ""; - this.epubReadingSystem("epub.js", _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EPUBJS_VERSION */ "b"]); - this.called = 0; - this.active = true; - this.listeners(); + this.document.fonts.ready.then(function () { + this.resizeCheck(); + }.bind(this)); } /** - * Get DOM events that are listened for and passed along - */ + * Get the documentElement + * @returns {element} documentElement + */ - static get listenedEvents() { - return _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* DOM_EVENTS */ "a"]; + root() { + if (!this.document) return null; + return this.document.documentElement; } /** - * Get or Set width - * @param {number} [w] - * @returns {number} width - */ + * Get the location offset of a EpubCFI or an #id + * @param {string | EpubCFI} target + * @param {string} [ignoreClass] for the cfi + * @returns { {left: Number, top: Number } + */ - width(w) { - // var frame = this.documentElement; - var frame = this.content; + locationOf(target, ignoreClass) { + var position; + var targetPos = { + "left": 0, + "top": 0 + }; + if (!this.document) return targetPos; - if (w && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(w)) { - w = w + "px"; - } + if (this.epubcfi.isCfiString(target)) { + let range = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](target).toRange(this.document, ignoreClass); - if (w) { - frame.style.width = w; // this.content.style.width = w; - } + if (range) { + try { + if (!range.endContainer || range.startContainer == range.endContainer && range.startOffset == range.endOffset) { + // If the end for the range is not set, it results in collapsed becoming + // true. This in turn leads to inconsistent behaviour when calling + // getBoundingRect. Wrong bounds lead to the wrong page being displayed. + // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/15684911/ + let pos = range.startContainer.textContent.indexOf(" ", range.startOffset); - return parseInt(this.window.getComputedStyle(frame)["width"]); - } - /** - * Get or Set height - * @param {number} [h] - * @returns {number} height - */ + if (pos == -1) { + pos = range.startContainer.textContent.length; + } + range.setEnd(range.startContainer, pos); + } + } catch (e) { + console.error("setting end offset to start container length failed", e); + } - height(h) { - // var frame = this.documentElement; - var frame = this.content; + if (range.startContainer.nodeType === Node.ELEMENT_NODE) { + position = range.startContainer.getBoundingClientRect(); + targetPos.left = position.left; + targetPos.top = position.top; + } else { + // Webkit does not handle collapsed range bounds correctly + // https://bugs.webkit.org/show_bug.cgi?id=138949 + // Construct a new non-collapsed range + if (isWebkit) { + let container = range.startContainer; + let newRange = new Range(); - if (h && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(h)) { - h = h + "px"; + try { + if (container.nodeType === ELEMENT_NODE) { + position = container.getBoundingClientRect(); + } else if (range.startOffset + 2 < container.length) { + newRange.setStart(container, range.startOffset); + newRange.setEnd(container, range.startOffset + 2); + position = newRange.getBoundingClientRect(); + } else if (range.startOffset - 2 > 0) { + newRange.setStart(container, range.startOffset - 2); + newRange.setEnd(container, range.startOffset); + position = newRange.getBoundingClientRect(); + } else { + // empty, return the parent element + position = container.parentNode.getBoundingClientRect(); + } + } catch (e) { + console.error(e, e.stack); + } + } else { + position = range.getBoundingClientRect(); + } + } + } + } else if (typeof target === "string" && target.indexOf("#") > -1) { + let id = target.substring(target.indexOf("#") + 1); + let el = this.document.getElementById(id); + + if (el) { + if (isWebkit) { + // Webkit reports incorrect bounding rects in Columns + let newRange = new Range(); + newRange.selectNode(el); + position = newRange.getBoundingClientRect(); + } else { + position = el.getBoundingClientRect(); + } + } } - if (h) { - frame.style.height = h; // this.content.style.height = h; + if (position) { + targetPos.left = position.left; + targetPos.top = position.top; } - return parseInt(this.window.getComputedStyle(frame)["height"]); + return targetPos; } /** - * Get or Set width of the contents - * @param {number} [w] - * @returns {number} width - */ + * Append a stylesheet link to the document head + * @param {string} src url + */ - contentWidth(w) { - var content = this.content || this.document.body; + addStylesheet(src) { + return new Promise(function (resolve, reject) { + var $stylesheet; + var ready = false; - if (w && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(w)) { - w = w + "px"; - } + if (!this.document) { + resolve(false); + return; + } // Check if link already exists - if (w) { - content.style.width = w; - } - return parseInt(this.window.getComputedStyle(content)["width"]); - } - /** - * Get or Set height of the contents - * @param {number} [h] - * @returns {number} height - */ + $stylesheet = this.document.querySelector("link[href='" + src + "']"); + if ($stylesheet) { + resolve(true); + return; // already present + } - contentHeight(h) { - var content = this.content || this.document.body; + $stylesheet = this.document.createElement("link"); + $stylesheet.type = "text/css"; + $stylesheet.rel = "stylesheet"; + $stylesheet.href = src; - if (h && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(h)) { - h = h + "px"; - } + $stylesheet.onload = $stylesheet.onreadystatechange = function () { + if (!ready && (!this.readyState || this.readyState == "complete")) { + ready = true; // Let apply - if (h) { - content.style.height = h; - } + setTimeout(() => { + resolve(true); + }, 1); + } + }; - return parseInt(this.window.getComputedStyle(content)["height"]); + this.document.head.appendChild($stylesheet); + }.bind(this)); } - /** - * Get the width of the text using Range - * @returns {number} width - */ - - textWidth() { - let rect; - let width; - let range = this.document.createRange(); - let content = this.content || this.document.body; - let border = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["borders"])(content); // Select the contents of frame + _getStylesheetNode(key) { + var styleEl; + key = "epubjs-inserted-css-" + (key || ''); + if (!this.document) return false; // Check if link already exists - range.selectNodeContents(content); // get the width of the text content + styleEl = this.document.getElementById(key); - rect = range.getBoundingClientRect(); - width = rect.width; + if (!styleEl) { + styleEl = this.document.createElement("style"); + styleEl.id = key; // Append style element to head - if (border && border.width) { - width += border.width; + this.document.head.appendChild(styleEl); } - return Math.round(width); + return styleEl; } /** - * Get the height of the text using Range - * @returns {number} height - */ + * Append stylesheet css + * @param {string} serializedCss + * @param {string} key If the key is the same, the CSS will be replaced instead of inserted + */ - textHeight() { - let rect; - let height; - let range = this.document.createRange(); - let content = this.content || this.document.body; - range.selectNodeContents(content); - rect = range.getBoundingClientRect(); - height = rect.bottom; - return Math.round(height); + addStylesheetCss(serializedCss, key) { + if (!this.document || !serializedCss) return false; + var styleEl; + styleEl = this._getStylesheetNode(key); + styleEl.innerHTML = serializedCss; + return true; } /** - * Get documentElement scrollWidth - * @returns {number} width - */ + * Append stylesheet rules to a generate stylesheet + * Array: https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule + * Object: https://github.com/desirable-objects/json-to-css + * @param {array | object} rules + * @param {string} key If the key is the same, the CSS will be replaced instead of inserted + */ - scrollWidth() { - var width = this.documentElement.scrollWidth; - return width; + addStylesheetRules(rules, key) { + var styleSheet; + if (!this.document || !rules || rules.length === 0) return; // Grab style sheet + + styleSheet = this._getStylesheetNode(key).sheet; + + if (Object.prototype.toString.call(rules) === "[object Array]") { + for (var i = 0, rl = rules.length; i < rl; i++) { + var j = 1, + rule = rules[i], + selector = rules[i][0], + propStr = ""; // If the second argument of a rule is an array of arrays, correct our variables. + + if (Object.prototype.toString.call(rule[1][0]) === "[object Array]") { + rule = rule[1]; + j = 0; + } + + for (var pl = rule.length; j < pl; j++) { + var prop = rule[j]; + propStr += prop[0] + ":" + prop[1] + (prop[2] ? " !important" : "") + ";\n"; + } // Insert CSS Rule + + + styleSheet.insertRule(selector + "{" + propStr + "}", styleSheet.cssRules.length); + } + } else { + const selectors = Object.keys(rules); + selectors.forEach(selector => { + const definition = rules[selector]; + + if (Array.isArray(definition)) { + definition.forEach(item => { + const _rules = Object.keys(item); + + const result = _rules.map(rule => { + return `${rule}:${item[rule]}`; + }).join(';'); + + styleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length); + }); + } else { + const _rules = Object.keys(definition); + + const result = _rules.map(rule => { + return `${rule}:${definition[rule]}`; + }).join(';'); + + styleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length); + } + }); + } } /** - * Get documentElement scrollHeight - * @returns {number} height - */ + * Append a script tag to the document head + * @param {string} src url + * @returns {Promise} loaded + */ - scrollHeight() { - var height = this.documentElement.scrollHeight; - return height; + addScript(src) { + return new Promise(function (resolve, reject) { + var $script; + var ready = false; + + if (!this.document) { + resolve(false); + return; + } + + $script = this.document.createElement("script"); + $script.type = "text/javascript"; + $script.async = true; + $script.src = src; + + $script.onload = $script.onreadystatechange = function () { + if (!ready && (!this.readyState || this.readyState == "complete")) { + ready = true; + setTimeout(function () { + resolve(true); + }, 1); + } + }; + + this.document.head.appendChild($script); + }.bind(this)); } /** - * Set overflow css style of the contents - * @param {string} [overflow] - */ + * Add a class to the contents container + * @param {string} className + */ - overflow(overflow) { - if (overflow) { - this.documentElement.style.overflow = overflow; - } + addClass(className) { + var content; + if (!this.document) return; + content = this.content || this.document.body; - return this.window.getComputedStyle(this.documentElement)["overflow"]; + if (content) { + content.classList.add(className); + } } /** - * Set overflowX css style of the documentElement - * @param {string} [overflow] - */ + * Remove a class from the contents container + * @param {string} removeClass + */ - overflowX(overflow) { - if (overflow) { - this.documentElement.style.overflowX = overflow; - } + removeClass(className) { + var content; + if (!this.document) return; + content = this.content || this.document.body; - return this.window.getComputedStyle(this.documentElement)["overflowX"]; + if (content) { + content.classList.remove(className); + } } /** - * Set overflowY css style of the documentElement - * @param {string} [overflow] - */ + * Add DOM event listeners + * @private + */ - overflowY(overflow) { - if (overflow) { - this.documentElement.style.overflowY = overflow; + addEventListeners() { + if (!this.document) { + return; } - return this.window.getComputedStyle(this.documentElement)["overflowY"]; + this._triggerEvent = this.triggerEvent.bind(this); + _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* DOM_EVENTS */ "a"].forEach(function (eventName) { + this.document.addEventListener(eventName, this._triggerEvent, { + passive: true + }); + }, this); } /** - * Set Css styles on the contents element (typically Body) - * @param {string} property - * @param {string} value - * @param {boolean} [priority] set as "important" - */ - + * Remove DOM event listeners + * @private + */ - css(property, value, priority) { - var content = this.content || this.document.body; - if (value) { - content.style.setProperty(property, value, priority ? "important" : ""); - } else { - content.style.removeProperty(property); + removeEventListeners() { + if (!this.document) { + return; } - return this.window.getComputedStyle(content)[property]; + _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* DOM_EVENTS */ "a"].forEach(function (eventName) { + this.document.removeEventListener(eventName, this._triggerEvent, { + passive: true + }); + }, this); + this._triggerEvent = undefined; } /** - * Get or Set the viewport element - * @param {object} [options] - * @param {string} [options.width] - * @param {string} [options.height] - * @param {string} [options.scale] - * @param {string} [options.minimum] - * @param {string} [options.maximum] - * @param {string} [options.scalable] - */ + * Emit passed browser events + * @private + */ - viewport(options) { - var _width, _height, _scale, _minimum, _maximum, _scalable; // var width, height, scale, minimum, maximum, scalable; - - - var $viewport = this.document.querySelector("meta[name='viewport']"); - var parsed = { - "width": undefined, - "height": undefined, - "scale": undefined, - "minimum": undefined, - "maximum": undefined, - "scalable": undefined - }; - var newContent = []; - var settings = {}; - /* - * check for the viewport size - * - */ - - if ($viewport && $viewport.hasAttribute("content")) { - let content = $viewport.getAttribute("content"); - - let _width = content.match(/width\s*=\s*([^,]*)/); - - let _height = content.match(/height\s*=\s*([^,]*)/); - - let _scale = content.match(/initial-scale\s*=\s*([^,]*)/); - - let _minimum = content.match(/minimum-scale\s*=\s*([^,]*)/); - - let _maximum = content.match(/maximum-scale\s*=\s*([^,]*)/); - - let _scalable = content.match(/user-scalable\s*=\s*([^,]*)/); - - if (_width && _width.length && typeof _width[1] !== "undefined") { - parsed.width = _width[1]; - } - - if (_height && _height.length && typeof _height[1] !== "undefined") { - parsed.height = _height[1]; - } - - if (_scale && _scale.length && typeof _scale[1] !== "undefined") { - parsed.scale = _scale[1]; - } - - if (_minimum && _minimum.length && typeof _minimum[1] !== "undefined") { - parsed.minimum = _minimum[1]; - } - - if (_maximum && _maximum.length && typeof _maximum[1] !== "undefined") { - parsed.maximum = _maximum[1]; - } - - if (_scalable && _scalable.length && typeof _scalable[1] !== "undefined") { - parsed.scalable = _scalable[1]; - } - } - - settings = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["defaults"])(options || {}, parsed); - - if (options) { - if (settings.width) { - newContent.push("width=" + settings.width); - } - - if (settings.height) { - newContent.push("height=" + settings.height); - } - - if (settings.scale) { - newContent.push("initial-scale=" + settings.scale); - } - - if (settings.scalable === "no") { - newContent.push("minimum-scale=" + settings.scale); - newContent.push("maximum-scale=" + settings.scale); - newContent.push("user-scalable=" + settings.scalable); - } else { - if (settings.scalable) { - newContent.push("user-scalable=" + settings.scalable); - } - - if (settings.minimum) { - newContent.push("minimum-scale=" + settings.minimum); - } - - if (settings.maximum) { - newContent.push("minimum-scale=" + settings.maximum); - } - } - - if (!$viewport) { - $viewport = this.document.createElement("meta"); - $viewport.setAttribute("name", "viewport"); - this.document.querySelector("head").appendChild($viewport); - } - - $viewport.setAttribute("content", newContent.join(", ")); - this.window.scrollTo(0, 0); - } - - return settings; + triggerEvent(e) { + this.emit(e.type, e); } /** - * Event emitter for when the contents has expanded + * Add listener for text selection * @private */ - expand() { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.EXPAND); + addSelectionListeners() { + if (!this.document) { + return; + } + + this._onSelectionChange = this.onSelectionChange.bind(this); + this.document.addEventListener("selectionchange", this._onSelectionChange, { + passive: true + }); } /** - * Add DOM listeners + * Remove listener for text selection * @private */ - listeners() { - this.imageLoadListeners(); - this.mediaQueryListeners(); // this.fontLoadListeners(); - - this.addEventListeners(); - this.addSelectionListeners(); // this.transitionListeners(); - - if (typeof ResizeObserver === "undefined") { - this.resizeListeners(); - this.visibilityListeners(); - } else { - this.resizeObservers(); - } // this.mutationObservers(); - + removeSelectionListeners() { + if (!this.document) { + return; + } - this.linksHandler(); + this.document.removeEventListener("selectionchange", this._onSelectionChange, { + passive: true + }); + this._onSelectionChange = undefined; } /** - * Remove DOM listeners + * Handle getting text on selection * @private */ - removeListeners() { - this.removeEventListeners(); - this.removeSelectionListeners(); - - if (this.observer) { - this.observer.disconnect(); + onSelectionChange(e) { + if (this.selectionEndTimeout) { + clearTimeout(this.selectionEndTimeout); } - clearTimeout(this.expanding); + this.selectionEndTimeout = setTimeout(function () { + var selection = this.window.getSelection(); + this.triggerSelectedEvent(selection); + }.bind(this), 250); } /** - * Check if size of contents has changed and - * emit 'resize' event if it has. + * Emit event on text selection * @private */ - resizeCheck() { - let width = this.textWidth(); - let height = this.textHeight(); + triggerSelectedEvent(selection) { + var range, cfirange; - if (width != this._size.width || height != this._size.height) { - this._size = { - width: width, - height: height - }; - this.onResize && this.onResize(this._size); - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.RESIZE, this._size); + if (selection && selection.rangeCount > 0) { + range = selection.getRangeAt(0); + + if (!range.collapsed) { + // cfirange = this.section.cfiFromRange(range); + cfirange = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](range, this.cfiBase).toString(); + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.SELECTED, cfirange); + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.SELECTED_RANGE, range); + } } } /** - * Poll for resize detection - * @private + * Get a Dom Range from EpubCFI + * @param {EpubCFI} _cfi + * @param {string} [ignoreClass] + * @returns {Range} range */ - resizeListeners() { - var width, height; // Test size again - - clearTimeout(this.expanding); - requestAnimationFrame(this.resizeCheck.bind(this)); - this.expanding = setTimeout(this.resizeListeners.bind(this), 350); + range(_cfi, ignoreClass) { + var cfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](_cfi); + return cfi.toRange(this.document, ignoreClass); } /** - * Listen for visibility of tab to change - * @private + * Get an EpubCFI from a Dom Range + * @param {Range} range + * @param {string} [ignoreClass] + * @returns {EpubCFI} cfi */ - visibilityListeners() { - document.addEventListener("visibilitychange", () => { - if (document.visibilityState === "visible" && this.active === false) { - this.active = true; - this.resizeListeners(); - } else { - this.active = false; - clearTimeout(this.expanding); - } - }); + cfiFromRange(range, ignoreClass) { + return new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](range, this.cfiBase, ignoreClass).toString(); } /** - * Use css transitions to detect resize - * @private + * Get an EpubCFI from a Dom node + * @param {node} node + * @param {string} [ignoreClass] + * @returns {EpubCFI} cfi */ - transitionListeners() { - let body = this.content; - body.style['transitionProperty'] = "font, font-size, font-size-adjust, font-stretch, font-variation-settings, font-weight, width, height"; - body.style['transitionDuration'] = "0.001ms"; - body.style['transitionTimingFunction'] = "linear"; - body.style['transitionDelay'] = "0"; - this._resizeCheck = this.resizeCheck.bind(this); - this.document.addEventListener('transitionend', this._resizeCheck); + cfiFromNode(node, ignoreClass) { + return new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](node, this.cfiBase, ignoreClass).toString(); + } // TODO: find where this is used - remove? + + + map(layout) { + var map = new _mapping__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"](layout); + return map.section(); } /** - * Listen for media query changes and emit 'expand' event - * Adapted from: https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js - * @private + * Size the contents to a given width and height + * @param {number} [width] + * @param {number} [height] */ - mediaQueryListeners() { - var sheets = this.document.styleSheets; + size(width, height) { + var viewport = { + scale: 1.0, + scalable: "no" + }; + this.layoutStyle("scrolling"); - var mediaChangeHandler = function (m) { - if (m.matches && !this._expanding) { - setTimeout(this.expand.bind(this), 1); - } - }.bind(this); - - for (var i = 0; i < sheets.length; i += 1) { - var rules; // Firefox errors if we access cssRules cross-domain - - try { - rules = sheets[i].cssRules; - } catch (e) { - return; - } - - if (!rules) return; // Stylesheets changed + if (width >= 0) { + this.width(width); + viewport.width = width; //this.css("padding", "0 "+(width/12)+"px"); + } - for (var j = 0; j < rules.length; j += 1) { - //if (rules[j].constructor === CSSMediaRule) { - if (rules[j].media) { - var mql = this.window.matchMedia(rules[j].media.mediaText); - mql.addListener(mediaChangeHandler); //mql.onchange = mediaChangeHandler; - } - } + if (height >= 0) { + this.height(height); + viewport.height = height; } + + this.css("margin", "0"); + this.css("box-sizing", "border-box"); + this.viewport(viewport); } /** - * Use ResizeObserver to listen for changes in the DOM and check for resize - * @private + * Apply columns to the contents for pagination + * @param {number} width + * @param {number} height + * @param {number} columnWidth + * @param {number} gap */ - resizeObservers() { - // create an observer instance - this.observer = new ResizeObserver(e => { - requestAnimationFrame(this.resizeCheck.bind(this)); - }); // pass in the target node + columns(width, height, columnWidth, gap, dir) { + let COLUMN_AXIS = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-axis"); + let COLUMN_GAP = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-gap"); + let COLUMN_WIDTH = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-width"); + let COLUMN_FILL = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-fill"); + let writingMode = this.writingMode(); + let axis = writingMode.indexOf("vertical") === 0 ? "vertical" : "horizontal"; + this.layoutStyle("paginated"); - this.observer.observe(this.document.documentElement); + if (dir === "rtl" && axis === "horizontal") { + this.direction(dir); + } + + this.width(width); + this.height(height); // Deal with Mobile trying to scale to viewport + + this.viewport({ + width: width, + height: height, + scale: 1.0, + scalable: "no" + }); // TODO: inline-block needs more testing + // Fixes Safari column cut offs, but causes RTL issues + // this.css("display", "inline-block"); + + this.css("overflow-y", "hidden"); + this.css("margin", "0", true); + + if (axis === "vertical") { + this.css("padding-top", gap / 2 + "px", true); + this.css("padding-bottom", gap / 2 + "px", true); + this.css("padding-left", "20px"); + this.css("padding-right", "20px"); + this.css(COLUMN_AXIS, "vertical"); + } else { + this.css("padding-top", "20px"); + this.css("padding-bottom", "20px"); + this.css("padding-left", gap / 2 + "px", true); + this.css("padding-right", gap / 2 + "px", true); + this.css(COLUMN_AXIS, "horizontal"); + } + + this.css("box-sizing", "border-box"); + this.css("max-width", "inherit"); + this.css(COLUMN_FILL, "auto"); + this.css(COLUMN_GAP, gap + "px"); + this.css(COLUMN_WIDTH, columnWidth + "px"); // Fix glyph clipping in WebKit + // https://github.com/futurepress/epub.js/issues/983 + + this.css("-webkit-line-box-contain", "block glyphs replaced"); } /** - * Use MutationObserver to listen for changes in the DOM and check for resize - * @private + * Scale contents from center + * @param {number} scale + * @param {number} offsetX + * @param {number} offsetY */ - mutationObservers() { - // create an observer instance - this.observer = new MutationObserver(mutations => { - this.resizeCheck(); - }); // configuration of the observer: + scaler(scale, offsetX, offsetY) { + var scaleStr = "scale(" + scale + ")"; + var translateStr = ""; // this.css("position", "absolute")); - let config = { - attributes: true, - childList: true, - characterData: true, - subtree: true - }; // pass in the target node, as well as the observer options + this.css("transform-origin", "top left"); - this.observer.observe(this.document, config); + if (offsetX >= 0 || offsetY >= 0) { + translateStr = " translate(" + (offsetX || 0) + "px, " + (offsetY || 0) + "px )"; + } + + this.css("transform", scaleStr + translateStr); } /** - * Test if images are loaded or add listener for when they load - * @private + * Fit contents into a fixed width and height + * @param {number} width + * @param {number} height */ - imageLoadListeners() { - var images = this.document.querySelectorAll("img"); - var img; + fit(width, height, section) { + var viewport = this.viewport(); + var viewportWidth = parseInt(viewport.width); + var viewportHeight = parseInt(viewport.height); + var widthScale = width / viewportWidth; + var heightScale = height / viewportHeight; + var scale = widthScale < heightScale ? widthScale : heightScale; // the translate does not work as intended, elements can end up unaligned + // var offsetY = (height - (viewportHeight * scale)) / 2; + // var offsetX = 0; + // if (this.sectionIndex % 2 === 1) { + // offsetX = width - (viewportWidth * scale); + // } - for (var i = 0; i < images.length; i++) { - img = images[i]; + this.layoutStyle("paginated"); // scale needs width and height to be set - if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) { - img.onload = this.expand.bind(this); - } + this.width(viewportWidth); + this.height(viewportHeight); + this.overflow("hidden"); // Scale to the correct size + + this.scaler(scale, 0, 0); // this.scaler(scale, offsetX > 0 ? offsetX : 0, offsetY); + // background images are not scaled by transform + + this.css("background-size", viewportWidth * scale + "px " + viewportHeight * scale + "px"); + this.css("background-color", "transparent"); + + if (section && section.properties.includes("page-spread-left")) { + // set margin since scale is weird + var marginLeft = width - viewportWidth * scale; + this.css("margin-left", marginLeft + "px"); } } /** - * Listen for font load and check for resize when loaded - * @private + * Set the direction of the text + * @param {string} [dir="ltr"] "rtl" | "ltr" */ - fontLoadListeners() { - if (!this.document || !this.document.fonts) { - return; + direction(dir) { + if (this.documentElement) { + this.documentElement.style["direction"] = dir; } + } - this.document.fonts.ready.then(function () { - this.resizeCheck(); - }.bind(this)); + mapPage(cfiBase, layout, start, end, dev) { + var mapping = new _mapping__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"](layout, dev); + return mapping.page(this, cfiBase, start, end); } /** - * Get the documentElement - * @returns {element} documentElement + * Emit event when link in content is clicked + * @private */ - root() { - if (!this.document) return null; - return this.document.documentElement; + linksHandler() { + Object(_utils_replacements__WEBPACK_IMPORTED_MODULE_4__[/* replaceLinks */ "c"])(this.content, href => { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.LINK_CLICKED, href); + }); } /** - * Get the location offset of a EpubCFI or an #id - * @param {string | EpubCFI} target - * @param {string} [ignoreClass] for the cfi - * @returns { {left: Number, top: Number } + * Set the writingMode of the text + * @param {string} [mode="horizontal-tb"] "horizontal-tb" | "vertical-rl" | "vertical-lr" */ - locationOf(target, ignoreClass) { - var position; - var targetPos = { - "left": 0, - "top": 0 - }; - if (!this.document) return targetPos; + writingMode(mode) { + let WRITING_MODE = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("writing-mode"); - if (this.epubcfi.isCfiString(target)) { - let range = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](target).toRange(this.document, ignoreClass); + if (mode && this.documentElement) { + this.documentElement.style[WRITING_MODE] = mode; + } - if (range) { - try { - if (!range.endContainer || range.startContainer == range.endContainer && range.startOffset == range.endOffset) { - // If the end for the range is not set, it results in collapsed becoming - // true. This in turn leads to inconsistent behaviour when calling - // getBoundingRect. Wrong bounds lead to the wrong page being displayed. - // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/15684911/ - let pos = range.startContainer.textContent.indexOf(" ", range.startOffset); + return this.window.getComputedStyle(this.documentElement)[WRITING_MODE] || ''; + } + /** + * Set the layoutStyle of the content + * @param {string} [style="paginated"] "scrolling" | "paginated" + * @private + */ - if (pos == -1) { - pos = range.startContainer.textContent.length; - } - range.setEnd(range.startContainer, pos); - } - } catch (e) { - console.error("setting end offset to start container length failed", e); - } + layoutStyle(style) { + if (style) { + this._layoutStyle = style; + navigator.epubReadingSystem.layoutStyle = this._layoutStyle; + } - if (range.startContainer.nodeType === Node.ELEMENT_NODE) { - position = range.startContainer.getBoundingClientRect(); - targetPos.left = position.left; - targetPos.top = position.top; - } else { - // Webkit does not handle collapsed range bounds correctly - // https://bugs.webkit.org/show_bug.cgi?id=138949 - // Construct a new non-collapsed range - if (isWebkit) { - let container = range.startContainer; - let newRange = new Range(); + return this._layoutStyle || "paginated"; + } + /** + * Add the epubReadingSystem object to the navigator + * @param {string} name + * @param {string} version + * @private + */ - try { - if (container.nodeType === ELEMENT_NODE) { - position = container.getBoundingClientRect(); - } else if (range.startOffset + 2 < container.length) { - newRange.setStart(container, range.startOffset); - newRange.setEnd(container, range.startOffset + 2); - position = newRange.getBoundingClientRect(); - } else if (range.startOffset - 2 > 0) { - newRange.setStart(container, range.startOffset - 2); - newRange.setEnd(container, range.startOffset); - position = newRange.getBoundingClientRect(); - } else { - // empty, return the parent element - position = container.parentNode.getBoundingClientRect(); - } - } catch (e) { - console.error(e, e.stack); - } - } else { - position = range.getBoundingClientRect(); - } - } - } - } else if (typeof target === "string" && target.indexOf("#") > -1) { - let id = target.substring(target.indexOf("#") + 1); - let el = this.document.getElementById(id); - - if (el) { - if (isWebkit) { - // Webkit reports incorrect bounding rects in Columns - let newRange = new Range(); - newRange.selectNode(el); - position = newRange.getBoundingClientRect(); - } else { - position = el.getBoundingClientRect(); - } - } - } - - if (position) { - targetPos.left = position.left; - targetPos.top = position.top; - } - return targetPos; - } - /** - * Append a stylesheet link to the document head - * @param {string} src url - */ + epubReadingSystem(name, version) { + navigator.epubReadingSystem = { + name: name, + version: version, + layoutStyle: this.layoutStyle(), + hasFeature: function (feature) { + switch (feature) { + case "dom-manipulation": + return true; + case "layout-changes": + return true; - addStylesheet(src) { - return new Promise(function (resolve, reject) { - var $stylesheet; - var ready = false; + case "touch-events": + return true; - if (!this.document) { - resolve(false); - return; - } // Check if link already exists + case "mouse-events": + return true; + case "keyboard-events": + return true; - $stylesheet = this.document.querySelector("link[href='" + src + "']"); + case "spine-scripting": + return false; - if ($stylesheet) { - resolve(true); - return; // already present + default: + return false; + } } + }; + return navigator.epubReadingSystem; + } - $stylesheet = this.document.createElement("link"); - $stylesheet.type = "text/css"; - $stylesheet.rel = "stylesheet"; - $stylesheet.href = src; + destroy() { + // this.document.removeEventListener('transitionend', this._resizeCheck); + this.removeListeners(); + } - $stylesheet.onload = $stylesheet.onreadystatechange = function () { - if (!ready && (!this.readyState || this.readyState == "complete")) { - ready = true; // Let apply +} - setTimeout(() => { - resolve(true); - }, 1); - } - }; +event_emitter__WEBPACK_IMPORTED_MODULE_0___default()(Contents.prototype); +/* harmony default export */ __webpack_exports__["a"] = (Contents); - this.document.head.appendChild($stylesheet); - }.bind(this)); - } +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { - _getStylesheetNode(key) { - var styleEl; - key = "epubjs-inserted-css-" + (key || ''); - if (!this.document) return false; // Check if link already exists +"use strict"; - styleEl = this.document.getElementById(key); - if (!styleEl) { - styleEl = this.document.createElement("style"); - styleEl.id = key; // Append style element to head +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Underline = exports.Highlight = exports.Mark = exports.Pane = undefined; - this.document.head.appendChild(styleEl); - } +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - return styleEl; - } - /** - * Append stylesheet css - * @param {string} serializedCss - * @param {string} key If the key is the same, the CSS will be replaced instead of inserted - */ +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +var _svg = __webpack_require__(49); - addStylesheetCss(serializedCss, key) { - if (!this.document || !serializedCss) return false; - var styleEl; - styleEl = this._getStylesheetNode(key); - styleEl.innerHTML = serializedCss; - return true; - } - /** - * Append stylesheet rules to a generate stylesheet - * Array: https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule - * Object: https://github.com/desirable-objects/json-to-css - * @param {array | object} rules - * @param {string} key If the key is the same, the CSS will be replaced instead of inserted - */ +var _svg2 = _interopRequireDefault(_svg); +var _events = __webpack_require__(50); - addStylesheetRules(rules, key) { - var styleSheet; - if (!this.document || !rules || rules.length === 0) return; // Grab style sheet +var _events2 = _interopRequireDefault(_events); - styleSheet = this._getStylesheetNode(key).sheet; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - if (Object.prototype.toString.call(rules) === "[object Array]") { - for (var i = 0, rl = rules.length; i < rl; i++) { - var j = 1, - rule = rules[i], - selector = rules[i][0], - propStr = ""; // If the second argument of a rule is an array of arrays, correct our variables. +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - if (Object.prototype.toString.call(rule[1][0]) === "[object Array]") { - rule = rule[1]; - j = 0; - } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - for (var pl = rule.length; j < pl; j++) { - var prop = rule[j]; - propStr += prop[0] + ":" + prop[1] + (prop[2] ? " !important" : "") + ";\n"; - } // Insert CSS Rule +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var Pane = exports.Pane = function () { + function Pane(target) { + var container = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.body; - styleSheet.insertRule(selector + "{" + propStr + "}", styleSheet.cssRules.length); - } - } else { - const selectors = Object.keys(rules); - selectors.forEach(selector => { - const definition = rules[selector]; + _classCallCheck(this, Pane); - if (Array.isArray(definition)) { - definition.forEach(item => { - const _rules = Object.keys(item); + this.target = target; + this.element = _svg2.default.createElement('svg'); + this.marks = []; - const result = _rules.map(rule => { - return `${rule}:${item[rule]}`; - }).join(';'); + // Match the coordinates of the target element + this.element.style.position = 'absolute'; + // Disable pointer events + this.element.setAttribute('pointer-events', 'none'); - styleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length); - }); - } else { - const _rules = Object.keys(definition); + // Set up mouse event proxying between the target element and the marks + _events2.default.proxyMouse(this.target, this.marks); - const result = _rules.map(rule => { - return `${rule}:${definition[rule]}`; - }).join(';'); + this.container = container; + this.container.appendChild(this.element); - styleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length); - } - }); + this.render(); } - } - /** - * Append a script tag to the document head - * @param {string} src url - * @returns {Promise} loaded - */ + _createClass(Pane, [{ + key: 'addMark', + value: function addMark(mark) { + var g = _svg2.default.createElement('g'); + this.element.appendChild(g); + mark.bind(g, this.container); - addScript(src) { - return new Promise(function (resolve, reject) { - var $script; - var ready = false; - - if (!this.document) { - resolve(false); - return; - } - - $script = this.document.createElement("script"); - $script.type = "text/javascript"; - $script.async = true; - $script.src = src; + this.marks.push(mark); - $script.onload = $script.onreadystatechange = function () { - if (!ready && (!this.readyState || this.readyState == "complete")) { - ready = true; - setTimeout(function () { - resolve(true); - }, 1); + mark.render(); + return mark; } - }; - - this.document.head.appendChild($script); - }.bind(this)); - } - /** - * Add a class to the contents container - * @param {string} className - */ - - - addClass(className) { - var content; - if (!this.document) return; - content = this.content || this.document.body; + }, { + key: 'removeMark', + value: function removeMark(mark) { + var idx = this.marks.indexOf(mark); + if (idx === -1) { + return; + } + var el = mark.unbind(); + this.element.removeChild(el); + this.marks.splice(idx, 1); + } + }, { + key: 'render', + value: function render() { + setCoords(this.element, coords(this.target, this.container)); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; - if (content) { - content.classList.add(className); - } - } - /** - * Remove a class from the contents container - * @param {string} removeClass - */ + try { + for (var _iterator = this.marks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var m = _step.value; + + m.render(); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + }]); + return Pane; +}(); - removeClass(className) { - var content; - if (!this.document) return; - content = this.content || this.document.body; +var Mark = exports.Mark = function () { + function Mark() { + _classCallCheck(this, Mark); - if (content) { - content.classList.remove(className); + this.element = null; } - } - /** - * Add DOM event listeners - * @private - */ + _createClass(Mark, [{ + key: 'bind', + value: function bind(element, container) { + this.element = element; + this.container = container; + } + }, { + key: 'unbind', + value: function unbind() { + var el = this.element; + this.element = null; + return el; + } + }, { + key: 'render', + value: function render() {} + }, { + key: 'dispatchEvent', + value: function dispatchEvent(e) { + if (!this.element) return; + this.element.dispatchEvent(e); + } + }, { + key: 'getBoundingClientRect', + value: function getBoundingClientRect() { + return this.element.getBoundingClientRect(); + } + }, { + key: 'getClientRects', + value: function getClientRects() { + var rects = []; + var el = this.element.firstChild; + while (el) { + rects.push(el.getBoundingClientRect()); + el = el.nextSibling; + } + return rects; + } + }, { + key: 'filteredRanges', + value: function filteredRanges() { + var rects = Array.from(this.range.getClientRects()); - addEventListeners() { - if (!this.document) { - return; - } + // De-duplicate the boxes + return rects.filter(function (box) { + for (var i = 0; i < rects.length; i++) { + if (rects[i] === box) { + return true; + } + var contained = contains(rects[i], box); + if (contained) { + return false; + } + } + return true; + }); + } + }]); - this._triggerEvent = this.triggerEvent.bind(this); - _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* DOM_EVENTS */ "a"].forEach(function (eventName) { - this.document.addEventListener(eventName, this._triggerEvent, { - passive: true - }); - }, this); - } - /** - * Remove DOM event listeners - * @private - */ + return Mark; +}(); + +var Highlight = exports.Highlight = function (_Mark) { + _inherits(Highlight, _Mark); + function Highlight(range, className, data, attributes) { + _classCallCheck(this, Highlight); - removeEventListeners() { - if (!this.document) { - return; + var _this = _possibleConstructorReturn(this, (Highlight.__proto__ || Object.getPrototypeOf(Highlight)).call(this)); + + _this.range = range; + _this.className = className; + _this.data = data || {}; + _this.attributes = attributes || {}; + return _this; } - _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* DOM_EVENTS */ "a"].forEach(function (eventName) { - this.document.removeEventListener(eventName, this._triggerEvent, { - passive: true - }); - }, this); - this._triggerEvent = undefined; - } - /** - * Emit passed browser events - * @private - */ + _createClass(Highlight, [{ + key: 'bind', + value: function bind(element, container) { + _get(Highlight.prototype.__proto__ || Object.getPrototypeOf(Highlight.prototype), 'bind', this).call(this, element, container); + for (var attr in this.data) { + if (this.data.hasOwnProperty(attr)) { + this.element.dataset[attr] = this.data[attr]; + } + } - triggerEvent(e) { - this.emit(e.type, e); - } - /** - * Add listener for text selection - * @private - */ + for (var attr in this.attributes) { + if (this.attributes.hasOwnProperty(attr)) { + this.element.setAttribute(attr, this.attributes[attr]); + } + } + if (this.className) { + this.element.classList.add(this.className); + } + } + }, { + key: 'render', + value: function render() { + // Empty element + while (this.element.firstChild) { + this.element.removeChild(this.element.firstChild); + } - addSelectionListeners() { - if (!this.document) { - return; - } + var docFrag = this.element.ownerDocument.createDocumentFragment(); + var filtered = this.filteredRanges(); + var offset = this.element.getBoundingClientRect(); + var container = this.container.getBoundingClientRect(); - this._onSelectionChange = this.onSelectionChange.bind(this); - this.document.addEventListener("selectionchange", this._onSelectionChange, { - passive: true - }); - } - /** - * Remove listener for text selection - * @private - */ + for (var i = 0, len = filtered.length; i < len; i++) { + var r = filtered[i]; + var el = _svg2.default.createElement('rect'); + el.setAttribute('x', r.left - offset.left + container.left); + el.setAttribute('y', r.top - offset.top + container.top); + el.setAttribute('height', r.height); + el.setAttribute('width', r.width); + docFrag.appendChild(el); + } + this.element.appendChild(docFrag); + } + }]); - removeSelectionListeners() { - if (!this.document) { - return; - } + return Highlight; +}(Mark); - this.document.removeEventListener("selectionchange", this._onSelectionChange, { - passive: true - }); - this._onSelectionChange = undefined; - } - /** - * Handle getting text on selection - * @private - */ +var Underline = exports.Underline = function (_Highlight) { + _inherits(Underline, _Highlight); + function Underline(range, className, data, attributes) { + _classCallCheck(this, Underline); - onSelectionChange(e) { - if (this.selectionEndTimeout) { - clearTimeout(this.selectionEndTimeout); + return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).call(this, range, className, data, attributes)); } - this.selectionEndTimeout = setTimeout(function () { - var selection = this.window.getSelection(); - this.triggerSelectedEvent(selection); - }.bind(this), 250); - } - /** - * Emit event on text selection - * @private - */ - - - triggerSelectedEvent(selection) { - var range, cfirange; - - if (selection && selection.rangeCount > 0) { - range = selection.getRangeAt(0); + _createClass(Underline, [{ + key: 'render', + value: function render() { + // Empty element + while (this.element.firstChild) { + this.element.removeChild(this.element.firstChild); + } - if (!range.collapsed) { - // cfirange = this.section.cfiFromRange(range); - cfirange = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](range, this.cfiBase).toString(); - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.SELECTED, cfirange); - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.SELECTED_RANGE, range); - } - } - } - /** - * Get a Dom Range from EpubCFI - * @param {EpubCFI} _cfi - * @param {string} [ignoreClass] - * @returns {Range} range - */ + var docFrag = this.element.ownerDocument.createDocumentFragment(); + var filtered = this.filteredRanges(); + var offset = this.element.getBoundingClientRect(); + var container = this.container.getBoundingClientRect(); + for (var i = 0, len = filtered.length; i < len; i++) { + var r = filtered[i]; - range(_cfi, ignoreClass) { - var cfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](_cfi); - return cfi.toRange(this.document, ignoreClass); - } - /** - * Get an EpubCFI from a Dom Range - * @param {Range} range - * @param {string} [ignoreClass] - * @returns {EpubCFI} cfi - */ + var rect = _svg2.default.createElement('rect'); + rect.setAttribute('x', r.left - offset.left + container.left); + rect.setAttribute('y', r.top - offset.top + container.top); + rect.setAttribute('height', r.height); + rect.setAttribute('width', r.width); + rect.setAttribute('fill', 'none'); + var line = _svg2.default.createElement('line'); + line.setAttribute('x1', r.left - offset.left + container.left); + line.setAttribute('x2', r.left - offset.left + container.left + r.width); + line.setAttribute('y1', r.top - offset.top + container.top + r.height - 1); + line.setAttribute('y2', r.top - offset.top + container.top + r.height - 1); - cfiFromRange(range, ignoreClass) { - return new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](range, this.cfiBase, ignoreClass).toString(); - } - /** - * Get an EpubCFI from a Dom node - * @param {node} node - * @param {string} [ignoreClass] - * @returns {EpubCFI} cfi - */ + line.setAttribute('stroke-width', 1); + line.setAttribute('stroke', 'black'); //TODO: match text color? + line.setAttribute('stroke-linecap', 'square'); + docFrag.appendChild(rect); - cfiFromNode(node, ignoreClass) { - return new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](node, this.cfiBase, ignoreClass).toString(); - } // TODO: find where this is used - remove? + docFrag.appendChild(line); + } + this.element.appendChild(docFrag); + } + }]); - map(layout) { - var map = new _mapping__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"](layout); - return map.section(); - } - /** - * Size the contents to a given width and height - * @param {number} [width] - * @param {number} [height] - */ + return Underline; +}(Highlight); +function coords(el, container) { + var offset = container.getBoundingClientRect(); + var rect = el.getBoundingClientRect(); - size(width, height) { - var viewport = { - scale: 1.0, - scalable: "no" + return { + top: rect.top - offset.top, + left: rect.left - offset.left, + height: el.scrollHeight, + width: el.scrollWidth }; - this.layoutStyle("scrolling"); +} - if (width >= 0) { - this.width(width); - viewport.width = width; //this.css("padding", "0 "+(width/12)+"px"); - } +function setCoords(el, coords) { + el.style.setProperty('top', coords.top + 'px', 'important'); + el.style.setProperty('left', coords.left + 'px', 'important'); + el.style.setProperty('height', coords.height + 'px', 'important'); + el.style.setProperty('width', coords.width + 'px', 'important'); +} - if (height >= 0) { - this.height(height); - viewport.height = height; - } +function contains(rect1, rect2) { + return rect2.right <= rect1.right && rect2.left >= rect1.left && rect2.top >= rect1.top && rect2.bottom <= rect1.bottom; +} - this.css("margin", "0"); - this.css("box-sizing", "border-box"); - this.viewport(viewport); - } - /** - * Apply columns to the contents for pagination - * @param {number} width - * @param {number} height - * @param {number} columnWidth - * @param {number} gap - */ +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { - columns(width, height, columnWidth, gap, dir) { - let COLUMN_AXIS = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-axis"); - let COLUMN_GAP = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-gap"); - let COLUMN_WIDTH = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-width"); - let COLUMN_FILL = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("column-fill"); - let writingMode = this.writingMode(); - let axis = writingMode.indexOf("vertical") === 0 ? "vertical" : "horizontal"; - this.layoutStyle("paginated"); +"use strict"; - if (dir === "rtl" && axis === "horizontal") { - this.direction(dir); - } - this.width(width); - this.height(height); // Deal with Mobile trying to scale to viewport +/** + * "Shallow freezes" an object to render it immutable. + * Uses `Object.freeze` if available, + * otherwise the immutability is only in the type. + * + * Is used to create "enum like" objects. + * + * @template T + * @param {T} object the object to freeze + * @param {Pick = Object} oc `Object` by default, + * allows to inject custom object constructor for tests + * @returns {Readonly} + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze + */ +function freeze(object, oc) { + if (oc === undefined) { + oc = Object + } + return oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object +} - this.viewport({ - width: width, - height: height, - scale: 1.0, - scalable: "no" - }); // TODO: inline-block needs more testing - // Fixes Safari column cut offs, but causes RTL issues - // this.css("display", "inline-block"); +/** + * All mime types that are allowed as input to `DOMParser.parseFromString` + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec + * @see DOMParser.prototype.parseFromString + */ +var MIME_TYPE = freeze({ + /** + * `text/html`, the only mime type that triggers treating an XML document as HTML. + * + * @see DOMParser.SupportedType.isHTML + * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration + * @see https://en.wikipedia.org/wiki/HTML Wikipedia + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec + */ + HTML: 'text/html', + + /** + * Helper method to check a mime type if it indicates an HTML document + * + * @param {string} [value] + * @returns {boolean} + * + * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration + * @see https://en.wikipedia.org/wiki/HTML Wikipedia + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring */ + isHTML: function (value) { + return value === MIME_TYPE.HTML + }, + + /** + * `application/xml`, the standard mime type for XML documents. + * + * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration + * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303 + * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia + */ + XML_APPLICATION: 'application/xml', + + /** + * `text/html`, an alias for `application/xml`. + * + * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303 + * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration + * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia + */ + XML_TEXT: 'text/xml', + + /** + * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace, + * but is parsed as an XML document. + * + * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration + * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec + * @see https://en.wikipedia.org/wiki/XHTML Wikipedia + */ + XML_XHTML_APPLICATION: 'application/xhtml+xml', + + /** + * `image/svg+xml`, + * + * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration + * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1 + * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia + */ + XML_SVG_IMAGE: 'image/svg+xml', +}) - this.css("overflow-y", "hidden"); - this.css("margin", "0", true); +/** + * Namespaces that are used in this code base. + * + * @see http://www.w3.org/TR/REC-xml-names + */ +var NAMESPACE = freeze({ + /** + * The XHTML namespace. + * + * @see http://www.w3.org/1999/xhtml + */ + HTML: 'http://www.w3.org/1999/xhtml', + + /** + * Checks if `uri` equals `NAMESPACE.HTML`. + * + * @param {string} [uri] + * + * @see NAMESPACE.HTML + */ + isHTML: function (uri) { + return uri === NAMESPACE.HTML + }, + + /** + * The SVG namespace. + * + * @see http://www.w3.org/2000/svg + */ + SVG: 'http://www.w3.org/2000/svg', + + /** + * The `xml:` namespace. + * + * @see http://www.w3.org/XML/1998/namespace + */ + XML: 'http://www.w3.org/XML/1998/namespace', + + /** + * The `xmlns:` namespace + * + * @see https://www.w3.org/2000/xmlns/ + */ + XMLNS: 'http://www.w3.org/2000/xmlns/', +}) + +exports.freeze = freeze; +exports.MIME_TYPE = MIME_TYPE; +exports.NAMESPACE = NAMESPACE; - if (axis === "vertical") { - this.css("padding-top", gap / 2 + "px", true); - this.css("padding-bottom", gap / 2 + "px", true); - this.css("padding-left", "20px"); - this.css("padding-right", "20px"); - this.css(COLUMN_AXIS, "vertical"); - } else { - this.css("padding-top", "20px"); - this.css("padding-bottom", "20px"); - this.css("padding-left", gap / 2 + "px", true); - this.css("padding-right", gap / 2 + "px", true); - this.css(COLUMN_AXIS, "horizontal"); - } - this.css("box-sizing", "border-box"); - this.css("max-width", "inherit"); - this.css(COLUMN_FILL, "auto"); - this.css(COLUMN_GAP, gap + "px"); - this.css(COLUMN_WIDTH, columnWidth + "px"); // Fix glyph clipping in WebKit - // https://github.com/futurepress/epub.js/issues/983 +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { - this.css("-webkit-line-box-contain", "block glyphs replaced"); - } - /** - * Scale contents from center - * @param {number} scale - * @param {number} offsetX - * @param {number} offsetY - */ +var dom = __webpack_require__(25) +exports.DOMImplementation = dom.DOMImplementation +exports.XMLSerializer = dom.XMLSerializer +exports.DOMParser = __webpack_require__(46).DOMParser - scaler(scale, offsetX, offsetY) { - var scaleStr = "scale(" + scale + ")"; - var translateStr = ""; // this.css("position", "absolute")); +/***/ }), +/* 16 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - this.css("transform-origin", "top left"); +"use strict"; - if (offsetX >= 0 || offsetY >= 0) { - translateStr = " translate(" + (offsetX || 0) + "px, " + (offsetY || 0) + "px )"; - } +// EXTERNAL MODULE: ./node_modules/event-emitter/index.js +var event_emitter = __webpack_require__(3); +var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); - this.css("transform", scaleStr + translateStr); - } - /** - * Fit contents into a fixed width and height - * @param {number} width - * @param {number} height - */ +// EXTERNAL MODULE: ./src/utils/core.js +var core = __webpack_require__(0); +// EXTERNAL MODULE: ./src/utils/hook.js +var hook = __webpack_require__(6); - fit(width, height, section) { - var viewport = this.viewport(); - var viewportWidth = parseInt(viewport.width); - var viewportHeight = parseInt(viewport.height); - var widthScale = width / viewportWidth; - var heightScale = height / viewportHeight; - var scale = widthScale < heightScale ? widthScale : heightScale; // the translate does not work as intended, elements can end up unaligned - // var offsetY = (height - (viewportHeight * scale)) / 2; - // var offsetX = 0; - // if (this.sectionIndex % 2 === 1) { - // offsetX = width - (viewportWidth * scale); - // } +// EXTERNAL MODULE: ./src/epubcfi.js +var src_epubcfi = __webpack_require__(2); - this.layoutStyle("paginated"); // scale needs width and height to be set +// EXTERNAL MODULE: ./src/utils/queue.js +var queue = __webpack_require__(9); - this.width(viewportWidth); - this.height(viewportHeight); - this.overflow("hidden"); // Scale to the correct size +// EXTERNAL MODULE: ./src/utils/constants.js +var constants = __webpack_require__(1); - this.scaler(scale, 0, 0); // this.scaler(scale, offsetX > 0 ? offsetX : 0, offsetY); - // background images are not scaled by transform +// CONCATENATED MODULE: ./src/layout.js - this.css("background-size", viewportWidth * scale + "px " + viewportHeight * scale + "px"); - this.css("background-color", "transparent"); - if (section && section.properties.includes("page-spread-left")) { - // set margin since scale is weird - var marginLeft = width - viewportWidth * scale; - this.css("margin-left", marginLeft + "px"); - } - } - /** - * Set the direction of the text - * @param {string} [dir="ltr"] "rtl" | "ltr" - */ +/** + * Figures out the CSS values to apply for a layout + * @class + * @param {object} settings + * @param {string} [settings.layout='reflowable'] + * @param {string} [settings.spread] + * @param {number} [settings.minSpreadWidth=800] + * @param {boolean} [settings.evenSpreads=false] + * @param {number} [settings.maxSpreadColumns=Infinity] + * @param {number} [settings.gap] width of the gap between columns + */ - direction(dir) { - if (this.documentElement) { - this.documentElement.style["direction"] = dir; +class layout_Layout { + constructor(settings) { + this.settings = settings; + this.name = settings.layout || "reflowable"; + this._spread = settings.spread === "none" ? false : true; + this._minSpreadWidth = settings.minSpreadWidth || 800; + this._evenSpreads = settings.evenSpreads || false; + this._maxSpreadColumns = settings.maxSpreadColumns || Infinity; + this._gap = settings.gap || 0; + + if (settings.flow === "scrolled" || settings.flow === "scrolled-continuous" || settings.flow === "scrolled-doc") { + this._flow = "scrolled"; + } else { + this._flow = "paginated"; } - } - mapPage(cfiBase, layout, start, end, dev) { - var mapping = new _mapping__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"](layout, dev); - return mapping.page(this, cfiBase, start, end); + this.width = 0; + this.height = 0; + this.spreadWidth = 0; + this.delta = 0; + this.columnWidth = 0; + this.gap = 0; + this.divisor = 1; + this.props = { + name: this.name, + spread: this._spread, + flow: this._flow, + width: 0, + height: 0, + spreadWidth: 0, + delta: 0, + columnWidth: 0, + gap: 0, + divisor: 1 + }; } /** - * Emit event when link in content is clicked - * @private + * Switch the flow between paginated and scrolled + * @param {string} flow paginated | scrolled + * @return {string} simplified flow */ - linksHandler() { - Object(_utils_replacements__WEBPACK_IMPORTED_MODULE_4__[/* replaceLinks */ "c"])(this.content, href => { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EVENTS */ "c"].CONTENTS.LINK_CLICKED, href); - }); - } - /** - * Set the writingMode of the text - * @param {string} [mode="horizontal-tb"] "horizontal-tb" | "vertical-rl" | "vertical-lr" - */ - + flow(flow) { + if (typeof flow != "undefined") { + if (flow === "scrolled" || flow === "scrolled-continuous" || flow === "scrolled-doc") { + this._flow = "scrolled"; + } else { + this._flow = "paginated"; + } // this.props.flow = this._flow; - writingMode(mode) { - let WRITING_MODE = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["prefixed"])("writing-mode"); - if (mode && this.documentElement) { - this.documentElement.style[WRITING_MODE] = mode; + this.update({ + flow: this._flow + }); } - return this.window.getComputedStyle(this.documentElement)[WRITING_MODE] || ''; + return this._flow; } /** - * Set the layoutStyle of the content - * @param {string} [style="paginated"] "scrolling" | "paginated" - * @private + * Switch between using spreads or not, and set the + * width at which they switch to single. + * @param {string} spread "none" | "always" | "auto" + * @param {number} min integer in pixels + * @return {boolean} spread true | false */ - layoutStyle(style) { - if (style) { - this._layoutStyle = style; - navigator.epubReadingSystem.layoutStyle = this._layoutStyle; + spread(spread, min) { + if (spread) { + this._spread = spread === "none" ? false : true; // this.props.spread = this._spread; + + this.update({ + spread: this._spread + }); } - return this._layoutStyle || "paginated"; + if (min >= 0) { + this._minSpreadWidth = min; + } + + return this._spread; } /** - * Add the epubReadingSystem object to the navigator - * @param {string} name - * @param {string} version - * @private + * Calculate the dimensions of the pagination + * @param {number} _width width of the rendering + * @param {number} _height height of the rendering */ - epubReadingSystem(name, version) { - navigator.epubReadingSystem = { - name: name, - version: version, - layoutStyle: this.layoutStyle(), - hasFeature: function (feature) { - switch (feature) { - case "dom-manipulation": - return true; - - case "layout-changes": - return true; - - case "touch-events": - return true; - - case "mouse-events": - return true; + calculate(_width, _height) { + var divisor = 1; + var gap = this._gap % 2 ? this._gap - 1 : this._gap; //-- Check the width and create even width columns + // var fullWidth = Math.floor(_width); - case "keyboard-events": - return true; + var width = _width; + var height = _height; + var columnWidth; + var spreadWidth; + var pageWidth; + var delta; - case "spine-scripting": - return false; + if (this._spread) { + divisor = Math.min(this._maxSpreadColumns, Math.floor(width / (this._minSpreadWidth / 2))); - default: - return false; - } + if (this._evenSpreads && divisor % 2) { + divisor = Math.max(1, divisor - 1); } - }; - return navigator.epubReadingSystem; - } + } - destroy() { - // this.document.removeEventListener('transitionend', this._resizeCheck); - this.removeListeners(); - } + if (this.name === "pre-paginated") { + gap = 0; + } //-- Double Page -} -event_emitter__WEBPACK_IMPORTED_MODULE_0___default()(Contents.prototype); -/* harmony default export */ __webpack_exports__["a"] = (Contents); + if (divisor > 1) { + // width = width - gap; + // columnWidth = (width - gap) / divisor; + // gap = gap / divisor; + columnWidth = width / divisor - gap; + pageWidth = columnWidth + gap; + } else { + columnWidth = width; + pageWidth = width; + } -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.name === "pre-paginated" && divisor > 1) { + width = columnWidth; + } -"use strict"; + spreadWidth = columnWidth * divisor + gap; + delta = width; + this.width = width; + this.height = height; + this.spreadWidth = spreadWidth; + this.pageWidth = pageWidth; + this.delta = delta; + this.columnWidth = columnWidth; + this.gap = gap; + this.divisor = divisor; // this.props.width = width; + // this.props.height = _height; + // this.props.spreadWidth = spreadWidth; + // this.props.pageWidth = pageWidth; + // this.props.delta = delta; + // + // this.props.columnWidth = colWidth; + // this.props.gap = gap; + // this.props.divisor = divisor; + this.update({ + width, + height, + spreadWidth, + pageWidth, + delta, + columnWidth, + gap, + divisor + }); + } + /** + * Apply Css to a Document + * @param {Contents} contents + * @return {Promise} + */ -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Underline = exports.Highlight = exports.Mark = exports.Pane = undefined; -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + format(contents, section, axis) { + var formating; -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + if (this.name === "pre-paginated") { + formating = contents.fit(this.columnWidth, this.height, section); + } else if (this._flow === "paginated") { + formating = contents.columns(this.width, this.height, this.columnWidth, this.gap, this.settings.direction); + } else if (axis && axis === "horizontal") { + formating = contents.size(null, this.height); + } else { + formating = contents.size(this.width, null); + } -var _svg = __webpack_require__(135); + return formating; // might be a promise in some View Managers + } + /** + * Count number of pages + * @param {number} totalLength + * @param {number} pageLength + * @return {{spreads: Number, pages: Number}} + */ -var _svg2 = _interopRequireDefault(_svg); -var _events = __webpack_require__(136); + count(totalLength, pageLength) { + let spreads, pages; -var _events2 = _interopRequireDefault(_events); + if (this.name === "pre-paginated") { + spreads = 1; + pages = 1; + } else if (this._flow === "paginated") { + pageLength = pageLength || this.delta; + spreads = Math.ceil(totalLength / pageLength); + pages = spreads * this.divisor; + } else { + // scrolled + pageLength = pageLength || this.height; + spreads = Math.ceil(totalLength / pageLength); + pages = spreads; + } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + return { + spreads, + pages + }; + } + /** + * Update props that have changed + * @private + * @param {object} props + */ -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + update(props) { + // Remove props that haven't changed + Object.keys(props).forEach(propName => { + if (this.props[propName] === props[propName]) { + delete props[propName]; + } + }); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + if (Object.keys(props).length > 0) { + let newProps = Object(core["extend"])(this.props, props); + this.emit(constants["c" /* EVENTS */].LAYOUT.UPDATED, newProps, props); + } + } -var Pane = exports.Pane = function () { - function Pane(target) { - var container = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.body; +} - _classCallCheck(this, Pane); +event_emitter_default()(layout_Layout.prototype); +/* harmony default export */ var layout = (layout_Layout); +// EXTERNAL MODULE: ./src/utils/url.js +var utils_url = __webpack_require__(5); - this.target = target; - this.element = _svg2.default.createElement('svg'); - this.marks = []; +// CONCATENATED MODULE: ./src/themes.js - // Match the coordinates of the target element - this.element.style.position = 'absolute'; - // Disable pointer events - this.element.setAttribute('pointer-events', 'none'); +/** + * Themes to apply to displayed content + * @class + * @param {Rendition} rendition + */ - // Set up mouse event proxying between the target element and the marks - _events2.default.proxyMouse(this.target, this.marks); +class themes_Themes { + constructor(rendition) { + this.rendition = rendition; + this._themes = { + "default": { + "rules": {}, + "url": "", + "serialized": "" + } + }; + this._overrides = {}; + this._current = "default"; + this._injected = []; + this.rendition.hooks.content.register(this.inject.bind(this)); + this.rendition.hooks.content.register(this.overrides.bind(this)); + } + /** + * Add themes to be used by a rendition + * @param {object | Array | string} + * @example themes.register("light", "http://example.com/light.css") + * @example themes.register("light", { "body": { "color": "purple"}}) + * @example themes.register({ "light" : {...}, "dark" : {...}}) + */ - this.container = container; - this.container.appendChild(this.element); - this.render(); + register() { + if (arguments.length === 0) { + return; } - _createClass(Pane, [{ - key: 'addMark', - value: function addMark(mark) { - var g = _svg2.default.createElement('g'); - this.element.appendChild(g); - mark.bind(g, this.container); + if (arguments.length === 1 && typeof arguments[0] === "object") { + return this.registerThemes(arguments[0]); + } - this.marks.push(mark); + if (arguments.length === 1 && typeof arguments[0] === "string") { + return this.default(arguments[0]); + } - mark.render(); - return mark; - } - }, { - key: 'removeMark', - value: function removeMark(mark) { - var idx = this.marks.indexOf(mark); - if (idx === -1) { - return; - } - var el = mark.unbind(); - this.element.removeChild(el); - this.marks.splice(idx, 1); - } - }, { - key: 'render', - value: function render() { - setCoords(this.element, coords(this.target, this.container)); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; + if (arguments.length === 2 && typeof arguments[1] === "string") { + return this.registerUrl(arguments[0], arguments[1]); + } - try { - for (var _iterator = this.marks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var m = _step.value; + if (arguments.length === 2 && typeof arguments[1] === "object") { + return this.registerRules(arguments[0], arguments[1]); + } + } + /** + * Add a default theme to be used by a rendition + * @param {object | string} theme + * @example themes.register("http://example.com/default.css") + * @example themes.register({ "body": { "color": "purple"}}) + */ - m.render(); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - } - }]); - return Pane; -}(); + default(theme) { + if (!theme) { + return; + } -var Mark = exports.Mark = function () { - function Mark() { - _classCallCheck(this, Mark); + if (typeof theme === "string") { + return this.registerUrl("default", theme); + } - this.element = null; + if (typeof theme === "object") { + return this.registerRules("default", theme); } + } + /** + * Register themes object + * @param {object} themes + */ - _createClass(Mark, [{ - key: 'bind', - value: function bind(element, container) { - this.element = element; - this.container = container; - } - }, { - key: 'unbind', - value: function unbind() { - var el = this.element; - this.element = null; - return el; - } - }, { - key: 'render', - value: function render() {} - }, { - key: 'dispatchEvent', - value: function dispatchEvent(e) { - if (!this.element) return; - this.element.dispatchEvent(e); - } - }, { - key: 'getBoundingClientRect', - value: function getBoundingClientRect() { - return this.element.getBoundingClientRect(); - } - }, { - key: 'getClientRects', - value: function getClientRects() { - var rects = []; - var el = this.element.firstChild; - while (el) { - rects.push(el.getBoundingClientRect()); - el = el.nextSibling; - } - return rects; - } - }, { - key: 'filteredRanges', - value: function filteredRanges() { - var rects = Array.from(this.range.getClientRects()); - // De-duplicate the boxes - return rects.filter(function (box) { - for (var i = 0; i < rects.length; i++) { - if (rects[i] === box) { - return true; - } - var contained = contains(rects[i], box); - if (contained) { - return false; - } - } - return true; - }); + registerThemes(themes) { + for (var theme in themes) { + if (themes.hasOwnProperty(theme)) { + if (typeof themes[theme] === "string") { + this.registerUrl(theme, themes[theme]); + } else { + this.registerRules(theme, themes[theme]); } - }]); - - return Mark; -}(); + } + } + } + /** + * Register a theme by passing its css as string + * @param {string} name + * @param {string} css + */ -var Highlight = exports.Highlight = function (_Mark) { - _inherits(Highlight, _Mark); - function Highlight(range, className, data, attributes) { - _classCallCheck(this, Highlight); - - var _this = _possibleConstructorReturn(this, (Highlight.__proto__ || Object.getPrototypeOf(Highlight)).call(this)); + registerCss(name, css) { + this._themes[name] = { + "serialized": css + }; - _this.range = range; - _this.className = className; - _this.data = data || {}; - _this.attributes = attributes || {}; - return _this; + if (this._injected[name] || name == 'default') { + this.update(name); } + } + /** + * Register a url + * @param {string} name + * @param {string} input + */ - _createClass(Highlight, [{ - key: 'bind', - value: function bind(element, container) { - _get(Highlight.prototype.__proto__ || Object.getPrototypeOf(Highlight.prototype), 'bind', this).call(this, element, container); - - for (var attr in this.data) { - if (this.data.hasOwnProperty(attr)) { - this.element.dataset[attr] = this.data[attr]; - } - } - for (var attr in this.attributes) { - if (this.attributes.hasOwnProperty(attr)) { - this.element.setAttribute(attr, this.attributes[attr]); - } - } + registerUrl(name, input) { + var url = new utils_url["a" /* default */](input); + this._themes[name] = { + "url": url.toString() + }; - if (this.className) { - this.element.classList.add(this.className); - } - } - }, { - key: 'render', - value: function render() { - // Empty element - while (this.element.firstChild) { - this.element.removeChild(this.element.firstChild); - } + if (this._injected[name] || name == 'default') { + this.update(name); + } + } + /** + * Register rule + * @param {string} name + * @param {object} rules + */ - var docFrag = this.element.ownerDocument.createDocumentFragment(); - var filtered = this.filteredRanges(); - var offset = this.element.getBoundingClientRect(); - var container = this.container.getBoundingClientRect(); - for (var i = 0, len = filtered.length; i < len; i++) { - var r = filtered[i]; - var el = _svg2.default.createElement('rect'); - el.setAttribute('x', r.left - offset.left + container.left); - el.setAttribute('y', r.top - offset.top + container.top); - el.setAttribute('height', r.height); - el.setAttribute('width', r.width); - docFrag.appendChild(el); - } + registerRules(name, rules) { + this._themes[name] = { + "rules": rules + }; // TODO: serialize css rules - this.element.appendChild(docFrag); - } - }]); + if (this._injected[name] || name == 'default') { + this.update(name); + } + } + /** + * Select a theme + * @param {string} name + */ - return Highlight; -}(Mark); -var Underline = exports.Underline = function (_Highlight) { - _inherits(Underline, _Highlight); + select(name) { + var prev = this._current; + var contents; + this._current = name; + this.update(name); + contents = this.rendition.getContents(); + contents.forEach(content => { + content.removeClass(prev); + content.addClass(name); + }); + } + /** + * Update a theme + * @param {string} name + */ - function Underline(range, className, data, attributes) { - _classCallCheck(this, Underline); - return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).call(this, range, className, data, attributes)); - } + update(name) { + var contents = this.rendition.getContents(); + contents.forEach(content => { + this.add(name, content); + }); + } + /** + * Inject all themes into contents + * @param {Contents} contents + */ - _createClass(Underline, [{ - key: 'render', - value: function render() { - // Empty element - while (this.element.firstChild) { - this.element.removeChild(this.element.firstChild); - } - var docFrag = this.element.ownerDocument.createDocumentFragment(); - var filtered = this.filteredRanges(); - var offset = this.element.getBoundingClientRect(); - var container = this.container.getBoundingClientRect(); + inject(contents) { + var links = []; + var themes = this._themes; + var theme; - for (var i = 0, len = filtered.length; i < len; i++) { - var r = filtered[i]; + for (var name in themes) { + if (themes.hasOwnProperty(name) && (name === this._current || name === "default")) { + theme = themes[name]; - var rect = _svg2.default.createElement('rect'); - rect.setAttribute('x', r.left - offset.left + container.left); - rect.setAttribute('y', r.top - offset.top + container.top); - rect.setAttribute('height', r.height); - rect.setAttribute('width', r.width); - rect.setAttribute('fill', 'none'); + if (theme.rules && Object.keys(theme.rules).length > 0 || theme.url && links.indexOf(theme.url) === -1) { + this.add(name, contents); + } - var line = _svg2.default.createElement('line'); - line.setAttribute('x1', r.left - offset.left + container.left); - line.setAttribute('x2', r.left - offset.left + container.left + r.width); - line.setAttribute('y1', r.top - offset.top + container.top + r.height - 1); - line.setAttribute('y2', r.top - offset.top + container.top + r.height - 1); + this._injected.push(name); + } + } - line.setAttribute('stroke-width', 1); - line.setAttribute('stroke', 'black'); //TODO: match text color? - line.setAttribute('stroke-linecap', 'square'); + if (this._current != "default") { + contents.addClass(this._current); + } + } + /** + * Add Theme to contents + * @param {string} name + * @param {Contents} contents + */ - docFrag.appendChild(rect); - docFrag.appendChild(line); - } + add(name, contents) { + var theme = this._themes[name]; - this.element.appendChild(docFrag); - } - }]); + if (!theme || !contents) { + return; + } - return Underline; -}(Highlight); + if (theme.url) { + contents.addStylesheet(theme.url); + } else if (theme.serialized) { + contents.addStylesheetCss(theme.serialized, name); + theme.injected = true; + } else if (theme.rules) { + contents.addStylesheetRules(theme.rules, name); + theme.injected = true; + } + } + /** + * Add override + * @param {string} name + * @param {string} value + * @param {boolean} priority + */ -function coords(el, container) { - var offset = container.getBoundingClientRect(); - var rect = el.getBoundingClientRect(); - return { - top: rect.top - offset.top, - left: rect.left - offset.left, - height: el.scrollHeight, - width: el.scrollWidth + override(name, value, priority) { + var contents = this.rendition.getContents(); + this._overrides[name] = { + value: value, + priority: priority === true }; -} + contents.forEach(content => { + content.css(name, this._overrides[name].value, this._overrides[name].priority); + }); + } -function setCoords(el, coords) { - el.style.setProperty('top', coords.top + 'px', 'important'); - el.style.setProperty('left', coords.left + 'px', 'important'); - el.style.setProperty('height', coords.height + 'px', 'important'); - el.style.setProperty('width', coords.width + 'px', 'important'); -} + removeOverride(name) { + var contents = this.rendition.getContents(); + delete this._overrides[name]; + contents.forEach(content => { + content.css(name); + }); + } + /** + * Add all overrides + * @param {Content} content + */ -function contains(rect1, rect2) { - return rect2.right <= rect1.right && rect2.left >= rect1.left && rect2.top >= rect1.top && rect2.bottom <= rect1.bottom; -} + overrides(contents) { + var overrides = this._overrides; -/***/ }), -/* 30 */ -/***/ (function(module, exports) { + for (var rule in overrides) { + if (overrides.hasOwnProperty(rule)) { + contents.css(rule, overrides[rule].value, overrides[rule].priority); + } + } + } + /** + * Adjust the font size of a rendition + * @param {number} size + */ -var g; -// This works in non-strict mode -g = (function() { - return this; -})(); + fontSize(size) { + this.override("font-size", size); + } + /** + * Adjust the font-family of a rendition + * @param {string} f + */ -try { - // This works if eval is allowed (see CSP) - g = g || new Function("return this")(); -} catch (e) { - // This works if the window reference is available - if (typeof window === "object") g = window; -} -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} + font(f) { + this.override("font-family", f, true); + } -module.exports = g; + destroy() { + this.rendition = undefined; + this._themes = undefined; + this._overrides = undefined; + this._current = undefined; + this._injected = undefined; + } +} -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony default export */ var themes = (themes_Themes); +// EXTERNAL MODULE: ./src/contents.js +var src_contents = __webpack_require__(12); -var global = __webpack_require__(7); -var getOwnPropertyDescriptor = __webpack_require__(59).f; -var createNonEnumerableProperty = __webpack_require__(15); -var redefine = __webpack_require__(19); -var setGlobal = __webpack_require__(42); -var copyConstructorProperties = __webpack_require__(90); -var isForced = __webpack_require__(96); +// CONCATENATED MODULE: ./src/annotations.js -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global; - } else if (STATIC) { - target = global[TARGET] || setGlobal(TARGET, {}); - } else { - target = (global[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty === typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(sourceProperty, 'sham', true); - } - // extend global - redefine(target, key, sourceProperty, options); - } -}; -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Handles managing adding & removing Annotations + * @param {Rendition} rendition + * @class + */ -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = __webpack_require__(61); -var requireObjectCoercible = __webpack_require__(33); +class annotations_Annotations { + constructor(rendition) { + this.rendition = rendition; + this.highlights = []; + this.underlines = []; + this.marks = []; + this._annotations = {}; + this._annotationsBySectionIndex = {}; + this.rendition.hooks.render.register(this.inject.bind(this)); + this.rendition.hooks.unloaded.register(this.clear.bind(this)); + } + /** + * Add an annotation to store + * @param {string} type Type of annotation to add: "highlight", "underline", "mark" + * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to + * @param {object} data Data to assign to annotation + * @param {function} [cb] Callback after annotation is added + * @param {string} className CSS class to assign to annotation + * @param {object} styles CSS styles to assign to annotation + * @returns {Annotation} annotation + */ -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; + add(type, cfiRange, data, cb, className, styles) { + let hash = encodeURI(cfiRange + type); + let cfi = new src_epubcfi["a" /* default */](cfiRange); + let sectionIndex = cfi.spinePos; + let annotation = new annotations_Annotation({ + type, + cfiRange, + data, + sectionIndex, + cb, + className, + styles + }); + this._annotations[hash] = annotation; -/***/ }), -/* 33 */ -/***/ (function(module, exports) { + if (sectionIndex in this._annotationsBySectionIndex) { + this._annotationsBySectionIndex[sectionIndex].push(hash); + } else { + this._annotationsBySectionIndex[sectionIndex] = [hash]; + } -// `RequireObjectCoercible` abstract operation -// https://tc39.github.io/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; + let views = this.rendition.views(); + views.forEach(view => { + if (annotation.sectionIndex === view.index) { + annotation.attach(view); + } + }); + return annotation; + } + /** + * Remove an annotation from store + * @param {EpubCFI} cfiRange EpubCFI range the annotation is attached to + * @param {string} type Type of annotation to add: "highlight", "underline", "mark" + */ -/***/ }), -/* 34 */ -/***/ (function(module, exports) { + remove(cfiRange, type) { + let hash = encodeURI(cfiRange + type); -module.exports = false; + if (hash in this._annotations) { + let annotation = this._annotations[hash]; + if (type && annotation.type !== type) { + return; + } -/***/ }), -/* 35 */ -/***/ (function(module, exports) { + let views = this.rendition.views(); + views.forEach(view => { + this._removeFromAnnotationBySectionIndex(annotation.sectionIndex, hash); -var ceil = Math.ceil; -var floor = Math.floor; + if (annotation.sectionIndex === view.index) { + annotation.detach(view); + } + }); + delete this._annotations[hash]; + } + } + /** + * Remove an annotations by Section Index + * @private + */ -// `ToInteger` abstract operation -// https://tc39.github.io/ecma262/#sec-tointeger -module.exports = function (argument) { - return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); -}; + _removeFromAnnotationBySectionIndex(sectionIndex, hash) { + this._annotationsBySectionIndex[sectionIndex] = this._annotationsAt(sectionIndex).filter(h => h !== hash); + } + /** + * Get annotations by Section Index + * @private + */ -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { -var requireObjectCoercible = __webpack_require__(33); + _annotationsAt(index) { + return this._annotationsBySectionIndex[index]; + } + /** + * Add a highlight to the store + * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to + * @param {object} data Data to assign to annotation + * @param {function} cb Callback after annotation is clicked + * @param {string} className CSS class to assign to annotation + * @param {object} styles CSS styles to assign to annotation + */ -// `ToObject` abstract operation -// https://tc39.github.io/ecma262/#sec-toobject -module.exports = function (argument) { - return Object(requireObjectCoercible(argument)); -}; + highlight(cfiRange, data, cb, className, styles) { + return this.add("highlight", cfiRange, data, cb, className, styles); + } + /** + * Add a underline to the store + * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to + * @param {object} data Data to assign to annotation + * @param {function} cb Callback after annotation is clicked + * @param {string} className CSS class to assign to annotation + * @param {object} styles CSS styles to assign to annotation + */ -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { -var defineProperty = __webpack_require__(18).f; -var has = __webpack_require__(10); -var wellKnownSymbol = __webpack_require__(8); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -module.exports = function (it, TAG, STATIC) { - if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { - defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + underline(cfiRange, data, cb, className, styles) { + return this.add("underline", cfiRange, data, cb, className, styles); } -}; + /** + * Add a mark to the store + * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to + * @param {object} data Data to assign to annotation + * @param {function} cb Callback after annotation is clicked + */ -/***/ }), -/* 38 */ -/***/ (function(module, exports) { + mark(cfiRange, data, cb) { + return this.add("mark", cfiRange, data, cb); + } + /** + * iterate over annotations in the store + */ -module.exports = __WEBPACK_EXTERNAL_MODULE__38__; -/***/ }), -/* 39 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + each() { + return this._annotations.forEach.apply(this._annotations, arguments); + } + /** + * Hook for injecting annotation into a view + * @param {View} view + * @private + */ -"use strict"; -// EXTERNAL MODULE: ./node_modules/event-emitter/index.js -var event_emitter = __webpack_require__(3); -var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); + inject(view) { + let sectionIndex = view.index; -// EXTERNAL MODULE: ./src/utils/core.js -var core = __webpack_require__(0); + if (sectionIndex in this._annotationsBySectionIndex) { + let annotations = this._annotationsBySectionIndex[sectionIndex]; + annotations.forEach(hash => { + let annotation = this._annotations[hash]; + annotation.attach(view); + }); + } + } + /** + * Hook for removing annotation from a view + * @param {View} view + * @private + */ -// EXTERNAL MODULE: ./src/utils/hook.js -var hook = __webpack_require__(6); -// EXTERNAL MODULE: ./src/epubcfi.js -var src_epubcfi = __webpack_require__(2); + clear(view) { + let sectionIndex = view.index; -// EXTERNAL MODULE: ./src/utils/queue.js -var queue = __webpack_require__(21); + if (sectionIndex in this._annotationsBySectionIndex) { + let annotations = this._annotationsBySectionIndex[sectionIndex]; + annotations.forEach(hash => { + let annotation = this._annotations[hash]; + annotation.detach(view); + }); + } + } + /** + * [Not Implemented] Show annotations + * @TODO: needs implementation in View + */ -// EXTERNAL MODULE: ./src/utils/constants.js -var constants = __webpack_require__(1); -// CONCATENATED MODULE: ./src/layout.js + show() {} + /** + * [Not Implemented] Hide annotations + * @TODO: needs implementation in View + */ + hide() {} +} /** - * Figures out the CSS values to apply for a layout + * Annotation object * @class - * @param {object} settings - * @param {string} [settings.layout='reflowable'] - * @param {string} [settings.spread] - * @param {number} [settings.minSpreadWidth=800] - * @param {boolean} [settings.evenSpreads=false] - * @param {number} [settings.maxSpreadColumns=Infinity] - * @param {number} [settings.gap] width of the gap between columns + * @param {object} options + * @param {string} options.type Type of annotation to add: "highlight", "underline", "mark" + * @param {EpubCFI} options.cfiRange EpubCFI range to attach annotation to + * @param {object} options.data Data to assign to annotation + * @param {int} options.sectionIndex Index in the Spine of the Section annotation belongs to + * @param {function} [options.cb] Callback after annotation is clicked + * @param {string} className CSS class to assign to annotation + * @param {object} styles CSS styles to assign to annotation + * @returns {Annotation} annotation */ -class layout_Layout { - constructor(settings) { - this.settings = settings; - this.name = settings.layout || "reflowable"; - this._spread = settings.spread === "none" ? false : true; - this._minSpreadWidth = settings.minSpreadWidth || 800; - this._evenSpreads = settings.evenSpreads || false; - this._maxSpreadColumns = settings.maxSpreadColumns || Infinity; - this._gap = settings.gap || 0; - - if (settings.flow === "scrolled" || settings.flow === "scrolled-continuous" || settings.flow === "scrolled-doc") { - this._flow = "scrolled"; - } else { - this._flow = "paginated"; - } - this.width = 0; - this.height = 0; - this.spreadWidth = 0; - this.delta = 0; - this.columnWidth = 0; - this.gap = 0; - this.divisor = 1; - this.props = { - name: this.name, - spread: this._spread, - flow: this._flow, - width: 0, - height: 0, - spreadWidth: 0, - delta: 0, - columnWidth: 0, - gap: 0, - divisor: 1 - }; +class annotations_Annotation { + constructor({ + type, + cfiRange, + data, + sectionIndex, + cb, + className, + styles + }) { + this.type = type; + this.cfiRange = cfiRange; + this.data = data; + this.sectionIndex = sectionIndex; + this.mark = undefined; + this.cb = cb; + this.className = className; + this.styles = styles; } /** - * Switch the flow between paginated and scrolled - * @param {string} flow paginated | scrolled - * @return {string} simplified flow + * Update stored data + * @param {object} data */ - flow(flow) { - if (typeof flow != "undefined") { - if (flow === "scrolled" || flow === "scrolled-continuous" || flow === "scrolled-doc") { - this._flow = "scrolled"; - } else { - this._flow = "paginated"; - } // this.props.flow = this._flow; + update(data) { + this.data = data; + } + /** + * Add to a view + * @param {View} view + */ - this.update({ - flow: this._flow - }); + attach(view) { + let { + cfiRange, + data, + type, + mark, + cb, + className, + styles + } = this; + let result; + + if (type === "highlight") { + result = view.highlight(cfiRange, data, cb, className, styles); + } else if (type === "underline") { + result = view.underline(cfiRange, data, cb, className, styles); + } else if (type === "mark") { + result = view.mark(cfiRange, data, cb); } - return this._flow; + this.mark = result; + this.emit(constants["c" /* EVENTS */].ANNOTATION.ATTACH, result); + return result; } /** - * Switch between using spreads or not, and set the - * width at which they switch to single. - * @param {string} spread "none" | "always" | "auto" - * @param {number} min integer in pixels - * @return {boolean} spread true | false + * Remove from a view + * @param {View} view */ - spread(spread, min) { - if (spread) { - this._spread = spread === "none" ? false : true; // this.props.spread = this._spread; - - this.update({ - spread: this._spread - }); - } + detach(view) { + let { + cfiRange, + type + } = this; + let result; - if (min >= 0) { - this._minSpreadWidth = min; + if (view) { + if (type === "highlight") { + result = view.unhighlight(cfiRange); + } else if (type === "underline") { + result = view.ununderline(cfiRange); + } else if (type === "mark") { + result = view.unmark(cfiRange); + } } - return this._spread; + this.mark = undefined; + this.emit(constants["c" /* EVENTS */].ANNOTATION.DETACH, result); + return result; } /** - * Calculate the dimensions of the pagination - * @param {number} _width width of the rendering - * @param {number} _height height of the rendering + * [Not Implemented] Get text of an annotation + * @TODO: needs implementation in contents */ - calculate(_width, _height) { - var divisor = 1; - var gap = this._gap % 2 ? this._gap - 1 : this._gap; //-- Check the width and create even width columns - // var fullWidth = Math.floor(_width); + text() {} - var width = _width; - var height = _height; - var columnWidth; - var spreadWidth; - var pageWidth; - var delta; +} - if (this._spread) { - divisor = Math.min(this._maxSpreadColumns, Math.floor(width / (this._minSpreadWidth / 2))); +event_emitter_default()(annotations_Annotation.prototype); +/* harmony default export */ var annotations = (annotations_Annotations); +// EXTERNAL MODULE: ./src/managers/views/iframe.js +var iframe = __webpack_require__(20); - if (this._evenSpreads && divisor % 2) { - divisor = Math.max(1, divisor - 1); - } - } +// EXTERNAL MODULE: ./src/managers/default/index.js + 3 modules +var managers_default = __webpack_require__(10); - if (this.name === "pre-paginated") { - gap = 0; - } //-- Double Page +// EXTERNAL MODULE: ./src/managers/continuous/index.js + 1 modules +var continuous = __webpack_require__(22); +// CONCATENATED MODULE: ./src/rendition.js - if (divisor > 1) { - // width = width - gap; - // columnWidth = (width - gap) / divisor; - // gap = gap / divisor; - columnWidth = width / divisor - gap; - pageWidth = columnWidth + gap; - } else { - columnWidth = width; - pageWidth = width; - } - if (this.name === "pre-paginated" && divisor > 1) { - width = columnWidth; - } - spreadWidth = columnWidth * divisor + gap; - delta = width; - this.width = width; - this.height = height; - this.spreadWidth = spreadWidth; - this.pageWidth = pageWidth; - this.delta = delta; - this.columnWidth = columnWidth; - this.gap = gap; - this.divisor = divisor; // this.props.width = width; - // this.props.height = _height; - // this.props.spreadWidth = spreadWidth; - // this.props.pageWidth = pageWidth; - // this.props.delta = delta; - // - // this.props.columnWidth = colWidth; - // this.props.gap = gap; - // this.props.divisor = divisor; - this.update({ - width, - height, - spreadWidth, - pageWidth, - delta, - columnWidth, - gap, - divisor - }); - } - /** - * Apply Css to a Document - * @param {Contents} contents - * @return {Promise} - */ + // import Mapping from "./mapping"; - format(contents, section, axis) { - var formating; - if (this.name === "pre-paginated") { - formating = contents.fit(this.columnWidth, this.height, section); - } else if (this._flow === "paginated") { - formating = contents.columns(this.width, this.height, this.columnWidth, this.gap, this.settings.direction); - } else if (axis && axis === "horizontal") { - formating = contents.size(null, this.height); - } else { - formating = contents.size(this.width, null); - } - return formating; // might be a promise in some View Managers - } - /** - * Count number of pages - * @param {number} totalLength - * @param {number} pageLength - * @return {{spreads: Number, pages: Number}} - */ + // Default Views - count(totalLength, pageLength) { - let spreads, pages; + // Default View Managers - if (this.name === "pre-paginated") { - spreads = 1; - pages = 1; - } else if (this._flow === "paginated") { - pageLength = pageLength || this.delta; - spreads = Math.ceil(totalLength / pageLength); - pages = spreads * this.divisor; - } else { - // scrolled - pageLength = pageLength || this.height; - spreads = Math.ceil(totalLength / pageLength); - pages = spreads; - } - return { - spreads, - pages - }; - } - /** - * Update props that have changed - * @private - * @param {object} props - */ +/** + * Displays an Epub as a series of Views for each Section. + * Requires Manager and View class to handle specifics of rendering + * the section content. + * @class + * @param {Book} book + * @param {object} [options] + * @param {number} [options.width] + * @param {number} [options.height] + * @param {string} [options.ignoreClass] class for the cfi parser to ignore + * @param {string | function | object} [options.manager='default'] + * @param {string | function} [options.view='iframe'] + * @param {string} [options.layout] layout to force + * @param {string} [options.spread] force spread value + * @param {number} [options.minSpreadWidth] overridden by spread: none (never) / both (always) + * @param {boolean} [settings.evenSpreads=true] whether to force an even number of columns + * @param {number} [settings.maxSpreadColumns=Infinity] max number of columns in the spread + * @param {number} [settings.gap] width of the gap between columns + * @param {string} [options.stylesheet] url of stylesheet to be injected + * @param {boolean} [options.resizeOnOrientationChange] false to disable orientation events + * @param {string} [options.script] url of script to be injected + * @param {boolean | object} [options.snap=false] use snap scrolling + * @param {string} [options.defaultDirection='ltr'] default text direction + * @param {boolean} [options.allowScriptedContent=false] enable running scripts in content + */ - update(props) { - // Remove props that haven't changed - Object.keys(props).forEach(propName => { - if (this.props[propName] === props[propName]) { - delete props[propName]; - } +class rendition_Rendition { + constructor(book, options) { + this.settings = Object(core["extend"])(this.settings || {}, { + width: null, + height: null, + ignoreClass: "", + manager: "default", + view: "iframe", + flow: null, + layout: null, + spread: null, + minSpreadWidth: 800, + evenSpreads: true, + maxSpreadColumns: Infinity, + gap: 60, + stylesheet: null, + resizeOnOrientationChange: true, + script: null, + snap: false, + defaultDirection: "ltr", + allowScriptedContent: false }); + Object(core["extend"])(this.settings, options); - if (Object.keys(props).length > 0) { - let newProps = Object(core["extend"])(this.props, props); - this.emit(constants["c" /* EVENTS */].LAYOUT.UPDATED, newProps, props); + if (typeof this.settings.manager === "object") { + this.manager = this.settings.manager; } - } - -} - -event_emitter_default()(layout_Layout.prototype); -/* harmony default export */ var layout = (layout_Layout); -// EXTERNAL MODULE: ./src/utils/url.js -var utils_url = __webpack_require__(5); - -// CONCATENATED MODULE: ./src/themes.js -/** - * Themes to apply to displayed content - * @class - * @param {Rendition} rendition - */ - -class themes_Themes { - constructor(rendition) { - this.rendition = rendition; - this._themes = { - "default": { - "rules": {}, - "url": "", - "serialized": "" - } - }; - this._overrides = {}; - this._current = "default"; - this._injected = []; - this.rendition.hooks.content.register(this.inject.bind(this)); - this.rendition.hooks.content.register(this.overrides.bind(this)); - } - /** - * Add themes to be used by a rendition - * @param {object | Array | string} - * @example themes.register("light", "http://example.com/light.css") - * @example themes.register("light", { "body": { "color": "purple"}}) - * @example themes.register({ "light" : {...}, "dark" : {...}}) - */ + this.book = book; + /** + * Adds Hook methods to the Rendition prototype + * @member {object} hooks + * @property {Hook} hooks.content + * @memberof Rendition + */ + this.hooks = {}; + this.hooks.display = new hook["a" /* default */](this); + this.hooks.serialize = new hook["a" /* default */](this); + this.hooks.content = new hook["a" /* default */](this); + this.hooks.unloaded = new hook["a" /* default */](this); + this.hooks.layout = new hook["a" /* default */](this); + this.hooks.render = new hook["a" /* default */](this); + this.hooks.show = new hook["a" /* default */](this); + this.hooks.content.register(this.handleLinks.bind(this)); + this.hooks.content.register(this.passEvents.bind(this)); + this.hooks.content.register(this.adjustImages.bind(this)); + this.book.spine.hooks.content.register(this.injectIdentifier.bind(this)); - register() { - if (arguments.length === 0) { - return; + if (this.settings.stylesheet) { + this.book.spine.hooks.content.register(this.injectStylesheet.bind(this)); } - if (arguments.length === 1 && typeof arguments[0] === "object") { - return this.registerThemes(arguments[0]); + if (this.settings.script) { + this.book.spine.hooks.content.register(this.injectScript.bind(this)); } + /** + * @member {Themes} themes + * @memberof Rendition + */ - if (arguments.length === 1 && typeof arguments[0] === "string") { - return this.default(arguments[0]); - } - if (arguments.length === 2 && typeof arguments[1] === "string") { - return this.registerUrl(arguments[0], arguments[1]); - } + this.themes = new themes(this); + /** + * @member {Annotations} annotations + * @memberof Rendition + */ - if (arguments.length === 2 && typeof arguments[1] === "object") { - return this.registerRules(arguments[0], arguments[1]); - } - } - /** - * Add a default theme to be used by a rendition - * @param {object | string} theme - * @example themes.register("http://example.com/default.css") - * @example themes.register({ "body": { "color": "purple"}}) - */ + this.annotations = new annotations(this); + this.epubcfi = new src_epubcfi["a" /* default */](); + this.q = new queue["a" /* default */](this); + /** + * A Rendered Location Range + * @typedef location + * @type {Object} + * @property {object} start + * @property {string} start.index + * @property {string} start.href + * @property {object} start.displayed + * @property {EpubCFI} start.cfi + * @property {number} start.location + * @property {number} start.percentage + * @property {number} start.displayed.page + * @property {number} start.displayed.total + * @property {object} end + * @property {string} end.index + * @property {string} end.href + * @property {object} end.displayed + * @property {EpubCFI} end.cfi + * @property {number} end.location + * @property {number} end.percentage + * @property {number} end.displayed.page + * @property {number} end.displayed.total + * @property {boolean} atStart + * @property {boolean} atEnd + * @memberof Rendition + */ + this.location = undefined; // Hold queue until book is opened - default(theme) { - if (!theme) { - return; - } + this.q.enqueue(this.book.opened); + this.starting = new core["defer"](); + /** + * @member {promise} started returns after the rendition has started + * @memberof Rendition + */ - if (typeof theme === "string") { - return this.registerUrl("default", theme); - } + this.started = this.starting.promise; // Block the queue until rendering is started - if (typeof theme === "object") { - return this.registerRules("default", theme); - } + this.q.enqueue(this.start); } /** - * Register themes object - * @param {object} themes + * Set the manager function + * @param {function} manager */ - registerThemes(themes) { - for (var theme in themes) { - if (themes.hasOwnProperty(theme)) { - if (typeof themes[theme] === "string") { - this.registerUrl(theme, themes[theme]); - } else { - this.registerRules(theme, themes[theme]); - } - } - } + setManager(manager) { + this.manager = manager; } /** - * Register a theme by passing its css as string - * @param {string} name - * @param {string} css + * Require the manager from passed string, or as a class function + * @param {string|object} manager [description] + * @return {method} */ - registerCss(name, css) { - this._themes[name] = { - "serialized": css - }; + requireManager(manager) { + var viewManager; // If manager is a string, try to load from imported managers - if (this._injected[name] || name == 'default') { - this.update(name); + if (typeof manager === "string" && manager === "default") { + viewManager = managers_default["a" /* default */]; + } else if (typeof manager === "string" && manager === "continuous") { + viewManager = continuous["a" /* default */]; + } else { + // otherwise, assume we were passed a class function + viewManager = manager; } + + return viewManager; } /** - * Register a url - * @param {string} name - * @param {string} input + * Require the view from passed string, or as a class function + * @param {string|object} view + * @return {view} */ - registerUrl(name, input) { - var url = new utils_url["a" /* default */](input); - this._themes[name] = { - "url": url.toString() - }; + requireView(view) { + var View; // If view is a string, try to load from imported views, - if (this._injected[name] || name == 'default') { - this.update(name); + if (typeof view == "string" && view === "iframe") { + View = iframe["a" /* default */]; + } else { + // otherwise, assume we were passed a class function + View = view; } - } - /** - * Register rule - * @param {string} name - * @param {object} rules - */ - - - registerRules(name, rules) { - this._themes[name] = { - "rules": rules - }; // TODO: serialize css rules - if (this._injected[name] || name == 'default') { - this.update(name); - } + return View; } /** - * Select a theme - * @param {string} name + * Start the rendering + * @return {Promise} rendering has started */ - select(name) { - var prev = this._current; - var contents; - this._current = name; - this.update(name); - contents = this.rendition.getContents(); - contents.forEach(content => { - content.removeClass(prev); - content.addClass(name); - }); - } - /** - * Update a theme - * @param {string} name - */ - + start() { + if (!this.settings.layout && (this.book.package.metadata.layout === "pre-paginated" || this.book.displayOptions.fixedLayout === "true")) { + this.settings.layout = "pre-paginated"; + } - update(name) { - var contents = this.rendition.getContents(); - contents.forEach(content => { - this.add(name, content); - }); - } - /** - * Inject all themes into contents - * @param {Contents} contents - */ + switch (this.book.package.metadata.spread) { + case 'none': + this.settings.spread = 'none'; + break; + case 'both': + this.settings.spread = true; + break; + } - inject(contents) { - var links = []; - var themes = this._themes; - var theme; + if (!this.manager) { + this.ViewManager = this.requireManager(this.settings.manager); + this.View = this.requireView(this.settings.view); + this.manager = new this.ViewManager({ + view: this.View, + queue: this.q, + request: this.book.load.bind(this.book), + settings: this.settings + }); + } - for (var name in themes) { - if (themes.hasOwnProperty(name) && (name === this._current || name === "default")) { - theme = themes[name]; + this.direction(this.book.package.metadata.direction || this.settings.defaultDirection); // Parse metadata to get layout props - if (theme.rules && Object.keys(theme.rules).length > 0 || theme.url && links.indexOf(theme.url) === -1) { - this.add(name, contents); - } + this.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata); + this.flow(this.settings.globalLayoutProperties.flow); + this.layout(this.settings.globalLayoutProperties); // Listen for displayed views - this._injected.push(name); - } - } + this.manager.on(constants["c" /* EVENTS */].MANAGERS.ADDED, this.afterDisplayed.bind(this)); + this.manager.on(constants["c" /* EVENTS */].MANAGERS.REMOVED, this.afterRemoved.bind(this)); // Listen for resizing - if (this._current != "default") { - contents.addClass(this._current); - } - } - /** - * Add Theme to contents - * @param {string} name - * @param {Contents} contents - */ + this.manager.on(constants["c" /* EVENTS */].MANAGERS.RESIZED, this.onResized.bind(this)); // Listen for rotation + this.manager.on(constants["c" /* EVENTS */].MANAGERS.ORIENTATION_CHANGE, this.onOrientationChange.bind(this)); // Listen for scroll changes - add(name, contents) { - var theme = this._themes[name]; + this.manager.on(constants["c" /* EVENTS */].MANAGERS.SCROLLED, this.reportLocation.bind(this)); + /** + * Emit that rendering has started + * @event started + * @memberof Rendition + */ - if (!theme || !contents) { - return; - } + this.emit(constants["c" /* EVENTS */].RENDITION.STARTED); // Start processing queue - if (theme.url) { - contents.addStylesheet(theme.url); - } else if (theme.serialized) { - contents.addStylesheetCss(theme.serialized, name); - theme.injected = true; - } else if (theme.rules) { - contents.addStylesheetRules(theme.rules, name); - theme.injected = true; - } + this.starting.resolve(); } /** - * Add override - * @param {string} name - * @param {string} value - * @param {boolean} priority + * Call to attach the container to an element in the dom + * Container must be attached before rendering can begin + * @param {element} element to attach to + * @return {Promise} */ - override(name, value, priority) { - var contents = this.rendition.getContents(); - this._overrides[name] = { - value: value, - priority: priority === true - }; - contents.forEach(content => { - content.css(name, this._overrides[name].value, this._overrides[name].priority); - }); - } + attachTo(element) { + return this.q.enqueue(function () { + // Start rendering + this.manager.render(element, { + "width": this.settings.width, + "height": this.settings.height + }); + /** + * Emit that rendering has attached to an element + * @event attached + * @memberof Rendition + */ - removeOverride(name) { - var contents = this.rendition.getContents(); - delete this._overrides[name]; - contents.forEach(content => { - content.css(name); - }); + this.emit(constants["c" /* EVENTS */].RENDITION.ATTACHED); + }.bind(this)); } /** - * Add all overrides - * @param {Content} content + * Display a point in the book + * The request will be added to the rendering Queue, + * so it will wait until book is opened, rendering started + * and all other rendering tasks have finished to be called. + * @param {string} target Url or EpubCFI + * @return {Promise} */ - overrides(contents) { - var overrides = this._overrides; - - for (var rule in overrides) { - if (overrides.hasOwnProperty(rule)) { - contents.css(rule, overrides[rule].value, overrides[rule].priority); - } + display(target) { + if (this.displaying) { + this.displaying.resolve(); } - } - /** - * Adjust the font size of a rendition - * @param {number} size - */ - - fontSize(size) { - this.override("font-size", size); + return this.q.enqueue(this._display, target); } /** - * Adjust the font-family of a rendition - * @param {string} f + * Tells the manager what to display immediately + * @private + * @param {string} target Url or EpubCFI + * @return {Promise} */ - font(f) { - this.override("font-family", f, true); - } - - destroy() { - this.rendition = undefined; - this._themes = undefined; - this._overrides = undefined; - this._current = undefined; - this._injected = undefined; - } - -} + _display(target) { + if (!this.book) { + return; + } -/* harmony default export */ var themes = (themes_Themes); -// EXTERNAL MODULE: ./src/contents.js -var src_contents = __webpack_require__(28); + var isCfiString = this.epubcfi.isCfiString(target); + var displaying = new core["defer"](); + var displayed = displaying.promise; + var section; + var moveTo; + this.displaying = displaying; // Check if this is a book percentage -// CONCATENATED MODULE: ./src/annotations.js + if (this.book.locations.length() && Object(core["isFloat"])(target)) { + target = this.book.locations.cfiFromPercentage(parseFloat(target)); + } + section = this.book.spine.get(target); + if (!section) { + displaying.reject(new Error("No Section Found")); + return displayed; + } -/** - * Handles managing adding & removing Annotations - * @param {Rendition} rendition - * @class - */ + this.manager.display(section, target).then(() => { + displaying.resolve(section); + this.displaying = undefined; + /** + * Emit that a section has been displayed + * @event displayed + * @param {Section} section + * @memberof Rendition + */ -class annotations_Annotations { - constructor(rendition) { - this.rendition = rendition; - this.highlights = []; - this.underlines = []; - this.marks = []; - this._annotations = {}; - this._annotationsBySectionIndex = {}; - this.rendition.hooks.render.register(this.inject.bind(this)); - this.rendition.hooks.unloaded.register(this.clear.bind(this)); + this.emit(constants["c" /* EVENTS */].RENDITION.DISPLAYED, section); + this.reportLocation(); + }, err => { + /** + * Emit that has been an error displaying + * @event displayError + * @param {Section} section + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.DISPLAY_ERROR, err); + }); + return displayed; } + /* + render(view, show) { + // view.onLayout = this.layout.format.bind(this.layout); + view.create(); + // Fit to size of the container, apply padding + this.manager.resizeView(view); + // Render Chain + return view.section.render(this.book.request) + .then(function(contents){ + return view.load(contents); + }.bind(this)) + .then(function(doc){ + return this.hooks.content.trigger(view, this); + }.bind(this)) + .then(function(){ + this.layout.format(view.contents); + return this.hooks.layout.trigger(view, this); + }.bind(this)) + .then(function(){ + return view.display(); + }.bind(this)) + .then(function(){ + return this.hooks.render.trigger(view, this); + }.bind(this)) + .then(function(){ + if(show !== false) { + this.q.enqueue(function(view){ + view.show(); + }, view); + } + // this.map = new Map(view, this.layout); + this.hooks.show.trigger(view, this); + this.trigger("rendered", view.section); + }.bind(this)) + .catch(function(e){ + this.trigger("loaderror", e); + }.bind(this)); + } + */ + /** - * Add an annotation to store - * @param {string} type Type of annotation to add: "highlight", "underline", "mark" - * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to - * @param {object} data Data to assign to annotation - * @param {function} [cb] Callback after annotation is added - * @param {string} className CSS class to assign to annotation - * @param {object} styles CSS styles to assign to annotation - * @returns {Annotation} annotation + * Report what section has been displayed + * @private + * @param {*} view */ - add(type, cfiRange, data, cb, className, styles) { - let hash = encodeURI(cfiRange + type); - let cfi = new src_epubcfi["a" /* default */](cfiRange); - let sectionIndex = cfi.spinePos; - let annotation = new annotations_Annotation({ - type, - cfiRange, - data, - sectionIndex, - cb, - className, - styles - }); - this._annotations[hash] = annotation; - - if (sectionIndex in this._annotationsBySectionIndex) { - this._annotationsBySectionIndex[sectionIndex].push(hash); - } else { - this._annotationsBySectionIndex[sectionIndex] = [hash]; - } - - let views = this.rendition.views(); - views.forEach(view => { - if (annotation.sectionIndex === view.index) { - annotation.attach(view); + afterDisplayed(view) { + view.on(constants["c" /* EVENTS */].VIEWS.MARK_CLICKED, (cfiRange, data) => this.triggerMarkEvent(cfiRange, data, view.contents)); + this.hooks.render.trigger(view, this).then(() => { + if (view.contents) { + this.hooks.content.trigger(view.contents, this).then(() => { + /** + * Emit that a section has been rendered + * @event rendered + * @param {Section} section + * @param {View} view + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.RENDERED, view.section, view); + }); + } else { + this.emit(constants["c" /* EVENTS */].RENDITION.RENDERED, view.section, view); } }); - return annotation; } /** - * Remove an annotation from store - * @param {EpubCFI} cfiRange EpubCFI range the annotation is attached to - * @param {string} type Type of annotation to add: "highlight", "underline", "mark" + * Report what has been removed + * @private + * @param {*} view */ - remove(cfiRange, type) { - let hash = encodeURI(cfiRange + type); - - if (hash in this._annotations) { - let annotation = this._annotations[hash]; - - if (type && annotation.type !== type) { - return; - } - - let views = this.rendition.views(); - views.forEach(view => { - this._removeFromAnnotationBySectionIndex(annotation.sectionIndex, hash); - - if (annotation.sectionIndex === view.index) { - annotation.detach(view); - } - }); - delete this._annotations[hash]; - } + afterRemoved(view) { + this.hooks.unloaded.trigger(view, this).then(() => { + /** + * Emit that a section has been removed + * @event removed + * @param {Section} section + * @param {View} view + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.REMOVED, view.section, view); + }); } /** - * Remove an annotations by Section Index + * Report resize events and display the last seen location * @private */ - _removeFromAnnotationBySectionIndex(sectionIndex, hash) { - this._annotationsBySectionIndex[sectionIndex] = this._annotationsAt(sectionIndex).filter(h => h !== hash); + onResized(size, epubcfi) { + /** + * Emit that the rendition has been resized + * @event resized + * @param {number} width + * @param {height} height + * @param {string} epubcfi (optional) + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.RESIZED, { + width: size.width, + height: size.height + }, epubcfi); + + if (this.location && this.location.start) { + this.display(epubcfi || this.location.start.cfi); + } } /** - * Get annotations by Section Index + * Report orientation events and display the last seen location * @private */ - _annotationsAt(index) { - return this._annotationsBySectionIndex[index]; + onOrientationChange(orientation) { + /** + * Emit that the rendition has been rotated + * @event orientationchange + * @param {string} orientation + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.ORIENTATION_CHANGE, orientation); } /** - * Add a highlight to the store - * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to - * @param {object} data Data to assign to annotation - * @param {function} cb Callback after annotation is clicked - * @param {string} className CSS class to assign to annotation - * @param {object} styles CSS styles to assign to annotation + * Move the Rendition to a specific offset + * Usually you would be better off calling display() + * @param {object} offset */ - highlight(cfiRange, data, cb, className, styles) { - return this.add("highlight", cfiRange, data, cb, className, styles); + moveTo(offset) { + this.manager.moveTo(offset); } /** - * Add a underline to the store - * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to - * @param {object} data Data to assign to annotation - * @param {function} cb Callback after annotation is clicked - * @param {string} className CSS class to assign to annotation - * @param {object} styles CSS styles to assign to annotation + * Trigger a resize of the views + * @param {number} [width] + * @param {number} [height] + * @param {string} [epubcfi] (optional) */ - underline(cfiRange, data, cb, className, styles) { - return this.add("underline", cfiRange, data, cb, className, styles); + resize(width, height, epubcfi) { + if (width) { + this.settings.width = width; + } + + if (height) { + this.settings.height = height; + } + + this.manager.resize(width, height, epubcfi); } /** - * Add a mark to the store - * @param {EpubCFI} cfiRange EpubCFI range to attach annotation to - * @param {object} data Data to assign to annotation - * @param {function} cb Callback after annotation is clicked + * Clear all rendered views */ - mark(cfiRange, data, cb) { - return this.add("mark", cfiRange, data, cb); + clear() { + this.manager.clear(); } /** - * iterate over annotations in the store + * Go to the next "page" in the rendition + * @return {Promise} */ - each() { - return this._annotations.forEach.apply(this._annotations, arguments); + next() { + return this.q.enqueue(this.manager.next.bind(this.manager)).then(this.reportLocation.bind(this)); } /** - * Hook for injecting annotation into a view - * @param {View} view - * @private + * Go to the previous "page" in the rendition + * @return {Promise} */ - inject(view) { - let sectionIndex = view.index; + prev() { + return this.q.enqueue(this.manager.prev.bind(this.manager)).then(this.reportLocation.bind(this)); + } //-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering - if (sectionIndex in this._annotationsBySectionIndex) { - let annotations = this._annotationsBySectionIndex[sectionIndex]; - annotations.forEach(hash => { - let annotation = this._annotations[hash]; - annotation.attach(view); - }); - } - } /** - * Hook for removing annotation from a view - * @param {View} view + * Determine the Layout properties from metadata and settings * @private + * @param {object} metadata + * @return {object} properties */ - clear(view) { - let sectionIndex = view.index; + determineLayoutProperties(metadata) { + var properties; + var layout = this.settings.layout || metadata.layout || "reflowable"; + var spread = this.settings.spread || metadata.spread || "auto"; + var orientation = this.settings.orientation || metadata.orientation || "auto"; + var flow = this.settings.flow || metadata.flow || "auto"; + var viewport = metadata.viewport || ""; + var minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800; + var direction = this.settings.direction || metadata.direction || "ltr"; - if (sectionIndex in this._annotationsBySectionIndex) { - let annotations = this._annotationsBySectionIndex[sectionIndex]; - annotations.forEach(hash => { - let annotation = this._annotations[hash]; - annotation.detach(view); - }); + if ((this.settings.width === 0 || this.settings.width > 0) && (this.settings.height === 0 || this.settings.height > 0)) {// viewport = "width="+this.settings.width+", height="+this.settings.height+""; } + + properties = { + layout: layout, + spread: spread, + orientation: orientation, + flow: flow, + viewport: viewport, + minSpreadWidth: minSpreadWidth, + evenSpreads: this.settings.evenSpreads, + maxSpreadColumns: this.settings.maxSpreadColumns, + gap: this.settings.gap, + direction: direction + }; + return properties; } /** - * [Not Implemented] Show annotations - * @TODO: needs implementation in View + * Adjust the flow of the rendition to paginated or scrolled + * (scrolled-continuous vs scrolled-doc are handled by different view managers) + * @param {string} flow */ - show() {} - /** - * [Not Implemented] Hide annotations - * @TODO: needs implementation in View - */ + flow(flow) { + var _flow = flow; + if (flow === "scrolled" || flow === "scrolled-doc" || flow === "scrolled-continuous") { + _flow = "scrolled"; + } - hide() {} + if (flow === "auto" || flow === "paginated") { + _flow = "paginated"; + } -} -/** - * Annotation object - * @class - * @param {object} options - * @param {string} options.type Type of annotation to add: "highlight", "underline", "mark" - * @param {EpubCFI} options.cfiRange EpubCFI range to attach annotation to - * @param {object} options.data Data to assign to annotation - * @param {int} options.sectionIndex Index in the Spine of the Section annotation belongs to - * @param {function} [options.cb] Callback after annotation is clicked - * @param {string} className CSS class to assign to annotation - * @param {object} styles CSS styles to assign to annotation - * @returns {Annotation} annotation - */ + this.settings.flow = flow; + if (this._layout) { + this._layout.flow(_flow); + } -class annotations_Annotation { - constructor({ - type, - cfiRange, - data, - sectionIndex, - cb, - className, - styles - }) { - this.type = type; - this.cfiRange = cfiRange; - this.data = data; - this.sectionIndex = sectionIndex; - this.mark = undefined; - this.cb = cb; - this.className = className; - this.styles = styles; - } - /** - * Update stored data - * @param {object} data - */ + if (this.manager && this._layout) { + this.manager.applyLayout(this._layout); + } + if (this.manager) { + this.manager.updateFlow(_flow); + } - update(data) { - this.data = data; + if (this.manager && this.manager.isRendered() && this.location) { + this.manager.clear(); + this.display(this.location.start.cfi); + } } /** - * Add to a view - * @param {View} view + * Adjust the layout of the rendition to reflowable or pre-paginated + * @param {object} settings */ - attach(view) { - let { - cfiRange, - data, - type, - mark, - cb, - className, - styles - } = this; - let result; + layout(settings) { + if (settings) { + this._layout = new layout(settings); - if (type === "highlight") { - result = view.highlight(cfiRange, data, cb, className, styles); - } else if (type === "underline") { - result = view.underline(cfiRange, data, cb, className, styles); - } else if (type === "mark") { - result = view.mark(cfiRange, data, cb); + this._layout.spread(settings.spread, this.settings.minSpreadWidth); // this.mapping = new Mapping(this._layout.props); + + + this._layout.on(constants["c" /* EVENTS */].LAYOUT.UPDATED, (props, changed) => { + this.emit(constants["c" /* EVENTS */].RENDITION.LAYOUT, props, changed); + }); } - this.mark = result; - this.emit(constants["c" /* EVENTS */].ANNOTATION.ATTACH, result); - return result; + if (this.manager && this._layout) { + this.manager.applyLayout(this._layout); + } + + return this._layout; } /** - * Remove from a view - * @param {View} view + * Adjust if the rendition uses spreads + * @param {string} spread none | auto (TODO: implement landscape, portrait, both) + * @param {int} [min] min width to use spreads at */ - detach(view) { - let { - cfiRange, - type - } = this; - let result; + spread(spread, min) { + this.settings.spread = spread; - if (view) { - if (type === "highlight") { - result = view.unhighlight(cfiRange); - } else if (type === "underline") { - result = view.ununderline(cfiRange); - } else if (type === "mark") { - result = view.unmark(cfiRange); - } + if (min) { + this.settings.minSpreadWidth = min; } - this.mark = undefined; - this.emit(constants["c" /* EVENTS */].ANNOTATION.DETACH, result); - return result; + if (this._layout) { + this._layout.spread(spread, min); + } + + if (this.manager && this.manager.isRendered()) { + this.manager.updateLayout(); + } } /** - * [Not Implemented] Get text of an annotation - * @TODO: needs implementation in contents + * Adjust the direction of the rendition + * @param {string} dir */ - text() {} - -} - -event_emitter_default()(annotations_Annotation.prototype); -/* harmony default export */ var annotations = (annotations_Annotations); -// EXTERNAL MODULE: ./src/managers/views/iframe.js -var iframe = __webpack_require__(54); - -// EXTERNAL MODULE: ./src/managers/default/index.js + 3 modules -var managers_default = __webpack_require__(22); - -// EXTERNAL MODULE: ./src/managers/continuous/index.js + 1 modules -var continuous = __webpack_require__(56); + direction(dir) { + this.settings.direction = dir || "ltr"; -// CONCATENATED MODULE: ./src/rendition.js + if (this.manager) { + this.manager.direction(this.settings.direction); + } + if (this.manager && this.manager.isRendered() && this.location) { + this.manager.clear(); + this.display(this.location.start.cfi); + } + } + /** + * Report the current location + * @fires relocated + * @fires locationChanged + */ + reportLocation() { + return this.q.enqueue(function reportedLocation() { + requestAnimationFrame(function reportedLocationAfterRAF() { + var location = this.manager.currentLocation(); + if (location && location.then && typeof location.then === "function") { + location.then(function (result) { + let located = this.located(result); - // import Mapping from "./mapping"; + if (!located || !located.start || !located.end) { + return; + } + this.location = located; + this.emit(constants["c" /* EVENTS */].RENDITION.LOCATION_CHANGED, { + index: this.location.start.index, + href: this.location.start.href, + start: this.location.start.cfi, + end: this.location.end.cfi, + percentage: this.location.start.percentage + }); + this.emit(constants["c" /* EVENTS */].RENDITION.RELOCATED, this.location); + }.bind(this)); + } else if (location) { + let located = this.located(location); + if (!located || !located.start || !located.end) { + return; + } + this.location = located; + /** + * @event locationChanged + * @deprecated + * @type {object} + * @property {number} index + * @property {string} href + * @property {EpubCFI} start + * @property {EpubCFI} end + * @property {number} percentage + * @memberof Rendition + */ - // Default Views + this.emit(constants["c" /* EVENTS */].RENDITION.LOCATION_CHANGED, { + index: this.location.start.index, + href: this.location.start.href, + start: this.location.start.cfi, + end: this.location.end.cfi, + percentage: this.location.start.percentage + }); + /** + * @event relocated + * @type {displayedLocation} + * @memberof Rendition + */ - // Default View Managers + this.emit(constants["c" /* EVENTS */].RENDITION.RELOCATED, this.location); + } + }.bind(this)); + }.bind(this)); + } + /** + * Get the Current Location object + * @return {displayedLocation | promise} location (may be a promise) + */ + currentLocation() { + var location = this.manager.currentLocation(); -/** - * Displays an Epub as a series of Views for each Section. - * Requires Manager and View class to handle specifics of rendering - * the section content. - * @class - * @param {Book} book - * @param {object} [options] - * @param {number} [options.width] - * @param {number} [options.height] - * @param {string} [options.ignoreClass] class for the cfi parser to ignore - * @param {string | function | object} [options.manager='default'] - * @param {string | function} [options.view='iframe'] - * @param {string} [options.layout] layout to force - * @param {string} [options.spread] force spread value - * @param {number} [options.minSpreadWidth] overridden by spread: none (never) / both (always) - * @param {boolean} [settings.evenSpreads=true] whether to force an even number of columns - * @param {number} [settings.maxSpreadColumns=Infinity] max number of columns in the spread - * @param {number} [settings.gap] width of the gap between columns - * @param {string} [options.stylesheet] url of stylesheet to be injected - * @param {boolean} [options.resizeOnOrientationChange] false to disable orientation events - * @param {string} [options.script] url of script to be injected - * @param {boolean | object} [options.snap=false] use snap scrolling - */ + if (location && location.then && typeof location.then === "function") { + location.then(function (result) { + let located = this.located(result); + return located; + }.bind(this)); + } else if (location) { + let located = this.located(location); + return located; + } + } + /** + * Creates a Rendition#locationRange from location + * passed by the Manager + * @returns {displayedLocation} + * @private + */ -class rendition_Rendition { - constructor(book, options) { - this.settings = Object(core["extend"])(this.settings || {}, { - width: null, - height: null, - ignoreClass: "", - manager: "default", - view: "iframe", - flow: null, - layout: null, - spread: null, - minSpreadWidth: 800, - evenSpreads: true, - maxSpreadColumns: Infinity, - gap: 60, - stylesheet: null, - resizeOnOrientationChange: true, - script: null, - snap: false, - defaultDirection: "ltr" - }); - Object(core["extend"])(this.settings, options); - if (typeof this.settings.manager === "object") { - this.manager = this.settings.manager; + located(location) { + if (!location.length) { + return {}; } - this.book = book; - /** - * Adds Hook methods to the Rendition prototype - * @member {object} hooks - * @property {Hook} hooks.content - * @memberof Rendition - */ - - this.hooks = {}; - this.hooks.display = new hook["a" /* default */](this); - this.hooks.serialize = new hook["a" /* default */](this); - this.hooks.content = new hook["a" /* default */](this); - this.hooks.unloaded = new hook["a" /* default */](this); - this.hooks.layout = new hook["a" /* default */](this); - this.hooks.render = new hook["a" /* default */](this); - this.hooks.show = new hook["a" /* default */](this); - this.hooks.content.register(this.handleLinks.bind(this)); - this.hooks.content.register(this.passEvents.bind(this)); - this.hooks.content.register(this.adjustImages.bind(this)); - this.book.spine.hooks.content.register(this.injectIdentifier.bind(this)); + let start = location[0]; + let end = location[location.length - 1]; + let located = { + start: { + index: start.index, + href: start.href, + cfi: start.mapping.start, + displayed: { + page: start.pages[0] || 1, + total: start.totalPages + } + }, + end: { + index: end.index, + href: end.href, + cfi: end.mapping.end, + displayed: { + page: end.pages[end.pages.length - 1] || 1, + total: end.totalPages + } + } + }; + let locationStart = this.book.locations.locationFromCfi(start.mapping.start); + let locationEnd = this.book.locations.locationFromCfi(end.mapping.end); - if (this.settings.stylesheet) { - this.book.spine.hooks.content.register(this.injectStylesheet.bind(this)); + if (locationStart != null) { + located.start.location = locationStart; + located.start.percentage = this.book.locations.percentageFromLocation(locationStart); } - if (this.settings.script) { - this.book.spine.hooks.content.register(this.injectScript.bind(this)); + if (locationEnd != null) { + located.end.location = locationEnd; + located.end.percentage = this.book.locations.percentageFromLocation(locationEnd); } - /** - * @member {Themes} themes - * @memberof Rendition - */ - - this.themes = new themes(this); - /** - * @member {Annotations} annotations - * @memberof Rendition - */ + let pageStart = this.book.pageList.pageFromCfi(start.mapping.start); + let pageEnd = this.book.pageList.pageFromCfi(end.mapping.end); - this.annotations = new annotations(this); - this.epubcfi = new src_epubcfi["a" /* default */](); - this.q = new queue["a" /* default */](this); - /** - * A Rendered Location Range - * @typedef location - * @type {Object} - * @property {object} start - * @property {string} start.index - * @property {string} start.href - * @property {object} start.displayed - * @property {EpubCFI} start.cfi - * @property {number} start.location - * @property {number} start.percentage - * @property {number} start.displayed.page - * @property {number} start.displayed.total - * @property {object} end - * @property {string} end.index - * @property {string} end.href - * @property {object} end.displayed - * @property {EpubCFI} end.cfi - * @property {number} end.location - * @property {number} end.percentage - * @property {number} end.displayed.page - * @property {number} end.displayed.total - * @property {boolean} atStart - * @property {boolean} atEnd - * @memberof Rendition - */ + if (pageStart != -1) { + located.start.page = pageStart; + } - this.location = undefined; // Hold queue until book is opened + if (pageEnd != -1) { + located.end.page = pageEnd; + } - this.q.enqueue(this.book.opened); - this.starting = new core["defer"](); - /** - * @member {promise} started returns after the rendition has started - * @memberof Rendition - */ + if (end.index === this.book.spine.last().index && located.end.displayed.page >= located.end.displayed.total) { + located.atEnd = true; + } - this.started = this.starting.promise; // Block the queue until rendering is started + if (start.index === this.book.spine.first().index && located.start.displayed.page === 1) { + located.atStart = true; + } - this.q.enqueue(this.start); + return located; } /** - * Set the manager function - * @param {function} manager + * Remove and Clean Up the Rendition */ - setManager(manager) { - this.manager = manager; + destroy() { + // Clear the queue + // this.q.clear(); + // this.q = undefined; + this.manager && this.manager.destroy(); + this.book = undefined; // this.views = null; + // this.hooks.display.clear(); + // this.hooks.serialize.clear(); + // this.hooks.content.clear(); + // this.hooks.layout.clear(); + // this.hooks.render.clear(); + // this.hooks.show.clear(); + // this.hooks = {}; + // this.themes.destroy(); + // this.themes = undefined; + // this.epubcfi = undefined; + // this.starting = undefined; + // this.started = undefined; } /** - * Require the manager from passed string, or as a class function - * @param {string|object} manager [description] - * @return {method} + * Pass the events from a view's Contents + * @private + * @param {Contents} view contents */ - requireManager(manager) { - var viewManager; // If manager is a string, try to load from imported managers + passEvents(contents) { + constants["a" /* DOM_EVENTS */].forEach(e => { + contents.on(e, ev => this.triggerViewEvent(ev, contents)); + }); + contents.on(constants["c" /* EVENTS */].CONTENTS.SELECTED, e => this.triggerSelectedEvent(e, contents)); + } + /** + * Emit events passed by a view + * @private + * @param {event} e + */ - if (typeof manager === "string" && manager === "default") { - viewManager = managers_default["a" /* default */]; - } else if (typeof manager === "string" && manager === "continuous") { - viewManager = continuous["a" /* default */]; - } else { - // otherwise, assume we were passed a class function - viewManager = manager; - } - return viewManager; + triggerViewEvent(e, contents) { + this.emit(e.type, e, contents); } /** - * Require the view from passed string, or as a class function - * @param {string|object} view - * @return {view} + * Emit a selection event's CFI Range passed from a a view + * @private + * @param {string} cfirange */ - requireView(view) { - var View; // If view is a string, try to load from imported views, - - if (typeof view == "string" && view === "iframe") { - View = iframe["a" /* default */]; - } else { - // otherwise, assume we were passed a class function - View = view; - } + triggerSelectedEvent(cfirange, contents) { + /** + * Emit that a text selection has occurred + * @event selected + * @param {string} cfirange + * @param {Contents} contents + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.SELECTED, cfirange, contents); + } + /** + * Emit a markClicked event with the cfiRange and data from a mark + * @private + * @param {EpubCFI} cfirange + */ - return View; + + triggerMarkEvent(cfiRange, data, contents) { + /** + * Emit that a mark was clicked + * @event markClicked + * @param {EpubCFI} cfirange + * @param {object} data + * @param {Contents} contents + * @memberof Rendition + */ + this.emit(constants["c" /* EVENTS */].RENDITION.MARK_CLICKED, cfiRange, data, contents); } /** - * Start the rendering - * @return {Promise} rendering has started + * Get a Range from a Visible CFI + * @param {string} cfi EpubCfi String + * @param {string} ignoreClass + * @return {range} */ - start() { - if (!this.settings.layout && (this.book.package.metadata.layout === "pre-paginated" || this.book.displayOptions.fixedLayout === "true")) { - this.settings.layout = "pre-paginated"; - } + getRange(cfi, ignoreClass) { + var _cfi = new src_epubcfi["a" /* default */](cfi); - switch (this.book.package.metadata.spread) { - case 'none': - this.settings.spread = 'none'; - break; + var found = this.manager.visible().filter(function (view) { + if (_cfi.spinePos === view.index) return true; + }); // Should only every return 1 item - case 'both': - this.settings.spread = true; - break; + if (found.length) { + return found[0].contents.range(_cfi, ignoreClass); } + } + /** + * Hook to adjust images to fit in columns + * @param {Contents} contents + * @private + */ - if (!this.manager) { - this.ViewManager = this.requireManager(this.settings.manager); - this.View = this.requireView(this.settings.view); - this.manager = new this.ViewManager({ - view: this.View, - queue: this.q, - request: this.book.load.bind(this.book), - settings: this.settings + + adjustImages(contents) { + if (this._layout.name === "pre-paginated") { + return new Promise(function (resolve) { + resolve(); }); } - this.direction(this.book.package.metadata.direction || this.settings.defaultDirection); // Parse metadata to get layout props - - this.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata); - this.flow(this.settings.globalLayoutProperties.flow); - this.layout(this.settings.globalLayoutProperties); // Listen for displayed views - - this.manager.on(constants["c" /* EVENTS */].MANAGERS.ADDED, this.afterDisplayed.bind(this)); - this.manager.on(constants["c" /* EVENTS */].MANAGERS.REMOVED, this.afterRemoved.bind(this)); // Listen for resizing - - this.manager.on(constants["c" /* EVENTS */].MANAGERS.RESIZED, this.onResized.bind(this)); // Listen for rotation + let computed = contents.window.getComputedStyle(contents.content, null); + let height = (contents.content.offsetHeight - (parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom))) * .95; + let horizontalPadding = parseFloat(computed.paddingLeft) + parseFloat(computed.paddingRight); + contents.addStylesheetRules({ + "img": { + "max-width": (this._layout.columnWidth ? this._layout.columnWidth - horizontalPadding + "px" : "100%") + "!important", + "max-height": height + "px" + "!important", + "object-fit": "contain", + "page-break-inside": "avoid", + "break-inside": "avoid", + "box-sizing": "border-box" + }, + "svg": { + "max-width": (this._layout.columnWidth ? this._layout.columnWidth - horizontalPadding + "px" : "100%") + "!important", + "max-height": height + "px" + "!important", + "page-break-inside": "avoid", + "break-inside": "avoid" + } + }); + return new Promise(function (resolve, reject) { + // Wait to apply + setTimeout(function () { + resolve(); + }, 1); + }); + } + /** + * Get the Contents object of each rendered view + * @returns {Contents[]} + */ - this.manager.on(constants["c" /* EVENTS */].MANAGERS.ORIENTATION_CHANGE, this.onOrientationChange.bind(this)); // Listen for scroll changes - this.manager.on(constants["c" /* EVENTS */].MANAGERS.SCROLLED, this.reportLocation.bind(this)); - /** - * Emit that rendering has started - * @event started - * @memberof Rendition - */ + getContents() { + return this.manager ? this.manager.getContents() : []; + } + /** + * Get the views member from the manager + * @returns {Views} + */ - this.emit(constants["c" /* EVENTS */].RENDITION.STARTED); // Start processing queue - this.starting.resolve(); + views() { + let views = this.manager ? this.manager.views : undefined; + return views || []; } /** - * Call to attach the container to an element in the dom - * Container must be attached before rendering can begin - * @param {element} element to attach to - * @return {Promise} + * Hook to handle link clicks in rendered content + * @param {Contents} contents + * @private */ - attachTo(element) { - return this.q.enqueue(function () { - // Start rendering - this.manager.render(element, { - "width": this.settings.width, - "height": this.settings.height + handleLinks(contents) { + if (contents) { + contents.on(constants["c" /* EVENTS */].CONTENTS.LINK_CLICKED, href => { + let relative = this.book.path.relative(href); + this.display(relative); }); - /** - * Emit that rendering has attached to an element - * @event attached - * @memberof Rendition - */ + } + } + /** + * Hook to handle injecting stylesheet before + * a Section is serialized + * @param {document} doc + * @param {Section} section + * @private + */ - this.emit(constants["c" /* EVENTS */].RENDITION.ATTACHED); - }.bind(this)); + + injectStylesheet(doc, section) { + let style = doc.createElement("link"); + style.setAttribute("type", "text/css"); + style.setAttribute("rel", "stylesheet"); + style.setAttribute("href", this.settings.stylesheet); + doc.getElementsByTagName("head")[0].appendChild(style); } /** - * Display a point in the book - * The request will be added to the rendering Queue, - * so it will wait until book is opened, rendering started - * and all other rendering tasks have finished to be called. - * @param {string} target Url or EpubCFI - * @return {Promise} + * Hook to handle injecting scripts before + * a Section is serialized + * @param {document} doc + * @param {Section} section + * @private */ - display(target) { - if (this.displaying) { - this.displaying.resolve(); - } + injectScript(doc, section) { + let script = doc.createElement("script"); + script.setAttribute("type", "text/javascript"); + script.setAttribute("src", this.settings.script); + script.textContent = " "; // Needed to prevent self closing tag - return this.q.enqueue(this._display, target); + doc.getElementsByTagName("head")[0].appendChild(script); } /** - * Tells the manager what to display immediately + * Hook to handle the document identifier before + * a Section is serialized + * @param {document} doc + * @param {Section} section * @private - * @param {string} target Url or EpubCFI - * @return {Promise} */ - _display(target) { - if (!this.book) { - return; + injectIdentifier(doc, section) { + let ident = this.book.packaging.metadata.identifier; + let meta = doc.createElement("meta"); + meta.setAttribute("name", "dc.relation.ispartof"); + + if (ident) { + meta.setAttribute("content", ident); } - var isCfiString = this.epubcfi.isCfiString(target); - var displaying = new core["defer"](); - var displayed = displaying.promise; - var section; - var moveTo; - this.displaying = displaying; // Check if this is a book percentage + doc.getElementsByTagName("head")[0].appendChild(meta); + } - if (this.book.locations.length() && Object(core["isFloat"])(target)) { - target = this.book.locations.cfiFromPercentage(parseFloat(target)); - } +} //-- Enable binding events to Renderer - section = this.book.spine.get(target); - if (!section) { - displaying.reject(new Error("No Section Found")); - return displayed; - } +event_emitter_default()(rendition_Rendition.prototype); +/* harmony default export */ var rendition = __webpack_exports__["a"] = (rendition_Rendition); - this.manager.display(section, target).then(() => { - displaying.resolve(section); - this.displaying = undefined; - /** - * Emit that a section has been displayed - * @event displayed - * @param {Section} section - * @memberof Rendition - */ +/***/ }), +/* 17 */ +/***/ (function(module, exports) { - this.emit(constants["c" /* EVENTS */].RENDITION.DISPLAYED, section); - this.reportLocation(); - }, err => { - /** - * Emit that has been an error displaying - * @event displayError - * @param {Section} section - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.DISPLAY_ERROR, err); - }); - return displayed; - } - /* - render(view, show) { - // view.onLayout = this.layout.format.bind(this.layout); - view.create(); - // Fit to size of the container, apply padding - this.manager.resizeView(view); - // Render Chain - return view.section.render(this.book.request) - .then(function(contents){ - return view.load(contents); - }.bind(this)) - .then(function(doc){ - return this.hooks.content.trigger(view, this); - }.bind(this)) - .then(function(){ - this.layout.format(view.contents); - return this.hooks.layout.trigger(view, this); - }.bind(this)) - .then(function(){ - return view.display(); - }.bind(this)) - .then(function(){ - return this.hooks.render.trigger(view, this); - }.bind(this)) - .then(function(){ - if(show !== false) { - this.q.enqueue(function(view){ - view.show(); - }, view); - } - // this.map = new Map(view, this.layout); - this.hooks.show.trigger(view, this); - this.trigger("rendered", view.section); - }.bind(this)) - .catch(function(e){ - this.trigger("loaderror", e); - }.bind(this)); - } - */ +var g; - /** - * Report what section has been displayed - * @private - * @param {*} view - */ +// This works in non-strict mode +g = (function() { + return this; +})(); +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} - afterDisplayed(view) { - view.on(constants["c" /* EVENTS */].VIEWS.MARK_CLICKED, (cfiRange, data) => this.triggerMarkEvent(cfiRange, data, view.contents)); - this.hooks.render.trigger(view, this).then(() => { - if (view.contents) { - this.hooks.content.trigger(view.contents, this).then(() => { - /** - * Emit that a section has been rendered - * @event rendered - * @param {Section} section - * @param {View} view - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.RENDERED, view.section, view); - }); - } else { - this.emit(constants["c" /* EVENTS */].RENDITION.RENDERED, view.section, view); - } - }); - } - /** - * Report what has been removed - * @private - * @param {*} view - */ +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} +module.exports = g; - afterRemoved(view) { - this.hooks.unloaded.trigger(view, this).then(() => { - /** - * Emit that a section has been removed - * @event removed - * @param {Section} section - * @param {View} view - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.REMOVED, view.section, view); - }); - } - /** - * Report resize events and display the last seen location - * @private - */ +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { - onResized(size, epubcfi) { - /** - * Emit that the rendition has been resized - * @event resized - * @param {number} width - * @param {height} height - * @param {string} epubcfi (optional) - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.RESIZED, { - width: size.width, - height: size.height - }, epubcfi); +"use strict"; - if (this.location && this.location.start) { - this.display(epubcfi || this.location.start.cfi); - } - } - /** - * Report orientation events and display the last seen location - * @private - */ +var _undefined = __webpack_require__(38)(); // Support ES3 engines - onOrientationChange(orientation) { - /** - * Emit that the rendition has been rotated - * @event orientationchange - * @param {string} orientation - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.ORIENTATION_CHANGE, orientation); - } - /** - * Move the Rendition to a specific offset - * Usually you would be better off calling display() - * @param {object} offset - */ +module.exports = function (val) { + return (val !== _undefined) && (val !== null); +}; - moveTo(offset) { - this.manager.moveTo(offset); - } - /** - * Trigger a resize of the views - * @param {number} [width] - * @param {number} [height] - * @param {string} [epubcfi] (optional) - */ +/***/ }), +/* 19 */ +/***/ (function(module, exports) { +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} - resize(width, height, epubcfi) { - if (width) { - this.settings.width = width; - } +module.exports = isObject; - if (height) { - this.settings.height = height; - } - this.manager.resize(width, height, epubcfi); - } - /** - * Clear all rendered views - */ +/***/ }), +/* 20 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); +/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(event_emitter__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0); +/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2); +/* harmony import */ var _contents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12); +/* harmony import */ var _utils_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1); +/* harmony import */ var marks_pane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(13); +/* harmony import */ var marks_pane__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(marks_pane__WEBPACK_IMPORTED_MODULE_5__); - clear() { - this.manager.clear(); - } - /** - * Go to the next "page" in the rendition - * @return {Promise} - */ - next() { - return this.q.enqueue(this.manager.next.bind(this.manager)).then(this.reportLocation.bind(this)); - } - /** - * Go to the previous "page" in the rendition - * @return {Promise} - */ - prev() { - return this.q.enqueue(this.manager.prev.bind(this.manager)).then(this.reportLocation.bind(this)); - } //-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering - /** - * Determine the Layout properties from metadata and settings - * @private - * @param {object} metadata - * @return {object} properties - */ +class IframeView { + constructor(section, options) { + this.settings = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["extend"])({ + ignoreClass: "", + axis: undefined, + //options.layout && options.layout.props.flow === "scrolled" ? "vertical" : "horizontal", + direction: undefined, + width: 0, + height: 0, + layout: undefined, + globalLayoutProperties: {}, + method: undefined, + forceRight: false, + allowScriptedContent: false + }, options || {}); + this.id = "epubjs-view-" + Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["uuid"])(); + this.section = section; + this.index = section.index; + this.element = this.container(this.settings.axis); + this.added = false; + this.displayed = false; + this.rendered = false; // this.width = this.settings.width; + // this.height = this.settings.height; - determineLayoutProperties(metadata) { - var properties; - var layout = this.settings.layout || metadata.layout || "reflowable"; - var spread = this.settings.spread || metadata.spread || "auto"; - var orientation = this.settings.orientation || metadata.orientation || "auto"; - var flow = this.settings.flow || metadata.flow || "auto"; - var viewport = metadata.viewport || ""; - var minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800; - var direction = this.settings.direction || metadata.direction || "ltr"; + this.fixedWidth = 0; + this.fixedHeight = 0; // Blank Cfi for Parsing - if ((this.settings.width === 0 || this.settings.width > 0) && (this.settings.height === 0 || this.settings.height > 0)) {// viewport = "width="+this.settings.width+", height="+this.settings.height+""; - } + this.epubcfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](); + this.layout = this.settings.layout; // Dom events to listen for + // this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click", "touchend", "touchstart"]; - properties = { - layout: layout, - spread: spread, - orientation: orientation, - flow: flow, - viewport: viewport, - minSpreadWidth: minSpreadWidth, - evenSpreads: this.settings.evenSpreads, - maxSpreadColumns: this.settings.maxSpreadColumns, - gap: this.settings.gap, - direction: direction - }; - return properties; + this.pane = undefined; + this.highlights = {}; + this.underlines = {}; + this.marks = {}; } - /** - * Adjust the flow of the rendition to paginated or scrolled - * (scrolled-continuous vs scrolled-doc are handled by different view managers) - * @param {string} flow - */ - - - flow(flow) { - var _flow = flow; - - if (flow === "scrolled" || flow === "scrolled-doc" || flow === "scrolled-continuous") { - _flow = "scrolled"; - } - if (flow === "auto" || flow === "paginated") { - _flow = "paginated"; - } + container(axis) { + var element = document.createElement("div"); + element.classList.add("epub-view"); // this.element.style.minHeight = "100px"; - this.settings.flow = flow; + element.style.height = "0px"; + element.style.width = "0px"; + element.style.overflow = "hidden"; + element.style.position = "relative"; + element.style.display = "block"; - if (this._layout) { - this._layout.flow(_flow); + if (axis && axis == "horizontal") { + element.style.flex = "none"; + } else { + element.style.flex = "initial"; } - if (this.manager && this._layout) { - this.manager.applyLayout(this._layout); - } + return element; + } - if (this.manager) { - this.manager.updateFlow(_flow); + create() { + if (this.iframe) { + return this.iframe; } - if (this.manager && this.manager.isRendered() && this.location) { - this.manager.clear(); - this.display(this.location.start.cfi); + if (!this.element) { + this.element = this.createContainer(); } - } - /** - * Adjust the layout of the rendition to reflowable or pre-paginated - * @param {object} settings - */ + this.iframe = document.createElement("iframe"); + this.iframe.id = this.id; + this.iframe.scrolling = "no"; // Might need to be removed: breaks ios width calculations - layout(settings) { - if (settings) { - this._layout = new layout(settings); - - this._layout.spread(settings.spread, this.settings.minSpreadWidth); // this.mapping = new Mapping(this._layout.props); + this.iframe.style.overflow = "hidden"; + this.iframe.seamless = "seamless"; // Back up if seamless isn't supported + this.iframe.style.border = "none"; // sandbox - this._layout.on(constants["c" /* EVENTS */].LAYOUT.UPDATED, (props, changed) => { - this.emit(constants["c" /* EVENTS */].RENDITION.LAYOUT, props, changed); - }); - } + this.iframe.sandbox = "allow-same-origin"; - if (this.manager && this._layout) { - this.manager.applyLayout(this._layout); + if (this.settings.allowScriptedContent) { + this.iframe.sandbox += " allow-scripts"; } - return this._layout; - } - /** - * Adjust if the rendition uses spreads - * @param {string} spread none | auto (TODO: implement landscape, portrait, both) - * @param {int} [min] min width to use spreads at - */ - + this.iframe.setAttribute("enable-annotation", "true"); + this.resizing = true; // this.iframe.style.display = "none"; - spread(spread, min) { - this.settings.spread = spread; + this.element.style.visibility = "hidden"; + this.iframe.style.visibility = "hidden"; + this.iframe.style.width = "0"; + this.iframe.style.height = "0"; + this._width = 0; + this._height = 0; + this.element.setAttribute("ref", this.index); + this.added = true; + this.elementBounds = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["bounds"])(this.element); // if(width || height){ + // this.resize(width, height); + // } else if(this.width && this.height){ + // this.resize(this.width, this.height); + // } else { + // this.iframeBounds = bounds(this.iframe); + // } - if (min) { - this.settings.minSpreadWidth = min; + if ("srcdoc" in this.iframe) { + this.supportsSrcdoc = true; + } else { + this.supportsSrcdoc = false; } - if (this._layout) { - this._layout.spread(spread, min); + if (!this.settings.method) { + this.settings.method = this.supportsSrcdoc ? "srcdoc" : "write"; } - if (this.manager && this.manager.isRendered()) { - this.manager.updateLayout(); - } + return this.iframe; } - /** - * Adjust the direction of the rendition - * @param {string} dir - */ - - direction(dir) { - this.settings.direction = dir || "ltr"; + render(request, show) { + // view.onLayout = this.layout.format.bind(this.layout); + this.create(); // Fit to size of the container, apply padding - if (this.manager) { - this.manager.direction(this.settings.direction); - } + this.size(); - if (this.manager && this.manager.isRendered() && this.location) { - this.manager.clear(); - this.display(this.location.start.cfi); - } - } - /** - * Report the current location - * @fires relocated - * @fires locationChanged - */ + if (!this.sectionRender) { + this.sectionRender = this.section.render(request); + } // Render Chain - reportLocation() { - return this.q.enqueue(function reportedLocation() { - requestAnimationFrame(function reportedLocationAfterRAF() { - var location = this.manager.currentLocation(); + return this.sectionRender.then(function (contents) { + return this.load(contents); + }.bind(this)).then(function () { + // find and report the writingMode axis + let writingMode = this.contents.writingMode(); // Set the axis based on the flow and writing mode - if (location && location.then && typeof location.then === "function") { - location.then(function (result) { - let located = this.located(result); + let axis; - if (!located || !located.start || !located.end) { - return; - } + if (this.settings.flow === "scrolled") { + axis = writingMode.indexOf("vertical") === 0 ? "horizontal" : "vertical"; + } else { + axis = writingMode.indexOf("vertical") === 0 ? "vertical" : "horizontal"; + } - this.location = located; - this.emit(constants["c" /* EVENTS */].RENDITION.LOCATION_CHANGED, { - index: this.location.start.index, - href: this.location.start.href, - start: this.location.start.cfi, - end: this.location.end.cfi, - percentage: this.location.start.percentage - }); - this.emit(constants["c" /* EVENTS */].RENDITION.RELOCATED, this.location); - }.bind(this)); - } else if (location) { - let located = this.located(location); + if (writingMode.indexOf("vertical") === 0 && this.settings.flow === "paginated") { + this.layout.delta = this.layout.height; + } - if (!located || !located.start || !located.end) { - return; - } + this.setAxis(axis); + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.AXIS, axis); + this.setWritingMode(writingMode); + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.WRITING_MODE, writingMode); // apply the layout function to the contents - this.location = located; - /** - * @event locationChanged - * @deprecated - * @type {object} - * @property {number} index - * @property {string} href - * @property {EpubCFI} start - * @property {EpubCFI} end - * @property {number} percentage - * @memberof Rendition - */ + this.layout.format(this.contents, this.section, this.axis); // Listen for events that require an expansion of the iframe - this.emit(constants["c" /* EVENTS */].RENDITION.LOCATION_CHANGED, { - index: this.location.start.index, - href: this.location.start.href, - start: this.location.start.cfi, - end: this.location.end.cfi, - percentage: this.location.start.percentage - }); - /** - * @event relocated - * @type {displayedLocation} - * @memberof Rendition - */ + this.addListeners(); + return new Promise((resolve, reject) => { + // Expand the iframe to the full size of the content + this.expand(); - this.emit(constants["c" /* EVENTS */].RENDITION.RELOCATED, this.location); + if (this.settings.forceRight) { + this.element.style.marginLeft = this.width() + "px"; } - }.bind(this)); + + resolve(); + }); + }.bind(this), function (e) { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.LOAD_ERROR, e); + return new Promise((resolve, reject) => { + reject(e); + }); + }.bind(this)).then(function () { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.RENDERED, this.section); }.bind(this)); } - /** - * Get the Current Location object - * @return {displayedLocation | promise} location (may be a promise) - */ - - currentLocation() { - var location = this.manager.currentLocation(); - - if (location && location.then && typeof location.then === "function") { - location.then(function (result) { - let located = this.located(result); - return located; - }.bind(this)); - } else if (location) { - let located = this.located(location); - return located; + reset() { + if (this.iframe) { + this.iframe.style.width = "0"; + this.iframe.style.height = "0"; + this._width = 0; + this._height = 0; + this._textWidth = undefined; + this._contentWidth = undefined; + this._textHeight = undefined; + this._contentHeight = undefined; } - } - /** - * Creates a Rendition#locationRange from location - * passed by the Manager - * @returns {displayedLocation} - * @private - */ + this._needsReframe = true; + } // Determine locks base on settings - located(location) { - if (!location.length) { - return {}; - } - let start = location[0]; - let end = location[location.length - 1]; - let located = { - start: { - index: start.index, - href: start.href, - cfi: start.mapping.start, - displayed: { - page: start.pages[0] || 1, - total: start.totalPages - } - }, - end: { - index: end.index, - href: end.href, - cfi: end.mapping.end, - displayed: { - page: end.pages[end.pages.length - 1] || 1, - total: end.totalPages - } - } - }; - let locationStart = this.book.locations.locationFromCfi(start.mapping.start); - let locationEnd = this.book.locations.locationFromCfi(end.mapping.end); + size(_width, _height) { + var width = _width || this.settings.width; + var height = _height || this.settings.height; - if (locationStart != null) { - located.start.location = locationStart; - located.start.percentage = this.book.locations.percentageFromLocation(locationStart); + if (this.layout.name === "pre-paginated") { + this.lock("both", width, height); + } else if (this.settings.axis === "horizontal") { + this.lock("height", width, height); + } else { + this.lock("width", width, height); } - if (locationEnd != null) { - located.end.location = locationEnd; - located.end.percentage = this.book.locations.percentageFromLocation(locationEnd); - } + this.settings.width = width; + this.settings.height = height; + } // Lock an axis to element dimensions, taking borders into account - let pageStart = this.book.pageList.pageFromCfi(start.mapping.start); - let pageEnd = this.book.pageList.pageFromCfi(end.mapping.end); - if (pageStart != -1) { - located.start.page = pageStart; + lock(what, width, height) { + var elBorders = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["borders"])(this.element); + var iframeBorders; + + if (this.iframe) { + iframeBorders = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["borders"])(this.iframe); + } else { + iframeBorders = { + width: 0, + height: 0 + }; } - if (pageEnd != -1) { - located.end.page = pageEnd; + if (what == "width" && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(width)) { + this.lockedWidth = width - elBorders.width - iframeBorders.width; // this.resize(this.lockedWidth, width); // width keeps ratio correct } - if (end.index === this.book.spine.last().index && located.end.displayed.page >= located.end.displayed.total) { - located.atEnd = true; + if (what == "height" && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(height)) { + this.lockedHeight = height - elBorders.height - iframeBorders.height; // this.resize(width, this.lockedHeight); } - if (start.index === this.book.spine.first().index && located.start.displayed.page === 1) { - located.atStart = true; + if (what === "both" && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(width) && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(height)) { + this.lockedWidth = width - elBorders.width - iframeBorders.width; + this.lockedHeight = height - elBorders.height - iframeBorders.height; // this.resize(this.lockedWidth, this.lockedHeight); } - return located; - } - /** - * Remove and Clean Up the Rendition - */ + if (this.displayed && this.iframe) { + // this.contents.layout(); + this.expand(); + } + } // Resize a single axis based on content dimensions - destroy() { - // Clear the queue - // this.q.clear(); - // this.q = undefined; - this.manager && this.manager.destroy(); - this.book = undefined; // this.views = null; - // this.hooks.display.clear(); - // this.hooks.serialize.clear(); - // this.hooks.content.clear(); - // this.hooks.layout.clear(); - // this.hooks.render.clear(); - // this.hooks.show.clear(); - // this.hooks = {}; - // this.themes.destroy(); - // this.themes = undefined; - // this.epubcfi = undefined; - // this.starting = undefined; - // this.started = undefined; - } - /** - * Pass the events from a view's Contents - * @private - * @param {Contents} view contents - */ + expand(force) { + var width = this.lockedWidth; + var height = this.lockedHeight; + var columns; + var textWidth, textHeight; + if (!this.iframe || this._expanding) return; + this._expanding = true; + if (this.layout.name === "pre-paginated") { + width = this.layout.columnWidth; + height = this.layout.height; + } // Expand Horizontally + else if (this.settings.axis === "horizontal") { + // Get the width of the text + width = this.contents.textWidth(); - passEvents(contents) { - constants["a" /* DOM_EVENTS */].forEach(e => { - contents.on(e, ev => this.triggerViewEvent(ev, contents)); - }); - contents.on(constants["c" /* EVENTS */].CONTENTS.SELECTED, e => this.triggerSelectedEvent(e, contents)); - } - /** - * Emit events passed by a view - * @private - * @param {event} e - */ + if (width % this.layout.pageWidth > 0) { + width = Math.ceil(width / this.layout.pageWidth) * this.layout.pageWidth; + } + if (this.settings.forceEvenPages) { + columns = width / this.layout.pageWidth; - triggerViewEvent(e, contents) { - this.emit(e.type, e, contents); - } - /** - * Emit a selection event's CFI Range passed from a a view - * @private - * @param {string} cfirange - */ + if (this.layout.divisor > 1 && this.layout.name === "reflowable" && columns % 2 > 0) { + // add a blank page + width += this.layout.pageWidth; + } + } + } // Expand Vertically + else if (this.settings.axis === "vertical") { + height = this.contents.textHeight(); + if (this.settings.flow === "paginated" && height % this.layout.height > 0) { + height = Math.ceil(height / this.layout.height) * this.layout.height; + } + } // Only Resize if dimensions have changed or + // if Frame is still hidden, so needs reframing - triggerSelectedEvent(cfirange, contents) { - /** - * Emit that a text selection has occured - * @event selected - * @param {string} cfirange - * @param {Contents} contents - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.SELECTED, cfirange, contents); - } - /** - * Emit a markClicked event with the cfiRange and data from a mark - * @private - * @param {EpubCFI} cfirange - */ + if (this._needsReframe || width != this._width || height != this._height) { + this.reframe(width, height); + } - triggerMarkEvent(cfiRange, data, contents) { - /** - * Emit that a mark was clicked - * @event markClicked - * @param {EpubCFI} cfirange - * @param {object} data - * @param {Contents} contents - * @memberof Rendition - */ - this.emit(constants["c" /* EVENTS */].RENDITION.MARK_CLICKED, cfiRange, data, contents); + this._expanding = false; } - /** - * Get a Range from a Visible CFI - * @param {string} cfi EpubCfi String - * @param {string} ignoreClass - * @return {range} - */ + reframe(width, height) { + var size; - getRange(cfi, ignoreClass) { - var _cfi = new src_epubcfi["a" /* default */](cfi); - - var found = this.manager.visible().filter(function (view) { - if (_cfi.spinePos === view.index) return true; - }); // Should only every return 1 item - - if (found.length) { - return found[0].contents.range(_cfi, ignoreClass); + if (Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(width)) { + this.element.style.width = width + "px"; + this.iframe.style.width = width + "px"; + this._width = width; } - } - /** - * Hook to adjust images to fit in columns - * @param {Contents} contents - * @private - */ - - adjustImages(contents) { - if (this._layout.name === "pre-paginated") { - return new Promise(function (resolve) { - resolve(); - }); + if (Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(height)) { + this.element.style.height = height + "px"; + this.iframe.style.height = height + "px"; + this._height = height; } - let computed = contents.window.getComputedStyle(contents.content, null); - let height = (contents.content.offsetHeight - (parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom))) * .95; - let horizontalPadding = parseFloat(computed.paddingLeft) + parseFloat(computed.paddingRight); - contents.addStylesheetRules({ - "img": { - "max-width": (this._layout.columnWidth ? this._layout.columnWidth - horizontalPadding + "px" : "100%") + "!important", - "max-height": height + "px" + "!important", - "object-fit": "contain", - "page-break-inside": "avoid", - "break-inside": "avoid", - "box-sizing": "border-box" - }, - "svg": { - "max-width": (this._layout.columnWidth ? this._layout.columnWidth - horizontalPadding + "px" : "100%") + "!important", - "max-height": height + "px" + "!important", - "page-break-inside": "avoid", - "break-inside": "avoid" + let widthDelta = this.prevBounds ? width - this.prevBounds.width : width; + let heightDelta = this.prevBounds ? height - this.prevBounds.height : height; + size = { + width: width, + height: height, + widthDelta: widthDelta, + heightDelta: heightDelta + }; + this.pane && this.pane.render(); + requestAnimationFrame(() => { + let mark; + + for (let m in this.marks) { + if (this.marks.hasOwnProperty(m)) { + mark = this.marks[m]; + this.placeMark(mark.element, mark.range); + } } }); - return new Promise(function (resolve, reject) { - // Wait to apply - setTimeout(function () { - resolve(); - }, 1); - }); + this.onResize(this, size); + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.RESIZED, size); + this.prevBounds = size; + this.elementBounds = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["bounds"])(this.element); } - /** - * Get the Contents object of each rendered view - * @returns {Contents[]} - */ + load(contents) { + var loading = new _utils_core__WEBPACK_IMPORTED_MODULE_1__["defer"](); + var loaded = loading.promise; - getContents() { - return this.manager ? this.manager.getContents() : []; - } - /** - * Get the views member from the manager - * @returns {Views} - */ + if (!this.iframe) { + loading.reject(new Error("No Iframe Available")); + return loaded; + } + this.iframe.onload = function (event) { + this.onLoad(event, loading); + }.bind(this); - views() { - let views = this.manager ? this.manager.views : undefined; - return views || []; - } - /** - * Hook to handle link clicks in rendered content - * @param {Contents} contents - * @private - */ + if (this.settings.method === "blobUrl") { + this.blobUrl = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["createBlobUrl"])(contents, "application/xhtml+xml"); + this.iframe.src = this.blobUrl; + this.element.appendChild(this.iframe); + } else if (this.settings.method === "srcdoc") { + this.iframe.srcdoc = contents; + this.element.appendChild(this.iframe); + } else { + this.element.appendChild(this.iframe); + this.document = this.iframe.contentDocument; + if (!this.document) { + loading.reject(new Error("No Document Available")); + return loaded; + } - handleLinks(contents) { - if (contents) { - contents.on(constants["c" /* EVENTS */].CONTENTS.LINK_CLICKED, href => { - let relative = this.book.path.relative(href); - this.display(relative); - }); + this.iframe.contentDocument.open(); // For Cordova windows platform + + if (window.MSApp && MSApp.execUnsafeLocalFunction) { + var outerThis = this; + MSApp.execUnsafeLocalFunction(function () { + outerThis.iframe.contentDocument.write(contents); + }); + } else { + this.iframe.contentDocument.write(contents); + } + + this.iframe.contentDocument.close(); } + + return loaded; } - /** - * Hook to handle injecting stylesheet before - * a Section is serialized - * @param {document} doc - * @param {Section} section - * @private - */ + onLoad(event, promise) { + this.window = this.iframe.contentWindow; + this.document = this.iframe.contentDocument; + this.contents = new _contents__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"](this.document, this.document.body, this.section.cfiBase, this.section.index); + this.rendering = false; + var link = this.document.querySelector("link[rel='canonical']"); - injectStylesheet(doc, section) { - let style = doc.createElement("link"); - style.setAttribute("type", "text/css"); - style.setAttribute("rel", "stylesheet"); - style.setAttribute("href", this.settings.stylesheet); - doc.getElementsByTagName("head")[0].appendChild(style); - } - /** - * Hook to handle injecting scripts before - * a Section is serialized - * @param {document} doc - * @param {Section} section - * @private - */ + if (link) { + link.setAttribute("href", this.section.canonical); + } else { + link = this.document.createElement("link"); + link.setAttribute("rel", "canonical"); + link.setAttribute("href", this.section.canonical); + this.document.querySelector("head").appendChild(link); + } + this.contents.on(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].CONTENTS.EXPAND, () => { + if (this.displayed && this.iframe) { + this.expand(); - injectScript(doc, section) { - let script = doc.createElement("script"); - script.setAttribute("type", "text/javascript"); - script.setAttribute("src", this.settings.script); - script.textContent = " "; // Needed to prevent self closing tag + if (this.contents) { + this.layout.format(this.contents); + } + } + }); + this.contents.on(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].CONTENTS.RESIZE, e => { + if (this.displayed && this.iframe) { + this.expand(); - doc.getElementsByTagName("head")[0].appendChild(script); + if (this.contents) { + this.layout.format(this.contents); + } + } + }); + promise.resolve(this.contents); } - /** - * Hook to handle the document identifier before - * a Section is serialized - * @param {document} doc - * @param {Section} section - * @private - */ + setLayout(layout) { + this.layout = layout; - injectIdentifier(doc, section) { - let ident = this.book.packaging.metadata.identifier; - let meta = doc.createElement("meta"); - meta.setAttribute("name", "dc.relation.ispartof"); - - if (ident) { - meta.setAttribute("content", ident); + if (this.contents) { + this.layout.format(this.contents); + this.expand(); } - - doc.getElementsByTagName("head")[0].appendChild(meta); } -} //-- Enable binding events to Renderer - + setAxis(axis) { + this.settings.axis = axis; -event_emitter_default()(rendition_Rendition.prototype); -/* harmony default export */ var rendition = __webpack_exports__["a"] = (rendition_Rendition); + if (axis == "horizontal") { + this.element.style.flex = "none"; + } else { + this.element.style.flex = "initial"; + } -/***/ }), -/* 40 */ -/***/ (function(module, exports) { + this.size(); + } -var toString = {}.toString; + setWritingMode(mode) { + // this.element.style.writingMode = writingMode; + this.writingMode = mode; + } -module.exports = function (it) { - return toString.call(it).slice(8, -1); -}; + addListeners() {//TODO: Add content listeners for expanding + } + removeListeners(layoutFunc) {//TODO: remove content listeners for expanding + } -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { + display(request) { + var displayed = new _utils_core__WEBPACK_IMPORTED_MODULE_1__["defer"](); -var isObject = __webpack_require__(17); + if (!this.displayed) { + this.render(request).then(function () { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.DISPLAYED, this); + this.onDisplayed(this); + this.displayed = true; + displayed.resolve(this); + }.bind(this), function (err) { + displayed.reject(err, this); + }); + } else { + displayed.resolve(this); + } -// `ToPrimitive` abstract operation -// https://tc39.github.io/ecma262/#sec-toprimitive -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function (input, PREFERRED_STRING) { - if (!isObject(input)) return input; - var fn, val; - if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; - if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; + return displayed.promise; + } + show() { + this.element.style.visibility = "visible"; -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.iframe) { + this.iframe.style.visibility = "visible"; // Remind Safari to redraw the iframe -var global = __webpack_require__(7); -var createNonEnumerableProperty = __webpack_require__(15); + this.iframe.style.transform = "translateZ(0)"; + this.iframe.offsetWidth; + this.iframe.style.transform = null; + } -module.exports = function (key, value) { - try { - createNonEnumerableProperty(global, key, value); - } catch (error) { - global[key] = value; - } return value; -}; + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.SHOWN, this); + } + hide() { + // this.iframe.style.display = "none"; + this.element.style.visibility = "hidden"; + this.iframe.style.visibility = "hidden"; + this.stopExpanding = true; + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.HIDDEN, this); + } -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { + offset() { + return { + top: this.element.offsetTop, + left: this.element.offsetLeft + }; + } -var shared = __webpack_require__(66); -var uid = __webpack_require__(67); + width() { + return this._width; + } -var keys = shared('keys'); + height() { + return this._height; + } -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; + position() { + return this.element.getBoundingClientRect(); + } + locationOf(target) { + var parentPos = this.iframe.getBoundingClientRect(); + var targetPos = this.contents.locationOf(target, this.settings.ignoreClass); + return { + "left": targetPos.left, + "top": targetPos.top + }; + } -/***/ }), -/* 44 */ -/***/ (function(module, exports) { - -module.exports = {}; + onDisplayed(view) {// Stub, override with a custom functions + } + onResize(view, e) {// Stub, override with a custom functions + } -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { + bounds(force) { + if (force || !this.elementBounds) { + this.elementBounds = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["bounds"])(this.element); + } -var path = __webpack_require__(92); -var global = __webpack_require__(7); + return this.elementBounds; + } -var aFunction = function (variable) { - return typeof variable == 'function' ? variable : undefined; -}; + highlight(cfiRange, data = {}, cb, className = "epubjs-hl", styles = {}) { + if (!this.contents) { + return; + } -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) - : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; -}; + const attributes = Object.assign({ + "fill": "yellow", + "fill-opacity": "0.3", + "mix-blend-mode": "multiply" + }, styles); + let range = this.contents.range(cfiRange); + let emitter = () => { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.MARK_CLICKED, cfiRange, data); + }; -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { + data["epubcfi"] = cfiRange; -var toInteger = __webpack_require__(35); + if (!this.pane) { + this.pane = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Pane"](this.iframe, this.element); + } -var min = Math.min; + let m = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Highlight"](range, className, data, attributes); -// `ToLength` abstract operation -// https://tc39.github.io/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; + try { + let h = this.pane.addMark(m); + this.highlights[cfiRange] = { + "mark": h, + "element": h.element, + "listeners": [emitter, cb] + }; + h.element.setAttribute("ref", className); + h.element.addEventListener("click", emitter); + h.element.addEventListener("touchstart", emitter); + if (cb) { + h.element.addEventListener("click", cb); + h.element.addEventListener("touchstart", cb); + } -/***/ }), -/* 47 */ -/***/ (function(module, exports) { + return h; + } catch (e) {} + } -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; + underline(cfiRange, data = {}, cb, className = "epubjs-ul", styles = {}) { + if (!this.contents) { + return; + } + const attributes = Object.assign({ + "stroke": "black", + "stroke-opacity": "0.3", + "mix-blend-mode": "multiply" + }, styles); + let range = this.contents.range(cfiRange); -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { + let emitter = () => { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.MARK_CLICKED, cfiRange, data); + }; -"use strict"; + data["epubcfi"] = cfiRange; -var regexpFlags = __webpack_require__(97); -var stickyHelpers = __webpack_require__(98); + if (!this.pane) { + this.pane = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Pane"](this.iframe, this.element); + } -var nativeExec = RegExp.prototype.exec; -// This always refers to the native implementation, because the -// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, -// which loads this file before patching the method. -var nativeReplace = String.prototype.replace; - -var patchedExec = nativeExec; - -var UPDATES_LAST_INDEX_WRONG = (function () { - var re1 = /a/; - var re2 = /b*/g; - nativeExec.call(re1, 'a'); - nativeExec.call(re2, 'a'); - return re1.lastIndex !== 0 || re2.lastIndex !== 0; -})(); + let m = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Underline"](range, className, data, attributes); + let h = this.pane.addMark(m); + this.underlines[cfiRange] = { + "mark": h, + "element": h.element, + "listeners": [emitter, cb] + }; + h.element.setAttribute("ref", className); + h.element.addEventListener("click", emitter); + h.element.addEventListener("touchstart", emitter); -var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET; + if (cb) { + h.element.addEventListener("click", cb); + h.element.addEventListener("touchstart", cb); + } -// nonparticipating capturing group, copied from es5-shim's String#split patch. -var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + return h; + } -var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y; + mark(cfiRange, data = {}, cb) { + if (!this.contents) { + return; + } -if (PATCH) { - patchedExec = function exec(str) { - var re = this; - var lastIndex, reCopy, match, i; - var sticky = UNSUPPORTED_Y && re.sticky; - var flags = regexpFlags.call(re); - var source = re.source; - var charsAdded = 0; - var strCopy = str; - - if (sticky) { - flags = flags.replace('y', ''); - if (flags.indexOf('g') === -1) { - flags += 'g'; - } - - strCopy = String(str).slice(re.lastIndex); - // Support anchored sticky behavior. - if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) { - source = '(?: ' + source + ')'; - strCopy = ' ' + strCopy; - charsAdded++; - } - // ^(? + rx + ) is needed, in combination with some str slicing, to - // simulate the 'y' flag. - reCopy = new RegExp('^(?:' + source + ')', flags); - } - - if (NPCG_INCLUDED) { - reCopy = new RegExp('^' + source + '$(?!\\s)', flags); - } - if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; - - match = nativeExec.call(sticky ? reCopy : re, strCopy); - - if (sticky) { - if (match) { - match.input = match.input.slice(charsAdded); - match[0] = match[0].slice(charsAdded); - match.index = re.lastIndex; - re.lastIndex += match[0].length; - } else re.lastIndex = 0; - } else if (UPDATES_LAST_INDEX_WRONG && match) { - re.lastIndex = re.global ? match.index + match[0].length : lastIndex; - } - if (NPCG_INCLUDED && match && match.length > 1) { - // Fix browsers whose `exec` methods don't consistently return `undefined` - // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ - nativeReplace.call(match[0], reCopy, function () { - for (i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) match[i] = undefined; - } - }); + if (cfiRange in this.marks) { + let item = this.marks[cfiRange]; + return item; } - return match; - }; -} + let range = this.contents.range(cfiRange); -module.exports = patchedExec; + if (!range) { + return; + } + let container = range.commonAncestorContainer; + let parent = container.nodeType === 1 ? container : container.parentNode; -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { + let emitter = e => { + this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.MARK_CLICKED, cfiRange, data); + }; -var toInteger = __webpack_require__(35); -var requireObjectCoercible = __webpack_require__(33); + if (range.collapsed && container.nodeType === 1) { + range = new Range(); + range.selectNodeContents(container); + } else if (range.collapsed) { + // Webkit doesn't like collapsed ranges + range = new Range(); + range.selectNodeContents(parent); + } -// `String.prototype.{ codePointAt, at }` methods implementation -var createMethod = function (CONVERT_TO_STRING) { - return function ($this, pos) { - var S = String(requireObjectCoercible($this)); - var position = toInteger(pos); - var size = S.length; - var first, second; - if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; - first = S.charCodeAt(position); - return first < 0xD800 || first > 0xDBFF || position + 1 === size - || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF - ? CONVERT_TO_STRING ? S.charAt(position) : first - : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; - }; -}; + let mark = this.document.createElement("a"); + mark.setAttribute("ref", "epubjs-mk"); + mark.style.position = "absolute"; + mark.dataset["epubcfi"] = cfiRange; -module.exports = { - // `String.prototype.codePointAt` method - // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat - codeAt: createMethod(false), - // `String.prototype.at` method - // https://github.com/mathiasbynens/String.prototype.at - charAt: createMethod(true) -}; + if (data) { + Object.keys(data).forEach(key => { + mark.dataset[key] = data[key]; + }); + } + if (cb) { + mark.addEventListener("click", cb); + mark.addEventListener("touchstart", cb); + } -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { + mark.addEventListener("click", emitter); + mark.addEventListener("touchstart", emitter); + this.placeMark(mark, range); + this.element.appendChild(mark); + this.marks[cfiRange] = { + "element": mark, + "range": range, + "listeners": [emitter, cb] + }; + return parent; + } -var anObject = __webpack_require__(14); -var defineProperties = __webpack_require__(72); -var enumBugKeys = __webpack_require__(47); -var hiddenKeys = __webpack_require__(44); -var html = __webpack_require__(104); -var documentCreateElement = __webpack_require__(63); -var sharedKey = __webpack_require__(43); - -var GT = '>'; -var LT = '<'; -var PROTOTYPE = 'prototype'; -var SCRIPT = 'script'; -var IE_PROTO = sharedKey('IE_PROTO'); + placeMark(element, range) { + let top, right, left; -var EmptyConstructor = function () { /* empty */ }; + if (this.layout.name === "pre-paginated" || this.settings.axis !== "horizontal") { + let pos = range.getBoundingClientRect(); + top = pos.top; + right = pos.right; + } else { + // Element might break columns, so find the left most element + let rects = range.getClientRects(); + let rect; -var scriptTag = function (content) { - return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; -}; + for (var i = 0; i != rects.length; i++) { + rect = rects[i]; -// Create object with fake `null` prototype: use ActiveX Object with cleared prototype -var NullProtoObjectViaActiveX = function (activeXDocument) { - activeXDocument.write(scriptTag('')); - activeXDocument.close(); - var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak - return temp; -}; + if (!left || rect.left < left) { + left = rect.left; // right = rect.right; -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var NullProtoObjectViaIFrame = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var JS = 'java' + SCRIPT + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - // https://github.com/zloirock/core-js/issues/475 - iframe.src = String(JS); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(scriptTag('document.F=Object')); - iframeDocument.close(); - return iframeDocument.F; -}; + right = Math.ceil(left / this.layout.props.pageWidth) * this.layout.props.pageWidth - this.layout.gap / 2; + top = rect.top; + } + } + } -// Check for document.domain and active x support -// No need to use active x approach when document.domain is not set -// see https://github.com/es-shims/es5-shim/issues/150 -// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 -// avoid IE GC bug -var activeXDocument; -var NullProtoObject = function () { - try { - /* global ActiveXObject */ - activeXDocument = document.domain && new ActiveXObject('htmlfile'); - } catch (error) { /* ignore */ } - NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame(); - var length = enumBugKeys.length; - while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; - return NullProtoObject(); -}; + element.style.top = `${top}px`; + element.style.left = `${right}px`; + } -hiddenKeys[IE_PROTO] = true; + unhighlight(cfiRange) { + let item; -// `Object.create` method -// https://tc39.github.io/ecma262/#sec-object.create -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - EmptyConstructor[PROTOTYPE] = anObject(O); - result = new EmptyConstructor(); - EmptyConstructor[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = NullProtoObject(); - return Properties === undefined ? result : defineProperties(result, Properties); -}; + if (cfiRange in this.highlights) { + item = this.highlights[cfiRange]; + this.pane.removeMark(item.mark); + item.listeners.forEach(l => { + if (l) { + item.element.removeEventListener("click", l); + item.element.removeEventListener("touchstart", l); + } + ; + }); + delete this.highlights[cfiRange]; + } + } -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { + ununderline(cfiRange) { + let item; -"use strict"; + if (cfiRange in this.underlines) { + item = this.underlines[cfiRange]; + this.pane.removeMark(item.mark); + item.listeners.forEach(l => { + if (l) { + item.element.removeEventListener("click", l); + item.element.removeEventListener("touchstart", l); + } + ; + }); + delete this.underlines[cfiRange]; + } + } -var _undefined = __webpack_require__(115)(); // Support ES3 engines + unmark(cfiRange) { + let item; -module.exports = function (val) { - return (val !== _undefined) && (val !== null); -}; + if (cfiRange in this.marks) { + item = this.marks[cfiRange]; + this.element.removeChild(item.element); + item.listeners.forEach(l => { + if (l) { + item.element.removeEventListener("click", l); + item.element.removeEventListener("touchstart", l); + } + ; + }); + delete this.marks[cfiRange]; + } + } -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { + destroy() { + for (let cfiRange in this.highlights) { + this.unhighlight(cfiRange); + } -var classof = __webpack_require__(81); -var Iterators = __webpack_require__(27); -var wellKnownSymbol = __webpack_require__(8); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = function (it) { - if (it != undefined) return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; + for (let cfiRange in this.underlines) { + this.ununderline(cfiRange); + } + + for (let cfiRange in this.marks) { + this.unmark(cfiRange); + } + + if (this.blobUrl) { + Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["revokeBlobUrl"])(this.blobUrl); + } + + if (this.displayed) { + this.displayed = false; + this.removeListeners(); + this.contents.destroy(); + this.stopExpanding = true; + this.element.removeChild(this.iframe); + + if (this.pane) { + this.pane.element.remove(); + this.pane = undefined; + } + + this.iframe = undefined; + this.contents = undefined; + this._textWidth = null; + this._textHeight = null; + this._width = null; + this._height = null; + } // this.element.style.height = "0px"; + // this.element.style.width = "0px"; + + } + +} +event_emitter__WEBPACK_IMPORTED_MODULE_0___default()(IframeView.prototype); +/* harmony default export */ __webpack_exports__["a"] = (IframeView); /***/ }), -/* 53 */ -/***/ (function(module, exports) { +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(19), + now = __webpack_require__(51), + toNumber = __webpack_require__(53); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; /** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. * * @static * @memberOf _ * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. * @example * - * _.isObject({}); - * // => true + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); * - * _.isObject([1, 2, 3]); - * // => true + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); * - * _.isObject(_.noop); - * // => true + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); * - * _.isObject(null); - * // => false + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); */ -function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); -} - -module.exports = isObject; - - -/***/ }), -/* 54 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); -/* harmony import */ var event_emitter__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(event_emitter__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0); -/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2); -/* harmony import */ var _contents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28); -/* harmony import */ var _utils_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1); -/* harmony import */ var marks_pane__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(29); -/* harmony import */ var marks_pane__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(marks_pane__WEBPACK_IMPORTED_MODULE_5__); - - +function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } -class IframeView { - constructor(section, options) { - this.settings = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["extend"])({ - ignoreClass: "", - axis: undefined, - //options.layout && options.layout.props.flow === "scrolled" ? "vertical" : "horizontal", - direction: undefined, - width: 0, - height: 0, - layout: undefined, - globalLayoutProperties: {}, - method: undefined, - forceRight: false - }, options || {}); - this.id = "epubjs-view-" + Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["uuid"])(); - this.section = section; - this.index = section.index; - this.element = this.container(this.settings.axis); - this.added = false; - this.displayed = false; - this.rendered = false; // this.width = this.settings.width; - // this.height = this.settings.height; + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; - this.fixedWidth = 0; - this.fixedHeight = 0; // Blank Cfi for Parsing + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } - this.epubcfi = new _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"](); - this.layout = this.settings.layout; // Dom events to listen for - // this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click", "touchend", "touchstart"]; + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; - this.pane = undefined; - this.highlights = {}; - this.underlines = {}; - this.marks = {}; + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); } - container(axis) { - var element = document.createElement("div"); - element.classList.add("epub-view"); // this.element.style.minHeight = "100px"; + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } - element.style.height = "0px"; - element.style.width = "0px"; - element.style.overflow = "hidden"; - element.style.position = "relative"; - element.style.display = "block"; + function trailingEdge(time) { + timerId = undefined; - if (axis && axis == "horizontal") { - element.style.flex = "none"; - } else { - element.style.flex = "initial"; + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); } - - return element; + lastArgs = lastThis = undefined; + return result; } - create() { - if (this.iframe) { - return this.iframe; + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } - if (!this.element) { - this.element = this.createContainer(); - } + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } - this.iframe = document.createElement("iframe"); - this.iframe.id = this.id; - this.iframe.scrolling = "no"; // Might need to be removed: breaks ios width calculations - - this.iframe.style.overflow = "hidden"; - this.iframe.seamless = "seamless"; // Back up if seamless isn't supported - - this.iframe.style.border = "none"; - this.iframe.setAttribute("enable-annotation", "true"); - this.resizing = true; // this.iframe.style.display = "none"; + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); - this.element.style.visibility = "hidden"; - this.iframe.style.visibility = "hidden"; - this.iframe.style.width = "0"; - this.iframe.style.height = "0"; - this._width = 0; - this._height = 0; - this.element.setAttribute("ref", this.index); - this.added = true; - this.elementBounds = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["bounds"])(this.element); // if(width || height){ - // this.resize(width, height); - // } else if(this.width && this.height){ - // this.resize(this.width, this.height); - // } else { - // this.iframeBounds = bounds(this.iframe); - // } + lastArgs = arguments; + lastThis = this; + lastCallTime = time; - if ("srcdoc" in this.iframe) { - this.supportsSrcdoc = true; - } else { - this.supportsSrcdoc = false; + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } } - - if (!this.settings.method) { - this.settings.method = this.supportsSrcdoc ? "srcdoc" : "write"; + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); } - - return this.iframe; + return result; } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; +} - render(request, show) { - // view.onLayout = this.layout.format.bind(this.layout); - this.create(); // Fit to size of the container, apply padding - - this.size(); - - if (!this.sectionRender) { - this.sectionRender = this.section.render(request); - } // Render Chain +module.exports = debounce; - return this.sectionRender.then(function (contents) { - return this.load(contents); - }.bind(this)).then(function () { - // find and report the writingMode axis - let writingMode = this.contents.writingMode(); // Set the axis based on the flow and writing mode +/***/ }), +/* 22 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - let axis; +"use strict"; - if (this.settings.flow === "scrolled") { - axis = writingMode.indexOf("vertical") === 0 ? "horizontal" : "vertical"; - } else { - axis = writingMode.indexOf("vertical") === 0 ? "vertical" : "horizontal"; - } +// EXTERNAL MODULE: ./src/utils/core.js +var core = __webpack_require__(0); - if (writingMode.indexOf("vertical") === 0 && this.settings.flow === "paginated") { - this.layout.delta = this.layout.height; - } +// EXTERNAL MODULE: ./src/managers/default/index.js + 3 modules +var managers_default = __webpack_require__(10); - this.setAxis(axis); - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.AXIS, axis); - this.setWritingMode(writingMode); - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.WRITING_MODE, writingMode); // apply the layout function to the contents +// EXTERNAL MODULE: ./src/utils/constants.js +var constants = __webpack_require__(1); - this.layout.format(this.contents, this.section, this.axis); // Listen for events that require an expansion of the iframe +// EXTERNAL MODULE: ./node_modules/event-emitter/index.js +var event_emitter = __webpack_require__(3); +var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); - this.addListeners(); - return new Promise((resolve, reject) => { - // Expand the iframe to the full size of the content - this.expand(); +// CONCATENATED MODULE: ./src/managers/helpers/snap.js - if (this.settings.forceRight) { - this.element.style.marginLeft = this.width() + "px"; - } - resolve(); - }); - }.bind(this), function (e) { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.LOAD_ERROR, e); - return new Promise((resolve, reject) => { - reject(e); - }); - }.bind(this)).then(function () { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.RENDERED, this.section); - }.bind(this)); - } + // easing equations from https://github.com/danro/easing-js/blob/master/easing.js - reset() { - if (this.iframe) { - this.iframe.style.width = "0"; - this.iframe.style.height = "0"; - this._width = 0; - this._height = 0; - this._textWidth = undefined; - this._contentWidth = undefined; - this._textHeight = undefined; - this._contentHeight = undefined; +const PI_D2 = Math.PI / 2; +const EASING_EQUATIONS = { + easeOutSine: function (pos) { + return Math.sin(pos * PI_D2); + }, + easeInOutSine: function (pos) { + return -0.5 * (Math.cos(Math.PI * pos) - 1); + }, + easeInOutQuint: function (pos) { + if ((pos /= 0.5) < 1) { + return 0.5 * Math.pow(pos, 5); } - this._needsReframe = true; - } // Determine locks base on settings - + return 0.5 * (Math.pow(pos - 2, 5) + 2); + }, + easeInCubic: function (pos) { + return Math.pow(pos, 3); + } +}; - size(_width, _height) { - var width = _width || this.settings.width; - var height = _height || this.settings.height; +class snap_Snap { + constructor(manager, options) { + this.settings = Object(core["extend"])({ + duration: 80, + minVelocity: 0.2, + minDistance: 10, + easing: EASING_EQUATIONS['easeInCubic'] + }, options || {}); + this.supportsTouch = this.supportsTouch(); - if (this.layout.name === "pre-paginated") { - this.lock("both", width, height); - } else if (this.settings.axis === "horizontal") { - this.lock("height", width, height); - } else { - this.lock("width", width, height); + if (this.supportsTouch) { + this.setup(manager); } + } - this.settings.width = width; - this.settings.height = height; - } // Lock an axis to element dimensions, taking borders into account - - - lock(what, width, height) { - var elBorders = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["borders"])(this.element); - var iframeBorders; + setup(manager) { + this.manager = manager; + this.layout = this.manager.layout; + this.fullsize = this.manager.settings.fullsize; - if (this.iframe) { - iframeBorders = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["borders"])(this.iframe); + if (this.fullsize) { + this.element = this.manager.stage.element; + this.scroller = window; + this.disableScroll(); } else { - iframeBorders = { - width: 0, - height: 0 - }; - } - - if (what == "width" && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(width)) { - this.lockedWidth = width - elBorders.width - iframeBorders.width; // this.resize(this.lockedWidth, width); // width keeps ratio correct - } + this.element = this.manager.stage.container; + this.scroller = this.element; + this.element.style["WebkitOverflowScrolling"] = "touch"; + } // this.overflow = this.manager.overflow; + // set lookahead offset to page width - if (what == "height" && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(height)) { - this.lockedHeight = height - elBorders.height - iframeBorders.height; // this.resize(width, this.lockedHeight); - } - if (what === "both" && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(width) && Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(height)) { - this.lockedWidth = width - elBorders.width - iframeBorders.width; - this.lockedHeight = height - elBorders.height - iframeBorders.height; // this.resize(this.lockedWidth, this.lockedHeight); - } + this.manager.settings.offset = this.layout.width; + this.manager.settings.afterScrolledTimeout = this.settings.duration * 2; + this.isVertical = this.manager.settings.axis === "vertical"; // disable snapping if not paginated or axis in not horizontal - if (this.displayed && this.iframe) { - // this.contents.layout(); - this.expand(); + if (!this.manager.isPaginated || this.isVertical) { + return; } - } // Resize a single axis based on content dimensions - - expand(force) { - var width = this.lockedWidth; - var height = this.lockedHeight; - var columns; - var textWidth, textHeight; - if (!this.iframe || this._expanding) return; - this._expanding = true; + this.touchCanceler = false; + this.resizeCanceler = false; + this.snapping = false; + this.scrollLeft; + this.scrollTop; + this.startTouchX = undefined; + this.startTouchY = undefined; + this.startTime = undefined; + this.endTouchX = undefined; + this.endTouchY = undefined; + this.endTime = undefined; + this.addListeners(); + } - if (this.layout.name === "pre-paginated") { - width = this.layout.columnWidth; - height = this.layout.height; - } // Expand Horizontally - else if (this.settings.axis === "horizontal") { - // Get the width of the text - width = this.contents.textWidth(); + supportsTouch() { + if ('ontouchstart' in window || window.DocumentTouch && document instanceof DocumentTouch) { + return true; + } - if (width % this.layout.pageWidth > 0) { - width = Math.ceil(width / this.layout.pageWidth) * this.layout.pageWidth; - } + return false; + } - if (this.settings.forceEvenPages) { - columns = width / this.layout.pageWidth; + disableScroll() { + this.element.style.overflow = "hidden"; + } - if (this.layout.divisor > 1 && this.layout.name === "reflowable" && columns % 2 > 0) { - // add a blank page - width += this.layout.pageWidth; - } - } - } // Expand Vertically - else if (this.settings.axis === "vertical") { - height = this.contents.textHeight(); + enableScroll() { + this.element.style.overflow = ""; + } - if (this.settings.flow === "paginated" && height % this.layout.height > 0) { - height = Math.ceil(height / this.layout.height) * this.layout.height; - } - } // Only Resize if dimensions have changed or - // if Frame is still hidden, so needs reframing - - - if (this._needsReframe || width != this._width || height != this._height) { - this.reframe(width, height); - } - - this._expanding = false; + addListeners() { + this._onResize = this.onResize.bind(this); + window.addEventListener('resize', this._onResize); + this._onScroll = this.onScroll.bind(this); + this.scroller.addEventListener('scroll', this._onScroll); + this._onTouchStart = this.onTouchStart.bind(this); + this.scroller.addEventListener('touchstart', this._onTouchStart, { + passive: true + }); + this.on('touchstart', this._onTouchStart); + this._onTouchMove = this.onTouchMove.bind(this); + this.scroller.addEventListener('touchmove', this._onTouchMove, { + passive: true + }); + this.on('touchmove', this._onTouchMove); + this._onTouchEnd = this.onTouchEnd.bind(this); + this.scroller.addEventListener('touchend', this._onTouchEnd, { + passive: true + }); + this.on('touchend', this._onTouchEnd); + this._afterDisplayed = this.afterDisplayed.bind(this); + this.manager.on(constants["c" /* EVENTS */].MANAGERS.ADDED, this._afterDisplayed); } - reframe(width, height) { - var size; - - if (Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(width)) { - this.element.style.width = width + "px"; - this.iframe.style.width = width + "px"; - this._width = width; - } - - if (Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["isNumber"])(height)) { - this.element.style.height = height + "px"; - this.iframe.style.height = height + "px"; - this._height = height; - } - - let widthDelta = this.prevBounds ? width - this.prevBounds.width : width; - let heightDelta = this.prevBounds ? height - this.prevBounds.height : height; - size = { - width: width, - height: height, - widthDelta: widthDelta, - heightDelta: heightDelta - }; - this.pane && this.pane.render(); - requestAnimationFrame(() => { - let mark; - - for (let m in this.marks) { - if (this.marks.hasOwnProperty(m)) { - mark = this.marks[m]; - this.placeMark(mark.element, mark.range); - } - } + removeListeners() { + window.removeEventListener('resize', this._onResize); + this._onResize = undefined; + this.scroller.removeEventListener('scroll', this._onScroll); + this._onScroll = undefined; + this.scroller.removeEventListener('touchstart', this._onTouchStart, { + passive: true }); - this.onResize(this, size); - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.RESIZED, size); - this.prevBounds = size; - this.elementBounds = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["bounds"])(this.element); + this.off('touchstart', this._onTouchStart); + this._onTouchStart = undefined; + this.scroller.removeEventListener('touchmove', this._onTouchMove, { + passive: true + }); + this.off('touchmove', this._onTouchMove); + this._onTouchMove = undefined; + this.scroller.removeEventListener('touchend', this._onTouchEnd, { + passive: true + }); + this.off('touchend', this._onTouchEnd); + this._onTouchEnd = undefined; + this.manager.off(constants["c" /* EVENTS */].MANAGERS.ADDED, this._afterDisplayed); + this._afterDisplayed = undefined; } - load(contents) { - var loading = new _utils_core__WEBPACK_IMPORTED_MODULE_1__["defer"](); - var loaded = loading.promise; + afterDisplayed(view) { + let contents = view.contents; + ["touchstart", "touchmove", "touchend"].forEach(e => { + contents.on(e, ev => this.triggerViewEvent(ev, contents)); + }); + } - if (!this.iframe) { - loading.reject(new Error("No Iframe Available")); - return loaded; - } + triggerViewEvent(e, contents) { + this.emit(e.type, e, contents); + } - this.iframe.onload = function (event) { - this.onLoad(event, loading); - }.bind(this); + onScroll(e) { + this.scrollLeft = this.fullsize ? window.scrollX : this.scroller.scrollLeft; + this.scrollTop = this.fullsize ? window.scrollY : this.scroller.scrollTop; + } - if (this.settings.method === "blobUrl") { - this.blobUrl = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["createBlobUrl"])(contents, "application/xhtml+xml"); - this.iframe.src = this.blobUrl; - this.element.appendChild(this.iframe); - } else if (this.settings.method === "srcdoc") { - this.iframe.srcdoc = contents; - this.element.appendChild(this.iframe); - } else { - this.element.appendChild(this.iframe); - this.document = this.iframe.contentDocument; + onResize(e) { + this.resizeCanceler = true; + } - if (!this.document) { - loading.reject(new Error("No Document Available")); - return loaded; - } + onTouchStart(e) { + let { + screenX, + screenY + } = e.touches[0]; - this.iframe.contentDocument.open(); // For Cordova windows platform + if (this.fullsize) { + this.enableScroll(); + } - if (window.MSApp && MSApp.execUnsafeLocalFunction) { - var outerThis = this; - MSApp.execUnsafeLocalFunction(function () { - outerThis.iframe.contentDocument.write(contents); - }); - } else { - this.iframe.contentDocument.write(contents); - } + this.touchCanceler = true; - this.iframe.contentDocument.close(); + if (!this.startTouchX) { + this.startTouchX = screenX; + this.startTouchY = screenY; + this.startTime = this.now(); } - return loaded; + this.endTouchX = screenX; + this.endTouchY = screenY; + this.endTime = this.now(); } - onLoad(event, promise) { - this.window = this.iframe.contentWindow; - this.document = this.iframe.contentDocument; - this.contents = new _contents__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"](this.document, this.document.body, this.section.cfiBase, this.section.index); - this.rendering = false; - var link = this.document.querySelector("link[rel='canonical']"); + onTouchMove(e) { + let { + screenX, + screenY + } = e.touches[0]; + let deltaY = Math.abs(screenY - this.endTouchY); + this.touchCanceler = true; - if (link) { - link.setAttribute("href", this.section.canonical); - } else { - link = this.document.createElement("link"); - link.setAttribute("rel", "canonical"); - link.setAttribute("href", this.section.canonical); - this.document.querySelector("head").appendChild(link); + if (!this.fullsize && deltaY < 10) { + this.element.scrollLeft -= screenX - this.endTouchX; } - this.contents.on(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].CONTENTS.EXPAND, () => { - if (this.displayed && this.iframe) { - this.expand(); - - if (this.contents) { - this.layout.format(this.contents); - } - } - }); - this.contents.on(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].CONTENTS.RESIZE, e => { - if (this.displayed && this.iframe) { - this.expand(); - - if (this.contents) { - this.layout.format(this.contents); - } - } - }); - promise.resolve(this.contents); + this.endTouchX = screenX; + this.endTouchY = screenY; + this.endTime = this.now(); } - setLayout(layout) { - this.layout = layout; - - if (this.contents) { - this.layout.format(this.contents); - this.expand(); + onTouchEnd(e) { + if (this.fullsize) { + this.disableScroll(); } - } - setAxis(axis) { - this.settings.axis = axis; + this.touchCanceler = false; + let swipped = this.wasSwiped(); - if (axis == "horizontal") { - this.element.style.flex = "none"; + if (swipped !== 0) { + this.snap(swipped); } else { - this.element.style.flex = "initial"; + this.snap(); } - this.size(); + this.startTouchX = undefined; + this.startTouchY = undefined; + this.startTime = undefined; + this.endTouchX = undefined; + this.endTouchY = undefined; + this.endTime = undefined; } - setWritingMode(mode) { - // this.element.style.writingMode = writingMode; - this.writingMode = mode; - } + wasSwiped() { + let snapWidth = this.layout.pageWidth * this.layout.divisor; + let distance = this.endTouchX - this.startTouchX; + let absolute = Math.abs(distance); + let time = this.endTime - this.startTime; + let velocity = distance / time; + let minVelocity = this.settings.minVelocity; - addListeners() {//TODO: Add content listeners for expanding - } + if (absolute <= this.settings.minDistance || absolute >= snapWidth) { + return 0; + } - removeListeners(layoutFunc) {//TODO: remove content listeners for expanding + if (velocity > minVelocity) { + // previous + return -1; + } else if (velocity < -minVelocity) { + // next + return 1; + } } - display(request) { - var displayed = new _utils_core__WEBPACK_IMPORTED_MODULE_1__["defer"](); + needsSnap() { + let left = this.scrollLeft; + let snapWidth = this.layout.pageWidth * this.layout.divisor; + return left % snapWidth !== 0; + } - if (!this.displayed) { - this.render(request).then(function () { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.DISPLAYED, this); - this.onDisplayed(this); - this.displayed = true; - displayed.resolve(this); - }.bind(this), function (err) { - displayed.reject(err, this); - }); - } else { - displayed.resolve(this); + snap(howMany = 0) { + let left = this.scrollLeft; + let snapWidth = this.layout.pageWidth * this.layout.divisor; + let snapTo = Math.round(left / snapWidth) * snapWidth; + + if (howMany) { + snapTo += howMany * snapWidth; } - return displayed.promise; + return this.smoothScrollTo(snapTo); } - show() { - this.element.style.visibility = "visible"; + smoothScrollTo(destination) { + const deferred = new core["defer"](); + const start = this.scrollLeft; + const startTime = this.now(); + const duration = this.settings.duration; + const easing = this.settings.easing; + this.snapping = true; // add animation loop - if (this.iframe) { - this.iframe.style.visibility = "visible"; // Remind Safari to redraw the iframe + function tick() { + const now = this.now(); + const time = Math.min(1, (now - startTime) / duration); + const timeFunction = easing(time); - this.iframe.style.transform = "translateZ(0)"; - this.iframe.offsetWidth; - this.iframe.style.transform = null; + if (this.touchCanceler || this.resizeCanceler) { + this.resizeCanceler = false; + this.snapping = false; + deferred.resolve(); + return; + } + + if (time < 1) { + window.requestAnimationFrame(tick.bind(this)); + this.scrollTo(start + (destination - start) * time, 0); + } else { + this.scrollTo(destination, 0); + this.snapping = false; + deferred.resolve(); + } } - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.SHOWN, this); + tick.call(this); + return deferred.promise; } - hide() { - // this.iframe.style.display = "none"; - this.element.style.visibility = "hidden"; - this.iframe.style.visibility = "hidden"; - this.stopExpanding = true; - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.HIDDEN, this); + scrollTo(left = 0, top = 0) { + if (this.fullsize) { + window.scroll(left, top); + } else { + this.scroller.scrollLeft = left; + this.scroller.scrollTop = top; + } } - offset() { - return { - top: this.element.offsetTop, - left: this.element.offsetLeft - }; + now() { + return 'now' in window.performance ? performance.now() : new Date().getTime(); } - width() { - return this._width; - } + destroy() { + if (!this.scroller) { + return; + } - height() { - return this._height; - } + if (this.fullsize) { + this.enableScroll(); + } - position() { - return this.element.getBoundingClientRect(); + this.removeListeners(); + this.scroller = undefined; } - locationOf(target) { - var parentPos = this.iframe.getBoundingClientRect(); - var targetPos = this.contents.locationOf(target, this.settings.ignoreClass); - return { - "left": targetPos.left, - "top": targetPos.top - }; - } +} - onDisplayed(view) {// Stub, override with a custom functions - } +event_emitter_default()(snap_Snap.prototype); +/* harmony default export */ var snap = (snap_Snap); +// EXTERNAL MODULE: ./node_modules/lodash/debounce.js +var debounce = __webpack_require__(21); +var debounce_default = /*#__PURE__*/__webpack_require__.n(debounce); - onResize(view, e) {// Stub, override with a custom functions - } +// CONCATENATED MODULE: ./src/managers/continuous/index.js - bounds(force) { - if (force || !this.elementBounds) { - this.elementBounds = Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["bounds"])(this.element); - } - return this.elementBounds; - } - highlight(cfiRange, data = {}, cb, className = "epubjs-hl", styles = {}) { - if (!this.contents) { - return; - } - const attributes = Object.assign({ - "fill": "yellow", - "fill-opacity": "0.3", - "mix-blend-mode": "multiply" - }, styles); - let range = this.contents.range(cfiRange); - let emitter = () => { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.MARK_CLICKED, cfiRange, data); - }; - data["epubcfi"] = cfiRange; +class continuous_ContinuousViewManager extends managers_default["a" /* default */] { + constructor(options) { + super(options); + this.name = "continuous"; + this.settings = Object(core["extend"])(this.settings || {}, { + infinite: true, + overflow: undefined, + axis: undefined, + writingMode: undefined, + flow: "scrolled", + offset: 500, + offsetDelta: 250, + width: undefined, + height: undefined, + snap: false, + afterScrolledTimeout: 10, + allowScriptedContent: false + }); + Object(core["extend"])(this.settings, options.settings || {}); // Gap can be 0, but defaults doesn't handle that - if (!this.pane) { - this.pane = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Pane"](this.iframe, this.element); + if (options.settings.gap != "undefined" && options.settings.gap === 0) { + this.settings.gap = options.settings.gap; } - let m = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Highlight"](range, className, data, attributes); + this.viewSettings = { + ignoreClass: this.settings.ignoreClass, + axis: this.settings.axis, + flow: this.settings.flow, + layout: this.layout, + width: 0, + height: 0, + forceEvenPages: false, + allowScriptedContent: this.settings.allowScriptedContent + }; + this.scrollTop = 0; + this.scrollLeft = 0; + } - try { - let h = this.pane.addMark(m); - this.highlights[cfiRange] = { - "mark": h, - "element": h.element, - "listeners": [emitter, cb] - }; - h.element.setAttribute("ref", className); - h.element.addEventListener("click", emitter); - h.element.addEventListener("touchstart", emitter); + display(section, target) { + return managers_default["a" /* default */].prototype.display.call(this, section, target).then(function () { + return this.fill(); + }.bind(this)); + } - if (cb) { - h.element.addEventListener("click", cb); - h.element.addEventListener("touchstart", cb); + fill(_full) { + var full = _full || new core["defer"](); + this.q.enqueue(() => { + return this.check(); + }).then(result => { + if (result) { + this.fill(full); + } else { + full.resolve(); } - - return h; - } catch (e) {} + }); + return full.promise; } - underline(cfiRange, data = {}, cb, className = "epubjs-ul", styles = {}) { - if (!this.contents) { - return; - } - - const attributes = Object.assign({ - "stroke": "black", - "stroke-opacity": "0.3", - "mix-blend-mode": "multiply" - }, styles); - let range = this.contents.range(cfiRange); - - let emitter = () => { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.MARK_CLICKED, cfiRange, data); - }; + moveTo(offset) { + // var bounds = this.stage.bounds(); + // var dist = Math.floor(offset.top / bounds.height) * bounds.height; + var distX = 0, + distY = 0; + var offsetX = 0, + offsetY = 0; - data["epubcfi"] = cfiRange; + if (!this.isPaginated) { + distY = offset.top; + offsetY = offset.top + this.settings.offsetDelta; + } else { + distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; + offsetX = distX + this.settings.offsetDelta; + } - if (!this.pane) { - this.pane = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Pane"](this.iframe, this.element); + if (distX > 0 || distY > 0) { + this.scrollBy(distX, distY, true); } + } - let m = new marks_pane__WEBPACK_IMPORTED_MODULE_5__["Underline"](range, className, data, attributes); - let h = this.pane.addMark(m); - this.underlines[cfiRange] = { - "mark": h, - "element": h.element, - "listeners": [emitter, cb] - }; - h.element.setAttribute("ref", className); - h.element.addEventListener("click", emitter); - h.element.addEventListener("touchstart", emitter); + afterResized(view) { + this.emit(constants["c" /* EVENTS */].MANAGERS.RESIZE, view.section); + } // Remove Previous Listeners if present - if (cb) { - h.element.addEventListener("click", cb); - h.element.addEventListener("touchstart", cb); - } - return h; + removeShownListeners(view) { + // view.off("shown", this.afterDisplayed); + // view.off("shown", this.afterDisplayedAbove); + view.onDisplayed = function () {}; } - mark(cfiRange, data = {}, cb) { - if (!this.contents) { - return; - } + add(section) { + var view = this.createView(section); + this.views.append(view); + view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { + view.expanded = true; + }); + view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { + this.updateAxis(axis); + }); + view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { + this.updateWritingMode(mode); + }); // view.on(EVENTS.VIEWS.SHOWN, this.afterDisplayed.bind(this)); - if (cfiRange in this.marks) { - let item = this.marks[cfiRange]; - return item; - } + view.onDisplayed = this.afterDisplayed.bind(this); + view.onResize = this.afterResized.bind(this); + return view.display(this.request); + } - let range = this.contents.range(cfiRange); + append(section) { + var view = this.createView(section); + view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { + view.expanded = true; + }); + view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { + this.updateAxis(axis); + }); + view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { + this.updateWritingMode(mode); + }); + this.views.append(view); + view.onDisplayed = this.afterDisplayed.bind(this); + return view; + } - if (!range) { - return; + prepend(section) { + var view = this.createView(section); + view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { + this.counter(bounds); + view.expanded = true; + }); + view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { + this.updateAxis(axis); + }); + view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { + this.updateWritingMode(mode); + }); + this.views.prepend(view); + view.onDisplayed = this.afterDisplayed.bind(this); + return view; + } + + counter(bounds) { + if (this.settings.axis === "vertical") { + this.scrollBy(0, bounds.heightDelta, true); + } else { + this.scrollBy(bounds.widthDelta, 0, true); } + } - let container = range.commonAncestorContainer; - let parent = container.nodeType === 1 ? container : container.parentNode; + update(_offset) { + var container = this.bounds(); + var views = this.views.all(); + var viewsLength = views.length; + var visible = []; + var offset = typeof _offset != "undefined" ? _offset : this.settings.offset || 0; + var isVisible; + var view; + var updating = new core["defer"](); + var promises = []; - let emitter = e => { - this.emit(_utils_constants__WEBPACK_IMPORTED_MODULE_4__[/* EVENTS */ "c"].VIEWS.MARK_CLICKED, cfiRange, data); - }; + for (var i = 0; i < viewsLength; i++) { + view = views[i]; + isVisible = this.isVisible(view, offset, offset, container); - if (range.collapsed && container.nodeType === 1) { - range = new Range(); - range.selectNodeContents(container); - } else if (range.collapsed) { - // Webkit doesn't like collapsed ranges - range = new Range(); - range.selectNodeContents(parent); - } + if (isVisible === true) { + // console.log("visible " + view.index, view.displayed); + if (!view.displayed) { + let displayed = view.display(this.request).then(function (view) { + view.show(); + }, err => { + view.hide(); + }); + promises.push(displayed); + } else { + view.show(); + } - let mark = this.document.createElement("a"); - mark.setAttribute("ref", "epubjs-mk"); - mark.style.position = "absolute"; - mark.dataset["epubcfi"] = cfiRange; + visible.push(view); + } else { + this.q.enqueue(view.destroy.bind(view)); // console.log("hidden " + view.index, view.displayed); - if (data) { - Object.keys(data).forEach(key => { - mark.dataset[key] = data[key]; + clearTimeout(this.trimTimeout); + this.trimTimeout = setTimeout(function () { + this.q.enqueue(this.trim.bind(this)); + }.bind(this), 250); + } + } + + if (promises.length) { + return Promise.all(promises).catch(err => { + updating.reject(err); }); + } else { + updating.resolve(); + return updating.promise; } + } - if (cb) { - mark.addEventListener("click", cb); - mark.addEventListener("touchstart", cb); + check(_offsetLeft, _offsetTop) { + var checking = new core["defer"](); + var newViews = []; + var horizontal = this.settings.axis === "horizontal"; + var delta = this.settings.offset || 0; + + if (_offsetLeft && horizontal) { + delta = _offsetLeft; } - mark.addEventListener("click", emitter); - mark.addEventListener("touchstart", emitter); - this.placeMark(mark, range); - this.element.appendChild(mark); - this.marks[cfiRange] = { - "element": mark, - "range": range, - "listeners": [emitter, cb] - }; - return parent; - } + if (_offsetTop && !horizontal) { + delta = _offsetTop; + } - placeMark(element, range) { - let top, right, left; + var bounds = this._bounds; // bounds saved this until resize - if (this.layout.name === "pre-paginated" || this.settings.axis !== "horizontal") { - let pos = range.getBoundingClientRect(); - top = pos.top; - right = pos.right; - } else { - // Element might break columns, so find the left most element - let rects = range.getClientRects(); - let rect; + let offset = horizontal ? this.scrollLeft : this.scrollTop; + let visibleLength = horizontal ? Math.floor(bounds.width) : bounds.height; + let contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight; + let writingMode = this.writingMode && this.writingMode.indexOf("vertical") === 0 ? "vertical" : "horizontal"; + let rtlScrollType = this.settings.rtlScrollType; + let rtl = this.settings.direction === "rtl"; - for (var i = 0; i != rects.length; i++) { - rect = rects[i]; + if (!this.settings.fullsize) { + // Scroll offset starts at width of element + if (rtl && rtlScrollType === "default" && writingMode === "horizontal") { + offset = contentLength - visibleLength - offset; + } // Scroll offset starts at 0 and goes negative - if (!left || rect.left < left) { - left = rect.left; // right = rect.right; - right = Math.ceil(left / this.layout.props.pageWidth) * this.layout.props.pageWidth - this.layout.gap / 2; - top = rect.top; - } + if (rtl && rtlScrollType === "negative" && writingMode === "horizontal") { + offset = offset * -1; + } + } else { + // Scroll offset starts at 0 and goes negative + if (horizontal && rtl && rtlScrollType === "negative" || !horizontal && rtl && rtlScrollType === "default") { + offset = offset * -1; } } - element.style.top = `${top}px`; - element.style.left = `${right}px`; - } + let prepend = () => { + let first = this.views.first(); + let prev = first && first.section.prev(); - unhighlight(cfiRange) { - let item; + if (prev) { + newViews.push(this.prepend(prev)); + } + }; - if (cfiRange in this.highlights) { - item = this.highlights[cfiRange]; - this.pane.removeMark(item.mark); - item.listeners.forEach(l => { - if (l) { - item.element.removeEventListener("click", l); - item.element.removeEventListener("touchstart", l); - } + let append = () => { + let last = this.views.last(); + let next = last && last.section.next(); - ; - }); - delete this.highlights[cfiRange]; + if (next) { + newViews.push(this.append(next)); + } + }; + + let end = offset + visibleLength + delta; + let start = offset - delta; + + if (end >= contentLength) { + append(); } - } - ununderline(cfiRange) { - let item; + if (start < 0) { + prepend(); + } - if (cfiRange in this.underlines) { - item = this.underlines[cfiRange]; - this.pane.removeMark(item.mark); - item.listeners.forEach(l => { - if (l) { - item.element.removeEventListener("click", l); - item.element.removeEventListener("touchstart", l); - } + let promises = newViews.map(view => { + return view.display(this.request); + }); - ; + if (newViews.length) { + return Promise.all(promises).then(() => { + return this.check(); + }).then(() => { + // Check to see if anything new is on screen after rendering + return this.update(delta); + }, err => { + return err; }); - delete this.underlines[cfiRange]; + } else { + this.q.enqueue(function () { + this.update(); + }.bind(this)); + checking.resolve(false); + return checking.promise; } } - unmark(cfiRange) { - let item; + trim() { + var task = new core["defer"](); + var displayed = this.views.displayed(); + var first = displayed[0]; + var last = displayed[displayed.length - 1]; + var firstIndex = this.views.indexOf(first); + var lastIndex = this.views.indexOf(last); + var above = this.views.slice(0, firstIndex); + var below = this.views.slice(lastIndex + 1); // Erase all but last above - if (cfiRange in this.marks) { - item = this.marks[cfiRange]; - this.element.removeChild(item.element); - item.listeners.forEach(l => { - if (l) { - item.element.removeEventListener("click", l); - item.element.removeEventListener("touchstart", l); - } + for (var i = 0; i < above.length - 1; i++) { + this.erase(above[i], above); + } // Erase all except first below - ; - }); - delete this.marks[cfiRange]; - } - } - destroy() { - for (let cfiRange in this.highlights) { - this.unhighlight(cfiRange); + for (var j = 1; j < below.length; j++) { + this.erase(below[j]); } - for (let cfiRange in this.underlines) { - this.ununderline(cfiRange); - } + task.resolve(); + return task.promise; + } - for (let cfiRange in this.marks) { - this.unmark(cfiRange); - } + erase(view, above) { + //Trim + var prevTop; + var prevLeft; - if (this.blobUrl) { - Object(_utils_core__WEBPACK_IMPORTED_MODULE_1__["revokeBlobUrl"])(this.blobUrl); + if (!this.settings.fullsize) { + prevTop = this.container.scrollTop; + prevLeft = this.container.scrollLeft; + } else { + prevTop = window.scrollY; + prevLeft = window.scrollX; } - if (this.displayed) { - this.displayed = false; - this.removeListeners(); - this.contents.destroy(); - this.stopExpanding = true; - this.element.removeChild(this.iframe); - this.iframe = undefined; - this.contents = undefined; - this._textWidth = null; - this._textHeight = null; - this._width = null; - this._height = null; - } // this.element.style.height = "0px"; - // this.element.style.width = "0px"; + var bounds = view.bounds(); + this.views.remove(view); + if (above) { + if (this.settings.axis === "vertical") { + this.scrollTo(0, prevTop - bounds.height, true); + } else { + if (this.settings.direction === 'rtl') { + if (!this.settings.fullsize) { + this.scrollTo(prevLeft, 0, true); + } else { + this.scrollTo(prevLeft + Math.floor(bounds.width), 0, true); + } + } else { + this.scrollTo(prevLeft - Math.floor(bounds.width), 0, true); + } + } + } } -} - -event_emitter__WEBPACK_IMPORTED_MODULE_0___default()(IframeView.prototype); -/* harmony default export */ __webpack_exports__["a"] = (IframeView); + addEventListeners(stage) { + window.addEventListener("unload", function (e) { + this.ignore = true; // this.scrollTo(0,0); -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { + this.destroy(); + }.bind(this)); + this.addScrollListeners(); -var isObject = __webpack_require__(53), - now = __webpack_require__(137), - toNumber = __webpack_require__(139); + if (this.isPaginated && this.settings.snap) { + this.snapper = new snap(this, this.settings.snap && typeof this.settings.snap === "object" && this.settings.snap); + } + } -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; + addScrollListeners() { + var scroller; + this.tick = core["requestAnimationFrame"]; + let dir = this.settings.direction === "rtl" && this.settings.rtlScrollType === "default" ? -1 : 1; + this.scrollDeltaVert = 0; + this.scrollDeltaHorz = 0; -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max, - nativeMin = Math.min; + if (!this.settings.fullsize) { + scroller = this.container; + this.scrollTop = this.container.scrollTop; + this.scrollLeft = this.container.scrollLeft; + } else { + scroller = window; + this.scrollTop = window.scrollY * dir; + this.scrollLeft = window.scrollX * dir; + } -/** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ -function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; + this._onScroll = this.onScroll.bind(this); + scroller.addEventListener("scroll", this._onScroll); + this._scrolled = debounce_default()(this.scrolled.bind(this), 30); // this.tick.call(window, this.onScroll.bind(this)); - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; + this.didScroll = false; } - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; + removeEventListeners() { + var scroller; - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } + if (!this.settings.fullsize) { + scroller = this.container; + } else { + scroller = window; + } - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; + scroller.removeEventListener("scroll", this._onScroll); + this._onScroll = undefined; } - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; + onScroll() { + let scrollTop; + let scrollLeft; + let dir = this.settings.direction === "rtl" && this.settings.rtlScrollType === "default" ? -1 : 1; - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } + if (!this.settings.fullsize) { + scrollTop = this.container.scrollTop; + scrollLeft = this.container.scrollLeft; + } else { + scrollTop = window.scrollY * dir; + scrollLeft = window.scrollX * dir; + } - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; + this.scrollTop = scrollTop; + this.scrollLeft = scrollLeft; - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); - } + if (!this.ignore) { + this._scrolled(); + } else { + this.ignore = false; + } - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); + this.scrollDeltaVert += Math.abs(scrollTop - this.prevScrollTop); + this.scrollDeltaHorz += Math.abs(scrollLeft - this.prevScrollLeft); + this.prevScrollTop = scrollTop; + this.prevScrollLeft = scrollLeft; + clearTimeout(this.scrollTimeout); + this.scrollTimeout = setTimeout(function () { + this.scrollDeltaVert = 0; + this.scrollDeltaHorz = 0; + }.bind(this), 150); + clearTimeout(this.afterScrolled); + this.didScroll = false; } - function trailingEdge(time) { - timerId = undefined; + scrolled() { + this.q.enqueue(function () { + return this.check(); + }.bind(this)); + this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLL, { + top: this.scrollTop, + left: this.scrollLeft + }); + clearTimeout(this.afterScrolled); + this.afterScrolled = setTimeout(function () { + // Don't report scroll if we are about the snap + if (this.snapper && this.snapper.supportsTouch && this.snapper.needsSnap()) { + return; + } - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; + this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLLED, { + top: this.scrollTop, + left: this.scrollLeft + }); + }.bind(this), this.settings.afterScrolledTimeout); } - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); + next() { + let delta = this.layout.props.name === "pre-paginated" && this.layout.props.spread ? this.layout.props.delta * 2 : this.layout.props.delta; + if (!this.views.length) return; + + if (this.isPaginated && this.settings.axis === "horizontal") { + this.scrollBy(delta, 0, true); + } else { + this.scrollBy(0, this.layout.height, true); } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; + + this.q.enqueue(function () { + return this.check(); + }.bind(this)); } - function flush() { - return timerId === undefined ? result : trailingEdge(now()); + prev() { + let delta = this.layout.props.name === "pre-paginated" && this.layout.props.spread ? this.layout.props.delta * 2 : this.layout.props.delta; + if (!this.views.length) return; + + if (this.isPaginated && this.settings.axis === "horizontal") { + this.scrollBy(-delta, 0, true); + } else { + this.scrollBy(0, -this.layout.height, true); + } + + this.q.enqueue(function () { + return this.check(); + }.bind(this)); } - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); + updateFlow(flow) { + if (this.rendered && this.snapper) { + this.snapper.destroy(); + this.snapper = undefined; + } - lastArgs = arguments; - lastThis = this; - lastCallTime = time; + super.updateFlow(flow, "scroll"); - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - clearTimeout(timerId); - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } + if (this.rendered && this.isPaginated && this.settings.snap) { + this.snapper = new snap(this, this.settings.snap && typeof this.settings.snap === "object" && this.settings.snap); } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); + } + + destroy() { + super.destroy(); + + if (this.snapper) { + this.snapper.destroy(); } - return result; } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; -} -module.exports = debounce; +} +/* harmony default export */ var continuous = __webpack_exports__["a"] = (continuous_ContinuousViewManager); /***/ }), -/* 56 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; +/* WEBPACK VAR INJECTION */(function(global) {var require;var require;/*! + localForage -- Offline Storage, Improved + Version 1.10.0 + https://localforage.github.io/localForage + (c) 2013-2017 Mozilla, Apache License 2.0 +*/ +(function(f){if(true){module.exports=f()}else { var g; }})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw (f.code="MODULE_NOT_FOUND", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted + // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. + var scriptEl = global.document.createElement('script'); + scriptEl.onreadystatechange = function () { + nextTick(); -// EXTERNAL MODULE: ./src/utils/constants.js -var constants = __webpack_require__(1); + scriptEl.onreadystatechange = null; + scriptEl.parentNode.removeChild(scriptEl); + scriptEl = null; + }; + global.document.documentElement.appendChild(scriptEl); + }; + } else { + scheduleDrain = function () { + setTimeout(nextTick, 0); + }; + } +} -// EXTERNAL MODULE: ./node_modules/event-emitter/index.js -var event_emitter = __webpack_require__(3); -var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); +var draining; +var queue = []; +//named nextTick for less confusing stack traces +function nextTick() { + draining = true; + var i, oldQueue; + var len = queue.length; + while (len) { + oldQueue = queue; + queue = []; + i = -1; + while (++i < len) { + oldQueue[i](); + } + len = queue.length; + } + draining = false; +} -// CONCATENATED MODULE: ./src/managers/helpers/snap.js +module.exports = immediate; +function immediate(task) { + if (queue.push(task) === 1 && !draining) { + scheduleDrain(); + } +} +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],2:[function(_dereq_,module,exports){ +'use strict'; +var immediate = _dereq_(1); - // easing equations from https://github.com/danro/easing-js/blob/master/easing.js +/* istanbul ignore next */ +function INTERNAL() {} -const PI_D2 = Math.PI / 2; -const EASING_EQUATIONS = { - easeOutSine: function (pos) { - return Math.sin(pos * PI_D2); - }, - easeInOutSine: function (pos) { - return -0.5 * (Math.cos(Math.PI * pos) - 1); - }, - easeInOutQuint: function (pos) { - if ((pos /= 0.5) < 1) { - return 0.5 * Math.pow(pos, 5); - } +var handlers = {}; - return 0.5 * (Math.pow(pos - 2, 5) + 2); - }, - easeInCubic: function (pos) { - return Math.pow(pos, 3); - } -}; +var REJECTED = ['REJECTED']; +var FULFILLED = ['FULFILLED']; +var PENDING = ['PENDING']; -class snap_Snap { - constructor(manager, options) { - this.settings = Object(core["extend"])({ - duration: 80, - minVelocity: 0.2, - minDistance: 10, - easing: EASING_EQUATIONS['easeInCubic'] - }, options || {}); - this.supportsTouch = this.supportsTouch(); +module.exports = Promise; - if (this.supportsTouch) { - this.setup(manager); - } +function Promise(resolver) { + if (typeof resolver !== 'function') { + throw new TypeError('resolver must be a function'); } + this.state = PENDING; + this.queue = []; + this.outcome = void 0; + if (resolver !== INTERNAL) { + safelyResolveThenable(this, resolver); + } +} - setup(manager) { - this.manager = manager; - this.layout = this.manager.layout; - this.fullsize = this.manager.settings.fullsize; - - if (this.fullsize) { - this.element = this.manager.stage.element; - this.scroller = window; - this.disableScroll(); - } else { - this.element = this.manager.stage.container; - this.scroller = this.element; - this.element.style["WebkitOverflowScrolling"] = "touch"; - } // this.overflow = this.manager.overflow; - // set lookahead offset to page width - +Promise.prototype["catch"] = function (onRejected) { + return this.then(null, onRejected); +}; +Promise.prototype.then = function (onFulfilled, onRejected) { + if (typeof onFulfilled !== 'function' && this.state === FULFILLED || + typeof onRejected !== 'function' && this.state === REJECTED) { + return this; + } + var promise = new this.constructor(INTERNAL); + if (this.state !== PENDING) { + var resolver = this.state === FULFILLED ? onFulfilled : onRejected; + unwrap(promise, resolver, this.outcome); + } else { + this.queue.push(new QueueItem(promise, onFulfilled, onRejected)); + } - this.manager.settings.offset = this.layout.width; - this.manager.settings.afterScrolledTimeout = this.settings.duration * 2; - this.isVertical = this.manager.settings.axis === "vertical"; // disable snapping if not paginated or axis in not horizontal + return promise; +}; +function QueueItem(promise, onFulfilled, onRejected) { + this.promise = promise; + if (typeof onFulfilled === 'function') { + this.onFulfilled = onFulfilled; + this.callFulfilled = this.otherCallFulfilled; + } + if (typeof onRejected === 'function') { + this.onRejected = onRejected; + this.callRejected = this.otherCallRejected; + } +} +QueueItem.prototype.callFulfilled = function (value) { + handlers.resolve(this.promise, value); +}; +QueueItem.prototype.otherCallFulfilled = function (value) { + unwrap(this.promise, this.onFulfilled, value); +}; +QueueItem.prototype.callRejected = function (value) { + handlers.reject(this.promise, value); +}; +QueueItem.prototype.otherCallRejected = function (value) { + unwrap(this.promise, this.onRejected, value); +}; - if (!this.manager.isPaginated || this.isVertical) { - return; +function unwrap(promise, func, value) { + immediate(function () { + var returnValue; + try { + returnValue = func(value); + } catch (e) { + return handlers.reject(promise, e); + } + if (returnValue === promise) { + handlers.reject(promise, new TypeError('Cannot resolve promise with itself')); + } else { + handlers.resolve(promise, returnValue); } + }); +} - this.touchCanceler = false; - this.resizeCanceler = false; - this.snapping = false; - this.scrollLeft; - this.scrollTop; - this.startTouchX = undefined; - this.startTouchY = undefined; - this.startTime = undefined; - this.endTouchX = undefined; - this.endTouchY = undefined; - this.endTime = undefined; - this.addListeners(); +handlers.resolve = function (self, value) { + var result = tryCatch(getThen, value); + if (result.status === 'error') { + return handlers.reject(self, result.value); } + var thenable = result.value; - supportsTouch() { - if ('ontouchstart' in window || window.DocumentTouch && document instanceof DocumentTouch) { - return true; + if (thenable) { + safelyResolveThenable(self, thenable); + } else { + self.state = FULFILLED; + self.outcome = value; + var i = -1; + var len = self.queue.length; + while (++i < len) { + self.queue[i].callFulfilled(value); } - - return false; } - - disableScroll() { - this.element.style.overflow = "hidden"; + return self; +}; +handlers.reject = function (self, error) { + self.state = REJECTED; + self.outcome = error; + var i = -1; + var len = self.queue.length; + while (++i < len) { + self.queue[i].callRejected(error); } + return self; +}; - enableScroll() { - this.element.style.overflow = ""; +function getThen(obj) { + // Make sure we only access the accessor once as required by the spec + var then = obj && obj.then; + if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') { + return function appyThen() { + then.apply(obj, arguments); + }; } +} - addListeners() { - this._onResize = this.onResize.bind(this); - window.addEventListener('resize', this._onResize); - this._onScroll = this.onScroll.bind(this); - this.scroller.addEventListener('scroll', this._onScroll); - this._onTouchStart = this.onTouchStart.bind(this); - this.scroller.addEventListener('touchstart', this._onTouchStart, { - passive: true - }); - this.on('touchstart', this._onTouchStart); - this._onTouchMove = this.onTouchMove.bind(this); - this.scroller.addEventListener('touchmove', this._onTouchMove, { - passive: true - }); - this.on('touchmove', this._onTouchMove); - this._onTouchEnd = this.onTouchEnd.bind(this); - this.scroller.addEventListener('touchend', this._onTouchEnd, { - passive: true - }); - this.on('touchend', this._onTouchEnd); - this._afterDisplayed = this.afterDisplayed.bind(this); - this.manager.on(constants["c" /* EVENTS */].MANAGERS.ADDED, this._afterDisplayed); +function safelyResolveThenable(self, thenable) { + // Either fulfill, reject or reject with error + var called = false; + function onError(value) { + if (called) { + return; + } + called = true; + handlers.reject(self, value); } - removeListeners() { - window.removeEventListener('resize', this._onResize); - this._onResize = undefined; - this.scroller.removeEventListener('scroll', this._onScroll); - this._onScroll = undefined; - this.scroller.removeEventListener('touchstart', this._onTouchStart, { - passive: true - }); - this.off('touchstart', this._onTouchStart); - this._onTouchStart = undefined; - this.scroller.removeEventListener('touchmove', this._onTouchMove, { - passive: true - }); - this.off('touchmove', this._onTouchMove); - this._onTouchMove = undefined; - this.scroller.removeEventListener('touchend', this._onTouchEnd, { - passive: true - }); - this.off('touchend', this._onTouchEnd); - this._onTouchEnd = undefined; - this.manager.off(constants["c" /* EVENTS */].MANAGERS.ADDED, this._afterDisplayed); - this._afterDisplayed = undefined; + function onSuccess(value) { + if (called) { + return; + } + called = true; + handlers.resolve(self, value); } - afterDisplayed(view) { - let contents = view.contents; - ["touchstart", "touchmove", "touchend"].forEach(e => { - contents.on(e, ev => this.triggerViewEvent(ev, contents)); - }); + function tryToUnwrap() { + thenable(onSuccess, onError); } - triggerViewEvent(e, contents) { - this.emit(e.type, e, contents); + var result = tryCatch(tryToUnwrap); + if (result.status === 'error') { + onError(result.value); } +} - onScroll(e) { - this.scrollLeft = this.fullsize ? window.scrollX : this.scroller.scrollLeft; - this.scrollTop = this.fullsize ? window.scrollY : this.scroller.scrollTop; +function tryCatch(func, value) { + var out = {}; + try { + out.value = func(value); + out.status = 'success'; + } catch (e) { + out.status = 'error'; + out.value = e; } + return out; +} - onResize(e) { - this.resizeCanceler = true; +Promise.resolve = resolve; +function resolve(value) { + if (value instanceof this) { + return value; } + return handlers.resolve(new this(INTERNAL), value); +} - onTouchStart(e) { - let { - screenX, - screenY - } = e.touches[0]; - - if (this.fullsize) { - this.enableScroll(); - } - - this.touchCanceler = true; +Promise.reject = reject; +function reject(reason) { + var promise = new this(INTERNAL); + return handlers.reject(promise, reason); +} - if (!this.startTouchX) { - this.startTouchX = screenX; - this.startTouchY = screenY; - this.startTime = this.now(); - } +Promise.all = all; +function all(iterable) { + var self = this; + if (Object.prototype.toString.call(iterable) !== '[object Array]') { + return this.reject(new TypeError('must be an array')); + } - this.endTouchX = screenX; - this.endTouchY = screenY; - this.endTime = this.now(); + var len = iterable.length; + var called = false; + if (!len) { + return this.resolve([]); } - onTouchMove(e) { - let { - screenX, - screenY - } = e.touches[0]; - let deltaY = Math.abs(screenY - this.endTouchY); - this.touchCanceler = true; - - if (!this.fullsize && deltaY < 10) { - this.element.scrollLeft -= screenX - this.endTouchX; - } + var values = new Array(len); + var resolved = 0; + var i = -1; + var promise = new this(INTERNAL); - this.endTouchX = screenX; - this.endTouchY = screenY; - this.endTime = this.now(); + while (++i < len) { + allResolver(iterable[i], i); } - - onTouchEnd(e) { - if (this.fullsize) { - this.disableScroll(); - } - - this.touchCanceler = false; - let swipped = this.wasSwiped(); - - if (swipped !== 0) { - this.snap(swipped); - } else { - this.snap(); + return promise; + function allResolver(value, i) { + self.resolve(value).then(resolveFromAll, function (error) { + if (!called) { + called = true; + handlers.reject(promise, error); + } + }); + function resolveFromAll(outValue) { + values[i] = outValue; + if (++resolved === len && !called) { + called = true; + handlers.resolve(promise, values); + } } + } +} - this.startTouchX = undefined; - this.startTouchY = undefined; - this.startTime = undefined; - this.endTouchX = undefined; - this.endTouchY = undefined; - this.endTime = undefined; +Promise.race = race; +function race(iterable) { + var self = this; + if (Object.prototype.toString.call(iterable) !== '[object Array]') { + return this.reject(new TypeError('must be an array')); } - wasSwiped() { - let snapWidth = this.layout.pageWidth * this.layout.divisor; - let distance = this.endTouchX - this.startTouchX; - let absolute = Math.abs(distance); - let time = this.endTime - this.startTime; - let velocity = distance / time; - let minVelocity = this.settings.minVelocity; + var len = iterable.length; + var called = false; + if (!len) { + return this.resolve([]); + } - if (absolute <= this.settings.minDistance || absolute >= snapWidth) { - return 0; - } + var i = -1; + var promise = new this(INTERNAL); - if (velocity > minVelocity) { - // previous - return -1; - } else if (velocity < -minVelocity) { - // next - return 1; - } + while (++i < len) { + resolver(iterable[i]); } - - needsSnap() { - let left = this.scrollLeft; - let snapWidth = this.layout.pageWidth * this.layout.divisor; - return left % snapWidth !== 0; + return promise; + function resolver(value) { + self.resolve(value).then(function (response) { + if (!called) { + called = true; + handlers.resolve(promise, response); + } + }, function (error) { + if (!called) { + called = true; + handlers.reject(promise, error); + } + }); } +} - snap(howMany = 0) { - let left = this.scrollLeft; - let snapWidth = this.layout.pageWidth * this.layout.divisor; - let snapTo = Math.round(left / snapWidth) * snapWidth; - - if (howMany) { - snapTo += howMany * snapWidth; - } +},{"1":1}],3:[function(_dereq_,module,exports){ +(function (global){ +'use strict'; +if (typeof global.Promise !== 'function') { + global.Promise = _dereq_(2); +} - return this.smoothScrollTo(snapTo); - } +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"2":2}],4:[function(_dereq_,module,exports){ +'use strict'; - smoothScrollTo(destination) { - const deferred = new core["defer"](); - const start = this.scrollLeft; - const startTime = this.now(); - const duration = this.settings.duration; - const easing = this.settings.easing; - this.snapping = true; // add animation loop +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - function tick() { - const now = this.now(); - const time = Math.min(1, (now - startTime) / duration); - const timeFunction = easing(time); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (this.touchCanceler || this.resizeCanceler) { - this.resizeCanceler = false; - this.snapping = false; - deferred.resolve(); +function getIDB() { + /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */ + try { + if (typeof indexedDB !== 'undefined') { + return indexedDB; + } + if (typeof webkitIndexedDB !== 'undefined') { + return webkitIndexedDB; + } + if (typeof mozIndexedDB !== 'undefined') { + return mozIndexedDB; + } + if (typeof OIndexedDB !== 'undefined') { + return OIndexedDB; + } + if (typeof msIndexedDB !== 'undefined') { + return msIndexedDB; + } + } catch (e) { return; - } - - if (time < 1) { - window.requestAnimationFrame(tick.bind(this)); - this.scrollTo(start + (destination - start) * time, 0); - } else { - this.scrollTo(destination, 0); - this.snapping = false; - deferred.resolve(); - } } +} - tick.call(this); - return deferred.promise; - } +var idb = getIDB(); - scrollTo(left = 0, top = 0) { - if (this.fullsize) { - window.scroll(left, top); - } else { - this.scroller.scrollLeft = left; - this.scroller.scrollTop = top; - } - } +function isIndexedDBValid() { + try { + // Initialize IndexedDB; fall back to vendor-prefixed versions + // if needed. + if (!idb || !idb.open) { + return false; + } + // We mimic PouchDB here; + // + // We test for openDatabase because IE Mobile identifies itself + // as Safari. Oh the lulz... + var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform); - now() { - return 'now' in window.performance ? performance.now() : new Date().getTime(); - } + var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1; - destroy() { - if (!this.scroller) { - return; + // Safari <10.1 does not meet our requirements for IDB support + // (see: https://github.com/pouchdb/pouchdb/issues/5572). + // Safari 10.1 shipped with fetch, we can use that to detect it. + // Note: this creates issues with `window.fetch` polyfills and + // overrides; see: + // https://github.com/localForage/localForage/issues/856 + return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' && + // some outdated implementations of IDB that appear on Samsung + // and HTC Android devices <4.4 are missing IDBKeyRange + // See: https://github.com/mozilla/localForage/issues/128 + // See: https://github.com/mozilla/localForage/issues/272 + typeof IDBKeyRange !== 'undefined'; + } catch (e) { + return false; } +} - if (this.fullsize) { - this.enableScroll(); +// Abstracts constructing a Blob object, so it also works in older +// browsers that don't support the native Blob constructor. (i.e. +// old QtWebKit versions, at least). +// Abstracts constructing a Blob object, so it also works in older +// browsers that don't support the native Blob constructor. (i.e. +// old QtWebKit versions, at least). +function createBlob(parts, properties) { + /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */ + parts = parts || []; + properties = properties || {}; + try { + return new Blob(parts, properties); + } catch (e) { + if (e.name !== 'TypeError') { + throw e; + } + var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder; + var builder = new Builder(); + for (var i = 0; i < parts.length; i += 1) { + builder.append(parts[i]); + } + return builder.getBlob(properties.type); } +} - this.removeListeners(); - this.scroller = undefined; - } +// This is CommonJS because lie is an external dependency, so Rollup +// can just ignore it. +if (typeof Promise === 'undefined') { + // In the "nopromises" build this will just throw if you don't have + // a global promise object, but it would throw anyway later. + _dereq_(3); +} +var Promise$1 = Promise; +function executeCallback(promise, callback) { + if (callback) { + promise.then(function (result) { + callback(null, result); + }, function (error) { + callback(error); + }); + } } -event_emitter_default()(snap_Snap.prototype); -/* harmony default export */ var snap = (snap_Snap); -// EXTERNAL MODULE: ./node_modules/lodash/debounce.js -var debounce = __webpack_require__(55); -var debounce_default = /*#__PURE__*/__webpack_require__.n(debounce); +function executeTwoCallbacks(promise, callback, errorCallback) { + if (typeof callback === 'function') { + promise.then(callback); + } -// CONCATENATED MODULE: ./src/managers/continuous/index.js + if (typeof errorCallback === 'function') { + promise["catch"](errorCallback); + } +} + +function normalizeKey(key) { + // Cast the key to a string, as that's all we can set as a key. + if (typeof key !== 'string') { + console.warn(key + ' used as a key, but it is not a string.'); + key = String(key); + } + return key; +} +function getCallback() { + if (arguments.length && typeof arguments[arguments.length - 1] === 'function') { + return arguments[arguments.length - 1]; + } +} +// Some code originally from async_storage.js in +// [Gaia](https://github.com/mozilla-b2g/gaia). +var DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support'; +var supportsBlobs = void 0; +var dbContexts = {}; +var toString = Object.prototype.toString; +// Transaction Modes +var READ_ONLY = 'readonly'; +var READ_WRITE = 'readwrite'; +// Transform a binary string to an array buffer, because otherwise +// weird stuff happens when you try to work with the binary string directly. +// It is known. +// From http://stackoverflow.com/questions/14967647/ (continues on next line) +// encode-decode-image-with-base64-breaks-image (2013-04-21) +function _binStringToArrayBuffer(bin) { + var length = bin.length; + var buf = new ArrayBuffer(length); + var arr = new Uint8Array(buf); + for (var i = 0; i < length; i++) { + arr[i] = bin.charCodeAt(i); + } + return buf; +} -class continuous_ContinuousViewManager extends managers_default["a" /* default */] { - constructor(options) { - super(options); - this.name = "continuous"; - this.settings = Object(core["extend"])(this.settings || {}, { - infinite: true, - overflow: undefined, - axis: undefined, - writingMode: undefined, - flow: "scrolled", - offset: 500, - offsetDelta: 250, - width: undefined, - height: undefined, - snap: false, - afterScrolledTimeout: 10 +// +// Blobs are not supported in all versions of IndexedDB, notably +// Chrome <37 and Android <5. In those versions, storing a blob will throw. +// +// Various other blob bugs exist in Chrome v37-42 (inclusive). +// Detecting them is expensive and confusing to users, and Chrome 37-42 +// is at very low usage worldwide, so we do a hacky userAgent check instead. +// +// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120 +// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916 +// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836 +// +// Code borrowed from PouchDB. See: +// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js +// +function _checkBlobSupportWithoutCaching(idb) { + return new Promise$1(function (resolve) { + var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE); + var blob = createBlob(['']); + txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key'); + + txn.onabort = function (e) { + // If the transaction aborts now its due to not being able to + // write to the database, likely due to the disk being full + e.preventDefault(); + e.stopPropagation(); + resolve(false); + }; + + txn.oncomplete = function () { + var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/); + var matchedEdge = navigator.userAgent.match(/Edge\//); + // MS Edge pretends to be Chrome 42: + // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx + resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43); + }; + })["catch"](function () { + return false; // error, so assume unsupported }); - Object(core["extend"])(this.settings, options.settings || {}); // Gap can be 0, but defaults doesn't handle that +} - if (options.settings.gap != "undefined" && options.settings.gap === 0) { - this.settings.gap = options.settings.gap; +function _checkBlobSupport(idb) { + if (typeof supportsBlobs === 'boolean') { + return Promise$1.resolve(supportsBlobs); } + return _checkBlobSupportWithoutCaching(idb).then(function (value) { + supportsBlobs = value; + return supportsBlobs; + }); +} - this.viewSettings = { - ignoreClass: this.settings.ignoreClass, - axis: this.settings.axis, - flow: this.settings.flow, - layout: this.layout, - width: 0, - height: 0, - forceEvenPages: false - }; - this.scrollTop = 0; - this.scrollLeft = 0; - } +function _deferReadiness(dbInfo) { + var dbContext = dbContexts[dbInfo.name]; - display(section, target) { - return managers_default["a" /* default */].prototype.display.call(this, section, target).then(function () { - return this.fill(); - }.bind(this)); - } + // Create a deferred object representing the current database operation. + var deferredOperation = {}; - fill(_full) { - var full = _full || new core["defer"](); - this.q.enqueue(() => { - return this.check(); - }).then(result => { - if (result) { - this.fill(full); - } else { - full.resolve(); - } + deferredOperation.promise = new Promise$1(function (resolve, reject) { + deferredOperation.resolve = resolve; + deferredOperation.reject = reject; }); - return full.promise; - } - moveTo(offset) { - // var bounds = this.stage.bounds(); - // var dist = Math.floor(offset.top / bounds.height) * bounds.height; - var distX = 0, - distY = 0; - var offsetX = 0, - offsetY = 0; + // Enqueue the deferred operation. + dbContext.deferredOperations.push(deferredOperation); - if (!this.isPaginated) { - distY = offset.top; - offsetY = offset.top + this.settings.offsetDelta; + // Chain its promise to the database readiness. + if (!dbContext.dbReady) { + dbContext.dbReady = deferredOperation.promise; } else { - distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; - offsetX = distX + this.settings.offsetDelta; + dbContext.dbReady = dbContext.dbReady.then(function () { + return deferredOperation.promise; + }); } +} - if (distX > 0 || distY > 0) { - this.scrollBy(distX, distY, true); +function _advanceReadiness(dbInfo) { + var dbContext = dbContexts[dbInfo.name]; + + // Dequeue a deferred operation. + var deferredOperation = dbContext.deferredOperations.pop(); + + // Resolve its promise (which is part of the database readiness + // chain of promises). + if (deferredOperation) { + deferredOperation.resolve(); + return deferredOperation.promise; } - } +} - afterResized(view) { - this.emit(constants["c" /* EVENTS */].MANAGERS.RESIZE, view.section); - } // Remove Previous Listeners if present +function _rejectReadiness(dbInfo, err) { + var dbContext = dbContexts[dbInfo.name]; + // Dequeue a deferred operation. + var deferredOperation = dbContext.deferredOperations.pop(); - removeShownListeners(view) { - // view.off("shown", this.afterDisplayed); - // view.off("shown", this.afterDisplayedAbove); - view.onDisplayed = function () {}; - } + // Reject its promise (which is part of the database readiness + // chain of promises). + if (deferredOperation) { + deferredOperation.reject(err); + return deferredOperation.promise; + } +} - add(section) { - var view = this.createView(section); - this.views.append(view); - view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { - view.expanded = true; - }); - view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { - this.updateAxis(axis); - }); - view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { - this.updateWritingMode(mode); - }); // view.on(EVENTS.VIEWS.SHOWN, this.afterDisplayed.bind(this)); +function _getConnection(dbInfo, upgradeNeeded) { + return new Promise$1(function (resolve, reject) { + dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext(); - view.onDisplayed = this.afterDisplayed.bind(this); - view.onResize = this.afterResized.bind(this); - return view.display(this.request); - } + if (dbInfo.db) { + if (upgradeNeeded) { + _deferReadiness(dbInfo); + dbInfo.db.close(); + } else { + return resolve(dbInfo.db); + } + } - append(section) { - var view = this.createView(section); - view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { - view.expanded = true; - }); - view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { - this.updateAxis(axis); - }); - view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { - this.updateWritingMode(mode); - }); - this.views.append(view); - view.onDisplayed = this.afterDisplayed.bind(this); - return view; - } + var dbArgs = [dbInfo.name]; - prepend(section) { - var view = this.createView(section); - view.on(constants["c" /* EVENTS */].VIEWS.RESIZED, bounds => { - this.counter(bounds); - view.expanded = true; - }); - view.on(constants["c" /* EVENTS */].VIEWS.AXIS, axis => { - this.updateAxis(axis); - }); - view.on(constants["c" /* EVENTS */].VIEWS.WRITING_MODE, mode => { - this.updateWritingMode(mode); - }); - this.views.prepend(view); - view.onDisplayed = this.afterDisplayed.bind(this); - return view; - } + if (upgradeNeeded) { + dbArgs.push(dbInfo.version); + } - counter(bounds) { - if (this.settings.axis === "vertical") { - this.scrollBy(0, bounds.heightDelta, true); - } else { - this.scrollBy(bounds.widthDelta, 0, true); - } - } + var openreq = idb.open.apply(idb, dbArgs); - update(_offset) { - var container = this.bounds(); - var views = this.views.all(); - var viewsLength = views.length; - var visible = []; - var offset = typeof _offset != "undefined" ? _offset : this.settings.offset || 0; - var isVisible; - var view; - var updating = new core["defer"](); - var promises = []; + if (upgradeNeeded) { + openreq.onupgradeneeded = function (e) { + var db = openreq.result; + try { + db.createObjectStore(dbInfo.storeName); + if (e.oldVersion <= 1) { + // Added when support for blob shims was added + db.createObjectStore(DETECT_BLOB_SUPPORT_STORE); + } + } catch (ex) { + if (ex.name === 'ConstraintError') { + console.warn('The database "' + dbInfo.name + '"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.'); + } else { + throw ex; + } + } + }; + } - for (var i = 0; i < viewsLength; i++) { - view = views[i]; - isVisible = this.isVisible(view, offset, offset, container); + openreq.onerror = function (e) { + e.preventDefault(); + reject(openreq.error); + }; - if (isVisible === true) { - // console.log("visible " + view.index, view.displayed); - if (!view.displayed) { - let displayed = view.display(this.request).then(function (view) { - view.show(); - }, err => { - view.hide(); - }); - promises.push(displayed); - } else { - view.show(); - } + openreq.onsuccess = function () { + var db = openreq.result; + db.onversionchange = function (e) { + // Triggered when the database is modified (e.g. adding an objectStore) or + // deleted (even when initiated by other sessions in different tabs). + // Closing the connection here prevents those operations from being blocked. + // If the database is accessed again later by this instance, the connection + // will be reopened or the database recreated as needed. + e.target.close(); + }; + resolve(db); + _advanceReadiness(dbInfo); + }; + }); +} - visible.push(view); - } else { - this.q.enqueue(view.destroy.bind(view)); // console.log("hidden " + view.index, view.displayed); +function _getOriginalConnection(dbInfo) { + return _getConnection(dbInfo, false); +} - clearTimeout(this.trimTimeout); - this.trimTimeout = setTimeout(function () { - this.q.enqueue(this.trim.bind(this)); - }.bind(this), 250); - } - } +function _getUpgradedConnection(dbInfo) { + return _getConnection(dbInfo, true); +} - if (promises.length) { - return Promise.all(promises).catch(err => { - updating.reject(err); - }); - } else { - updating.resolve(); - return updating.promise; +function _isUpgradeNeeded(dbInfo, defaultVersion) { + if (!dbInfo.db) { + return true; } - } - check(_offsetLeft, _offsetTop) { - var checking = new core["defer"](); - var newViews = []; - var horizontal = this.settings.axis === "horizontal"; - var delta = this.settings.offset || 0; + var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName); + var isDowngrade = dbInfo.version < dbInfo.db.version; + var isUpgrade = dbInfo.version > dbInfo.db.version; - if (_offsetLeft && horizontal) { - delta = _offsetLeft; + if (isDowngrade) { + // If the version is not the default one + // then warn for impossible downgrade. + if (dbInfo.version !== defaultVersion) { + console.warn('The database "' + dbInfo.name + '"' + " can't be downgraded from version " + dbInfo.db.version + ' to version ' + dbInfo.version + '.'); + } + // Align the versions to prevent errors. + dbInfo.version = dbInfo.db.version; } - if (_offsetTop && !horizontal) { - delta = _offsetTop; - } + if (isUpgrade || isNewStore) { + // If the store is new then increment the version (if needed). + // This will trigger an "upgradeneeded" event which is required + // for creating a store. + if (isNewStore) { + var incVersion = dbInfo.db.version + 1; + if (incVersion > dbInfo.version) { + dbInfo.version = incVersion; + } + } - var bounds = this._bounds; // bounds saved this until resize + return true; + } - let offset = horizontal ? this.scrollLeft : this.scrollTop; - let visibleLength = horizontal ? Math.floor(bounds.width) : bounds.height; - let contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight; - let writingMode = this.writingMode && this.writingMode.indexOf("vertical") === 0 ? "vertical" : "horizontal"; - let rtlScrollType = this.settings.rtlScrollType; - let rtl = this.settings.direction === "rtl"; + return false; +} - if (!this.settings.fullsize) { - // Scroll offset starts at width of element - if (rtl && rtlScrollType === "default" && writingMode === "horizontal") { - offset = contentLength - visibleLength - offset; - } // Scroll offset starts at 0 and goes negative +// encode a blob for indexeddb engines that don't support blobs +function _encodeBlob(blob) { + return new Promise$1(function (resolve, reject) { + var reader = new FileReader(); + reader.onerror = reject; + reader.onloadend = function (e) { + var base64 = btoa(e.target.result || ''); + resolve({ + __local_forage_encoded_blob: true, + data: base64, + type: blob.type + }); + }; + reader.readAsBinaryString(blob); + }); +} +// decode an encoded blob +function _decodeBlob(encodedBlob) { + var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data)); + return createBlob([arrayBuff], { type: encodedBlob.type }); +} - if (rtl && rtlScrollType === "negative" && writingMode === "horizontal") { - offset = offset * -1; - } - } else { - // Scroll offset starts at 0 and goes negative - if (horizontal && rtl && rtlScrollType === "negative" || !horizontal && rtl && rtlScrollType === "default") { - offset = offset * -1; - } - } +// is this one of our fancy encoded blobs? +function _isEncodedBlob(value) { + return value && value.__local_forage_encoded_blob; +} - let prepend = () => { - let first = this.views.first(); - let prev = first && first.section.prev(); +// Specialize the default `ready()` function by making it dependent +// on the current database operations. Thus, the driver will be actually +// ready when it's been initialized (default) *and* there are no pending +// operations on the database (initiated by some other instances). +function _fullyReady(callback) { + var self = this; - if (prev) { - newViews.push(this.prepend(prev)); - } - }; + var promise = self._initReady().then(function () { + var dbContext = dbContexts[self._dbInfo.name]; - let append = () => { - let last = this.views.last(); - let next = last && last.section.next(); + if (dbContext && dbContext.dbReady) { + return dbContext.dbReady; + } + }); - if (next) { - newViews.push(this.append(next)); - } - }; + executeTwoCallbacks(promise, callback, callback); + return promise; +} - let end = offset + visibleLength + delta; - let start = offset - delta; +// Try to establish a new db connection to replace the +// current one which is broken (i.e. experiencing +// InvalidStateError while creating a transaction). +function _tryReconnect(dbInfo) { + _deferReadiness(dbInfo); - if (end >= contentLength) { - append(); - } + var dbContext = dbContexts[dbInfo.name]; + var forages = dbContext.forages; - if (start < 0) { - prepend(); + for (var i = 0; i < forages.length; i++) { + var forage = forages[i]; + if (forage._dbInfo.db) { + forage._dbInfo.db.close(); + forage._dbInfo.db = null; + } } + dbInfo.db = null; - let promises = newViews.map(view => { - return view.display(this.request); + return _getOriginalConnection(dbInfo).then(function (db) { + dbInfo.db = db; + if (_isUpgradeNeeded(dbInfo)) { + // Reopen the database for upgrading. + return _getUpgradedConnection(dbInfo); + } + return db; + }).then(function (db) { + // store the latest db reference + // in case the db was upgraded + dbInfo.db = dbContext.db = db; + for (var i = 0; i < forages.length; i++) { + forages[i]._dbInfo.db = db; + } + })["catch"](function (err) { + _rejectReadiness(dbInfo, err); + throw err; }); +} - if (newViews.length) { - return Promise.all(promises).then(() => { - return this.check(); - }).then(() => { - // Check to see if anything new is on screen after rendering - return this.update(delta); - }, err => { - return err; - }); - } else { - this.q.enqueue(function () { - this.update(); - }.bind(this)); - checking.resolve(false); - return checking.promise; +// FF doesn't like Promises (micro-tasks) and IDDB store operations, +// so we have to do it with callbacks +function createTransaction(dbInfo, mode, callback, retries) { + if (retries === undefined) { + retries = 1; } - } - - trim() { - var task = new core["defer"](); - var displayed = this.views.displayed(); - var first = displayed[0]; - var last = displayed[displayed.length - 1]; - var firstIndex = this.views.indexOf(first); - var lastIndex = this.views.indexOf(last); - var above = this.views.slice(0, firstIndex); - var below = this.views.slice(lastIndex + 1); // Erase all but last above - - for (var i = 0; i < above.length - 1; i++) { - this.erase(above[i], above); - } // Erase all except first below + try { + var tx = dbInfo.db.transaction(dbInfo.storeName, mode); + callback(null, tx); + } catch (err) { + if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) { + return Promise$1.resolve().then(function () { + if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) { + // increase the db version, to create the new ObjectStore + if (dbInfo.db) { + dbInfo.version = dbInfo.db.version + 1; + } + // Reopen the database for upgrading. + return _getUpgradedConnection(dbInfo); + } + }).then(function () { + return _tryReconnect(dbInfo).then(function () { + createTransaction(dbInfo, mode, callback, retries - 1); + }); + })["catch"](callback); + } - for (var j = 1; j < below.length; j++) { - this.erase(below[j]); + callback(err); } +} - task.resolve(); - return task.promise; - } +function createDbContext() { + return { + // Running localForages sharing a database. + forages: [], + // Shared database. + db: null, + // Database readiness (promise). + dbReady: null, + // Deferred operations on the database. + deferredOperations: [] + }; +} - erase(view, above) { - //Trim - var prevTop; - var prevLeft; +// Open the IndexedDB database (automatically creates one if one didn't +// previously exist), using any options set in the config. +function _initStorage(options) { + var self = this; + var dbInfo = { + db: null + }; - if (!this.settings.fullsize) { - prevTop = this.container.scrollTop; - prevLeft = this.container.scrollLeft; - } else { - prevTop = window.scrollY; - prevLeft = window.scrollX; + if (options) { + for (var i in options) { + dbInfo[i] = options[i]; + } } - var bounds = view.bounds(); - this.views.remove(view); + // Get the current context of the database; + var dbContext = dbContexts[dbInfo.name]; - if (above) { - if (this.settings.axis === "vertical") { - this.scrollTo(0, prevTop - bounds.height, true); - } else { - if (this.settings.direction === 'rtl') { - if (!this.settings.fullsize) { - this.scrollTo(prevLeft, 0, true); - } else { - this.scrollTo(prevLeft + Math.floor(bounds.width), 0, true); - } - } else { - this.scrollTo(prevLeft - Math.floor(bounds.width), 0, true); - } - } + // ...or create a new context. + if (!dbContext) { + dbContext = createDbContext(); + // Register the new context in the global container. + dbContexts[dbInfo.name] = dbContext; } - } - - addEventListeners(stage) { - window.addEventListener("unload", function (e) { - this.ignore = true; // this.scrollTo(0,0); - this.destroy(); - }.bind(this)); - this.addScrollListeners(); + // Register itself as a running localForage in the current context. + dbContext.forages.push(self); - if (this.isPaginated && this.settings.snap) { - this.snapper = new snap(this, this.settings.snap && typeof this.settings.snap === "object" && this.settings.snap); + // Replace the default `ready()` function with the specialized one. + if (!self._initReady) { + self._initReady = self.ready; + self.ready = _fullyReady; } - } - addScrollListeners() { - var scroller; - this.tick = core["requestAnimationFrame"]; - let dir = this.settings.direction === "rtl" && this.settings.rtlScrollType === "default" ? -1 : 1; - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; + // Create an array of initialization states of the related localForages. + var initPromises = []; - if (!this.settings.fullsize) { - scroller = this.container; - this.scrollTop = this.container.scrollTop; - this.scrollLeft = this.container.scrollLeft; - } else { - scroller = window; - this.scrollTop = window.scrollY * dir; - this.scrollLeft = window.scrollX * dir; + function ignoreErrors() { + // Don't handle errors here, + // just makes sure related localForages aren't pending. + return Promise$1.resolve(); } - this._onScroll = this.onScroll.bind(this); - scroller.addEventListener("scroll", this._onScroll); - this._scrolled = debounce_default()(this.scrolled.bind(this), 30); // this.tick.call(window, this.onScroll.bind(this)); + for (var j = 0; j < dbContext.forages.length; j++) { + var forage = dbContext.forages[j]; + if (forage !== self) { + // Don't wait for itself... + initPromises.push(forage._initReady()["catch"](ignoreErrors)); + } + } - this.didScroll = false; - } + // Take a snapshot of the related localForages. + var forages = dbContext.forages.slice(0); - removeEventListeners() { - var scroller; + // Initialize the connection process only when + // all the related localForages aren't pending. + return Promise$1.all(initPromises).then(function () { + dbInfo.db = dbContext.db; + // Get the connection or open a new one without upgrade. + return _getOriginalConnection(dbInfo); + }).then(function (db) { + dbInfo.db = db; + if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) { + // Reopen the database for upgrading. + return _getUpgradedConnection(dbInfo); + } + return db; + }).then(function (db) { + dbInfo.db = dbContext.db = db; + self._dbInfo = dbInfo; + // Share the final connection amongst related localForages. + for (var k = 0; k < forages.length; k++) { + var forage = forages[k]; + if (forage !== self) { + // Self is already up-to-date. + forage._dbInfo.db = dbInfo.db; + forage._dbInfo.version = dbInfo.version; + } + } + }); +} - if (!this.settings.fullsize) { - scroller = this.container; - } else { - scroller = window; - } +function getItem(key, callback) { + var self = this; - scroller.removeEventListener("scroll", this._onScroll); - this._onScroll = undefined; - } + key = normalizeKey(key); - onScroll() { - let scrollTop; - let scrollLeft; - let dir = this.settings.direction === "rtl" && this.settings.rtlScrollType === "default" ? -1 : 1; + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } - if (!this.settings.fullsize) { - scrollTop = this.container.scrollTop; - scrollLeft = this.container.scrollLeft; - } else { - scrollTop = window.scrollY * dir; - scrollLeft = window.scrollX * dir; - } + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.get(key); - this.scrollTop = scrollTop; - this.scrollLeft = scrollLeft; + req.onsuccess = function () { + var value = req.result; + if (value === undefined) { + value = null; + } + if (_isEncodedBlob(value)) { + value = _decodeBlob(value); + } + resolve(value); + }; - if (!this.ignore) { - this._scrolled(); - } else { - this.ignore = false; - } + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); - this.scrollDeltaVert += Math.abs(scrollTop - this.prevScrollTop); - this.scrollDeltaHorz += Math.abs(scrollLeft - this.prevScrollLeft); - this.prevScrollTop = scrollTop; - this.prevScrollLeft = scrollLeft; - clearTimeout(this.scrollTimeout); - this.scrollTimeout = setTimeout(function () { - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - }.bind(this), 150); - clearTimeout(this.afterScrolled); - this.didScroll = false; - } - - scrolled() { - this.q.enqueue(function () { - return this.check(); - }.bind(this)); - this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLL, { - top: this.scrollTop, - left: this.scrollLeft - }); - clearTimeout(this.afterScrolled); - this.afterScrolled = setTimeout(function () { - // Don't report scroll if we are about the snap - if (this.snapper && this.snapper.supportsTouch && this.snapper.needsSnap()) { - return; - } - - this.emit(constants["c" /* EVENTS */].MANAGERS.SCROLLED, { - top: this.scrollTop, - left: this.scrollLeft - }); - }.bind(this), this.settings.afterScrolledTimeout); - } + executeCallback(promise, callback); + return promise; +} - next() { - let delta = this.layout.props.name === "pre-paginated" && this.layout.props.spread ? this.layout.props.delta * 2 : this.layout.props.delta; - if (!this.views.length) return; +// Iterate over all items stored in database. +function iterate(iterator, callback) { + var self = this; - if (this.isPaginated && this.settings.axis === "horizontal") { - this.scrollBy(delta, 0, true); - } else { - this.scrollBy(0, this.layout.height, true); - } + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } - this.q.enqueue(function () { - return this.check(); - }.bind(this)); - } + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.openCursor(); + var iterationNumber = 1; - prev() { - let delta = this.layout.props.name === "pre-paginated" && this.layout.props.spread ? this.layout.props.delta * 2 : this.layout.props.delta; - if (!this.views.length) return; + req.onsuccess = function () { + var cursor = req.result; - if (this.isPaginated && this.settings.axis === "horizontal") { - this.scrollBy(-delta, 0, true); - } else { - this.scrollBy(0, -this.layout.height, true); - } + if (cursor) { + var value = cursor.value; + if (_isEncodedBlob(value)) { + value = _decodeBlob(value); + } + var result = iterator(value, cursor.key, iterationNumber++); - this.q.enqueue(function () { - return this.check(); - }.bind(this)); - } + // when the iterator callback returns any + // (non-`undefined`) value, then we stop + // the iteration immediately + if (result !== void 0) { + resolve(result); + } else { + cursor["continue"](); + } + } else { + resolve(); + } + }; - updateFlow(flow) { - if (this.rendered && this.snapper) { - this.snapper.destroy(); - this.snapper = undefined; - } + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); + }); - super.updateFlow(flow, "scroll"); + executeCallback(promise, callback); - if (this.rendered && this.isPaginated && this.settings.snap) { - this.snapper = new snap(this, this.settings.snap && typeof this.settings.snap === "object" && this.settings.snap); - } - } + return promise; +} - destroy() { - super.destroy(); +function setItem(key, value, callback) { + var self = this; - if (this.snapper) { - this.snapper.destroy(); - } - } + key = normalizeKey(key); -} + var promise = new Promise$1(function (resolve, reject) { + var dbInfo; + self.ready().then(function () { + dbInfo = self._dbInfo; + if (toString.call(value) === '[object Blob]') { + return _checkBlobSupport(dbInfo.db).then(function (blobSupport) { + if (blobSupport) { + return value; + } + return _encodeBlob(value); + }); + } + return value; + }).then(function (value) { + createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { + if (err) { + return reject(err); + } -/* harmony default export */ var continuous = __webpack_exports__["a"] = (continuous_ContinuousViewManager); + try { + var store = transaction.objectStore(self._dbInfo.storeName); -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { + // The reason we don't _save_ null is because IE 10 does + // not support saving the `null` type in IndexedDB. How + // ironic, given the bug below! + // See: https://github.com/mozilla/localForage/issues/161 + if (value === null) { + value = undefined; + } -/* WEBPACK VAR INJECTION */(function(global) {var require;var require;/*! - localForage -- Offline Storage, Improved - Version 1.7.3 - https://localforage.github.io/localForage - (c) 2013-2017 Mozilla, Apache License 2.0 -*/ -(function(f){if(true){module.exports=f()}else { var g; }})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw (f.code="MODULE_NOT_FOUND", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted - // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. - var scriptEl = global.document.createElement('script'); - scriptEl.onreadystatechange = function () { - nextTick(); - - scriptEl.onreadystatechange = null; - scriptEl.parentNode.removeChild(scriptEl); - scriptEl = null; - }; - global.document.documentElement.appendChild(scriptEl); - }; - } else { - scheduleDrain = function () { - setTimeout(nextTick, 0); - }; - } -} -var draining; -var queue = []; -//named nextTick for less confusing stack traces -function nextTick() { - draining = true; - var i, oldQueue; - var len = queue.length; - while (len) { - oldQueue = queue; - queue = []; - i = -1; - while (++i < len) { - oldQueue[i](); - } - len = queue.length; - } - draining = false; + executeCallback(promise, callback); + return promise; } -module.exports = immediate; -function immediate(task) { - if (queue.push(task) === 1 && !draining) { - scheduleDrain(); - } -} +function removeItem(key, callback) { + var self = this; -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],2:[function(_dereq_,module,exports){ -'use strict'; -var immediate = _dereq_(1); + key = normalizeKey(key); -/* istanbul ignore next */ -function INTERNAL() {} + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { + if (err) { + return reject(err); + } -var handlers = {}; - -var REJECTED = ['REJECTED']; -var FULFILLED = ['FULFILLED']; -var PENDING = ['PENDING']; - -module.exports = Promise; - -function Promise(resolver) { - if (typeof resolver !== 'function') { - throw new TypeError('resolver must be a function'); - } - this.state = PENDING; - this.queue = []; - this.outcome = void 0; - if (resolver !== INTERNAL) { - safelyResolveThenable(this, resolver); - } -} - -Promise.prototype["catch"] = function (onRejected) { - return this.then(null, onRejected); -}; -Promise.prototype.then = function (onFulfilled, onRejected) { - if (typeof onFulfilled !== 'function' && this.state === FULFILLED || - typeof onRejected !== 'function' && this.state === REJECTED) { - return this; - } - var promise = new this.constructor(INTERNAL); - if (this.state !== PENDING) { - var resolver = this.state === FULFILLED ? onFulfilled : onRejected; - unwrap(promise, resolver, this.outcome); - } else { - this.queue.push(new QueueItem(promise, onFulfilled, onRejected)); - } - - return promise; -}; -function QueueItem(promise, onFulfilled, onRejected) { - this.promise = promise; - if (typeof onFulfilled === 'function') { - this.onFulfilled = onFulfilled; - this.callFulfilled = this.otherCallFulfilled; - } - if (typeof onRejected === 'function') { - this.onRejected = onRejected; - this.callRejected = this.otherCallRejected; - } -} -QueueItem.prototype.callFulfilled = function (value) { - handlers.resolve(this.promise, value); -}; -QueueItem.prototype.otherCallFulfilled = function (value) { - unwrap(this.promise, this.onFulfilled, value); -}; -QueueItem.prototype.callRejected = function (value) { - handlers.reject(this.promise, value); -}; -QueueItem.prototype.otherCallRejected = function (value) { - unwrap(this.promise, this.onRejected, value); -}; - -function unwrap(promise, func, value) { - immediate(function () { - var returnValue; - try { - returnValue = func(value); - } catch (e) { - return handlers.reject(promise, e); - } - if (returnValue === promise) { - handlers.reject(promise, new TypeError('Cannot resolve promise with itself')); - } else { - handlers.resolve(promise, returnValue); - } - }); -} - -handlers.resolve = function (self, value) { - var result = tryCatch(getThen, value); - if (result.status === 'error') { - return handlers.reject(self, result.value); - } - var thenable = result.value; - - if (thenable) { - safelyResolveThenable(self, thenable); - } else { - self.state = FULFILLED; - self.outcome = value; - var i = -1; - var len = self.queue.length; - while (++i < len) { - self.queue[i].callFulfilled(value); - } - } - return self; -}; -handlers.reject = function (self, error) { - self.state = REJECTED; - self.outcome = error; - var i = -1; - var len = self.queue.length; - while (++i < len) { - self.queue[i].callRejected(error); - } - return self; -}; - -function getThen(obj) { - // Make sure we only access the accessor once as required by the spec - var then = obj && obj.then; - if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') { - return function appyThen() { - then.apply(obj, arguments); - }; - } -} - -function safelyResolveThenable(self, thenable) { - // Either fulfill, reject or reject with error - var called = false; - function onError(value) { - if (called) { - return; - } - called = true; - handlers.reject(self, value); - } - - function onSuccess(value) { - if (called) { - return; - } - called = true; - handlers.resolve(self, value); - } - - function tryToUnwrap() { - thenable(onSuccess, onError); - } - - var result = tryCatch(tryToUnwrap); - if (result.status === 'error') { - onError(result.value); - } -} - -function tryCatch(func, value) { - var out = {}; - try { - out.value = func(value); - out.status = 'success'; - } catch (e) { - out.status = 'error'; - out.value = e; - } - return out; -} - -Promise.resolve = resolve; -function resolve(value) { - if (value instanceof this) { - return value; - } - return handlers.resolve(new this(INTERNAL), value); -} - -Promise.reject = reject; -function reject(reason) { - var promise = new this(INTERNAL); - return handlers.reject(promise, reason); -} - -Promise.all = all; -function all(iterable) { - var self = this; - if (Object.prototype.toString.call(iterable) !== '[object Array]') { - return this.reject(new TypeError('must be an array')); - } - - var len = iterable.length; - var called = false; - if (!len) { - return this.resolve([]); - } - - var values = new Array(len); - var resolved = 0; - var i = -1; - var promise = new this(INTERNAL); - - while (++i < len) { - allResolver(iterable[i], i); - } - return promise; - function allResolver(value, i) { - self.resolve(value).then(resolveFromAll, function (error) { - if (!called) { - called = true; - handlers.reject(promise, error); - } - }); - function resolveFromAll(outValue) { - values[i] = outValue; - if (++resolved === len && !called) { - called = true; - handlers.resolve(promise, values); - } - } - } -} - -Promise.race = race; -function race(iterable) { - var self = this; - if (Object.prototype.toString.call(iterable) !== '[object Array]') { - return this.reject(new TypeError('must be an array')); - } - - var len = iterable.length; - var called = false; - if (!len) { - return this.resolve([]); - } - - var i = -1; - var promise = new this(INTERNAL); - - while (++i < len) { - resolver(iterable[i]); - } - return promise; - function resolver(value) { - self.resolve(value).then(function (response) { - if (!called) { - called = true; - handlers.resolve(promise, response); - } - }, function (error) { - if (!called) { - called = true; - handlers.reject(promise, error); - } - }); - } -} - -},{"1":1}],3:[function(_dereq_,module,exports){ -(function (global){ -'use strict'; -if (typeof global.Promise !== 'function') { - global.Promise = _dereq_(2); -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"2":2}],4:[function(_dereq_,module,exports){ -'use strict'; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function getIDB() { - /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */ - try { - if (typeof indexedDB !== 'undefined') { - return indexedDB; - } - if (typeof webkitIndexedDB !== 'undefined') { - return webkitIndexedDB; - } - if (typeof mozIndexedDB !== 'undefined') { - return mozIndexedDB; - } - if (typeof OIndexedDB !== 'undefined') { - return OIndexedDB; - } - if (typeof msIndexedDB !== 'undefined') { - return msIndexedDB; - } - } catch (e) { - return; - } -} - -var idb = getIDB(); - -function isIndexedDBValid() { - try { - // Initialize IndexedDB; fall back to vendor-prefixed versions - // if needed. - if (!idb) { - return false; - } - // We mimic PouchDB here; - // - // We test for openDatabase because IE Mobile identifies itself - // as Safari. Oh the lulz... - var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform); - - var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1; - - // Safari <10.1 does not meet our requirements for IDB support (#5572) - // since Safari 10.1 shipped with fetch, we can use that to detect it - return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' && - // some outdated implementations of IDB that appear on Samsung - // and HTC Android devices <4.4 are missing IDBKeyRange - // See: https://github.com/mozilla/localForage/issues/128 - // See: https://github.com/mozilla/localForage/issues/272 - typeof IDBKeyRange !== 'undefined'; - } catch (e) { - return false; - } -} - -// Abstracts constructing a Blob object, so it also works in older -// browsers that don't support the native Blob constructor. (i.e. -// old QtWebKit versions, at least). -// Abstracts constructing a Blob object, so it also works in older -// browsers that don't support the native Blob constructor. (i.e. -// old QtWebKit versions, at least). -function createBlob(parts, properties) { - /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */ - parts = parts || []; - properties = properties || {}; - try { - return new Blob(parts, properties); - } catch (e) { - if (e.name !== 'TypeError') { - throw e; - } - var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder; - var builder = new Builder(); - for (var i = 0; i < parts.length; i += 1) { - builder.append(parts[i]); - } - return builder.getBlob(properties.type); - } -} - -// This is CommonJS because lie is an external dependency, so Rollup -// can just ignore it. -if (typeof Promise === 'undefined') { - // In the "nopromises" build this will just throw if you don't have - // a global promise object, but it would throw anyway later. - _dereq_(3); -} -var Promise$1 = Promise; - -function executeCallback(promise, callback) { - if (callback) { - promise.then(function (result) { - callback(null, result); - }, function (error) { - callback(error); - }); - } -} - -function executeTwoCallbacks(promise, callback, errorCallback) { - if (typeof callback === 'function') { - promise.then(callback); - } - - if (typeof errorCallback === 'function') { - promise["catch"](errorCallback); - } -} - -function normalizeKey(key) { - // Cast the key to a string, as that's all we can set as a key. - if (typeof key !== 'string') { - console.warn(key + ' used as a key, but it is not a string.'); - key = String(key); - } - - return key; -} - -function getCallback() { - if (arguments.length && typeof arguments[arguments.length - 1] === 'function') { - return arguments[arguments.length - 1]; - } -} - -// Some code originally from async_storage.js in -// [Gaia](https://github.com/mozilla-b2g/gaia). - -var DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support'; -var supportsBlobs = void 0; -var dbContexts = {}; -var toString = Object.prototype.toString; - -// Transaction Modes -var READ_ONLY = 'readonly'; -var READ_WRITE = 'readwrite'; - -// Transform a binary string to an array buffer, because otherwise -// weird stuff happens when you try to work with the binary string directly. -// It is known. -// From http://stackoverflow.com/questions/14967647/ (continues on next line) -// encode-decode-image-with-base64-breaks-image (2013-04-21) -function _binStringToArrayBuffer(bin) { - var length = bin.length; - var buf = new ArrayBuffer(length); - var arr = new Uint8Array(buf); - for (var i = 0; i < length; i++) { - arr[i] = bin.charCodeAt(i); - } - return buf; -} - -// -// Blobs are not supported in all versions of IndexedDB, notably -// Chrome <37 and Android <5. In those versions, storing a blob will throw. -// -// Various other blob bugs exist in Chrome v37-42 (inclusive). -// Detecting them is expensive and confusing to users, and Chrome 37-42 -// is at very low usage worldwide, so we do a hacky userAgent check instead. -// -// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120 -// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916 -// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836 -// -// Code borrowed from PouchDB. See: -// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js -// -function _checkBlobSupportWithoutCaching(idb) { - return new Promise$1(function (resolve) { - var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE); - var blob = createBlob(['']); - txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key'); - - txn.onabort = function (e) { - // If the transaction aborts now its due to not being able to - // write to the database, likely due to the disk being full - e.preventDefault(); - e.stopPropagation(); - resolve(false); - }; - - txn.oncomplete = function () { - var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/); - var matchedEdge = navigator.userAgent.match(/Edge\//); - // MS Edge pretends to be Chrome 42: - // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx - resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43); - }; - })["catch"](function () { - return false; // error, so assume unsupported - }); -} - -function _checkBlobSupport(idb) { - if (typeof supportsBlobs === 'boolean') { - return Promise$1.resolve(supportsBlobs); - } - return _checkBlobSupportWithoutCaching(idb).then(function (value) { - supportsBlobs = value; - return supportsBlobs; - }); -} - -function _deferReadiness(dbInfo) { - var dbContext = dbContexts[dbInfo.name]; - - // Create a deferred object representing the current database operation. - var deferredOperation = {}; - - deferredOperation.promise = new Promise$1(function (resolve, reject) { - deferredOperation.resolve = resolve; - deferredOperation.reject = reject; - }); - - // Enqueue the deferred operation. - dbContext.deferredOperations.push(deferredOperation); - - // Chain its promise to the database readiness. - if (!dbContext.dbReady) { - dbContext.dbReady = deferredOperation.promise; - } else { - dbContext.dbReady = dbContext.dbReady.then(function () { - return deferredOperation.promise; - }); - } -} - -function _advanceReadiness(dbInfo) { - var dbContext = dbContexts[dbInfo.name]; - - // Dequeue a deferred operation. - var deferredOperation = dbContext.deferredOperations.pop(); - - // Resolve its promise (which is part of the database readiness - // chain of promises). - if (deferredOperation) { - deferredOperation.resolve(); - return deferredOperation.promise; - } -} - -function _rejectReadiness(dbInfo, err) { - var dbContext = dbContexts[dbInfo.name]; - - // Dequeue a deferred operation. - var deferredOperation = dbContext.deferredOperations.pop(); - - // Reject its promise (which is part of the database readiness - // chain of promises). - if (deferredOperation) { - deferredOperation.reject(err); - return deferredOperation.promise; - } -} - -function _getConnection(dbInfo, upgradeNeeded) { - return new Promise$1(function (resolve, reject) { - dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext(); - - if (dbInfo.db) { - if (upgradeNeeded) { - _deferReadiness(dbInfo); - dbInfo.db.close(); - } else { - return resolve(dbInfo.db); - } - } - - var dbArgs = [dbInfo.name]; - - if (upgradeNeeded) { - dbArgs.push(dbInfo.version); - } - - var openreq = idb.open.apply(idb, dbArgs); - - if (upgradeNeeded) { - openreq.onupgradeneeded = function (e) { - var db = openreq.result; - try { - db.createObjectStore(dbInfo.storeName); - if (e.oldVersion <= 1) { - // Added when support for blob shims was added - db.createObjectStore(DETECT_BLOB_SUPPORT_STORE); - } - } catch (ex) { - if (ex.name === 'ConstraintError') { - console.warn('The database "' + dbInfo.name + '"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.'); - } else { - throw ex; - } - } - }; - } - - openreq.onerror = function (e) { - e.preventDefault(); - reject(openreq.error); - }; - - openreq.onsuccess = function () { - resolve(openreq.result); - _advanceReadiness(dbInfo); - }; - }); -} - -function _getOriginalConnection(dbInfo) { - return _getConnection(dbInfo, false); -} - -function _getUpgradedConnection(dbInfo) { - return _getConnection(dbInfo, true); -} - -function _isUpgradeNeeded(dbInfo, defaultVersion) { - if (!dbInfo.db) { - return true; - } - - var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName); - var isDowngrade = dbInfo.version < dbInfo.db.version; - var isUpgrade = dbInfo.version > dbInfo.db.version; - - if (isDowngrade) { - // If the version is not the default one - // then warn for impossible downgrade. - if (dbInfo.version !== defaultVersion) { - console.warn('The database "' + dbInfo.name + '"' + " can't be downgraded from version " + dbInfo.db.version + ' to version ' + dbInfo.version + '.'); - } - // Align the versions to prevent errors. - dbInfo.version = dbInfo.db.version; - } - - if (isUpgrade || isNewStore) { - // If the store is new then increment the version (if needed). - // This will trigger an "upgradeneeded" event which is required - // for creating a store. - if (isNewStore) { - var incVersion = dbInfo.db.version + 1; - if (incVersion > dbInfo.version) { - dbInfo.version = incVersion; - } - } - - return true; - } - - return false; -} - -// encode a blob for indexeddb engines that don't support blobs -function _encodeBlob(blob) { - return new Promise$1(function (resolve, reject) { - var reader = new FileReader(); - reader.onerror = reject; - reader.onloadend = function (e) { - var base64 = btoa(e.target.result || ''); - resolve({ - __local_forage_encoded_blob: true, - data: base64, - type: blob.type - }); - }; - reader.readAsBinaryString(blob); - }); -} - -// decode an encoded blob -function _decodeBlob(encodedBlob) { - var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data)); - return createBlob([arrayBuff], { type: encodedBlob.type }); -} - -// is this one of our fancy encoded blobs? -function _isEncodedBlob(value) { - return value && value.__local_forage_encoded_blob; -} - -// Specialize the default `ready()` function by making it dependent -// on the current database operations. Thus, the driver will be actually -// ready when it's been initialized (default) *and* there are no pending -// operations on the database (initiated by some other instances). -function _fullyReady(callback) { - var self = this; - - var promise = self._initReady().then(function () { - var dbContext = dbContexts[self._dbInfo.name]; - - if (dbContext && dbContext.dbReady) { - return dbContext.dbReady; - } - }); - - executeTwoCallbacks(promise, callback, callback); - return promise; -} - -// Try to establish a new db connection to replace the -// current one which is broken (i.e. experiencing -// InvalidStateError while creating a transaction). -function _tryReconnect(dbInfo) { - _deferReadiness(dbInfo); - - var dbContext = dbContexts[dbInfo.name]; - var forages = dbContext.forages; - - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - if (forage._dbInfo.db) { - forage._dbInfo.db.close(); - forage._dbInfo.db = null; - } - } - dbInfo.db = null; - - return _getOriginalConnection(dbInfo).then(function (db) { - dbInfo.db = db; - if (_isUpgradeNeeded(dbInfo)) { - // Reopen the database for upgrading. - return _getUpgradedConnection(dbInfo); - } - return db; - }).then(function (db) { - // store the latest db reference - // in case the db was upgraded - dbInfo.db = dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - forages[i]._dbInfo.db = db; - } - })["catch"](function (err) { - _rejectReadiness(dbInfo, err); - throw err; - }); -} - -// FF doesn't like Promises (micro-tasks) and IDDB store operations, -// so we have to do it with callbacks -function createTransaction(dbInfo, mode, callback, retries) { - if (retries === undefined) { - retries = 1; - } - - try { - var tx = dbInfo.db.transaction(dbInfo.storeName, mode); - callback(null, tx); - } catch (err) { - if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) { - return Promise$1.resolve().then(function () { - if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) { - // increase the db version, to create the new ObjectStore - if (dbInfo.db) { - dbInfo.version = dbInfo.db.version + 1; - } - // Reopen the database for upgrading. - return _getUpgradedConnection(dbInfo); - } - }).then(function () { - return _tryReconnect(dbInfo).then(function () { - createTransaction(dbInfo, mode, callback, retries - 1); - }); - })["catch"](callback); - } - - callback(err); - } -} - -function createDbContext() { - return { - // Running localForages sharing a database. - forages: [], - // Shared database. - db: null, - // Database readiness (promise). - dbReady: null, - // Deferred operations on the database. - deferredOperations: [] - }; -} - -// Open the IndexedDB database (automatically creates one if one didn't -// previously exist), using any options set in the config. -function _initStorage(options) { - var self = this; - var dbInfo = { - db: null - }; - - if (options) { - for (var i in options) { - dbInfo[i] = options[i]; - } - } - - // Get the current context of the database; - var dbContext = dbContexts[dbInfo.name]; - - // ...or create a new context. - if (!dbContext) { - dbContext = createDbContext(); - // Register the new context in the global container. - dbContexts[dbInfo.name] = dbContext; - } - - // Register itself as a running localForage in the current context. - dbContext.forages.push(self); - - // Replace the default `ready()` function with the specialized one. - if (!self._initReady) { - self._initReady = self.ready; - self.ready = _fullyReady; - } - - // Create an array of initialization states of the related localForages. - var initPromises = []; - - function ignoreErrors() { - // Don't handle errors here, - // just makes sure related localForages aren't pending. - return Promise$1.resolve(); - } - - for (var j = 0; j < dbContext.forages.length; j++) { - var forage = dbContext.forages[j]; - if (forage !== self) { - // Don't wait for itself... - initPromises.push(forage._initReady()["catch"](ignoreErrors)); - } - } - - // Take a snapshot of the related localForages. - var forages = dbContext.forages.slice(0); - - // Initialize the connection process only when - // all the related localForages aren't pending. - return Promise$1.all(initPromises).then(function () { - dbInfo.db = dbContext.db; - // Get the connection or open a new one without upgrade. - return _getOriginalConnection(dbInfo); - }).then(function (db) { - dbInfo.db = db; - if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) { - // Reopen the database for upgrading. - return _getUpgradedConnection(dbInfo); - } - return db; - }).then(function (db) { - dbInfo.db = dbContext.db = db; - self._dbInfo = dbInfo; - // Share the final connection amongst related localForages. - for (var k = 0; k < forages.length; k++) { - var forage = forages[k]; - if (forage !== self) { - // Self is already up-to-date. - forage._dbInfo.db = dbInfo.db; - forage._dbInfo.version = dbInfo.version; - } - } - }); -} - -function getItem(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.get(key); - - req.onsuccess = function () { - var value = req.result; - if (value === undefined) { - value = null; - } - if (_isEncodedBlob(value)) { - value = _decodeBlob(value); - } - resolve(value); - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -// Iterate over all items stored in database. -function iterate(iterator, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.openCursor(); - var iterationNumber = 1; - - req.onsuccess = function () { - var cursor = req.result; - - if (cursor) { - var value = cursor.value; - if (_isEncodedBlob(value)) { - value = _decodeBlob(value); - } - var result = iterator(value, cursor.key, iterationNumber++); - - // when the iterator callback retuns any - // (non-`undefined`) value, then we stop - // the iteration immediately - if (result !== void 0) { - resolve(result); - } else { - cursor["continue"](); - } - } else { - resolve(); - } - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - - return promise; -} - -function setItem(key, value, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - var dbInfo; - self.ready().then(function () { - dbInfo = self._dbInfo; - if (toString.call(value) === '[object Blob]') { - return _checkBlobSupport(dbInfo.db).then(function (blobSupport) { - if (blobSupport) { - return value; - } - return _encodeBlob(value); - }); - } - return value; - }).then(function (value) { - createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - - // The reason we don't _save_ null is because IE 10 does - // not support saving the `null` type in IndexedDB. How - // ironic, given the bug below! - // See: https://github.com/mozilla/localForage/issues/161 - if (value === null) { - value = undefined; - } - - var req = store.put(value, key); - - transaction.oncomplete = function () { - // Cast to undefined so the value passed to - // callback/promise is the same as what one would get out - // of `getItem()` later. This leads to some weirdness - // (setItem('foo', undefined) will return `null`), but - // it's not my fault localStorage is our baseline and that - // it's weird. - if (value === undefined) { - value = null; - } - - resolve(value); - }; - transaction.onabort = transaction.onerror = function () { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function removeItem(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - // We use a Grunt task to make this safe for IE and some - // versions of Android (including those used by Cordova). - // Normally IE won't like `.delete()` and will insist on - // using `['delete']()`, but we have a build step that - // fixes this for us now. - var req = store["delete"](key); - transaction.oncomplete = function () { - resolve(); - }; - - transaction.onerror = function () { - reject(req.error); - }; - - // The request will be also be aborted if we've exceeded our storage - // space. - transaction.onabort = function () { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function clear(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.clear(); - - transaction.oncomplete = function () { - resolve(); - }; - - transaction.onabort = transaction.onerror = function () { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function length(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.count(); - - req.onsuccess = function () { - resolve(req.result); - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function key(n, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - if (n < 0) { - resolve(null); - - return; - } - - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var advanced = false; - var req = store.openCursor(); - - req.onsuccess = function () { - var cursor = req.result; - if (!cursor) { - // this means there weren't enough keys - resolve(null); - - return; - } - - if (n === 0) { - // We have the first key, return it if that's what they - // wanted. - resolve(cursor.key); - } else { - if (!advanced) { - // Otherwise, ask the cursor to skip ahead n - // records. - advanced = true; - cursor.advance(n); - } else { - // When we get here, we've got the nth key. - resolve(cursor.key); - } - } - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function keys(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.openCursor(); - var keys = []; - - req.onsuccess = function () { - var cursor = req.result; - - if (!cursor) { - resolve(keys); - return; - } - - keys.push(cursor.key); - cursor["continue"](); - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function dropInstance(options, callback) { - callback = getCallback.apply(this, arguments); - - var currentConfig = this.config(); - options = typeof options !== 'function' && options || {}; - if (!options.name) { - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject('Invalid arguments'); - } else { - var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db; - - var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) { - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - forages[i]._dbInfo.db = db; - } - return db; - }); - - if (!options.storeName) { - promise = dbPromise.then(function (db) { - _deferReadiness(options); - - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - - db.close(); - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - forage._dbInfo.db = null; - } - - var dropDBPromise = new Promise$1(function (resolve, reject) { - var req = idb.deleteDatabase(options.name); - - req.onerror = req.onblocked = function (err) { - var db = req.result; - if (db) { - db.close(); - } - reject(err); - }; - - req.onsuccess = function () { - var db = req.result; - if (db) { - db.close(); - } - resolve(db); - }; - }); - - return dropDBPromise.then(function (db) { - dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - var _forage = forages[i]; - _advanceReadiness(_forage._dbInfo); - } - })["catch"](function (err) { - (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); - throw err; - }); - }); - } else { - promise = dbPromise.then(function (db) { - if (!db.objectStoreNames.contains(options.storeName)) { - return; - } - - var newVersion = db.version + 1; - - _deferReadiness(options); - - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - - db.close(); - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - forage._dbInfo.db = null; - forage._dbInfo.version = newVersion; - } - - var dropObjectPromise = new Promise$1(function (resolve, reject) { - var req = idb.open(options.name, newVersion); - - req.onerror = function (err) { - var db = req.result; - db.close(); - reject(err); - }; - - req.onupgradeneeded = function () { - var db = req.result; - db.deleteObjectStore(options.storeName); - }; - - req.onsuccess = function () { - var db = req.result; - db.close(); - resolve(db); - }; - }); - - return dropObjectPromise.then(function (db) { - dbContext.db = db; - for (var j = 0; j < forages.length; j++) { - var _forage2 = forages[j]; - _forage2._dbInfo.db = db; - _advanceReadiness(_forage2._dbInfo); - } - })["catch"](function (err) { - (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); - throw err; - }); - }); - } - } - - executeCallback(promise, callback); - return promise; -} - -var asyncStorage = { - _driver: 'asyncStorage', - _initStorage: _initStorage, - _support: isIndexedDBValid(), - iterate: iterate, - getItem: getItem, - setItem: setItem, - removeItem: removeItem, - clear: clear, - length: length, - key: key, - keys: keys, - dropInstance: dropInstance -}; - -function isWebSQLValid() { - return typeof openDatabase === 'function'; -} - -// Sadly, the best way to save binary data in WebSQL/localStorage is serializing -// it to Base64, so this is how we store it to prevent very strange errors with less -// verbose ways of binary <-> string data storage. -var BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -var BLOB_TYPE_PREFIX = '~~local_forage_type~'; -var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/; - -var SERIALIZED_MARKER = '__lfsc__:'; -var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; - -// OMG the serializations! -var TYPE_ARRAYBUFFER = 'arbf'; -var TYPE_BLOB = 'blob'; -var TYPE_INT8ARRAY = 'si08'; -var TYPE_UINT8ARRAY = 'ui08'; -var TYPE_UINT8CLAMPEDARRAY = 'uic8'; -var TYPE_INT16ARRAY = 'si16'; -var TYPE_INT32ARRAY = 'si32'; -var TYPE_UINT16ARRAY = 'ur16'; -var TYPE_UINT32ARRAY = 'ui32'; -var TYPE_FLOAT32ARRAY = 'fl32'; -var TYPE_FLOAT64ARRAY = 'fl64'; -var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length; - -var toString$1 = Object.prototype.toString; - -function stringToBuffer(serializedString) { - // Fill the string into a ArrayBuffer. - var bufferLength = serializedString.length * 0.75; - var len = serializedString.length; - var i; - var p = 0; - var encoded1, encoded2, encoded3, encoded4; - - if (serializedString[serializedString.length - 1] === '=') { - bufferLength--; - if (serializedString[serializedString.length - 2] === '=') { - bufferLength--; - } - } - - var buffer = new ArrayBuffer(bufferLength); - var bytes = new Uint8Array(buffer); - - for (i = 0; i < len; i += 4) { - encoded1 = BASE_CHARS.indexOf(serializedString[i]); - encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]); - encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]); - encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]); - - /*jslint bitwise: true */ - bytes[p++] = encoded1 << 2 | encoded2 >> 4; - bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; - bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; - } - return buffer; -} - -// Converts a buffer to a string to store, serialized, in the backend -// storage library. -function bufferToString(buffer) { - // base64-arraybuffer - var bytes = new Uint8Array(buffer); - var base64String = ''; - var i; - - for (i = 0; i < bytes.length; i += 3) { - /*jslint bitwise: true */ - base64String += BASE_CHARS[bytes[i] >> 2]; - base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; - base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; - base64String += BASE_CHARS[bytes[i + 2] & 63]; - } - - if (bytes.length % 3 === 2) { - base64String = base64String.substring(0, base64String.length - 1) + '='; - } else if (bytes.length % 3 === 1) { - base64String = base64String.substring(0, base64String.length - 2) + '=='; - } - - return base64String; -} - -// Serialize a value, afterwards executing a callback (which usually -// instructs the `setItem()` callback/promise to be executed). This is how -// we store binary data with localStorage. -function serialize(value, callback) { - var valueType = ''; - if (value) { - valueType = toString$1.call(value); - } - - // Cannot use `value instanceof ArrayBuffer` or such here, as these - // checks fail when running the tests using casper.js... - // - // TODO: See why those tests fail and use a better solution. - if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) { - // Convert binary arrays to a string and prefix the string with - // a special marker. - var buffer; - var marker = SERIALIZED_MARKER; - - if (value instanceof ArrayBuffer) { - buffer = value; - marker += TYPE_ARRAYBUFFER; - } else { - buffer = value.buffer; - - if (valueType === '[object Int8Array]') { - marker += TYPE_INT8ARRAY; - } else if (valueType === '[object Uint8Array]') { - marker += TYPE_UINT8ARRAY; - } else if (valueType === '[object Uint8ClampedArray]') { - marker += TYPE_UINT8CLAMPEDARRAY; - } else if (valueType === '[object Int16Array]') { - marker += TYPE_INT16ARRAY; - } else if (valueType === '[object Uint16Array]') { - marker += TYPE_UINT16ARRAY; - } else if (valueType === '[object Int32Array]') { - marker += TYPE_INT32ARRAY; - } else if (valueType === '[object Uint32Array]') { - marker += TYPE_UINT32ARRAY; - } else if (valueType === '[object Float32Array]') { - marker += TYPE_FLOAT32ARRAY; - } else if (valueType === '[object Float64Array]') { - marker += TYPE_FLOAT64ARRAY; - } else { - callback(new Error('Failed to get type for BinaryArray')); - } - } - - callback(marker + bufferToString(buffer)); - } else if (valueType === '[object Blob]') { - // Conver the blob to a binaryArray and then to a string. - var fileReader = new FileReader(); - - fileReader.onload = function () { - // Backwards-compatible prefix for the blob type. - var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result); - - callback(SERIALIZED_MARKER + TYPE_BLOB + str); - }; - - fileReader.readAsArrayBuffer(value); - } else { - try { - callback(JSON.stringify(value)); - } catch (e) { - console.error("Couldn't convert value into a JSON string: ", value); - - callback(null, e); - } - } -} - -// Deserialize data we've inserted into a value column/field. We place -// special markers into our strings to mark them as encoded; this isn't -// as nice as a meta field, but it's the only sane thing we can do whilst -// keeping localStorage support intact. -// -// Oftentimes this will just deserialize JSON content, but if we have a -// special marker (SERIALIZED_MARKER, defined above), we will extract -// some kind of arraybuffer/binary data/typed array out of the string. -function deserialize(value) { - // If we haven't marked this string as being specially serialized (i.e. - // something other than serialized JSON), we can just return it and be - // done with it. - if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) { - return JSON.parse(value); - } - - // The following code deals with deserializing some kind of Blob or - // TypedArray. First we separate out the type of data we're dealing - // with from the data itself. - var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH); - var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH); - - var blobType; - // Backwards-compatible blob type serialization strategy. - // DBs created with older versions of localForage will simply not have the blob type. - if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) { - var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX); - blobType = matcher[1]; - serializedString = serializedString.substring(matcher[0].length); - } - var buffer = stringToBuffer(serializedString); - - // Return the right type based on the code/type set during - // serialization. - switch (type) { - case TYPE_ARRAYBUFFER: - return buffer; - case TYPE_BLOB: - return createBlob([buffer], { type: blobType }); - case TYPE_INT8ARRAY: - return new Int8Array(buffer); - case TYPE_UINT8ARRAY: - return new Uint8Array(buffer); - case TYPE_UINT8CLAMPEDARRAY: - return new Uint8ClampedArray(buffer); - case TYPE_INT16ARRAY: - return new Int16Array(buffer); - case TYPE_UINT16ARRAY: - return new Uint16Array(buffer); - case TYPE_INT32ARRAY: - return new Int32Array(buffer); - case TYPE_UINT32ARRAY: - return new Uint32Array(buffer); - case TYPE_FLOAT32ARRAY: - return new Float32Array(buffer); - case TYPE_FLOAT64ARRAY: - return new Float64Array(buffer); - default: - throw new Error('Unkown type: ' + type); - } -} - -var localforageSerializer = { - serialize: serialize, - deserialize: deserialize, - stringToBuffer: stringToBuffer, - bufferToString: bufferToString -}; - -/* - * Includes code from: - * - * base64-arraybuffer - * https://github.com/niklasvh/base64-arraybuffer - * - * Copyright (c) 2012 Niklas von Hertzen - * Licensed under the MIT license. - */ - -function createDbTable(t, dbInfo, callback, errorCallback) { - t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback); -} - -// Open the WebSQL database (automatically creates one if one didn't -// previously exist), using any options set in the config. -function _initStorage$1(options) { - var self = this; - var dbInfo = { - db: null - }; - - if (options) { - for (var i in options) { - dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i]; - } - } - - var dbInfoPromise = new Promise$1(function (resolve, reject) { - // Open the database; the openDatabase API will automatically - // create it for us if it doesn't exist. - try { - dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size); - } catch (e) { - return reject(e); - } - - // Create our key/value table if it doesn't exist. - dbInfo.db.transaction(function (t) { - createDbTable(t, dbInfo, function () { - self._dbInfo = dbInfo; - resolve(); - }, function (t, error) { - reject(error); - }); - }, reject); - }); - - dbInfo.serializer = localforageSerializer; - return dbInfoPromise; -} - -function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) { - t.executeSql(sqlStatement, args, callback, function (t, error) { - if (error.code === error.SYNTAX_ERR) { - t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name = ?", [dbInfo.storeName], function (t, results) { - if (!results.rows.length) { - // if the table is missing (was deleted) - // re-create it table and retry - createDbTable(t, dbInfo, function () { - t.executeSql(sqlStatement, args, callback, errorCallback); - }, errorCallback); - } else { - errorCallback(t, error); - } - }, errorCallback); - } else { - errorCallback(t, error); - } - }, errorCallback); -} - -function getItem$1(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) { - var result = results.rows.length ? results.rows.item(0).value : null; - - // Check to see if this is serialized content we need to - // unpack. - if (result) { - result = dbInfo.serializer.deserialize(result); - } - - resolve(result); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function iterate$1(iterator, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) { - var rows = results.rows; - var length = rows.length; - - for (var i = 0; i < length; i++) { - var item = rows.item(i); - var result = item.value; - - // Check to see if this is serialized content - // we need to unpack. - if (result) { - result = dbInfo.serializer.deserialize(result); - } - - result = iterator(result, item.key, i + 1); - - // void(0) prevents problems with redefinition - // of `undefined`. - if (result !== void 0) { - resolve(result); - return; - } - } - - resolve(); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function _setItem(key, value, callback, retriesLeft) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - // The localStorage API doesn't return undefined values in an - // "expected" way, so undefined is always cast to null in all - // drivers. See: https://github.com/mozilla/localForage/pull/42 - if (value === undefined) { - value = null; - } - - // Save the original value to pass to the callback. - var originalValue = value; - - var dbInfo = self._dbInfo; - dbInfo.serializer.serialize(value, function (value, error) { - if (error) { - reject(error); - } else { - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () { - resolve(originalValue); - }, function (t, error) { - reject(error); - }); - }, function (sqlError) { - // The transaction failed; check - // to see if it's a quota error. - if (sqlError.code === sqlError.QUOTA_ERR) { - // We reject the callback outright for now, but - // it's worth trying to re-run the transaction. - // Even if the user accepts the prompt to use - // more storage on Safari, this error will - // be called. - // - // Try to re-run the transaction. - if (retriesLeft > 0) { - resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1])); - return; - } - reject(sqlError); - } - }); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -function setItem$1(key, value, callback) { - return _setItem.apply(this, [key, value, callback, 1]); -} - -function removeItem$1(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () { - resolve(); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; -} - -// Deletes every item in the table. -// TODO: Find out if this resets the AUTO_INCREMENT number. -function clear$1(callback) { - var self = this; + try { + var store = transaction.objectStore(self._dbInfo.storeName); + // We use a Grunt task to make this safe for IE and some + // versions of Android (including those used by Cordova). + // Normally IE won't like `.delete()` and will insist on + // using `['delete']()`, but we have a build step that + // fixes this for us now. + var req = store["delete"](key); + transaction.oncomplete = function () { + resolve(); + }; - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () { - resolve(); - }, function (t, error) { - reject(error); - }); + transaction.onerror = function () { + reject(req.error); + }; + + // The request will be also be aborted if we've exceeded our storage + // space. + transaction.onabort = function () { + var err = req.error ? req.error : req.transaction.error; + reject(err); + }; + } catch (e) { + reject(e); + } }); })["catch"](reject); }); @@ -14952,50 +12371,31 @@ return promise; } -// Does a simple `COUNT(key)` to get the number of items stored in -// localForage. -function length$1(callback) { +function clear(callback) { var self = this; var promise = new Promise$1(function (resolve, reject) { self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - // Ahhh, SQL makes this one soooooo easy. - tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) { - var result = results.rows.item(0).c; - resolve(result); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); + createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { + if (err) { + return reject(err); + } - executeCallback(promise, callback); - return promise; -} + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.clear(); -// Return the key located at key index X; essentially gets the key from a -// `WHERE id = ?`. This is the most efficient way I can think to implement -// this rarely-used (in my experience) part of the API, but it can seem -// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so -// the ID of each key will change every time it's updated. Perhaps a stored -// procedure for the `setItem()` SQL would solve this problem? -// TODO: Don't change ID on `setItem()`. -function key$1(n, callback) { - var self = this; + transaction.oncomplete = function () { + resolve(); + }; - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) { - var result = results.rows.length ? results.rows.item(0).key : null; - resolve(result); - }, function (t, error) { - reject(error); - }); + transaction.onabort = transaction.onerror = function () { + var err = req.error ? req.error : req.transaction.error; + reject(err); + }; + } catch (e) { + reject(e); + } }); })["catch"](reject); }); @@ -15004,1650 +12404,1835 @@ return promise; } -function keys$1(callback) { +function length(callback) { var self = this; var promise = new Promise$1(function (resolve, reject) { self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) { - var keys = []; - - for (var i = 0; i < results.rows.length; i++) { - keys.push(results.rows.item(i).key); - } - - resolve(keys); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } - executeCallback(promise, callback); - return promise; -} + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.count(); -// https://www.w3.org/TR/webdatabase/#databases -// > There is no way to enumerate or delete the databases available for an origin from this API. -function getAllStoreNames(db) { - return new Promise$1(function (resolve, reject) { - db.transaction(function (t) { - t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, results) { - var storeNames = []; + req.onsuccess = function () { + resolve(req.result); + }; - for (var i = 0; i < results.rows.length; i++) { - storeNames.push(results.rows.item(i).name); + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); } - - resolve({ - db: db, - storeNames: storeNames - }); - }, function (t, error) { - reject(error); }); - }, function (sqlError) { - reject(sqlError); - }); + })["catch"](reject); }); -} - -function dropInstance$1(options, callback) { - callback = getCallback.apply(this, arguments); - - var currentConfig = this.config(); - options = typeof options !== 'function' && options || {}; - if (!options.name) { - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject('Invalid arguments'); - } else { - promise = new Promise$1(function (resolve) { - var db; - if (options.name === currentConfig.name) { - // use the db reference of the current instance - db = self._dbInfo.db; - } else { - db = openDatabase(options.name, '', '', 0); - } - - if (!options.storeName) { - // drop all database tables - resolve(getAllStoreNames(db)); - } else { - resolve({ - db: db, - storeNames: [options.storeName] - }); - } - }).then(function (operationInfo) { - return new Promise$1(function (resolve, reject) { - operationInfo.db.transaction(function (t) { - function dropTable(storeName) { - return new Promise$1(function (resolve, reject) { - t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () { - resolve(); - }, function (t, error) { - reject(error); - }); - }); - } - - var operations = []; - for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) { - operations.push(dropTable(operationInfo.storeNames[i])); - } - - Promise$1.all(operations).then(function () { - resolve(); - })["catch"](function (e) { - reject(e); - }); - }, function (sqlError) { - reject(sqlError); - }); - }); - }); - } executeCallback(promise, callback); return promise; } -var webSQLStorage = { - _driver: 'webSQLStorage', - _initStorage: _initStorage$1, - _support: isWebSQLValid(), - iterate: iterate$1, - getItem: getItem$1, - setItem: setItem$1, - removeItem: removeItem$1, - clear: clear$1, - length: length$1, - key: key$1, - keys: keys$1, - dropInstance: dropInstance$1 -}; - -function isLocalStorageValid() { - try { - return typeof localStorage !== 'undefined' && 'setItem' in localStorage && - // in IE8 typeof localStorage.setItem === 'object' - !!localStorage.setItem; - } catch (e) { - return false; - } -} - -function _getKeyPrefix(options, defaultConfig) { - var keyPrefix = options.name + '/'; - - if (options.storeName !== defaultConfig.storeName) { - keyPrefix += options.storeName + '/'; - } - return keyPrefix; -} - -// Check if localStorage throws when saving an item -function checkIfLocalStorageThrows() { - var localStorageTestKey = '_localforage_support_test'; - - try { - localStorage.setItem(localStorageTestKey, true); - localStorage.removeItem(localStorageTestKey); - - return false; - } catch (e) { - return true; - } -} +function key(n, callback) { + var self = this; -// Check if localStorage is usable and allows to save an item -// This method checks if localStorage is usable in Safari Private Browsing -// mode, or in any other case where the available quota for localStorage -// is 0 and there wasn't any saved items yet. -function _isLocalStorageUsable() { - return !checkIfLocalStorageThrows() || localStorage.length > 0; -} + var promise = new Promise$1(function (resolve, reject) { + if (n < 0) { + resolve(null); -// Config the localStorage backend, using options set in the config. -function _initStorage$2(options) { - var self = this; - var dbInfo = {}; - if (options) { - for (var i in options) { - dbInfo[i] = options[i]; + return; } - } - - dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig); - if (!_isLocalStorageUsable()) { - return Promise$1.reject(); - } + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } - self._dbInfo = dbInfo; - dbInfo.serializer = localforageSerializer; + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var advanced = false; + var req = store.openKeyCursor(); - return Promise$1.resolve(); -} + req.onsuccess = function () { + var cursor = req.result; + if (!cursor) { + // this means there weren't enough keys + resolve(null); -// Remove all keys from the datastore, effectively destroying all data in -// the app's key/value store! -function clear$2(callback) { - var self = this; - var promise = self.ready().then(function () { - var keyPrefix = self._dbInfo.keyPrefix; + return; + } - for (var i = localStorage.length - 1; i >= 0; i--) { - var key = localStorage.key(i); + if (n === 0) { + // We have the first key, return it if that's what they + // wanted. + resolve(cursor.key); + } else { + if (!advanced) { + // Otherwise, ask the cursor to skip ahead n + // records. + advanced = true; + cursor.advance(n); + } else { + // When we get here, we've got the nth key. + resolve(cursor.key); + } + } + }; - if (key.indexOf(keyPrefix) === 0) { - localStorage.removeItem(key); - } - } + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); }); executeCallback(promise, callback); return promise; } -// Retrieve an item from the store. Unlike the original async_storage -// library in Gaia, we don't modify return values at all. If a key's value -// is `undefined`, we pass that value to the callback function. -function getItem$2(key, callback) { +function keys(callback) { var self = this; - key = normalizeKey(key); + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { + if (err) { + return reject(err); + } - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var result = localStorage.getItem(dbInfo.keyPrefix + key); + try { + var store = transaction.objectStore(self._dbInfo.storeName); + var req = store.openKeyCursor(); + var keys = []; - // If a result was found, parse it from the serialized - // string into a JS object. If result isn't truthy, the key - // is likely undefined and we'll pass it straight to the - // callback. - if (result) { - result = dbInfo.serializer.deserialize(result); - } + req.onsuccess = function () { + var cursor = req.result; - return result; + if (!cursor) { + resolve(keys); + return; + } + + keys.push(cursor.key); + cursor["continue"](); + }; + + req.onerror = function () { + reject(req.error); + }; + } catch (e) { + reject(e); + } + }); + })["catch"](reject); }); executeCallback(promise, callback); return promise; } -// Iterate over all items in the store. -function iterate$2(iterator, callback) { - var self = this; +function dropInstance(options, callback) { + callback = getCallback.apply(this, arguments); - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var keyPrefix = dbInfo.keyPrefix; - var keyPrefixLength = keyPrefix.length; - var length = localStorage.length; + var currentConfig = this.config(); + options = typeof options !== 'function' && options || {}; + if (!options.name) { + options.name = options.name || currentConfig.name; + options.storeName = options.storeName || currentConfig.storeName; + } - // We use a dedicated iterator instead of the `i` variable below - // so other keys we fetch in localStorage aren't counted in - // the `iterationNumber` argument passed to the `iterate()` - // callback. - // - // See: github.com/mozilla/localForage/pull/435#discussion_r38061530 - var iterationNumber = 1; + var self = this; + var promise; + if (!options.name) { + promise = Promise$1.reject('Invalid arguments'); + } else { + var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db; - for (var i = 0; i < length; i++) { - var key = localStorage.key(i); - if (key.indexOf(keyPrefix) !== 0) { - continue; + var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) { + var dbContext = dbContexts[options.name]; + var forages = dbContext.forages; + dbContext.db = db; + for (var i = 0; i < forages.length; i++) { + forages[i]._dbInfo.db = db; } - var value = localStorage.getItem(key); + return db; + }); - // If a result was found, parse it from the serialized - // string into a JS object. If result isn't truthy, the - // key is likely undefined and we'll pass it straight - // to the iterator. - if (value) { - value = dbInfo.serializer.deserialize(value); - } + if (!options.storeName) { + promise = dbPromise.then(function (db) { + _deferReadiness(options); - value = iterator(value, key.substring(keyPrefixLength), iterationNumber++); + var dbContext = dbContexts[options.name]; + var forages = dbContext.forages; - if (value !== void 0) { - return value; - } - } - }); + db.close(); + for (var i = 0; i < forages.length; i++) { + var forage = forages[i]; + forage._dbInfo.db = null; + } - executeCallback(promise, callback); - return promise; -} + var dropDBPromise = new Promise$1(function (resolve, reject) { + var req = idb.deleteDatabase(options.name); -// Same as localStorage's key() method, except takes a callback. -function key$2(n, callback) { - var self = this; - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var result; - try { - result = localStorage.key(n); - } catch (error) { - result = null; - } + req.onerror = function () { + var db = req.result; + if (db) { + db.close(); + } + reject(req.error); + }; - // Remove the prefix from the key, if a key is found. - if (result) { - result = result.substring(dbInfo.keyPrefix.length); - } + req.onblocked = function () { + // Closing all open connections in onversionchange handler should prevent this situation, but if + // we do get here, it just means the request remains pending - eventually it will succeed or error + console.warn('dropInstance blocked for database "' + options.name + '" until all open connections are closed'); + }; - return result; - }); + req.onsuccess = function () { + var db = req.result; + if (db) { + db.close(); + } + resolve(db); + }; + }); - executeCallback(promise, callback); - return promise; -} + return dropDBPromise.then(function (db) { + dbContext.db = db; + for (var i = 0; i < forages.length; i++) { + var _forage = forages[i]; + _advanceReadiness(_forage._dbInfo); + } + })["catch"](function (err) { + (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); + throw err; + }); + }); + } else { + promise = dbPromise.then(function (db) { + if (!db.objectStoreNames.contains(options.storeName)) { + return; + } -function keys$2(callback) { - var self = this; - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var length = localStorage.length; - var keys = []; + var newVersion = db.version + 1; + + _deferReadiness(options); + + var dbContext = dbContexts[options.name]; + var forages = dbContext.forages; + + db.close(); + for (var i = 0; i < forages.length; i++) { + var forage = forages[i]; + forage._dbInfo.db = null; + forage._dbInfo.version = newVersion; + } + + var dropObjectPromise = new Promise$1(function (resolve, reject) { + var req = idb.open(options.name, newVersion); + + req.onerror = function (err) { + var db = req.result; + db.close(); + reject(err); + }; + + req.onupgradeneeded = function () { + var db = req.result; + db.deleteObjectStore(options.storeName); + }; - for (var i = 0; i < length; i++) { - var itemKey = localStorage.key(i); - if (itemKey.indexOf(dbInfo.keyPrefix) === 0) { - keys.push(itemKey.substring(dbInfo.keyPrefix.length)); - } - } + req.onsuccess = function () { + var db = req.result; + db.close(); + resolve(db); + }; + }); - return keys; - }); + return dropObjectPromise.then(function (db) { + dbContext.db = db; + for (var j = 0; j < forages.length; j++) { + var _forage2 = forages[j]; + _forage2._dbInfo.db = db; + _advanceReadiness(_forage2._dbInfo); + } + })["catch"](function (err) { + (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); + throw err; + }); + }); + } + } executeCallback(promise, callback); return promise; } -// Supply the number of keys in the datastore to the callback function. -function length$2(callback) { - var self = this; - var promise = self.keys().then(function (keys) { - return keys.length; - }); +var asyncStorage = { + _driver: 'asyncStorage', + _initStorage: _initStorage, + _support: isIndexedDBValid(), + iterate: iterate, + getItem: getItem, + setItem: setItem, + removeItem: removeItem, + clear: clear, + length: length, + key: key, + keys: keys, + dropInstance: dropInstance +}; - executeCallback(promise, callback); - return promise; +function isWebSQLValid() { + return typeof openDatabase === 'function'; } -// Remove an item from the store, nice and simple. -function removeItem$2(key, callback) { - var self = this; +// Sadly, the best way to save binary data in WebSQL/localStorage is serializing +// it to Base64, so this is how we store it to prevent very strange errors with less +// verbose ways of binary <-> string data storage. +var BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - key = normalizeKey(key); +var BLOB_TYPE_PREFIX = '~~local_forage_type~'; +var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/; - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - localStorage.removeItem(dbInfo.keyPrefix + key); - }); +var SERIALIZED_MARKER = '__lfsc__:'; +var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; - executeCallback(promise, callback); - return promise; -} +// OMG the serializations! +var TYPE_ARRAYBUFFER = 'arbf'; +var TYPE_BLOB = 'blob'; +var TYPE_INT8ARRAY = 'si08'; +var TYPE_UINT8ARRAY = 'ui08'; +var TYPE_UINT8CLAMPEDARRAY = 'uic8'; +var TYPE_INT16ARRAY = 'si16'; +var TYPE_INT32ARRAY = 'si32'; +var TYPE_UINT16ARRAY = 'ur16'; +var TYPE_UINT32ARRAY = 'ui32'; +var TYPE_FLOAT32ARRAY = 'fl32'; +var TYPE_FLOAT64ARRAY = 'fl64'; +var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length; -// Set a key's value and run an optional callback once the value is set. -// Unlike Gaia's implementation, the callback function is passed the value, -// in case you want to operate on that value only after you're sure it -// saved, or something like that. -function setItem$2(key, value, callback) { - var self = this; +var toString$1 = Object.prototype.toString; - key = normalizeKey(key); +function stringToBuffer(serializedString) { + // Fill the string into a ArrayBuffer. + var bufferLength = serializedString.length * 0.75; + var len = serializedString.length; + var i; + var p = 0; + var encoded1, encoded2, encoded3, encoded4; - var promise = self.ready().then(function () { - // Convert undefined values to null. - // https://github.com/mozilla/localForage/pull/42 - if (value === undefined) { - value = null; + if (serializedString[serializedString.length - 1] === '=') { + bufferLength--; + if (serializedString[serializedString.length - 2] === '=') { + bufferLength--; } + } - // Save the original value to pass to the callback. - var originalValue = value; + var buffer = new ArrayBuffer(bufferLength); + var bytes = new Uint8Array(buffer); - return new Promise$1(function (resolve, reject) { - var dbInfo = self._dbInfo; - dbInfo.serializer.serialize(value, function (value, error) { - if (error) { - reject(error); - } else { - try { - localStorage.setItem(dbInfo.keyPrefix + key, value); - resolve(originalValue); - } catch (e) { - // localStorage capacity exceeded. - // TODO: Make this a specific error/event. - if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') { - reject(e); - } - reject(e); - } - } - }); - }); - }); + for (i = 0; i < len; i += 4) { + encoded1 = BASE_CHARS.indexOf(serializedString[i]); + encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]); + encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]); + encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]); - executeCallback(promise, callback); - return promise; + /*jslint bitwise: true */ + bytes[p++] = encoded1 << 2 | encoded2 >> 4; + bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; + bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; + } + return buffer; } -function dropInstance$2(options, callback) { - callback = getCallback.apply(this, arguments); +// Converts a buffer to a string to store, serialized, in the backend +// storage library. +function bufferToString(buffer) { + // base64-arraybuffer + var bytes = new Uint8Array(buffer); + var base64String = ''; + var i; - options = typeof options !== 'function' && options || {}; - if (!options.name) { - var currentConfig = this.config(); - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; + for (i = 0; i < bytes.length; i += 3) { + /*jslint bitwise: true */ + base64String += BASE_CHARS[bytes[i] >> 2]; + base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; + base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; + base64String += BASE_CHARS[bytes[i + 2] & 63]; } - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject('Invalid arguments'); - } else { - promise = new Promise$1(function (resolve) { - if (!options.storeName) { - resolve(options.name + '/'); - } else { - resolve(_getKeyPrefix(options, self._defaultConfig)); - } - }).then(function (keyPrefix) { - for (var i = localStorage.length - 1; i >= 0; i--) { - var key = localStorage.key(i); - - if (key.indexOf(keyPrefix) === 0) { - localStorage.removeItem(key); - } - } - }); + if (bytes.length % 3 === 2) { + base64String = base64String.substring(0, base64String.length - 1) + '='; + } else if (bytes.length % 3 === 1) { + base64String = base64String.substring(0, base64String.length - 2) + '=='; } - executeCallback(promise, callback); - return promise; + return base64String; } -var localStorageWrapper = { - _driver: 'localStorageWrapper', - _initStorage: _initStorage$2, - _support: isLocalStorageValid(), - iterate: iterate$2, - getItem: getItem$2, - setItem: setItem$2, - removeItem: removeItem$2, - clear: clear$2, - length: length$2, - key: key$2, - keys: keys$2, - dropInstance: dropInstance$2 -}; +// Serialize a value, afterwards executing a callback (which usually +// instructs the `setItem()` callback/promise to be executed). This is how +// we store binary data with localStorage. +function serialize(value, callback) { + var valueType = ''; + if (value) { + valueType = toString$1.call(value); + } -var sameValue = function sameValue(x, y) { - return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y); -}; + // Cannot use `value instanceof ArrayBuffer` or such here, as these + // checks fail when running the tests using casper.js... + // + // TODO: See why those tests fail and use a better solution. + if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) { + // Convert binary arrays to a string and prefix the string with + // a special marker. + var buffer; + var marker = SERIALIZED_MARKER; -var includes = function includes(array, searchElement) { - var len = array.length; - var i = 0; - while (i < len) { - if (sameValue(array[i], searchElement)) { - return true; + if (value instanceof ArrayBuffer) { + buffer = value; + marker += TYPE_ARRAYBUFFER; + } else { + buffer = value.buffer; + + if (valueType === '[object Int8Array]') { + marker += TYPE_INT8ARRAY; + } else if (valueType === '[object Uint8Array]') { + marker += TYPE_UINT8ARRAY; + } else if (valueType === '[object Uint8ClampedArray]') { + marker += TYPE_UINT8CLAMPEDARRAY; + } else if (valueType === '[object Int16Array]') { + marker += TYPE_INT16ARRAY; + } else if (valueType === '[object Uint16Array]') { + marker += TYPE_UINT16ARRAY; + } else if (valueType === '[object Int32Array]') { + marker += TYPE_INT32ARRAY; + } else if (valueType === '[object Uint32Array]') { + marker += TYPE_UINT32ARRAY; + } else if (valueType === '[object Float32Array]') { + marker += TYPE_FLOAT32ARRAY; + } else if (valueType === '[object Float64Array]') { + marker += TYPE_FLOAT64ARRAY; + } else { + callback(new Error('Failed to get type for BinaryArray')); + } } - i++; - } - - return false; -}; -var isArray = Array.isArray || function (arg) { - return Object.prototype.toString.call(arg) === '[object Array]'; -}; + callback(marker + bufferToString(buffer)); + } else if (valueType === '[object Blob]') { + // Conver the blob to a binaryArray and then to a string. + var fileReader = new FileReader(); -// Drivers are stored here when `defineDriver()` is called. -// They are shared across all instances of localForage. -var DefinedDrivers = {}; + fileReader.onload = function () { + // Backwards-compatible prefix for the blob type. + var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result); -var DriverSupport = {}; + callback(SERIALIZED_MARKER + TYPE_BLOB + str); + }; -var DefaultDrivers = { - INDEXEDDB: asyncStorage, - WEBSQL: webSQLStorage, - LOCALSTORAGE: localStorageWrapper -}; + fileReader.readAsArrayBuffer(value); + } else { + try { + callback(JSON.stringify(value)); + } catch (e) { + console.error("Couldn't convert value into a JSON string: ", value); -var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver]; + callback(null, e); + } + } +} -var OptionalDriverMethods = ['dropInstance']; +// Deserialize data we've inserted into a value column/field. We place +// special markers into our strings to mark them as encoded; this isn't +// as nice as a meta field, but it's the only sane thing we can do whilst +// keeping localStorage support intact. +// +// Oftentimes this will just deserialize JSON content, but if we have a +// special marker (SERIALIZED_MARKER, defined above), we will extract +// some kind of arraybuffer/binary data/typed array out of the string. +function deserialize(value) { + // If we haven't marked this string as being specially serialized (i.e. + // something other than serialized JSON), we can just return it and be + // done with it. + if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) { + return JSON.parse(value); + } -var LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods); + // The following code deals with deserializing some kind of Blob or + // TypedArray. First we separate out the type of data we're dealing + // with from the data itself. + var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH); + var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH); -var DefaultConfig = { - description: '', - driver: DefaultDriverOrder.slice(), - name: 'localforage', - // Default DB size is _JUST UNDER_ 5MB, as it's the highest size - // we can use without a prompt. - size: 4980736, - storeName: 'keyvaluepairs', - version: 1.0 -}; + var blobType; + // Backwards-compatible blob type serialization strategy. + // DBs created with older versions of localForage will simply not have the blob type. + if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) { + var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX); + blobType = matcher[1]; + serializedString = serializedString.substring(matcher[0].length); + } + var buffer = stringToBuffer(serializedString); -function callWhenReady(localForageInstance, libraryMethod) { - localForageInstance[libraryMethod] = function () { - var _args = arguments; - return localForageInstance.ready().then(function () { - return localForageInstance[libraryMethod].apply(localForageInstance, _args); - }); - }; + // Return the right type based on the code/type set during + // serialization. + switch (type) { + case TYPE_ARRAYBUFFER: + return buffer; + case TYPE_BLOB: + return createBlob([buffer], { type: blobType }); + case TYPE_INT8ARRAY: + return new Int8Array(buffer); + case TYPE_UINT8ARRAY: + return new Uint8Array(buffer); + case TYPE_UINT8CLAMPEDARRAY: + return new Uint8ClampedArray(buffer); + case TYPE_INT16ARRAY: + return new Int16Array(buffer); + case TYPE_UINT16ARRAY: + return new Uint16Array(buffer); + case TYPE_INT32ARRAY: + return new Int32Array(buffer); + case TYPE_UINT32ARRAY: + return new Uint32Array(buffer); + case TYPE_FLOAT32ARRAY: + return new Float32Array(buffer); + case TYPE_FLOAT64ARRAY: + return new Float64Array(buffer); + default: + throw new Error('Unkown type: ' + type); + } } -function extend() { - for (var i = 1; i < arguments.length; i++) { - var arg = arguments[i]; +var localforageSerializer = { + serialize: serialize, + deserialize: deserialize, + stringToBuffer: stringToBuffer, + bufferToString: bufferToString +}; - if (arg) { - for (var _key in arg) { - if (arg.hasOwnProperty(_key)) { - if (isArray(arg[_key])) { - arguments[0][_key] = arg[_key].slice(); - } else { - arguments[0][_key] = arg[_key]; - } - } - } - } - } +/* + * Includes code from: + * + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + */ - return arguments[0]; +function createDbTable(t, dbInfo, callback, errorCallback) { + t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback); } -var LocalForage = function () { - function LocalForage(options) { - _classCallCheck(this, LocalForage); - - for (var driverTypeKey in DefaultDrivers) { - if (DefaultDrivers.hasOwnProperty(driverTypeKey)) { - var driver = DefaultDrivers[driverTypeKey]; - var driverName = driver._driver; - this[driverTypeKey] = driverName; +// Open the WebSQL database (automatically creates one if one didn't +// previously exist), using any options set in the config. +function _initStorage$1(options) { + var self = this; + var dbInfo = { + db: null + }; - if (!DefinedDrivers[driverName]) { - // we don't need to wait for the promise, - // since the default drivers can be defined - // in a blocking manner - this.defineDriver(driver); - } - } + if (options) { + for (var i in options) { + dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i]; } - - this._defaultConfig = extend({}, DefaultConfig); - this._config = extend({}, this._defaultConfig, options); - this._driverSet = null; - this._initDriver = null; - this._ready = false; - this._dbInfo = null; - - this._wrapLibraryMethodsWithReady(); - this.setDriver(this._config.driver)["catch"](function () {}); } - // Set any config values for localForage; can be called anytime before - // the first API call (e.g. `getItem`, `setItem`). - // We loop through options so we don't overwrite existing config - // values. - + var dbInfoPromise = new Promise$1(function (resolve, reject) { + // Open the database; the openDatabase API will automatically + // create it for us if it doesn't exist. + try { + dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size); + } catch (e) { + return reject(e); + } - LocalForage.prototype.config = function config(options) { - // If the options argument is an object, we use it to set values. - // Otherwise, we return either a specified config value or all - // config values. - if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') { - // If localforage is ready and fully initialized, we can't set - // any new configuration values. Instead, we return an error. - if (this._ready) { - return new Error("Can't call config() after localforage " + 'has been used.'); - } + // Create our key/value table if it doesn't exist. + dbInfo.db.transaction(function (t) { + createDbTable(t, dbInfo, function () { + self._dbInfo = dbInfo; + resolve(); + }, function (t, error) { + reject(error); + }); + }, reject); + }); - for (var i in options) { - if (i === 'storeName') { - options[i] = options[i].replace(/\W/g, '_'); - } + dbInfo.serializer = localforageSerializer; + return dbInfoPromise; +} - if (i === 'version' && typeof options[i] !== 'number') { - return new Error('Database version must be a number.'); +function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) { + t.executeSql(sqlStatement, args, callback, function (t, error) { + if (error.code === error.SYNTAX_ERR) { + t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name = ?", [dbInfo.storeName], function (t, results) { + if (!results.rows.length) { + // if the table is missing (was deleted) + // re-create it table and retry + createDbTable(t, dbInfo, function () { + t.executeSql(sqlStatement, args, callback, errorCallback); + }, errorCallback); + } else { + errorCallback(t, error); } - - this._config[i] = options[i]; - } - - // after all config options are set and - // the driver option is used, try setting it - if ('driver' in options && options.driver) { - return this.setDriver(this._config.driver); - } - - return true; - } else if (typeof options === 'string') { - return this._config[options]; + }, errorCallback); } else { - return this._config; + errorCallback(t, error); } - }; + }, errorCallback); +} - // Used to define a custom driver, shared across all instances of - // localForage. +function getItem$1(key, callback) { + var self = this; + key = normalizeKey(key); - LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) { - var promise = new Promise$1(function (resolve, reject) { - try { - var driverName = driverObject._driver; - var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver'); + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) { + var result = results.rows.length ? results.rows.item(0).value : null; - // A driver name should be defined and not overlap with the - // library-defined, default drivers. - if (!driverObject._driver) { - reject(complianceError); - return; - } + // Check to see if this is serialized content we need to + // unpack. + if (result) { + result = dbInfo.serializer.deserialize(result); + } - var driverMethods = LibraryMethods.concat('_initStorage'); - for (var i = 0, len = driverMethods.length; i < len; i++) { - var driverMethodName = driverMethods[i]; + resolve(result); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - // when the property is there, - // it should be a method even when optional - var isRequired = !includes(OptionalDriverMethods, driverMethodName); - if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') { - reject(complianceError); - return; - } - } + executeCallback(promise, callback); + return promise; +} - var configureMissingMethods = function configureMissingMethods() { - var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) { - return function () { - var error = new Error('Method ' + methodName + ' is not implemented by the current driver'); - var promise = Promise$1.reject(error); - executeCallback(promise, arguments[arguments.length - 1]); - return promise; - }; - }; +function iterate$1(iterator, callback) { + var self = this; - for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) { - var optionalDriverMethod = OptionalDriverMethods[_i]; - if (!driverObject[optionalDriverMethod]) { - driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod); + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) { + var rows = results.rows; + var length = rows.length; + + for (var i = 0; i < length; i++) { + var item = rows.item(i); + var result = item.value; + + // Check to see if this is serialized content + // we need to unpack. + if (result) { + result = dbInfo.serializer.deserialize(result); } - } - }; - configureMissingMethods(); + result = iterator(result, item.key, i + 1); - var setDriverSupport = function setDriverSupport(support) { - if (DefinedDrivers[driverName]) { - console.info('Redefining LocalForage driver: ' + driverName); + // void(0) prevents problems with redefinition + // of `undefined`. + if (result !== void 0) { + resolve(result); + return; + } } - DefinedDrivers[driverName] = driverObject; - DriverSupport[driverName] = support; - // don't use a then, so that we can define - // drivers that have simple _support methods - // in a blocking manner + resolve(); - }; + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - if ('_support' in driverObject) { - if (driverObject._support && typeof driverObject._support === 'function') { - driverObject._support().then(setDriverSupport, reject); - } else { - setDriverSupport(!!driverObject._support); - } - } else { - setDriverSupport(true); - } - } catch (e) { - reject(e); + executeCallback(promise, callback); + return promise; +} + +function _setItem(key, value, callback, retriesLeft) { + var self = this; + + key = normalizeKey(key); + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + // The localStorage API doesn't return undefined values in an + // "expected" way, so undefined is always cast to null in all + // drivers. See: https://github.com/mozilla/localForage/pull/42 + if (value === undefined) { + value = null; } - }); - executeTwoCallbacks(promise, callback, errorCallback); - return promise; - }; + // Save the original value to pass to the callback. + var originalValue = value; - LocalForage.prototype.driver = function driver() { - return this._driver || null; - }; + var dbInfo = self._dbInfo; + dbInfo.serializer.serialize(value, function (value, error) { + if (error) { + reject(error); + } else { + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () { + resolve(originalValue); + }, function (t, error) { + reject(error); + }); + }, function (sqlError) { + // The transaction failed; check + // to see if it's a quota error. + if (sqlError.code === sqlError.QUOTA_ERR) { + // We reject the callback outright for now, but + // it's worth trying to re-run the transaction. + // Even if the user accepts the prompt to use + // more storage on Safari, this error will + // be called. + // + // Try to re-run the transaction. + if (retriesLeft > 0) { + resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1])); + return; + } + reject(sqlError); + } + }); + } + }); + })["catch"](reject); + }); - LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) { - var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.')); + executeCallback(promise, callback); + return promise; +} - executeTwoCallbacks(getDriverPromise, callback, errorCallback); - return getDriverPromise; - }; +function setItem$1(key, value, callback) { + return _setItem.apply(this, [key, value, callback, 1]); +} - LocalForage.prototype.getSerializer = function getSerializer(callback) { - var serializerPromise = Promise$1.resolve(localforageSerializer); - executeTwoCallbacks(serializerPromise, callback); - return serializerPromise; - }; +function removeItem$1(key, callback) { + var self = this; - LocalForage.prototype.ready = function ready(callback) { - var self = this; + key = normalizeKey(key); - var promise = self._driverSet.then(function () { - if (self._ready === null) { - self._ready = self._initDriver(); - } + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () { + resolve(); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - return self._ready; - }); + executeCallback(promise, callback); + return promise; +} - executeTwoCallbacks(promise, callback, callback); - return promise; - }; +// Deletes every item in the table. +// TODO: Find out if this resets the AUTO_INCREMENT number. +function clear$1(callback) { + var self = this; - LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) { - var self = this; + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () { + resolve(); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - if (!isArray(drivers)) { - drivers = [drivers]; - } + executeCallback(promise, callback); + return promise; +} - var supportedDrivers = this._getSupportedDrivers(drivers); +// Does a simple `COUNT(key)` to get the number of items stored in +// localForage. +function length$1(callback) { + var self = this; + + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + // Ahhh, SQL makes this one soooooo easy. + tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) { + var result = results.rows.item(0).c; + resolve(result); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - function setDriverToConfig() { - self._config.driver = self.driver(); - } + executeCallback(promise, callback); + return promise; +} - function extendSelfWithDriver(driver) { - self._extend(driver); - setDriverToConfig(); +// Return the key located at key index X; essentially gets the key from a +// `WHERE id = ?`. This is the most efficient way I can think to implement +// this rarely-used (in my experience) part of the API, but it can seem +// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so +// the ID of each key will change every time it's updated. Perhaps a stored +// procedure for the `setItem()` SQL would solve this problem? +// TODO: Don't change ID on `setItem()`. +function key$1(n, callback) { + var self = this; - self._ready = self._initStorage(self._config); - return self._ready; - } + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) { + var result = results.rows.length ? results.rows.item(0).key : null; + resolve(result); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - function initDriver(supportedDrivers) { - return function () { - var currentDriverIndex = 0; + executeCallback(promise, callback); + return promise; +} - function driverPromiseLoop() { - while (currentDriverIndex < supportedDrivers.length) { - var driverName = supportedDrivers[currentDriverIndex]; - currentDriverIndex++; +function keys$1(callback) { + var self = this; - self._dbInfo = null; - self._ready = null; + var promise = new Promise$1(function (resolve, reject) { + self.ready().then(function () { + var dbInfo = self._dbInfo; + dbInfo.db.transaction(function (t) { + tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) { + var keys = []; - return self.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop); + for (var i = 0; i < results.rows.length; i++) { + keys.push(results.rows.item(i).key); } - setDriverToConfig(); - var error = new Error('No available storage method found.'); - self._driverSet = Promise$1.reject(error); - return self._driverSet; - } + resolve(keys); + }, function (t, error) { + reject(error); + }); + }); + })["catch"](reject); + }); - return driverPromiseLoop(); - }; - } + executeCallback(promise, callback); + return promise; +} - // There might be a driver initialization in progress - // so wait for it to finish in order to avoid a possible - // race condition to set _dbInfo - var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function () { - return Promise$1.resolve(); - }) : Promise$1.resolve(); +// https://www.w3.org/TR/webdatabase/#databases +// > There is no way to enumerate or delete the databases available for an origin from this API. +function getAllStoreNames(db) { + return new Promise$1(function (resolve, reject) { + db.transaction(function (t) { + t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, results) { + var storeNames = []; - this._driverSet = oldDriverSetDone.then(function () { - var driverName = supportedDrivers[0]; - self._dbInfo = null; - self._ready = null; + for (var i = 0; i < results.rows.length; i++) { + storeNames.push(results.rows.item(i).name); + } - return self.getDriver(driverName).then(function (driver) { - self._driver = driver._driver; - setDriverToConfig(); - self._wrapLibraryMethodsWithReady(); - self._initDriver = initDriver(supportedDrivers); + resolve({ + db: db, + storeNames: storeNames + }); + }, function (t, error) { + reject(error); }); - })["catch"](function () { - setDriverToConfig(); - var error = new Error('No available storage method found.'); - self._driverSet = Promise$1.reject(error); - return self._driverSet; + }, function (sqlError) { + reject(sqlError); }); + }); +} - executeTwoCallbacks(this._driverSet, callback, errorCallback); - return this._driverSet; - }; +function dropInstance$1(options, callback) { + callback = getCallback.apply(this, arguments); - LocalForage.prototype.supports = function supports(driverName) { - return !!DriverSupport[driverName]; - }; + var currentConfig = this.config(); + options = typeof options !== 'function' && options || {}; + if (!options.name) { + options.name = options.name || currentConfig.name; + options.storeName = options.storeName || currentConfig.storeName; + } - LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) { - extend(this, libraryMethodsAndProperties); - }; + var self = this; + var promise; + if (!options.name) { + promise = Promise$1.reject('Invalid arguments'); + } else { + promise = new Promise$1(function (resolve) { + var db; + if (options.name === currentConfig.name) { + // use the db reference of the current instance + db = self._dbInfo.db; + } else { + db = openDatabase(options.name, '', '', 0); + } - LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) { - var supportedDrivers = []; - for (var i = 0, len = drivers.length; i < len; i++) { - var driverName = drivers[i]; - if (this.supports(driverName)) { - supportedDrivers.push(driverName); + if (!options.storeName) { + // drop all database tables + resolve(getAllStoreNames(db)); + } else { + resolve({ + db: db, + storeNames: [options.storeName] + }); } - } - return supportedDrivers; - }; + }).then(function (operationInfo) { + return new Promise$1(function (resolve, reject) { + operationInfo.db.transaction(function (t) { + function dropTable(storeName) { + return new Promise$1(function (resolve, reject) { + t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () { + resolve(); + }, function (t, error) { + reject(error); + }); + }); + } - LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() { - // Add a stub for each driver API method that delays the call to the - // corresponding driver method until localForage is ready. These stubs - // will be replaced by the driver methods as soon as the driver is - // loaded, so there is no performance impact. - for (var i = 0, len = LibraryMethods.length; i < len; i++) { - callWhenReady(this, LibraryMethods[i]); - } - }; + var operations = []; + for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) { + operations.push(dropTable(operationInfo.storeNames[i])); + } - LocalForage.prototype.createInstance = function createInstance(options) { - return new LocalForage(options); - }; + Promise$1.all(operations).then(function () { + resolve(); + })["catch"](function (e) { + reject(e); + }); + }, function (sqlError) { + reject(sqlError); + }); + }); + }); + } - return LocalForage; -}(); + executeCallback(promise, callback); + return promise; +} -// The actual localForage object that we expose as a module or via a -// global. It's extended by pulling in one of our other libraries. +var webSQLStorage = { + _driver: 'webSQLStorage', + _initStorage: _initStorage$1, + _support: isWebSQLValid(), + iterate: iterate$1, + getItem: getItem$1, + setItem: setItem$1, + removeItem: removeItem$1, + clear: clear$1, + length: length$1, + key: key$1, + keys: keys$1, + dropInstance: dropInstance$1 +}; + +function isLocalStorageValid() { + try { + return typeof localStorage !== 'undefined' && 'setItem' in localStorage && + // in IE8 typeof localStorage.setItem === 'object' + !!localStorage.setItem; + } catch (e) { + return false; + } +} + +function _getKeyPrefix(options, defaultConfig) { + var keyPrefix = options.name + '/'; + + if (options.storeName !== defaultConfig.storeName) { + keyPrefix += options.storeName + '/'; + } + return keyPrefix; +} +// Check if localStorage throws when saving an item +function checkIfLocalStorageThrows() { + var localStorageTestKey = '_localforage_support_test'; -var localforage_js = new LocalForage(); + try { + localStorage.setItem(localStorageTestKey, true); + localStorage.removeItem(localStorageTestKey); -module.exports = localforage_js; + return false; + } catch (e) { + return true; + } +} -},{"3":3}]},{},[4])(4) -}); +// Check if localStorage is usable and allows to save an item +// This method checks if localStorage is usable in Safari Private Browsing +// mode, or in any other case where the available quota for localStorage +// is 0 and there wasn't any saved items yet. +function _isLocalStorageUsable() { + return !checkIfLocalStorageThrows() || localStorage.length > 0; +} -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30))) +// Config the localStorage backend, using options set in the config. +function _initStorage$2(options) { + var self = this; + var dbInfo = {}; + if (options) { + for (var i in options) { + dbInfo[i] = options[i]; + } + } -/***/ }), -/* 58 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig); -"use strict"; + if (!_isLocalStorageUsable()) { + return Promise$1.reject(); + } -// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.replace.js -var es_string_replace = __webpack_require__(24); + self._dbInfo = dbInfo; + dbInfo.serializer = localforageSerializer; -// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.iterator.js -var web_dom_collections_iterator = __webpack_require__(11); + return Promise$1.resolve(); +} -// EXTERNAL MODULE: ./node_modules/event-emitter/index.js -var event_emitter = __webpack_require__(3); -var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); +// Remove all keys from the datastore, effectively destroying all data in +// the app's key/value store! +function clear$2(callback) { + var self = this; + var promise = self.ready().then(function () { + var keyPrefix = self._dbInfo.keyPrefix; -// EXTERNAL MODULE: ./src/utils/core.js -var core = __webpack_require__(0); + for (var i = localStorage.length - 1; i >= 0; i--) { + var key = localStorage.key(i); -// EXTERNAL MODULE: ./src/utils/url.js -var utils_url = __webpack_require__(5); + if (key.indexOf(keyPrefix) === 0) { + localStorage.removeItem(key); + } + } + }); -// EXTERNAL MODULE: ./src/utils/path.js -var utils_path = __webpack_require__(4); + executeCallback(promise, callback); + return promise; +} -// EXTERNAL MODULE: ./src/epubcfi.js -var epubcfi = __webpack_require__(2); +// Retrieve an item from the store. Unlike the original async_storage +// library in Gaia, we don't modify return values at all. If a key's value +// is `undefined`, we pass that value to the callback function. +function getItem$2(key, callback) { + var self = this; -// EXTERNAL MODULE: ./src/utils/hook.js -var hook = __webpack_require__(6); + key = normalizeKey(key); -// EXTERNAL MODULE: ./src/utils/replacements.js -var replacements = __webpack_require__(12); + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var result = localStorage.getItem(dbInfo.keyPrefix + key); -// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url.js -var web_url = __webpack_require__(20); + // If a result was found, parse it from the serialized + // string into a JS object. If result isn't truthy, the key + // is likely undefined and we'll pass it straight to the + // callback. + if (result) { + result = dbInfo.serializer.deserialize(result); + } -// CONCATENATED MODULE: ./src/utils/request.js + return result; + }); + executeCallback(promise, callback); + return promise; +} +// Iterate over all items in the store. +function iterate$2(iterator, callback) { + var self = this; + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var keyPrefix = dbInfo.keyPrefix; + var keyPrefixLength = keyPrefix.length; + var length = localStorage.length; + // We use a dedicated iterator instead of the `i` variable below + // so other keys we fetch in localStorage aren't counted in + // the `iterationNumber` argument passed to the `iterate()` + // callback. + // + // See: github.com/mozilla/localForage/pull/435#discussion_r38061530 + var iterationNumber = 1; -function request_request(url, type, withCredentials, headers) { - var supportsURL = typeof window != "undefined" ? window.URL : false; // TODO: fallback for url if window isn't defined + for (var i = 0; i < length; i++) { + var key = localStorage.key(i); + if (key.indexOf(keyPrefix) !== 0) { + continue; + } + var value = localStorage.getItem(key); - var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; - var deferred = new core["defer"](); - var xhr = new XMLHttpRequest(); //-- Check from PDF.js: - // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js + // If a result was found, parse it from the serialized + // string into a JS object. If result isn't truthy, the + // key is likely undefined and we'll pass it straight + // to the iterator. + if (value) { + value = dbInfo.serializer.deserialize(value); + } - var xhrPrototype = XMLHttpRequest.prototype; - var header; + value = iterator(value, key.substring(keyPrefixLength), iterationNumber++); - if (!("overrideMimeType" in xhrPrototype)) { - // IE10 might have response, but not overrideMimeType - Object.defineProperty(xhrPrototype, "overrideMimeType", { - value: function xmlHttpRequestOverrideMimeType() {} + if (value !== void 0) { + return value; + } + } }); - } - if (withCredentials) { - xhr.withCredentials = true; - } + executeCallback(promise, callback); + return promise; +} - xhr.onreadystatechange = handler; - xhr.onerror = err; - xhr.open("GET", url, true); +// Same as localStorage's key() method, except takes a callback. +function key$2(n, callback) { + var self = this; + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var result; + try { + result = localStorage.key(n); + } catch (error) { + result = null; + } - for (header in headers) { - xhr.setRequestHeader(header, headers[header]); - } + // Remove the prefix from the key, if a key is found. + if (result) { + result = result.substring(dbInfo.keyPrefix.length); + } - if (type == "json") { - xhr.setRequestHeader("Accept", "application/json"); - } // If type isn"t set, determine it from the file extension + return result; + }); + executeCallback(promise, callback); + return promise; +} - if (!type) { - type = new utils_path["a" /* default */](url).extension; - } +function keys$2(callback) { + var self = this; + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + var length = localStorage.length; + var keys = []; - if (type == "blob") { - xhr.responseType = BLOB_RESPONSE; - } + for (var i = 0; i < length; i++) { + var itemKey = localStorage.key(i); + if (itemKey.indexOf(dbInfo.keyPrefix) === 0) { + keys.push(itemKey.substring(dbInfo.keyPrefix.length)); + } + } - if (Object(core["isXml"])(type)) { - // xhr.responseType = "document"; - xhr.overrideMimeType("text/xml"); // for OPF parsing - } + return keys; + }); - if (type == "xhtml") {// xhr.responseType = "document"; - } + executeCallback(promise, callback); + return promise; +} - if (type == "html" || type == "htm") {// xhr.responseType = "document"; - } +// Supply the number of keys in the datastore to the callback function. +function length$2(callback) { + var self = this; + var promise = self.keys().then(function (keys) { + return keys.length; + }); - if (type == "binary") { - xhr.responseType = "arraybuffer"; - } + executeCallback(promise, callback); + return promise; +} - xhr.send(); +// Remove an item from the store, nice and simple. +function removeItem$2(key, callback) { + var self = this; - function err(e) { - deferred.reject(e); - } + key = normalizeKey(key); - function handler() { - if (this.readyState === XMLHttpRequest.DONE) { - var responseXML = false; + var promise = self.ready().then(function () { + var dbInfo = self._dbInfo; + localStorage.removeItem(dbInfo.keyPrefix + key); + }); - if (this.responseType === "" || this.responseType === "document") { - responseXML = this.responseXML; - } + executeCallback(promise, callback); + return promise; +} - if (this.status === 200 || this.status === 0 || responseXML) { - //-- Firefox is reporting 0 for blob urls - var r; +// Set a key's value and run an optional callback once the value is set. +// Unlike Gaia's implementation, the callback function is passed the value, +// in case you want to operate on that value only after you're sure it +// saved, or something like that. +function setItem$2(key, value, callback) { + var self = this; - if (!this.response && !responseXML) { - deferred.reject({ - status: this.status, - message: "Empty Response", - stack: new Error().stack - }); - return deferred.promise; - } + key = normalizeKey(key); - if (this.status === 403) { - deferred.reject({ - status: this.status, - response: this.response, - message: "Forbidden", - stack: new Error().stack - }); - return deferred.promise; + var promise = self.ready().then(function () { + // Convert undefined values to null. + // https://github.com/mozilla/localForage/pull/42 + if (value === undefined) { + value = null; } - if (responseXML) { - r = this.responseXML; - } else if (Object(core["isXml"])(type)) { - // xhr.overrideMimeType("text/xml"); // for OPF parsing - // If this.responseXML wasn't set, try to parse using a DOMParser from text - r = Object(core["parse"])(this.response, "text/xml"); - } else if (type == "xhtml") { - r = Object(core["parse"])(this.response, "application/xhtml+xml"); - } else if (type == "html" || type == "htm") { - r = Object(core["parse"])(this.response, "text/html"); - } else if (type == "json") { - r = JSON.parse(this.response); - } else if (type == "blob") { - if (supportsURL) { - r = this.response; - } else { - //-- Safari doesn't support responseType blob, so create a blob from arraybuffer - r = new Blob([this.response]); - } - } else { - r = this.response; - } + // Save the original value to pass to the callback. + var originalValue = value; - deferred.resolve(r); - } else { - deferred.reject({ - status: this.status, - message: this.response, - stack: new Error().stack + return new Promise$1(function (resolve, reject) { + var dbInfo = self._dbInfo; + dbInfo.serializer.serialize(value, function (value, error) { + if (error) { + reject(error); + } else { + try { + localStorage.setItem(dbInfo.keyPrefix + key, value); + resolve(originalValue); + } catch (e) { + // localStorage capacity exceeded. + // TODO: Make this a specific error/event. + if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') { + reject(e); + } + reject(e); + } + } + }); }); - } - } - } + }); - return deferred.promise; + executeCallback(promise, callback); + return promise; } -/* harmony default export */ var utils_request = (request_request); -// EXTERNAL MODULE: external "xmldom" -var external_xmldom_ = __webpack_require__(38); +function dropInstance$2(options, callback) { + callback = getCallback.apply(this, arguments); -// CONCATENATED MODULE: ./src/section.js + options = typeof options !== 'function' && options || {}; + if (!options.name) { + var currentConfig = this.config(); + options.name = options.name || currentConfig.name; + options.storeName = options.storeName || currentConfig.storeName; + } + var self = this; + var promise; + if (!options.name) { + promise = Promise$1.reject('Invalid arguments'); + } else { + promise = new Promise$1(function (resolve) { + if (!options.storeName) { + resolve(options.name + '/'); + } else { + resolve(_getKeyPrefix(options, self._defaultConfig)); + } + }).then(function (keyPrefix) { + for (var i = localStorage.length - 1; i >= 0; i--) { + var key = localStorage.key(i); + if (key.indexOf(keyPrefix) === 0) { + localStorage.removeItem(key); + } + } + }); + } + executeCallback(promise, callback); + return promise; +} +var localStorageWrapper = { + _driver: 'localStorageWrapper', + _initStorage: _initStorage$2, + _support: isLocalStorageValid(), + iterate: iterate$2, + getItem: getItem$2, + setItem: setItem$2, + removeItem: removeItem$2, + clear: clear$2, + length: length$2, + key: key$2, + keys: keys$2, + dropInstance: dropInstance$2 +}; +var sameValue = function sameValue(x, y) { + return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y); +}; +var includes = function includes(array, searchElement) { + var len = array.length; + var i = 0; + while (i < len) { + if (sameValue(array[i], searchElement)) { + return true; + } + i++; + } + return false; +}; -/** - * Represents a Section of the Book - * - * In most books this is equivelent to a Chapter - * @param {object} item The spine item representing the section - * @param {object} hooks hooks for serialize and content - */ +var isArray = Array.isArray || function (arg) { + return Object.prototype.toString.call(arg) === '[object Array]'; +}; -class section_Section { - constructor(item, hooks) { - this.idref = item.idref; - this.linear = item.linear === "yes"; - this.properties = item.properties; - this.index = item.index; - this.href = item.href; - this.url = item.url; - this.canonical = item.canonical; - this.next = item.next; - this.prev = item.prev; - this.cfiBase = item.cfiBase; +// Drivers are stored here when `defineDriver()` is called. +// They are shared across all instances of localForage. +var DefinedDrivers = {}; - if (hooks) { - this.hooks = hooks; - } else { - this.hooks = {}; - this.hooks.serialize = new hook["a" /* default */](this); - this.hooks.content = new hook["a" /* default */](this); - } +var DriverSupport = {}; - this.document = undefined; - this.contents = undefined; - this.output = undefined; - } - /** - * Load the section from its url - * @param {method} [_request] a request method to use for loading - * @return {document} a promise with the xml document - */ +var DefaultDrivers = { + INDEXEDDB: asyncStorage, + WEBSQL: webSQLStorage, + LOCALSTORAGE: localStorageWrapper +}; +var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver]; - load(_request) { - var request = _request || this.request || utils_request; - var loading = new core["defer"](); - var loaded = loading.promise; +var OptionalDriverMethods = ['dropInstance']; - if (this.contents) { - loading.resolve(this.contents); - } else { - request(this.url).then(function (xml) { - // when the url has no extension, `request` won't parse it, - // so we'll just have to parse it ourselves - if (typeof xml === 'string') xml = new DOMParser().parseFromString(xml, 'text/html'); // var directory = new Url(this.url).directory; +var LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods); - this.document = xml; - this.contents = xml.documentElement; - return this.hooks.content.trigger(this.document, this); - }.bind(this)).then(function () { - loading.resolve(this.contents); - }.bind(this)).catch(function (error) { - loading.reject(error); - }); - } +var DefaultConfig = { + description: '', + driver: DefaultDriverOrder.slice(), + name: 'localforage', + // Default DB size is _JUST UNDER_ 5MB, as it's the highest size + // we can use without a prompt. + size: 4980736, + storeName: 'keyvaluepairs', + version: 1.0 +}; - return loaded; - } - /** - * Adds a base tag for resolving urls in the section - * @private - */ +function callWhenReady(localForageInstance, libraryMethod) { + localForageInstance[libraryMethod] = function () { + var _args = arguments; + return localForageInstance.ready().then(function () { + return localForageInstance[libraryMethod].apply(localForageInstance, _args); + }); + }; +} +function extend() { + for (var i = 1; i < arguments.length; i++) { + var arg = arguments[i]; - base() { - return Object(replacements["a" /* replaceBase */])(this.document, this); - } - /** - * Render the contents of a section - * @param {method} [_request] a request method to use for loading - * @return {string} output a serialized XML Document - */ + if (arg) { + for (var _key in arg) { + if (arg.hasOwnProperty(_key)) { + if (isArray(arg[_key])) { + arguments[0][_key] = arg[_key].slice(); + } else { + arguments[0][_key] = arg[_key]; + } + } + } + } + } + return arguments[0]; +} - render(_request) { - var rendering = new core["defer"](); - var rendered = rendering.promise; - this.output; // TODO: better way to return this from hooks? +var LocalForage = function () { + function LocalForage(options) { + _classCallCheck(this, LocalForage); - this.load(_request).then(function (contents) { - var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || ''; - var isIE = userAgent.indexOf('Trident') >= 0; - var Serializer; + for (var driverTypeKey in DefaultDrivers) { + if (DefaultDrivers.hasOwnProperty(driverTypeKey)) { + var driver = DefaultDrivers[driverTypeKey]; + var driverName = driver._driver; + this[driverTypeKey] = driverName; - if (typeof XMLSerializer === "undefined" || isIE) { - Serializer = external_xmldom_["XMLDOMParser"]; - } else { - Serializer = XMLSerializer; - } + if (!DefinedDrivers[driverName]) { + // we don't need to wait for the promise, + // since the default drivers can be defined + // in a blocking manner + this.defineDriver(driver); + } + } + } - var serializer = new Serializer(); - this.output = serializer.serializeToString(contents); - return this.output; - }.bind(this)).then(function () { - return this.hooks.serialize.trigger(this.output, this); - }.bind(this)).then(function () { - rendering.resolve(this.output); - }.bind(this)).catch(function (error) { - rendering.reject(error); - }); - return rendered; - } - /** - * Find a string in a section - * @param {string} _query The query string to find - * @return {object[]} A list of matches, with form {cfi, excerpt} - */ + this._defaultConfig = extend({}, DefaultConfig); + this._config = extend({}, this._defaultConfig, options); + this._driverSet = null; + this._initDriver = null; + this._ready = false; + this._dbInfo = null; + this._wrapLibraryMethodsWithReady(); + this.setDriver(this._config.driver)["catch"](function () {}); + } - find(_query) { - var section = this; - var matches = []; + // Set any config values for localForage; can be called anytime before + // the first API call (e.g. `getItem`, `setItem`). + // We loop through options so we don't overwrite existing config + // values. - var query = _query.toLowerCase(); - var find = function (node) { - var text = node.textContent.toLowerCase(); - var range = section.document.createRange(); - var cfi; - var pos; - var last = -1; - var excerpt; - var limit = 150; + LocalForage.prototype.config = function config(options) { + // If the options argument is an object, we use it to set values. + // Otherwise, we return either a specified config value or all + // config values. + if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') { + // If localforage is ready and fully initialized, we can't set + // any new configuration values. Instead, we return an error. + if (this._ready) { + return new Error("Can't call config() after localforage " + 'has been used.'); + } - while (pos != -1) { - // Search for the query - pos = text.indexOf(query, last + 1); + for (var i in options) { + if (i === 'storeName') { + options[i] = options[i].replace(/\W/g, '_'); + } - if (pos != -1) { - // We found it! Generate a CFI - range = section.document.createRange(); - range.setStart(node, pos); - range.setEnd(node, pos + query.length); - cfi = section.cfiFromRange(range); // Generate the excerpt + if (i === 'version' && typeof options[i] !== 'number') { + return new Error('Database version must be a number.'); + } - if (node.textContent.length < limit) { - excerpt = node.textContent; - } else { - excerpt = node.textContent.substring(pos - limit / 2, pos + limit / 2); - excerpt = "..." + excerpt + "..."; - } // Add the CFI to the matches list + this._config[i] = options[i]; + } + // after all config options are set and + // the driver option is used, try setting it + if ('driver' in options && options.driver) { + return this.setDriver(this._config.driver); + } - matches.push({ - cfi: cfi, - excerpt: excerpt - }); + return true; + } else if (typeof options === 'string') { + return this._config[options]; + } else { + return this._config; } - - last = pos; - } }; - Object(core["sprint"])(section.document, function (node) { - find(node); - }); - return matches; - } + // Used to define a custom driver, shared across all instances of + // localForage. - /** - * Search a string in multiple sequential Element of the section. If the document.createTreeWalker api is missed(eg: IE8), use `find` as a fallback. - * @param {string} _query The query string to search - * @param {int} maxSeqEle The maximum number of Element that are combined for search, defualt value is 5. - * @return {object[]} A list of matches, with form {cfi, excerpt} - */ - search(_query, maxSeqEle = 5) { - if (typeof document.createTreeWalker == "undefined") { - return this.find(_query); - } - let matches = []; - const excerptLimit = 150; - const section = this; + LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) { + var promise = new Promise$1(function (resolve, reject) { + try { + var driverName = driverObject._driver; + var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver'); - const query = _query.toLowerCase(); + // A driver name should be defined and not overlap with the + // library-defined, default drivers. + if (!driverObject._driver) { + reject(complianceError); + return; + } - const search = function (nodeList) { - const textWithCase = nodeList.reduce((acc, current) => { - return acc + current.textContent; - }, ""); - const text = textWithCase.toLowerCase(); - const pos = text.indexOf(query); + var driverMethods = LibraryMethods.concat('_initStorage'); + for (var i = 0, len = driverMethods.length; i < len; i++) { + var driverMethodName = driverMethods[i]; - if (pos != -1) { - const startNodeIndex = 0, - endPos = pos + query.length; - let endNodeIndex = 0, - l = 0; + // when the property is there, + // it should be a method even when optional + var isRequired = !includes(OptionalDriverMethods, driverMethodName); + if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') { + reject(complianceError); + return; + } + } - if (pos < nodeList[startNodeIndex].length) { - let cfi; + var configureMissingMethods = function configureMissingMethods() { + var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) { + return function () { + var error = new Error('Method ' + methodName + ' is not implemented by the current driver'); + var promise = Promise$1.reject(error); + executeCallback(promise, arguments[arguments.length - 1]); + return promise; + }; + }; - while (endNodeIndex < nodeList.length - 1) { - l += nodeList[endNodeIndex].length; + for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) { + var optionalDriverMethod = OptionalDriverMethods[_i]; + if (!driverObject[optionalDriverMethod]) { + driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod); + } + } + }; - if (endPos <= l) { - break; + configureMissingMethods(); + + var setDriverSupport = function setDriverSupport(support) { + if (DefinedDrivers[driverName]) { + console.info('Redefining LocalForage driver: ' + driverName); + } + DefinedDrivers[driverName] = driverObject; + DriverSupport[driverName] = support; + // don't use a then, so that we can define + // drivers that have simple _support methods + // in a blocking manner + resolve(); + }; + + if ('_support' in driverObject) { + if (driverObject._support && typeof driverObject._support === 'function') { + driverObject._support().then(setDriverSupport, reject); + } else { + setDriverSupport(!!driverObject._support); + } + } else { + setDriverSupport(true); + } + } catch (e) { + reject(e); } + }); - endNodeIndex += 1; - } + executeTwoCallbacks(promise, callback, errorCallback); + return promise; + }; - let startNode = nodeList[startNodeIndex], - endNode = nodeList[endNodeIndex]; - let range = section.document.createRange(); - range.setStart(startNode, pos); - let beforeEndLengthCount = nodeList.slice(0, endNodeIndex).reduce((acc, current) => { - return acc + current.textContent.length; - }, 0); - range.setEnd(endNode, beforeEndLengthCount > endPos ? endPos : endPos - beforeEndLengthCount); - cfi = section.cfiFromRange(range); - let excerpt = nodeList.slice(0, endNodeIndex + 1).reduce((acc, current) => { - return acc + current.textContent; - }, ""); + LocalForage.prototype.driver = function driver() { + return this._driver || null; + }; - if (excerpt.length > excerptLimit) { - excerpt = excerpt.substring(pos - excerptLimit / 2, pos + excerptLimit / 2); - excerpt = "..." + excerpt + "..."; - } + LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) { + var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.')); - matches.push({ - cfi: cfi, - excerpt: excerpt - }); - } - } + executeTwoCallbacks(getDriverPromise, callback, errorCallback); + return getDriverPromise; }; - const treeWalker = document.createTreeWalker(section.document, NodeFilter.SHOW_TEXT, null, false); - let node, - nodeList = []; + LocalForage.prototype.getSerializer = function getSerializer(callback) { + var serializerPromise = Promise$1.resolve(localforageSerializer); + executeTwoCallbacks(serializerPromise, callback); + return serializerPromise; + }; - while (node = treeWalker.nextNode()) { - nodeList.push(node); + LocalForage.prototype.ready = function ready(callback) { + var self = this; - if (nodeList.length == maxSeqEle) { - search(nodeList.slice(0, maxSeqEle)); - nodeList = nodeList.slice(1, maxSeqEle); - } - } + var promise = self._driverSet.then(function () { + if (self._ready === null) { + self._ready = self._initDriver(); + } - if (nodeList.length > 0) { - search(nodeList); - } + return self._ready; + }); - return matches; - } - /** - * Reconciles the current chapters layout properies with - * the global layout properities. - * @param {object} globalLayout The global layout settings object, chapter properties string - * @return {object} layoutProperties Object with layout properties - */ + executeTwoCallbacks(promise, callback, callback); + return promise; + }; + LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) { + var self = this; - reconcileLayoutSettings(globalLayout) { - //-- Get the global defaults - var settings = { - layout: globalLayout.layout, - spread: globalLayout.spread, - orientation: globalLayout.orientation - }; //-- Get the chapter's display type + if (!isArray(drivers)) { + drivers = [drivers]; + } - this.properties.forEach(function (prop) { - var rendition = prop.replace("rendition:", ""); - var split = rendition.indexOf("-"); - var property, value; + var supportedDrivers = this._getSupportedDrivers(drivers); - if (split != -1) { - property = rendition.slice(0, split); - value = rendition.slice(split + 1); - settings[property] = value; - } - }); - return settings; - } - /** - * Get a CFI from a Range in the Section - * @param {range} _range - * @return {string} cfi an EpubCFI string - */ + function setDriverToConfig() { + self._config.driver = self.driver(); + } + function extendSelfWithDriver(driver) { + self._extend(driver); + setDriverToConfig(); - cfiFromRange(_range) { - return new epubcfi["a" /* default */](_range, this.cfiBase).toString(); - } - /** - * Get a CFI from an Element in the Section - * @param {element} el - * @return {string} cfi an EpubCFI string - */ + self._ready = self._initStorage(self._config); + return self._ready; + } + function initDriver(supportedDrivers) { + return function () { + var currentDriverIndex = 0; - cfiFromElement(el) { - return new epubcfi["a" /* default */](el, this.cfiBase).toString(); - } - /** - * Unload the section document - */ + function driverPromiseLoop() { + while (currentDriverIndex < supportedDrivers.length) { + var driverName = supportedDrivers[currentDriverIndex]; + currentDriverIndex++; + self._dbInfo = null; + self._ready = null; - unload() { - this.document = undefined; - this.contents = undefined; - this.output = undefined; - } + return self.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop); + } - destroy() { - this.unload(); - this.hooks.serialize.clear(); - this.hooks.content.clear(); - this.hooks = undefined; - this.idref = undefined; - this.linear = undefined; - this.properties = undefined; - this.index = undefined; - this.href = undefined; - this.url = undefined; - this.next = undefined; - this.prev = undefined; - this.cfiBase = undefined; - } + setDriverToConfig(); + var error = new Error('No available storage method found.'); + self._driverSet = Promise$1.reject(error); + return self._driverSet; + } -} + return driverPromiseLoop(); + }; + } -/* harmony default export */ var src_section = (section_Section); -// CONCATENATED MODULE: ./src/spine.js + // There might be a driver initialization in progress + // so wait for it to finish in order to avoid a possible + // race condition to set _dbInfo + var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function () { + return Promise$1.resolve(); + }) : Promise$1.resolve(); + this._driverSet = oldDriverSetDone.then(function () { + var driverName = supportedDrivers[0]; + self._dbInfo = null; + self._ready = null; + return self.getDriver(driverName).then(function (driver) { + self._driver = driver._driver; + setDriverToConfig(); + self._wrapLibraryMethodsWithReady(); + self._initDriver = initDriver(supportedDrivers); + }); + })["catch"](function () { + setDriverToConfig(); + var error = new Error('No available storage method found.'); + self._driverSet = Promise$1.reject(error); + return self._driverSet; + }); + executeTwoCallbacks(this._driverSet, callback, errorCallback); + return this._driverSet; + }; -/** - * A collection of Spine Items - */ + LocalForage.prototype.supports = function supports(driverName) { + return !!DriverSupport[driverName]; + }; -class spine_Spine { - constructor() { - this.spineItems = []; - this.spineByHref = {}; - this.spineById = {}; - this.hooks = {}; - this.hooks.serialize = new hook["a" /* default */](); - this.hooks.content = new hook["a" /* default */](); // Register replacements + LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) { + extend(this, libraryMethodsAndProperties); + }; - this.hooks.content.register(replacements["a" /* replaceBase */]); - this.hooks.content.register(replacements["b" /* replaceCanonical */]); - this.hooks.content.register(replacements["d" /* replaceMeta */]); - this.epubcfi = new epubcfi["a" /* default */](); - this.loaded = false; - this.items = undefined; - this.manifest = undefined; - this.spineNodeIndex = undefined; - this.baseUrl = undefined; - this.length = undefined; - } - /** - * Unpack items from a opf into spine items - * @param {Packaging} _package - * @param {method} resolver URL resolver - * @param {method} canonical Resolve canonical url - */ + LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) { + var supportedDrivers = []; + for (var i = 0, len = drivers.length; i < len; i++) { + var driverName = drivers[i]; + if (this.supports(driverName)) { + supportedDrivers.push(driverName); + } + } + return supportedDrivers; + }; + LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() { + // Add a stub for each driver API method that delays the call to the + // corresponding driver method until localForage is ready. These stubs + // will be replaced by the driver methods as soon as the driver is + // loaded, so there is no performance impact. + for (var i = 0, len = LibraryMethods.length; i < len; i++) { + callWhenReady(this, LibraryMethods[i]); + } + }; - unpack(_package, resolver, canonical) { - this.items = _package.spine; - this.manifest = _package.manifest; - this.spineNodeIndex = _package.spineNodeIndex; - this.baseUrl = _package.baseUrl || _package.basePath || ""; - this.length = this.items.length; - this.items.forEach((item, index) => { - var manifestItem = this.manifest[item.idref]; - var spineItem; - item.index = index; - item.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref); + LocalForage.prototype.createInstance = function createInstance(options) { + return new LocalForage(options); + }; - if (item.href) { - item.url = resolver(item.href, true); - item.canonical = canonical(item.href); - } + return LocalForage; +}(); - if (manifestItem) { - item.href = manifestItem.href; - item.url = resolver(item.href, true); - item.canonical = canonical(item.href); +// The actual localForage object that we expose as a module or via a +// global. It's extended by pulling in one of our other libraries. - if (manifestItem.properties.length) { - item.properties.push.apply(item.properties, manifestItem.properties); - } - } - if (item.linear === "yes") { - item.prev = function () { - let prevIndex = item.index; +var localforage_js = new LocalForage(); - while (prevIndex > 0) { - let prev = this.get(prevIndex - 1); +module.exports = localforage_js; - if (prev && prev.linear) { - return prev; - } +},{"3":3}]},{},[4])(4) +}); - prevIndex -= 1; - } +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(17))) - return; - }.bind(this); +/***/ }), +/* 24 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - item.next = function () { - let nextIndex = item.index; +"use strict"; + +// EXTERNAL MODULE: ./node_modules/event-emitter/index.js +var event_emitter = __webpack_require__(3); +var event_emitter_default = /*#__PURE__*/__webpack_require__.n(event_emitter); - while (nextIndex < this.spineItems.length - 1) { - let next = this.get(nextIndex + 1); +// EXTERNAL MODULE: ./src/utils/core.js +var core = __webpack_require__(0); - if (next && next.linear) { - return next; - } +// EXTERNAL MODULE: ./src/utils/url.js +var utils_url = __webpack_require__(5); - nextIndex += 1; - } +// EXTERNAL MODULE: ./src/utils/path.js +var utils_path = __webpack_require__(4); - return; - }.bind(this); - } else { - item.prev = function () { - return; - }; +// EXTERNAL MODULE: ./src/epubcfi.js +var epubcfi = __webpack_require__(2); - item.next = function () { - return; - }; - } +// EXTERNAL MODULE: ./src/utils/hook.js +var hook = __webpack_require__(6); - spineItem = new src_section(item, this.hooks); - this.append(spineItem); - }); - this.loaded = true; - } - /** - * Get an item from the spine - * @param {string|number} [target] - * @return {Section} section - * @example spine.get(); - * @example spine.get(1); - * @example spine.get("chap1.html"); - * @example spine.get("#id1234"); - */ +// EXTERNAL MODULE: ./src/utils/replacements.js +var replacements = __webpack_require__(8); +// CONCATENATED MODULE: ./src/utils/request.js - get(target) { - var index = 0; - if (typeof target === "undefined") { - while (index < this.spineItems.length) { - let next = this.spineItems[index]; - if (next && next.linear) { - break; - } +function request_request(url, type, withCredentials, headers) { + var supportsURL = typeof window != "undefined" ? window.URL : false; // TODO: fallback for url if window isn't defined - index += 1; - } - } else if (this.epubcfi.isCfiString(target)) { - let cfi = new epubcfi["a" /* default */](target); - index = cfi.spinePos; - } else if (typeof target === "number" || isNaN(target) === false) { - index = target; - } else if (typeof target === "string" && target.indexOf("#") === 0) { - index = this.spineById[target.substring(1)]; - } else if (typeof target === "string") { - // Remove fragments - target = target.split("#")[0]; - index = this.spineByHref[target] || this.spineByHref[encodeURI(target)]; - } + var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; + var deferred = new core["defer"](); + var xhr = new XMLHttpRequest(); //-- Check from PDF.js: + // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js - return this.spineItems[index] || null; + var xhrPrototype = XMLHttpRequest.prototype; + var header; + + if (!("overrideMimeType" in xhrPrototype)) { + // IE10 might have response, but not overrideMimeType + Object.defineProperty(xhrPrototype, "overrideMimeType", { + value: function xmlHttpRequestOverrideMimeType() {} + }); } - /** - * Append a Section to the Spine - * @private - * @param {Section} section - */ + if (withCredentials) { + xhr.withCredentials = true; + } - append(section) { - var index = this.spineItems.length; - section.index = index; - this.spineItems.push(section); // Encode and Decode href lookups - // see pr for details: https://github.com/futurepress/epub.js/pull/358 + xhr.onreadystatechange = handler; + xhr.onerror = err; + xhr.open("GET", url, true); - this.spineByHref[decodeURI(section.href)] = index; - this.spineByHref[encodeURI(section.href)] = index; - this.spineByHref[section.href] = index; - this.spineById[section.idref] = index; - return index; + for (header in headers) { + xhr.setRequestHeader(header, headers[header]); } - /** - * Prepend a Section to the Spine - * @private - * @param {Section} section - */ + if (type == "json") { + xhr.setRequestHeader("Accept", "application/json"); + } // If type isn"t set, determine it from the file extension - prepend(section) { - // var index = this.spineItems.unshift(section); - this.spineByHref[section.href] = 0; - this.spineById[section.idref] = 0; // Re-index - - this.spineItems.forEach(function (item, index) { - item.index = index; - }); - return 0; - } // insert(section, index) { - // - // }; - /** - * Remove a Section from the Spine - * @private - * @param {Section} section - */ + if (!type) { + type = new utils_path["a" /* default */](url).extension; + } + if (type == "blob") { + xhr.responseType = BLOB_RESPONSE; + } - remove(section) { - var index = this.spineItems.indexOf(section); + if (Object(core["isXml"])(type)) { + // xhr.responseType = "document"; + xhr.overrideMimeType("text/xml"); // for OPF parsing + } - if (index > -1) { - delete this.spineByHref[section.href]; - delete this.spineById[section.idref]; - return this.spineItems.splice(index, 1); - } + if (type == "xhtml") {// xhr.responseType = "document"; } - /** - * Loop over the Sections in the Spine - * @return {method} forEach - */ + if (type == "html" || type == "htm") {// xhr.responseType = "document"; + } - each() { - return this.spineItems.forEach.apply(this.spineItems, arguments); + if (type == "binary") { + xhr.responseType = "arraybuffer"; } - /** - * Find the first Section in the Spine - * @return {Section} first section - */ + xhr.send(); - first() { - let index = 0; + function err(e) { + deferred.reject(e); + } - do { - let next = this.get(index); + function handler() { + if (this.readyState === XMLHttpRequest.DONE) { + var responseXML = false; - if (next && next.linear) { - return next; + if (this.responseType === "" || this.responseType === "document") { + responseXML = this.responseXML; } - index += 1; - } while (index < this.spineItems.length); - } - /** - * Find the last Section in the Spine - * @return {Section} last section - */ - - - last() { - let index = this.spineItems.length - 1; + if (this.status === 200 || this.status === 0 || responseXML) { + //-- Firefox is reporting 0 for blob urls + var r; - do { - let prev = this.get(index); + if (!this.response && !responseXML) { + deferred.reject({ + status: this.status, + message: "Empty Response", + stack: new Error().stack + }); + return deferred.promise; + } - if (prev && prev.linear) { - return prev; - } + if (this.status === 403) { + deferred.reject({ + status: this.status, + response: this.response, + message: "Forbidden", + stack: new Error().stack + }); + return deferred.promise; + } - index -= 1; - } while (index >= 0); - } + if (responseXML) { + r = this.responseXML; + } else if (Object(core["isXml"])(type)) { + // xhr.overrideMimeType("text/xml"); // for OPF parsing + // If this.responseXML wasn't set, try to parse using a DOMParser from text + r = Object(core["parse"])(this.response, "text/xml"); + } else if (type == "xhtml") { + r = Object(core["parse"])(this.response, "application/xhtml+xml"); + } else if (type == "html" || type == "htm") { + r = Object(core["parse"])(this.response, "text/html"); + } else if (type == "json") { + r = JSON.parse(this.response); + } else if (type == "blob") { + if (supportsURL) { + r = this.response; + } else { + //-- Safari doesn't support responseType blob, so create a blob from arraybuffer + r = new Blob([this.response]); + } + } else { + r = this.response; + } - destroy() { - this.each(section => section.destroy()); - this.spineItems = undefined; - this.spineByHref = undefined; - this.spineById = undefined; - this.hooks.serialize.clear(); - this.hooks.content.clear(); - this.hooks = undefined; - this.epubcfi = undefined; - this.loaded = false; - this.items = undefined; - this.manifest = undefined; - this.spineNodeIndex = undefined; - this.baseUrl = undefined; - this.length = undefined; + deferred.resolve(r); + } else { + deferred.reject({ + status: this.status, + message: this.response, + stack: new Error().stack + }); + } + } } + return deferred.promise; } -/* harmony default export */ var src_spine = (spine_Spine); -// EXTERNAL MODULE: ./src/utils/queue.js -var queue = __webpack_require__(21); +/* harmony default export */ var utils_request = (request_request); +// EXTERNAL MODULE: ./node_modules/@xmldom/xmldom/lib/index.js +var lib = __webpack_require__(15); -// EXTERNAL MODULE: ./src/utils/constants.js -var constants = __webpack_require__(1); +// CONCATENATED MODULE: ./src/section.js -// CONCATENATED MODULE: ./src/locations.js @@ -16655,2375 +14240,2138 @@ /** - * Find Locations for a Book - * @param {Spine} spine - * @param {request} request - * @param {number} [pause=100] + * Represents a Section of the Book + * + * In most books this is equivalent to a Chapter + * @param {object} item The spine item representing the section + * @param {object} hooks hooks for serialize and content */ -class locations_Locations { - constructor(spine, request, pause) { - this.spine = spine; - this.request = request; - this.pause = pause || 100; - this.q = new queue["a" /* default */](this); - this.epubcfi = new epubcfi["a" /* default */](); - this._locations = []; - this._locationsWords = []; - this.total = 0; - this.break = 150; - this._current = 0; - this._wordCounter = 0; - this.currentLocation = ''; - this._currentCfi = ''; - this.processingTimeout = undefined; - } - /** - * Load all of sections in the book to generate locations - * @param {int} chars how many chars to split on - * @return {object} locations - */ - +class section_Section { + constructor(item, hooks) { + this.idref = item.idref; + this.linear = item.linear === "yes"; + this.properties = item.properties; + this.index = item.index; + this.href = item.href; + this.url = item.url; + this.canonical = item.canonical; + this.next = item.next; + this.prev = item.prev; + this.cfiBase = item.cfiBase; - generate(chars) { - if (chars) { - this.break = chars; + if (hooks) { + this.hooks = hooks; + } else { + this.hooks = {}; + this.hooks.serialize = new hook["a" /* default */](this); + this.hooks.content = new hook["a" /* default */](this); } - this.q.pause(); - this.spine.each(function (section) { - if (section.linear) { - this.q.enqueue(this.process.bind(this), section); - } - }.bind(this)); - return this.q.run().then(function () { - this.total = this._locations.length - 1; - - if (this._currentCfi) { - this.currentLocation = this._currentCfi; - } - - return this._locations; // console.log(this.percentage(this.book.rendition.location.start), this.percentage(this.book.rendition.location.end)); - }.bind(this)); - } - - createRange() { - return { - startContainer: undefined, - startOffset: undefined, - endContainer: undefined, - endOffset: undefined - }; - } - - process(section) { - return section.load(this.request).then(function (contents) { - var completed = new core["defer"](); - var locations = this.parse(contents, section.cfiBase); - this._locations = this._locations.concat(locations); - section.unload(); - this.processingTimeout = setTimeout(() => completed.resolve(locations), this.pause); - return completed.promise; - }.bind(this)); + this.document = undefined; + this.contents = undefined; + this.output = undefined; } + /** + * Load the section from its url + * @param {method} [_request] a request method to use for loading + * @return {document} a promise with the xml document + */ - parse(contents, cfiBase, chars) { - var locations = []; - var range; - var doc = contents.ownerDocument; - var body = Object(core["qs"])(doc, "body"); - var counter = 0; - var prev; - - var _break = chars || this.break; - - var parser = function (node) { - var len = node.length; - var dist; - var pos = 0; - - if (node.textContent.trim().length === 0) { - return false; // continue - } // Start range - - - if (counter == 0) { - range = this.createRange(); - range.startContainer = node; - range.startOffset = 0; - } - - dist = _break - counter; // Node is smaller than a break, - // skip over it - - if (dist > len) { - counter += len; - pos = len; - } - - while (pos < len) { - dist = _break - counter; - - if (counter === 0) { - // Start new range - pos += 1; - range = this.createRange(); - range.startContainer = node; - range.startOffset = pos; - } // pos += dist; - // Gone over - - - if (pos + dist >= len) { - // Continue counter for next node - counter += len - pos; // break - - pos = len; // At End - } else { - // Advance pos - pos += dist; // End the previous range - range.endContainer = node; - range.endOffset = pos; // cfi = section.cfiFromRange(range); + load(_request) { + var request = _request || this.request || utils_request; + var loading = new core["defer"](); + var loaded = loading.promise; - let cfi = new epubcfi["a" /* default */](range, cfiBase).toString(); - locations.push(cfi); - counter = 0; - } - } + if (this.contents) { + loading.resolve(this.contents); + } else { + request(this.url).then(function (xml) { + // when the url has no extension, `request` won't parse it, + // so we'll just have to parse it ourselves + if (typeof xml === 'string') xml = new DOMParser().parseFromString(xml, 'text/html'); // var directory = new Url(this.url).directory; - prev = node; - }; + this.document = xml; + this.contents = xml.documentElement; + return this.hooks.content.trigger(this.document, this); + }.bind(this)).then(function () { + loading.resolve(this.contents); + }.bind(this)).catch(function (error) { + loading.reject(error); + }); + } - Object(core["sprint"])(body, parser.bind(this)); // Close remaining + return loaded; + } + /** + * Adds a base tag for resolving urls in the section + * @private + */ - if (range && range.startContainer && prev) { - range.endContainer = prev; - range.endOffset = prev.length; - let cfi = new epubcfi["a" /* default */](range, cfiBase).toString(); - locations.push(cfi); - counter = 0; - } - return locations; + base() { + return Object(replacements["a" /* replaceBase */])(this.document, this); } /** - * Load all of sections in the book to generate locations - * @param {string} startCfi start position - * @param {int} wordCount how many words to split on - * @param {int} count result count - * @return {object} locations + * Render the contents of a section + * @param {method} [_request] a request method to use for loading + * @return {string} output a serialized XML Document */ - generateFromWords(startCfi, wordCount, count) { - var start = startCfi ? new epubcfi["a" /* default */](startCfi) : undefined; - this.q.pause(); - this._locationsWords = []; - this._wordCounter = 0; - this.spine.each(function (section) { - if (section.linear) { - if (start) { - if (section.index >= start.spinePos) { - this.q.enqueue(this.processWords.bind(this), section, wordCount, start, count); - } - } else { - this.q.enqueue(this.processWords.bind(this), section, wordCount, start, count); - } - } - }.bind(this)); - return this.q.run().then(function () { - if (this._currentCfi) { - this.currentLocation = this._currentCfi; + render(_request) { + var rendering = new core["defer"](); + var rendered = rendering.promise; + this.output; // TODO: better way to return this from hooks? + + this.load(_request).then(function (contents) { + var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || ''; + var isIE = userAgent.indexOf('Trident') >= 0; + var Serializer; + + if (typeof XMLSerializer === "undefined" || isIE) { + Serializer = lib["DOMParser"]; + } else { + Serializer = XMLSerializer; } - return this._locationsWords; - }.bind(this)); + var serializer = new Serializer(); + this.output = serializer.serializeToString(contents); + return this.output; + }.bind(this)).then(function () { + return this.hooks.serialize.trigger(this.output, this); + }.bind(this)).then(function () { + rendering.resolve(this.output); + }.bind(this)).catch(function (error) { + rendering.reject(error); + }); + return rendered; } + /** + * Find a string in a section + * @param {string} _query The query string to find + * @return {object[]} A list of matches, with form {cfi, excerpt} + */ - processWords(section, wordCount, startCfi, count) { - if (count && this._locationsWords.length >= count) { - return Promise.resolve(); - } - - return section.load(this.request).then(function (contents) { - var completed = new core["defer"](); - var locations = this.parseWords(contents, section, wordCount, startCfi); - var remainingCount = count - this._locationsWords.length; - this._locationsWords = this._locationsWords.concat(locations.length >= count ? locations.slice(0, remainingCount) : locations); - section.unload(); - this.processingTimeout = setTimeout(() => completed.resolve(locations), this.pause); - return completed.promise; - }.bind(this)); - } //http://stackoverflow.com/questions/18679576/counting-words-in-string + find(_query) { + var section = this; + var matches = []; - countWords(s) { - s = s.replace(/(^\s*)|(\s*$)/gi, ""); //exclude start and end white-space + var query = _query.toLowerCase(); - s = s.replace(/[ ]{2,}/gi, " "); //2 or more space to 1 + var find = function (node) { + var text = node.textContent.toLowerCase(); + var range = section.document.createRange(); + var cfi; + var pos; + var last = -1; + var excerpt; + var limit = 150; - s = s.replace(/\n /, "\n"); // exclude newline with a start spacing + while (pos != -1) { + // Search for the query + pos = text.indexOf(query, last + 1); - return s.split(" ").length; - } + if (pos != -1) { + // We found it! Generate a CFI + range = section.document.createRange(); + range.setStart(node, pos); + range.setEnd(node, pos + query.length); + cfi = section.cfiFromRange(range); // Generate the excerpt - parseWords(contents, section, wordCount, startCfi) { - var cfiBase = section.cfiBase; - var locations = []; - var doc = contents.ownerDocument; - var body = Object(core["qs"])(doc, "body"); - var prev; - var _break = wordCount; - var foundStartNode = startCfi ? startCfi.spinePos !== section.index : true; - var startNode; + if (node.textContent.length < limit) { + excerpt = node.textContent; + } else { + excerpt = node.textContent.substring(pos - limit / 2, pos + limit / 2); + excerpt = "..." + excerpt + "..."; + } // Add the CFI to the matches list - if (startCfi && section.index === startCfi.spinePos) { - startNode = startCfi.findNode(startCfi.range ? startCfi.path.steps.concat(startCfi.start.steps) : startCfi.path.steps, contents.ownerDocument); - } - var parser = function (node) { - if (!foundStartNode) { - if (node === startNode) { - foundStartNode = true; - } else { - return false; + matches.push({ + cfi: cfi, + excerpt: excerpt + }); } - } - if (node.textContent.length < 10) { - if (node.textContent.trim().length === 0) { - return false; - } + last = pos; } + }; - var len = this.countWords(node.textContent); - var dist; - var pos = 0; + Object(core["sprint"])(section.document, function (node) { + find(node); + }); + return matches; + } - if (len === 0) { - return false; // continue - } + /** + * Search a string in multiple sequential Element of the section. If the document.createTreeWalker api is missed(eg: IE8), use `find` as a fallback. + * @param {string} _query The query string to search + * @param {int} maxSeqEle The maximum number of Element that are combined for search, default value is 5. + * @return {object[]} A list of matches, with form {cfi, excerpt} + */ + search(_query, maxSeqEle = 5) { + if (typeof document.createTreeWalker == "undefined") { + return this.find(_query); + } - dist = _break - this._wordCounter; // Node is smaller than a break, - // skip over it + let matches = []; + const excerptLimit = 150; + const section = this; - if (dist > len) { - this._wordCounter += len; - pos = len; - } + const query = _query.toLowerCase(); - while (pos < len) { - dist = _break - this._wordCounter; // Gone over + const search = function (nodeList) { + const textWithCase = nodeList.reduce((acc, current) => { + return acc + current.textContent; + }, ""); + const text = textWithCase.toLowerCase(); + const pos = text.indexOf(query); - if (pos + dist >= len) { - // Continue counter for next node - this._wordCounter += len - pos; // break + if (pos != -1) { + const startNodeIndex = 0, + endPos = pos + query.length; + let endNodeIndex = 0, + l = 0; - pos = len; // At End - } else { - // Advance pos - pos += dist; - let cfi = new epubcfi["a" /* default */](node, cfiBase); - locations.push({ - cfi: cfi.toString(), - wordCount: this._wordCounter - }); - this._wordCounter = 0; - } - } + if (pos < nodeList[startNodeIndex].length) { + let cfi; - prev = node; - }; + while (endNodeIndex < nodeList.length - 1) { + l += nodeList[endNodeIndex].length; - Object(core["sprint"])(body, parser.bind(this)); - return locations; - } - /** - * Get a location from an EpubCFI - * @param {EpubCFI} cfi - * @return {number} - */ + if (endPos <= l) { + break; + } + endNodeIndex += 1; + } - locationFromCfi(cfi) { - let loc; + let startNode = nodeList[startNodeIndex], + endNode = nodeList[endNodeIndex]; + let range = section.document.createRange(); + range.setStart(startNode, pos); + let beforeEndLengthCount = nodeList.slice(0, endNodeIndex).reduce((acc, current) => { + return acc + current.textContent.length; + }, 0); + range.setEnd(endNode, beforeEndLengthCount > endPos ? endPos : endPos - beforeEndLengthCount); + cfi = section.cfiFromRange(range); + let excerpt = nodeList.slice(0, endNodeIndex + 1).reduce((acc, current) => { + return acc + current.textContent; + }, ""); - if (epubcfi["a" /* default */].prototype.isCfiString(cfi)) { - cfi = new epubcfi["a" /* default */](cfi); - } // Check if the location has not been set yet + if (excerpt.length > excerptLimit) { + excerpt = excerpt.substring(pos - excerptLimit / 2, pos + excerptLimit / 2); + excerpt = "..." + excerpt + "..."; + } + + matches.push({ + cfi: cfi, + excerpt: excerpt + }); + } + } + }; + const treeWalker = document.createTreeWalker(section.document, NodeFilter.SHOW_TEXT, null, false); + let node, + nodeList = []; - if (this._locations.length === 0) { - return -1; - } + while (node = treeWalker.nextNode()) { + nodeList.push(node); - loc = Object(core["locationOf"])(cfi, this._locations, this.epubcfi.compare); + if (nodeList.length == maxSeqEle) { + search(nodeList.slice(0, maxSeqEle)); + nodeList = nodeList.slice(1, maxSeqEle); + } + } - if (loc > this.total) { - return this.total; + if (nodeList.length > 0) { + search(nodeList); } - return loc; + return matches; } /** - * Get a percentage position in locations from an EpubCFI - * @param {EpubCFI} cfi - * @return {number} - */ - + * Reconciles the current chapters layout properties with + * the global layout properties. + * @param {object} globalLayout The global layout settings object, chapter properties string + * @return {object} layoutProperties Object with layout properties + */ - percentageFromCfi(cfi) { - if (this._locations.length === 0) { - return null; - } // Find closest cfi + reconcileLayoutSettings(globalLayout) { + //-- Get the global defaults + var settings = { + layout: globalLayout.layout, + spread: globalLayout.spread, + orientation: globalLayout.orientation + }; //-- Get the chapter's display type - var loc = this.locationFromCfi(cfi); // Get percentage in total + this.properties.forEach(function (prop) { + var rendition = prop.replace("rendition:", ""); + var split = rendition.indexOf("-"); + var property, value; - return this.percentageFromLocation(loc); + if (split != -1) { + property = rendition.slice(0, split); + value = rendition.slice(split + 1); + settings[property] = value; + } + }); + return settings; } /** - * Get a percentage position from a location index - * @param {number} location - * @return {number} + * Get a CFI from a Range in the Section + * @param {range} _range + * @return {string} cfi an EpubCFI string */ - percentageFromLocation(loc) { - if (!loc || !this.total) { - return 0; - } - - return loc / this.total; + cfiFromRange(_range) { + return new epubcfi["a" /* default */](_range, this.cfiBase).toString(); } /** - * Get an EpubCFI from location index - * @param {number} loc - * @return {EpubCFI} cfi + * Get a CFI from an Element in the Section + * @param {element} el + * @return {string} cfi an EpubCFI string */ - cfiFromLocation(loc) { - var cfi = -1; // check that pg is an int - - if (typeof loc != "number") { - loc = parseInt(loc); - } - - if (loc >= 0 && loc < this._locations.length) { - cfi = this._locations[loc]; - } - - return cfi; + cfiFromElement(el) { + return new epubcfi["a" /* default */](el, this.cfiBase).toString(); } /** - * Get an EpubCFI from location percentage - * @param {number} percentage - * @return {EpubCFI} cfi + * Unload the section document */ - cfiFromPercentage(percentage) { - let loc; + unload() { + this.document = undefined; + this.contents = undefined; + this.output = undefined; + } - if (percentage > 1) { - console.warn("Normalize cfiFromPercentage value to between 0 - 1"); - } // Make sure 1 goes to very end + destroy() { + this.unload(); + this.hooks.serialize.clear(); + this.hooks.content.clear(); + this.hooks = undefined; + this.idref = undefined; + this.linear = undefined; + this.properties = undefined; + this.index = undefined; + this.href = undefined; + this.url = undefined; + this.next = undefined; + this.prev = undefined; + this.cfiBase = undefined; + } +} - if (percentage >= 1) { - let cfi = new epubcfi["a" /* default */](this._locations[this.total]); - cfi.collapse(); - return cfi.toString(); - } +/* harmony default export */ var src_section = (section_Section); +// CONCATENATED MODULE: ./src/spine.js - loc = Math.ceil(this.total * percentage); - return this.cfiFromLocation(loc); - } - /** - * Load locations from JSON - * @param {json} locations - */ - load(locations) { - if (typeof locations === "string") { - this._locations = JSON.parse(locations); - } else { - this._locations = locations; - } - this.total = this._locations.length - 1; - return this._locations; +/** + * A collection of Spine Items + */ + +class spine_Spine { + constructor() { + this.spineItems = []; + this.spineByHref = {}; + this.spineById = {}; + this.hooks = {}; + this.hooks.serialize = new hook["a" /* default */](); + this.hooks.content = new hook["a" /* default */](); // Register replacements + + this.hooks.content.register(replacements["a" /* replaceBase */]); + this.hooks.content.register(replacements["b" /* replaceCanonical */]); + this.hooks.content.register(replacements["d" /* replaceMeta */]); + this.epubcfi = new epubcfi["a" /* default */](); + this.loaded = false; + this.items = undefined; + this.manifest = undefined; + this.spineNodeIndex = undefined; + this.baseUrl = undefined; + this.length = undefined; } /** - * Save locations to JSON - * @return {json} + * Unpack items from a opf into spine items + * @param {Packaging} _package + * @param {method} resolver URL resolver + * @param {method} canonical Resolve canonical url */ - save() { - return JSON.stringify(this._locations); - } + unpack(_package, resolver, canonical) { + this.items = _package.spine; + this.manifest = _package.manifest; + this.spineNodeIndex = _package.spineNodeIndex; + this.baseUrl = _package.baseUrl || _package.basePath || ""; + this.length = this.items.length; + this.items.forEach((item, index) => { + var manifestItem = this.manifest[item.idref]; + var spineItem; + item.index = index; + item.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.id); - getCurrent() { - return this._current; - } + if (item.href) { + item.url = resolver(item.href, true); + item.canonical = canonical(item.href); + } - setCurrent(curr) { - var loc; + if (manifestItem) { + item.href = manifestItem.href; + item.url = resolver(item.href, true); + item.canonical = canonical(item.href); - if (typeof curr == "string") { - this._currentCfi = curr; - } else if (typeof curr == "number") { - this._current = curr; - } else { - return; - } + if (manifestItem.properties.length) { + item.properties.push.apply(item.properties, manifestItem.properties); + } + } - if (this._locations.length === 0) { - return; - } + if (item.linear === "yes") { + item.prev = function () { + let prevIndex = item.index; - if (typeof curr == "string") { - loc = this.locationFromCfi(curr); - this._current = loc; - } else { - loc = curr; - } + while (prevIndex > 0) { + let prev = this.get(prevIndex - 1); - this.emit(constants["c" /* EVENTS */].LOCATIONS.CHANGED, { - percentage: this.percentageFromLocation(loc) - }); - } - /** - * Get the current location - */ + if (prev && prev.linear) { + return prev; + } + prevIndex -= 1; + } - get currentLocation() { - return this._current; - } - /** - * Set the current location - */ + return; + }.bind(this); + item.next = function () { + let nextIndex = item.index; - set currentLocation(curr) { - this.setCurrent(curr); - } - /** - * Locations length - */ + while (nextIndex < this.spineItems.length - 1) { + let next = this.get(nextIndex + 1); + if (next && next.linear) { + return next; + } - length() { - return this._locations.length; - } + nextIndex += 1; + } - destroy() { - this.spine = undefined; - this.request = undefined; - this.pause = undefined; - this.q.stop(); - this.q = undefined; - this.epubcfi = undefined; - this._locations = undefined; - this.total = undefined; - this.break = undefined; - this._current = undefined; - this.currentLocation = undefined; - this._currentCfi = undefined; - clearTimeout(this.processingTimeout); - } + return; + }.bind(this); + } else { + item.prev = function () { + return; + }; -} + item.next = function () { + return; + }; + } -event_emitter_default()(locations_Locations.prototype); -/* harmony default export */ var src_locations = (locations_Locations); -// EXTERNAL MODULE: ./node_modules/path-webpack/path.js -var path_webpack_path = __webpack_require__(9); -var path_default = /*#__PURE__*/__webpack_require__.n(path_webpack_path); + spineItem = new src_section(item, this.hooks); + this.append(spineItem); + }); + this.loaded = true; + } + /** + * Get an item from the spine + * @param {string|number} [target] + * @return {Section} section + * @example spine.get(); + * @example spine.get(1); + * @example spine.get("chap1.html"); + * @example spine.get("#id1234"); + */ -// CONCATENATED MODULE: ./src/container.js + get(target) { + var index = 0; -/** - * Handles Parsing and Accessing an Epub Container - * @class - * @param {document} [containerDocument] xml document - */ + if (typeof target === "undefined") { + while (index < this.spineItems.length) { + let next = this.spineItems[index]; -class container_Container { - constructor(containerDocument) { - this.packagePath = ''; - this.directory = ''; - this.encoding = ''; + if (next && next.linear) { + break; + } - if (containerDocument) { - this.parse(containerDocument); + index += 1; + } + } else if (this.epubcfi.isCfiString(target)) { + let cfi = new epubcfi["a" /* default */](target); + index = cfi.spinePos; + } else if (typeof target === "number" || isNaN(target) === false) { + index = target; + } else if (typeof target === "string" && target.indexOf("#") === 0) { + index = this.spineById[target.substring(1)]; + } else if (typeof target === "string") { + // Remove fragments + target = target.split("#")[0]; + index = this.spineByHref[target] || this.spineByHref[encodeURI(target)]; } + + return this.spineItems[index] || null; } /** - * Parse the Container XML - * @param {document} containerDocument + * Append a Section to the Spine + * @private + * @param {Section} section */ - parse(containerDocument) { - //-- - var rootfile; - - if (!containerDocument) { - throw new Error("Container File Not Found"); - } - - rootfile = Object(core["qs"])(containerDocument, "rootfile"); - - if (!rootfile) { - throw new Error("No RootFile Found"); - } + append(section) { + var index = this.spineItems.length; + section.index = index; + this.spineItems.push(section); // Encode and Decode href lookups + // see pr for details: https://github.com/futurepress/epub.js/pull/358 - this.packagePath = rootfile.getAttribute("full-path"); - this.directory = path_default.a.dirname(this.packagePath); - this.encoding = containerDocument.xmlEncoding; + this.spineByHref[decodeURI(section.href)] = index; + this.spineByHref[encodeURI(section.href)] = index; + this.spineByHref[section.href] = index; + this.spineById[section.idref] = index; + return index; } + /** + * Prepend a Section to the Spine + * @private + * @param {Section} section + */ - destroy() { - this.packagePath = undefined; - this.directory = undefined; - this.encoding = undefined; - } -} + prepend(section) { + // var index = this.spineItems.unshift(section); + this.spineByHref[section.href] = 0; + this.spineById[section.idref] = 0; // Re-index -/* harmony default export */ var container = (container_Container); -// CONCATENATED MODULE: ./src/packaging.js + this.spineItems.forEach(function (item, index) { + item.index = index; + }); + return 0; + } // insert(section, index) { + // + // }; + /** + * Remove a Section from the Spine + * @private + * @param {Section} section + */ -/** - * Open Packaging Format Parser - * @class - * @param {document} packageDocument OPF XML - */ -class packaging_Packaging { - constructor(packageDocument) { - this.manifest = {}; - this.navPath = ''; - this.ncxPath = ''; - this.coverPath = ''; - this.spineNodeIndex = 0; - this.spine = []; - this.metadata = {}; + remove(section) { + var index = this.spineItems.indexOf(section); - if (packageDocument) { - this.parse(packageDocument); + if (index > -1) { + delete this.spineByHref[section.href]; + delete this.spineById[section.idref]; + return this.spineItems.splice(index, 1); } } /** - * Parse OPF XML - * @param {document} packageDocument OPF XML - * @return {object} parsed package parts + * Loop over the Sections in the Spine + * @return {method} forEach */ - parse(packageDocument) { - var metadataNode, manifestNode, spineNode; - - if (!packageDocument) { - throw new Error("Package File Not Found"); - } - - metadataNode = Object(core["qs"])(packageDocument, "metadata"); - - if (!metadataNode) { - throw new Error("No Metadata Found"); - } + each() { + return this.spineItems.forEach.apply(this.spineItems, arguments); + } + /** + * Find the first Section in the Spine + * @return {Section} first section + */ - manifestNode = Object(core["qs"])(packageDocument, "manifest"); - if (!manifestNode) { - throw new Error("No Manifest Found"); - } + first() { + let index = 0; - spineNode = Object(core["qs"])(packageDocument, "spine"); + do { + let next = this.get(index); - if (!spineNode) { - throw new Error("No Spine Found"); - } + if (next && next.linear) { + return next; + } - this.manifest = this.parseManifest(manifestNode); - this.navPath = this.findNavPath(manifestNode); - this.ncxPath = this.findNcxPath(manifestNode, spineNode); - this.coverPath = this.findCoverPath(packageDocument); - this.spineNodeIndex = Object(core["indexOfElementNode"])(spineNode); - this.spine = this.parseSpine(spineNode, this.manifest); - this.uniqueIdentifier = this.findUniqueIdentifier(packageDocument); - this.metadata = this.parseMetadata(metadataNode); - this.metadata.direction = spineNode.getAttribute("page-progression-direction"); - return { - "metadata": this.metadata, - "spine": this.spine, - "manifest": this.manifest, - "navPath": this.navPath, - "ncxPath": this.ncxPath, - "coverPath": this.coverPath, - "spineNodeIndex": this.spineNodeIndex - }; + index += 1; + } while (index < this.spineItems.length); } /** - * Parse Metadata - * @private - * @param {node} xml - * @return {object} metadata + * Find the last Section in the Spine + * @return {Section} last section */ - parseMetadata(xml) { - var metadata = {}; - const DC_NS = "http://purl.org/dc/elements/1.1/"; - const OPF_NS = "http://www.idpf.org/2007/opf"; - - const getElementText = node => node ? node.childNodes[0].nodeValue : null; - - const getElementsNS = (ns, tagName) => [...xml.getElementsByTagNameNS(ns, tagName)].filter(node => node.childNodes.length); - - const metas = [...xml.getElementsByTagName('meta')]; - - const getRefiningMetas = id => metas.filter(meta => meta.getAttribute('refines') === '#' + id); + last() { + let index = this.spineItems.length - 1; - const getPropertyMetas = (el, prop) => { - const id = el.getAttribute('id'); - const metas = getRefiningMetas(id); + do { + let prev = this.get(index); - if (metas) { - const refined = metas.filter(meta => meta.getAttribute('property') === prop); - if (refined) return refined; + if (prev && prev.linear) { + return prev; } - }; - - const getProperty = (el, ns, prop, one = true) => { - const attribute = el.getAttributeNS(ns, prop); - const metas = getPropertyMetas(el, prop); - return metas && metas.length ? one ? getElementText(metas[0]) : metas.map(getElementText) : attribute; - }; - const titles = getElementsNS(DC_NS, "title").map(x => ({ - type: getProperty(x, OPF_NS, 'title-type'), - seq: getProperty(x, OPF_NS, 'display-seq'), - label: getElementText(x) - })); - metadata.titles = titles; - const mainTitle = titles.find(x => x.type === 'main'); - if (mainTitle) metadata.title = mainTitle.label;else metadata.title = this.getElementText(xml, "title"); - metadata.creator = this.getElementText(xml, "creator"); - metadata.description = this.getElementText(xml, "description"); - metadata.subjects = getElementsNS(DC_NS, "subject").map(x => ({ - authority: getProperty(x, OPF_NS, 'authority'), - term: getProperty(x, OPF_NS, 'term'), - label: getElementText(x) - })); - metadata.sources = getElementsNS(DC_NS, "source").map(getElementText); - metadata.collections = metas.filter(meta => meta.getAttribute('property') === 'belongs-to-collection').map(meta => ({ - type: getProperty(meta, OPF_NS, 'collection-type'), - position: getProperty(meta, OPF_NS, 'group-position'), - label: getElementText(meta) - })); - metadata.contributors = getElementsNS(DC_NS, "contributor").map(x => ({ - role: getProperty(x, OPF_NS, 'role', false), - scheme: getProperty(x, OPF_NS, 'scheme', false), - label: getElementText(x) - })); - metadata.pubdate = this.getElementText(xml, "date"); - metadata.publisher = this.getElementText(xml, "publisher"); - metadata.identifiers = getElementsNS(DC_NS, "identifier").map(x => ({ - type: getProperty(x, OPF_NS, 'identifier-type'), - scheme: getProperty(x, OPF_NS, 'scheme'), - identifier: getElementText(x) - })); - metadata.identifier = this.getElementText(xml, "identifier"); - metadata.language = this.getElementText(xml, "language"); - metadata.rights = this.getElementText(xml, "rights"); - metadata.modified_date = this.getPropertyText(xml, "dcterms:modified"); - metadata.layout = this.getPropertyText(xml, "rendition:layout"); - metadata.orientation = this.getPropertyText(xml, "rendition:orientation"); - metadata.flow = this.getPropertyText(xml, "rendition:flow"); - metadata.viewport = this.getPropertyText(xml, "rendition:viewport"); - metadata.media_active_class = this.getPropertyText(xml, "media:active-class"); - metadata.spread = this.getPropertyText(xml, "rendition:spread"); // metadata.page_prog_dir = packageXml.querySelector("spine").getAttribute("page-progression-direction"); + index -= 1; + } while (index >= 0); + } - return metadata; + destroy() { + this.each(section => section.destroy()); + this.spineItems = undefined; + this.spineByHref = undefined; + this.spineById = undefined; + this.hooks.serialize.clear(); + this.hooks.content.clear(); + this.hooks = undefined; + this.epubcfi = undefined; + this.loaded = false; + this.items = undefined; + this.manifest = undefined; + this.spineNodeIndex = undefined; + this.baseUrl = undefined; + this.length = undefined; } - /** - * Parse Manifest - * @private - * @param {node} manifestXml - * @return {object} manifest - */ +} - parseManifest(manifestXml) { - var manifest = {}; //-- Turn items into an array - // var selected = manifestXml.querySelectorAll("item"); +/* harmony default export */ var src_spine = (spine_Spine); +// EXTERNAL MODULE: ./src/utils/queue.js +var queue = __webpack_require__(9); - var selected = Object(core["qsa"])(manifestXml, "item"); - var items = Array.prototype.slice.call(selected); //-- Create an object with the id as key +// EXTERNAL MODULE: ./src/utils/constants.js +var constants = __webpack_require__(1); - items.forEach(function (item) { - var id = item.getAttribute("id"), - href = item.getAttribute("href") || "", - type = item.getAttribute("media-type") || "", - overlay = item.getAttribute("media-overlay") || "", - properties = item.getAttribute("properties") || ""; - manifest[id] = { - "href": href, - // "url" : href, - "type": type, - "overlay": overlay, - "properties": properties.length ? properties.split(" ") : [] - }; - }); - return manifest; - } - /** - * Parse Spine - * @private - * @param {node} spineXml - * @param {Packaging.manifest} manifest - * @return {object} spine - */ +// CONCATENATED MODULE: ./src/locations.js - parseSpine(spineXml, manifest) { - var spine = []; - var selected = Object(core["qsa"])(spineXml, "itemref"); - var items = Array.prototype.slice.call(selected); // var epubcfi = new EpubCFI(); - //-- Add to array to mantain ordering and cross reference with manifest - items.forEach(function (item, index) { - var idref = item.getAttribute("idref"); // var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); - var props = item.getAttribute("properties") || ""; - var propArray = props.length ? props.split(" ") : []; // var manifestProps = manifest[Id].properties; - // var manifestPropArray = manifestProps.length ? manifestProps.split(" ") : []; - var itemref = { - "idref": idref, - "linear": item.getAttribute("linear") || "yes", - "properties": propArray, - // "href" : manifest[Id].href, - // "url" : manifest[Id].url, - "index": index // "cfiBase" : cfiBase +/** + * Find Locations for a Book + * @param {Spine} spine + * @param {request} request + * @param {number} [pause=100] + */ - }; - spine.push(itemref); - }); - return spine; +class locations_Locations { + constructor(spine, request, pause) { + this.spine = spine; + this.request = request; + this.pause = pause || 100; + this.q = new queue["a" /* default */](this); + this.epubcfi = new epubcfi["a" /* default */](); + this._locations = []; + this._locationsWords = []; + this.total = 0; + this.break = 150; + this._current = 0; + this._wordCounter = 0; + this.currentLocation = ''; + this._currentCfi = ''; + this.processingTimeout = undefined; } /** - * Find Unique Identifier - * @private - * @param {node} packageXml - * @return {string} Unique Identifier text + * Load all of sections in the book to generate locations + * @param {int} chars how many chars to split on + * @return {Promise>} locations */ - findUniqueIdentifier(packageXml) { - var uniqueIdentifierId = packageXml.documentElement.getAttribute("unique-identifier"); - - if (!uniqueIdentifierId) { - return ""; + generate(chars) { + if (chars) { + this.break = chars; } - var identifier = packageXml.getElementById(uniqueIdentifierId); - - if (!identifier) { - return ""; - } + this.q.pause(); + this.spine.each(function (section) { + if (section.linear) { + this.q.enqueue(this.process.bind(this), section); + } + }.bind(this)); + return this.q.run().then(function () { + this.total = this._locations.length - 1; - if (identifier.localName === "identifier" && identifier.namespaceURI === "http://purl.org/dc/elements/1.1/") { - return identifier.childNodes.length > 0 ? identifier.childNodes[0].nodeValue.trim() : ""; - } + if (this._currentCfi) { + this.currentLocation = this._currentCfi; + } - return ""; + return this._locations; // console.log(this.percentage(this.book.rendition.location.start), this.percentage(this.book.rendition.location.end)); + }.bind(this)); } - /** - * Find TOC NAV - * @private - * @param {element} manifestNode - * @return {string} - */ + createRange() { + return { + startContainer: undefined, + startOffset: undefined, + endContainer: undefined, + endOffset: undefined + }; + } - findNavPath(manifestNode) { - // Find item with property "nav" - // Should catch nav irregardless of order - // var node = manifestNode.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']"); - var node = Object(core["qsp"])(manifestNode, "item", { - "properties": "nav" - }); - return node ? node.getAttribute("href") : false; + process(section) { + return section.load(this.request).then(function (contents) { + var completed = new core["defer"](); + var locations = this.parse(contents, section.cfiBase); + this._locations = this._locations.concat(locations); + section.unload(); + this.processingTimeout = setTimeout(() => completed.resolve(locations), this.pause); + return completed.promise; + }.bind(this)); } - /** - * Find TOC NCX - * media-type="application/x-dtbncx+xml" href="toc.ncx" - * @private - * @param {element} manifestNode - * @param {element} spineNode - * @return {string} - */ + parse(contents, cfiBase, chars) { + var locations = []; + var range; + var doc = contents.ownerDocument; + var body = Object(core["qs"])(doc, "body"); + var counter = 0; + var prev; - findNcxPath(manifestNode, spineNode) { - // var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); - var node = Object(core["qsp"])(manifestNode, "item", { - "media-type": "application/x-dtbncx+xml" - }); - var tocId; // If we can't find the toc by media-type then try to look for id of the item in the spine attributes as - // according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2, - // "The item that describes the NCX must be referenced by the spine toc attribute." + var _break = chars || this.break; - if (!node) { - tocId = spineNode.getAttribute("toc"); + var parser = function (node) { + var len = node.length; + var dist; + var pos = 0; - if (tocId) { - // node = manifestNode.querySelector("item[id='" + tocId + "']"); - node = manifestNode.querySelector(`#${tocId}`); - } - } + if (node.textContent.trim().length === 0) { + return false; // continue + } // Start range - return node ? node.getAttribute("href") : false; - } - /** - * Find the Cover Path - * - * Fallback for Epub 2.0 - * @private - * @param {node} packageXml - * @return {string} href - */ + if (counter == 0) { + range = this.createRange(); + range.startContainer = node; + range.startOffset = 0; + } - findCoverPath(packageXml) { - var pkg = Object(core["qs"])(packageXml, "package"); - var epubVersion = pkg.getAttribute("version"); // Try parsing cover with epub 3. - // var node = packageXml.querySelector("item[properties='cover-image']"); + dist = _break - counter; // Node is smaller than a break, + // skip over it - var node = Object(core["qsp"])(packageXml, "item", { - "properties": "cover-image" - }); - if (node) return node.getAttribute("href"); // Fallback to epub 2. + if (dist > len) { + counter += len; + pos = len; + } - var metaCover = Object(core["qsp"])(packageXml, "meta", { - "name": "cover" - }); + while (pos < len) { + dist = _break - counter; - if (metaCover) { - var coverId = metaCover.getAttribute("content"); // var cover = packageXml.querySelector("item[id='" + coverId + "']"); + if (counter === 0) { + // Start new range + pos += 1; + range = this.createRange(); + range.startContainer = node; + range.startOffset = pos; + } // pos += dist; + // Gone over - var cover = packageXml.getElementById(coverId); - return cover ? cover.getAttribute("href") : ""; - } else { - return false; - } - } - /** - * Get text of a namespaced element - * @private - * @param {node} xml - * @param {string} tag - * @return {string} text - */ + if (pos + dist >= len) { + // Continue counter for next node + counter += len - pos; // break - getElementText(xml, tag) { - var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag); - var el; - if (!found || found.length === 0) return ""; - el = found[0]; + pos = len; // At End + } else { + // Advance pos + pos += dist; // End the previous range - if (el.childNodes.length) { - return el.childNodes[0].nodeValue; - } + range.endContainer = node; + range.endOffset = pos; // cfi = section.cfiFromRange(range); - return ""; - } - /** - * Get text by property - * @private - * @param {node} xml - * @param {string} property - * @return {string} text - */ + let cfi = new epubcfi["a" /* default */](range, cfiBase).toString(); + locations.push(cfi); + counter = 0; + } + } + prev = node; + }; - getPropertyText(xml, property) { - var el = Object(core["qsp"])(xml, "meta", { - "property": property - }); + Object(core["sprint"])(body, parser.bind(this)); // Close remaining - if (el && el.childNodes.length) { - return el.childNodes[0].nodeValue; + if (range && range.startContainer && prev) { + range.endContainer = prev; + range.endOffset = prev.length; + let cfi = new epubcfi["a" /* default */](range, cfiBase).toString(); + locations.push(cfi); + counter = 0; } - return ""; + return locations; } /** - * Load JSON Manifest - * @param {document} packageDocument OPF XML - * @return {object} parsed package parts + * Load all of sections in the book to generate locations + * @param {string} startCfi start position + * @param {int} wordCount how many words to split on + * @param {int} count result count + * @return {object} locations */ - load(json) { - this.metadata = json.metadata; - let spine = json.readingOrder || json.spine; - this.spine = spine.map((item, index) => { - item.index = index; - item.linear = item.linear || "yes"; - return item; - }); - json.resources.forEach((item, index) => { - this.manifest[index] = item; - - if (item.rel && item.rel[0] === "cover") { - this.coverPath = item.href; + generateFromWords(startCfi, wordCount, count) { + var start = startCfi ? new epubcfi["a" /* default */](startCfi) : undefined; + this.q.pause(); + this._locationsWords = []; + this._wordCounter = 0; + this.spine.each(function (section) { + if (section.linear) { + if (start) { + if (section.index >= start.spinePos) { + this.q.enqueue(this.processWords.bind(this), section, wordCount, start, count); + } + } else { + this.q.enqueue(this.processWords.bind(this), section, wordCount, start, count); + } + } + }.bind(this)); + return this.q.run().then(function () { + if (this._currentCfi) { + this.currentLocation = this._currentCfi; } - }); - this.spineNodeIndex = 0; - this.toc = json.toc.map((item, index) => { - item.label = item.title; - return item; - }); - return { - "metadata": this.metadata, - "spine": this.spine, - "manifest": this.manifest, - "navPath": this.navPath, - "ncxPath": this.ncxPath, - "coverPath": this.coverPath, - "spineNodeIndex": this.spineNodeIndex, - "toc": this.toc - }; - } - destroy() { - this.manifest = undefined; - this.navPath = undefined; - this.ncxPath = undefined; - this.coverPath = undefined; - this.spineNodeIndex = undefined; - this.spine = undefined; - this.metadata = undefined; + return this._locationsWords; + }.bind(this)); } -} - -/* harmony default export */ var src_packaging = (packaging_Packaging); -// CONCATENATED MODULE: ./src/navigation.js - -/** - * Navigation Parser - * @param {document} xml navigation html / xhtml / ncx - */ - -class navigation_Navigation { - constructor(xml) { - this.toc = []; - this.tocByHref = {}; - this.tocById = {}; - this.landmarks = []; - this.landmarksByType = {}; - this.length = 0; - - if (xml) { - this.parse(xml); + processWords(section, wordCount, startCfi, count) { + if (count && this._locationsWords.length >= count) { + return Promise.resolve(); } - } - /** - * Parse out the navigation items - * @param {document} xml navigation html / xhtml / ncx - */ + return section.load(this.request).then(function (contents) { + var completed = new core["defer"](); + var locations = this.parseWords(contents, section, wordCount, startCfi); + var remainingCount = count - this._locationsWords.length; + this._locationsWords = this._locationsWords.concat(locations.length >= count ? locations.slice(0, remainingCount) : locations); + section.unload(); + this.processingTimeout = setTimeout(() => completed.resolve(locations), this.pause); + return completed.promise; + }.bind(this)); + } //http://stackoverflow.com/questions/18679576/counting-words-in-string - parse(xml) { - let isXml = xml.nodeType; - let html; - let ncx; - if (isXml) { - html = Object(core["qs"])(xml, "html"); - ncx = Object(core["qs"])(xml, "ncx"); - } + countWords(s) { + s = s.replace(/(^\s*)|(\s*$)/gi, ""); //exclude start and end white-space - if (!isXml) { - this.toc = this.load(xml); - } else if (html) { - this.toc = this.parseNav(xml); - this.landmarks = this.parseLandmarks(xml); - } else if (ncx) { - this.toc = this.parseNcx(xml); - } + s = s.replace(/[ ]{2,}/gi, " "); //2 or more space to 1 - this.length = 0; - this.unpack(this.toc); + s = s.replace(/\n /, "\n"); // exclude newline with a start spacing + + return s.split(" ").length; } - /** - * Unpack navigation items - * @private - * @param {array} toc - */ + parseWords(contents, section, wordCount, startCfi) { + var cfiBase = section.cfiBase; + var locations = []; + var doc = contents.ownerDocument; + var body = Object(core["qs"])(doc, "body"); + var prev; + var _break = wordCount; + var foundStartNode = startCfi ? startCfi.spinePos !== section.index : true; + var startNode; - unpack(toc) { - var item; + if (startCfi && section.index === startCfi.spinePos) { + startNode = startCfi.findNode(startCfi.range ? startCfi.path.steps.concat(startCfi.start.steps) : startCfi.path.steps, contents.ownerDocument); + } - for (var i = 0; i < toc.length; i++) { - item = toc[i]; + var parser = function (node) { + if (!foundStartNode) { + if (node === startNode) { + foundStartNode = true; + } else { + return false; + } + } - if (item.href) { - this.tocByHref[item.href] = i; + if (node.textContent.length < 10) { + if (node.textContent.trim().length === 0) { + return false; + } } - if (item.id) { - this.tocById[item.id] = i; + var len = this.countWords(node.textContent); + var dist; + var pos = 0; + + if (len === 0) { + return false; // continue } - this.length++; + dist = _break - this._wordCounter; // Node is smaller than a break, + // skip over it - if (item.subitems.length) { - this.unpack(item.subitems); + if (dist > len) { + this._wordCounter += len; + pos = len; } - } - } - /** - * Get an item from the navigation - * @param {string} target - * @return {object} navItem - */ + while (pos < len) { + dist = _break - this._wordCounter; // Gone over - get(target) { - var index; + if (pos + dist >= len) { + // Continue counter for next node + this._wordCounter += len - pos; // break - if (!target) { - return this.toc; - } + pos = len; // At End + } else { + // Advance pos + pos += dist; + let cfi = new epubcfi["a" /* default */](node, cfiBase); + locations.push({ + cfi: cfi.toString(), + wordCount: this._wordCounter + }); + this._wordCounter = 0; + } + } - if (target.indexOf("#") === 0) { - index = this.tocById[target.substring(1)]; - } else if (target in this.tocByHref) { - index = this.tocByHref[target]; - } + prev = node; + }; - return this.getByIndex(target, index, this.toc); + Object(core["sprint"])(body, parser.bind(this)); + return locations; } /** - * Get an item from navigation subitems recursively by index - * @param {string} target - * @param {number} index - * @param {array} navItems - * @return {object} navItem + * Get a location from an EpubCFI + * @param {EpubCFI} cfi + * @return {number} */ - getByIndex(target, index, navItems) { - if (navItems.length === 0) { - return; - } + locationFromCfi(cfi) { + let loc; - const item = navItems[index]; + if (epubcfi["a" /* default */].prototype.isCfiString(cfi)) { + cfi = new epubcfi["a" /* default */](cfi); + } // Check if the location has not been set yet - if (item && (target === item.id || target === item.href)) { - return item; - } else { - let result; - for (let i = 0; i < navItems.length; ++i) { - result = this.getByIndex(target, index, navItems[i].subitems); + if (this._locations.length === 0) { + return -1; + } - if (result) { - break; - } - } + loc = Object(core["locationOf"])(cfi, this._locations, this.epubcfi.compare); - return result; + if (loc > this.total) { + return this.total; } + + return loc; } /** - * Get a landmark by type - * List of types: https://idpf.github.io/epub-vocabs/structure/ - * @param {string} type - * @return {object} landmarkItem + * Get a percentage position in locations from an EpubCFI + * @param {EpubCFI} cfi + * @return {number} */ - landmark(type) { - var index; + percentageFromCfi(cfi) { + if (this._locations.length === 0) { + return null; + } // Find closest cfi - if (!type) { - return this.landmarks; - } - index = this.landmarksByType[type]; - return this.landmarks[index]; + var loc = this.locationFromCfi(cfi); // Get percentage in total + + return this.percentageFromLocation(loc); } /** - * Parse toc from a Epub > 3.0 Nav - * @private - * @param {document} navHtml - * @return {array} navigation list + * Get a percentage position from a location index + * @param {number} location + * @return {number} */ - parseNav(navHtml) { - var navElement = Object(core["querySelectorByType"])(navHtml, "nav", "toc"); - var list = []; - if (!navElement) return list; - let navList = Object(core["filterChildren"])(navElement, "ol", true); - if (!navList) return list; - list = this.parseNavList(navList); - return list; + percentageFromLocation(loc) { + if (!loc || !this.total) { + return 0; + } + + return loc / this.total; } /** - * Parses lists in the toc - * @param {document} navListHtml - * @param {string} parent id - * @return {array} navigation list + * Get an EpubCFI from location index + * @param {number} loc + * @return {EpubCFI} cfi */ - parseNavList(navListHtml, parent) { - const result = []; - if (!navListHtml) return result; - if (!navListHtml.children) return result; + cfiFromLocation(loc) { + var cfi = -1; // check that pg is an int - for (let i = 0; i < navListHtml.children.length; i++) { - const item = this.navItem(navListHtml.children[i], parent); + if (typeof loc != "number") { + loc = parseInt(loc); + } - if (item) { - result.push(item); - } + if (loc >= 0 && loc < this._locations.length) { + cfi = this._locations[loc]; } - return result; + return cfi; } /** - * Create a navItem - * @private - * @param {element} item - * @return {object} navItem + * Get an EpubCFI from location percentage + * @param {number} percentage + * @return {EpubCFI} cfi */ - navItem(item, parent) { - let id = item.getAttribute("id") || undefined; - let content = Object(core["filterChildren"])(item, "a", true); + cfiFromPercentage(percentage) { + let loc; - if (!content) { - return; - } + if (percentage > 1) { + console.warn("Normalize cfiFromPercentage value to between 0 - 1"); + } // Make sure 1 goes to very end - let src = content.getAttribute("href") || ""; - if (!id) { - id = src; + if (percentage >= 1) { + let cfi = new epubcfi["a" /* default */](this._locations[this.total]); + cfi.collapse(); + return cfi.toString(); } - let text = content.textContent || ""; - let subitems = []; - let nested = Object(core["filterChildren"])(item, "ol", true); + loc = Math.ceil(this.total * percentage); + return this.cfiFromLocation(loc); + } + /** + * Load locations from JSON + * @param {json} locations + */ - if (nested) { - subitems = this.parseNavList(nested, id); + + load(locations) { + if (typeof locations === "string") { + this._locations = JSON.parse(locations); + } else { + this._locations = locations; } - return { - "id": id, - "href": src, - "label": text, - "subitems": subitems, - "parent": parent - }; + this.total = this._locations.length - 1; + return this._locations; } /** - * Parse landmarks from a Epub > 3.0 Nav - * @private - * @param {document} navHtml - * @return {array} landmarks list + * Save locations to JSON + * @return {json} */ - parseLandmarks(navHtml) { - var navElement = Object(core["querySelectorByType"])(navHtml, "nav", "landmarks"); - var navItems = navElement ? Object(core["qsa"])(navElement, "li") : []; - var length = navItems.length; - var i; - var list = []; - var item; - if (!navItems || length === 0) return list; + save() { + return JSON.stringify(this._locations); + } - for (i = 0; i < length; ++i) { - item = this.landmarkItem(navItems[i]); + getCurrent() { + return this._current; + } - if (item) { - list.push(item); - this.landmarksByType[item.type] = i; - } + setCurrent(curr) { + var loc; + + if (typeof curr == "string") { + this._currentCfi = curr; + } else if (typeof curr == "number") { + this._current = curr; + } else { + return; } - return list; + if (this._locations.length === 0) { + return; + } + + if (typeof curr == "string") { + loc = this.locationFromCfi(curr); + this._current = loc; + } else { + loc = curr; + } + + this.emit(constants["c" /* EVENTS */].LOCATIONS.CHANGED, { + percentage: this.percentageFromLocation(loc) + }); } /** - * Create a landmarkItem - * @private - * @param {element} item - * @return {object} landmarkItem + * Get the current location */ - landmarkItem(item) { - let content = Object(core["filterChildren"])(item, "a", true); + get currentLocation() { + return this._current; + } + /** + * Set the current location + */ - if (!content) { - return; - } - let type = content.getAttributeNS("http://www.idpf.org/2007/ops", "type") || undefined; - let href = content.getAttribute("href") || ""; - let text = content.textContent || ""; - return { - "href": href, - "label": text, - "type": type - }; + set currentLocation(curr) { + this.setCurrent(curr); } /** - * Parse from a Epub > 3.0 NC - * @private - * @param {document} navHtml - * @return {array} navigation list + * Locations length */ - parseNcx(tocXml) { - var navPoints = Object(core["qsa"])(tocXml, "navPoint"); - var length = navPoints.length; - var i; - var toc = {}; - var list = []; - var item, parent; - if (!navPoints || length === 0) return list; + length() { + return this._locations.length; + } + + destroy() { + this.spine = undefined; + this.request = undefined; + this.pause = undefined; + this.q.stop(); + this.q = undefined; + this.epubcfi = undefined; + this._locations = undefined; + this.total = undefined; + this.break = undefined; + this._current = undefined; + this.currentLocation = undefined; + this._currentCfi = undefined; + clearTimeout(this.processingTimeout); + } + +} + +event_emitter_default()(locations_Locations.prototype); +/* harmony default export */ var src_locations = (locations_Locations); +// EXTERNAL MODULE: ./node_modules/path-webpack/path.js +var path_webpack_path = __webpack_require__(7); +var path_default = /*#__PURE__*/__webpack_require__.n(path_webpack_path); - for (i = 0; i < length; ++i) { - item = this.ncxItem(navPoints[i]); - toc[item.id] = item; +// CONCATENATED MODULE: ./src/container.js - if (!item.parent) { - list.push(item); - } else { - parent = toc[item.parent]; - parent.subitems.push(item); - } - } - return list; +/** + * Handles Parsing and Accessing an Epub Container + * @class + * @param {document} [containerDocument] xml document + */ + +class container_Container { + constructor(containerDocument) { + this.packagePath = ''; + this.directory = ''; + this.encoding = ''; + + if (containerDocument) { + this.parse(containerDocument); + } } /** - * Create a ncxItem - * @private - * @param {element} item - * @return {object} ncxItem + * Parse the Container XML + * @param {document} containerDocument */ - ncxItem(item) { - var id = item.getAttribute("id") || false, - content = Object(core["qs"])(item, "content"), - src = content.getAttribute("src"), - navLabel = Object(core["qs"])(item, "navLabel"), - text = navLabel.textContent ? navLabel.textContent : "", - subitems = [], - parentNode = item.parentNode, - parent; + parse(containerDocument) { + //-- + var rootfile; - if (parentNode && (parentNode.nodeName === "navPoint" || parentNode.nodeName.split(':').slice(-1)[0] === "navPoint")) { - parent = parentNode.getAttribute("id"); + if (!containerDocument) { + throw new Error("Container File Not Found"); } - return { - "id": id, - "href": src, - "label": text, - "subitems": subitems, - "parent": parent - }; - } - /** - * Load Spine Items - * @param {object} json the items to be loaded - * @return {Array} navItems - */ + rootfile = Object(core["qs"])(containerDocument, "rootfile"); + if (!rootfile) { + throw new Error("No RootFile Found"); + } - load(json) { - return json.map(item => { - item.label = item.title; - item.subitems = item.children ? this.load(item.children) : []; - return item; - }); + this.packagePath = rootfile.getAttribute("full-path"); + this.directory = path_default.a.dirname(this.packagePath); + this.encoding = containerDocument.xmlEncoding; } - /** - * forEach pass through - * @param {Function} fn function to run on each item - * @return {method} forEach loop - */ - - forEach(fn) { - return this.toc.forEach(fn); + destroy() { + this.packagePath = undefined; + this.directory = undefined; + this.encoding = undefined; } } -/* harmony default export */ var navigation = (navigation_Navigation); -// CONCATENATED MODULE: ./src/utils/mime.js -/* - From Zip.js, by Gildas Lormeau -edited down - */ -var table = { - "application": { - "ecmascript": ["es", "ecma"], - "javascript": "js", - "ogg": "ogx", - "pdf": "pdf", - "postscript": ["ps", "ai", "eps", "epsi", "epsf", "eps2", "eps3"], - "rdf+xml": "rdf", - "smil": ["smi", "smil"], - "xhtml+xml": ["xhtml", "xht"], - "xml": ["xml", "xsl", "xsd", "opf", "ncx"], - "zip": "zip", - "x-httpd-eruby": "rhtml", - "x-latex": "latex", - "x-maker": ["frm", "maker", "frame", "fm", "fb", "book", "fbdoc"], - "x-object": "o", - "x-shockwave-flash": ["swf", "swfl"], - "x-silverlight": "scr", - "epub+zip": "epub", - "font-tdpfr": "pfr", - "inkml+xml": ["ink", "inkml"], - "json": "json", - "jsonml+json": "jsonml", - "mathml+xml": "mathml", - "metalink+xml": "metalink", - "mp4": "mp4s", - // "oebps-package+xml" : "opf", - "omdoc+xml": "omdoc", - "oxps": "oxps", - "vnd.amazon.ebook": "azw", - "widget": "wgt", - // "x-dtbncx+xml" : "ncx", - "x-dtbook+xml": "dtb", - "x-dtbresource+xml": "res", - "x-font-bdf": "bdf", - "x-font-ghostscript": "gsf", - "x-font-linux-psf": "psf", - "x-font-otf": "otf", - "x-font-pcf": "pcf", - "x-font-snf": "snf", - "x-font-ttf": ["ttf", "ttc"], - "x-font-type1": ["pfa", "pfb", "pfm", "afm"], - "x-font-woff": "woff", - "x-mobipocket-ebook": ["prc", "mobi"], - "x-mspublisher": "pub", - "x-nzb": "nzb", - "x-tgif": "obj", - "xaml+xml": "xaml", - "xml-dtd": "dtd", - "xproc+xml": "xpl", - "xslt+xml": "xslt", - "internet-property-stream": "acx", - "x-compress": "z", - "x-compressed": "tgz", - "x-gzip": "gz" - }, - "audio": { - "flac": "flac", - "midi": ["mid", "midi", "kar", "rmi"], - "mpeg": ["mpga", "mpega", "mp2", "mp3", "m4a", "mp2a", "m2a", "m3a"], - "mpegurl": "m3u", - "ogg": ["oga", "ogg", "spx"], - "x-aiff": ["aif", "aiff", "aifc"], - "x-ms-wma": "wma", - "x-wav": "wav", - "adpcm": "adp", - "mp4": "mp4a", - "webm": "weba", - "x-aac": "aac", - "x-caf": "caf", - "x-matroska": "mka", - "x-pn-realaudio-plugin": "rmp", - "xm": "xm", - "mid": ["mid", "rmi"] - }, - "image": { - "gif": "gif", - "ief": "ief", - "jpeg": ["jpeg", "jpg", "jpe"], - "pcx": "pcx", - "png": "png", - "svg+xml": ["svg", "svgz"], - "tiff": ["tiff", "tif"], - "x-icon": "ico", - "bmp": "bmp", - "webp": "webp", - "x-pict": ["pic", "pct"], - "x-tga": "tga", - "cis-cod": "cod" - }, - "text": { - "cache-manifest": ["manifest", "appcache"], - "css": "css", - "csv": "csv", - "html": ["html", "htm", "shtml", "stm"], - "mathml": "mml", - "plain": ["txt", "text", "brf", "conf", "def", "list", "log", "in", "bas"], - "richtext": "rtx", - "tab-separated-values": "tsv", - "x-bibtex": "bib" - }, - "video": { - "mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v", "mp2", "mpa", "mpv2"], - "mp4": ["mp4", "mp4v", "mpg4"], - "quicktime": ["qt", "mov"], - "ogg": "ogv", - "vnd.mpegurl": ["mxu", "m4u"], - "x-flv": "flv", - "x-la-asf": ["lsf", "lsx"], - "x-mng": "mng", - "x-ms-asf": ["asf", "asx", "asr"], - "x-ms-wm": "wm", - "x-ms-wmv": "wmv", - "x-ms-wmx": "wmx", - "x-ms-wvx": "wvx", - "x-msvideo": "avi", - "x-sgi-movie": "movie", - "x-matroska": ["mpv", "mkv", "mk3d", "mks"], - "3gpp2": "3g2", - "h261": "h261", - "h263": "h263", - "h264": "h264", - "jpeg": "jpgv", - "jpm": ["jpm", "jpgm"], - "mj2": ["mj2", "mjp2"], - "vnd.ms-playready.media.pyv": "pyv", - "vnd.uvvu.mp4": ["uvu", "uvvu"], - "vnd.vivo": "viv", - "webm": "webm", - "x-f4v": "f4v", - "x-m4v": "m4v", - "x-ms-vob": "vob", - "x-smv": "smv" - } -}; +/* harmony default export */ var container = (container_Container); +// CONCATENATED MODULE: ./src/packaging.js -var mime_mimeTypes = function () { - var type, - subtype, - val, - index, - mimeTypes = {}; +/** + * Open Packaging Format Parser + * @class + * @param {document} packageDocument OPF XML + */ - for (type in table) { - if (table.hasOwnProperty(type)) { - for (subtype in table[type]) { - if (table[type].hasOwnProperty(subtype)) { - val = table[type][subtype]; +class packaging_Packaging { + constructor(packageDocument) { + this.manifest = {}; + this.navPath = ''; + this.ncxPath = ''; + this.coverPath = ''; + this.spineNodeIndex = 0; + this.spine = []; + this.metadata = {}; - if (typeof val == "string") { - mimeTypes[val] = type + "/" + subtype; - } else { - for (index = 0; index < val.length; index++) { - mimeTypes[val[index]] = type + "/" + subtype; - } - } - } - } + if (packageDocument) { + this.parse(packageDocument); } } + /** + * Parse OPF XML + * @param {document} packageDocument OPF XML + * @return {object} parsed package parts + */ - return mimeTypes; -}(); - -var defaultValue = "text/plain"; //"application/octet-stream"; - -function lookup(filename) { - return filename && mime_mimeTypes[filename.split(".").pop().toLowerCase()] || defaultValue; -} -; -/* harmony default export */ var mime = ({ - lookup -}); -// CONCATENATED MODULE: ./src/resources.js + parse(packageDocument) { + var metadataNode, manifestNode, spineNode; + if (!packageDocument) { + throw new Error("Package File Not Found"); + } + metadataNode = Object(core["qs"])(packageDocument, "metadata"); + if (!metadataNode) { + throw new Error("No Metadata Found"); + } + manifestNode = Object(core["qs"])(packageDocument, "manifest"); + if (!manifestNode) { + throw new Error("No Manifest Found"); + } + spineNode = Object(core["qs"])(packageDocument, "spine"); -/** - * Handle Package Resources - * @class - * @param {Manifest} manifest - * @param {object} [options] - * @param {string} [options.replacements="base64"] - * @param {Archive} [options.archive] - * @param {method} [options.resolver] - */ + if (!spineNode) { + throw new Error("No Spine Found"); + } -class resources_Resources { - constructor(manifest, options) { - this.settings = { - replacements: options && options.replacements || "base64", - archive: options && options.archive, - resolver: options && options.resolver, - request: options && options.request + this.manifest = this.parseManifest(manifestNode); + this.navPath = this.findNavPath(manifestNode); + this.ncxPath = this.findNcxPath(manifestNode, spineNode); + this.coverPath = this.findCoverPath(packageDocument); + this.spineNodeIndex = Object(core["indexOfElementNode"])(spineNode); + this.spine = this.parseSpine(spineNode, this.manifest); + this.uniqueIdentifier = this.findUniqueIdentifier(packageDocument); + this.metadata = this.parseMetadata(metadataNode); + this.metadata.direction = spineNode.getAttribute("page-progression-direction"); + return { + "metadata": this.metadata, + "spine": this.spine, + "manifest": this.manifest, + "navPath": this.navPath, + "ncxPath": this.ncxPath, + "coverPath": this.coverPath, + "spineNodeIndex": this.spineNodeIndex }; - this.process(manifest); } /** - * Process resources - * @param {Manifest} manifest + * Parse Metadata + * @private + * @param {node} xml + * @return {object} metadata */ - process(manifest) { - this.manifest = manifest; - this.resources = Object.keys(manifest).map(function (key) { - return manifest[key]; - }); - this.replacementUrls = []; - this.html = []; - this.assets = []; - this.css = []; - this.urls = []; - this.cssUrls = []; - this.split(); - this.splitUrls(); + parseMetadata(xml) { + var metadata = {}; + const DC_NS = "http://purl.org/dc/elements/1.1/"; + const OPF_NS = "http://www.idpf.org/2007/opf"; + + const getElementText = node => node ? node.childNodes[0].nodeValue : null; + + const getElementsNS = (ns, tagName) => [...xml.getElementsByTagNameNS(ns, tagName)].filter(node => node.childNodes.length); + + const metas = [...xml.getElementsByTagName('meta')]; + + const getRefiningMetas = id => metas.filter(meta => meta.getAttribute('refines') === '#' + id); + + const getPropertyMetas = (el, prop) => { + const id = el.getAttribute('id'); + const metas = getRefiningMetas(id); + + if (metas) { + const refined = metas.filter(meta => meta.getAttribute('property') === prop); + if (refined) return refined; + } + }; + + const getProperty = (el, ns, prop, one = true) => { + const attribute = el.getAttributeNS(ns, prop); + const metas = getPropertyMetas(el, prop); + return metas && metas.length ? one ? getElementText(metas[0]) : metas.map(getElementText) : attribute; + }; + + const titles = getElementsNS(DC_NS, "title").map(x => ({ + type: getProperty(x, OPF_NS, 'title-type'), + seq: getProperty(x, OPF_NS, 'display-seq'), + label: getElementText(x) + })); + metadata.titles = titles; + const mainTitle = titles.find(x => x.type === 'main'); + if (mainTitle) metadata.title = mainTitle.label;else metadata.title = this.getElementText(xml, "title"); + metadata.creator = this.getElementText(xml, "creator"); + metadata.description = this.getElementText(xml, "description"); + metadata.subjects = getElementsNS(DC_NS, "subject").map(x => ({ + authority: getProperty(x, OPF_NS, 'authority'), + term: getProperty(x, OPF_NS, 'term'), + label: getElementText(x) + })); + metadata.sources = getElementsNS(DC_NS, "source").map(getElementText); + metadata.collections = metas.filter(meta => meta.getAttribute('property') === 'belongs-to-collection').map(meta => ({ + type: getProperty(meta, OPF_NS, 'collection-type'), + position: getProperty(meta, OPF_NS, 'group-position'), + label: getElementText(meta) + })); + metadata.contributors = getElementsNS(DC_NS, "contributor").map(x => ({ + role: getProperty(x, OPF_NS, 'role', false), + scheme: getProperty(x, OPF_NS, 'scheme', false), + label: getElementText(x) + })); + metadata.pubdate = this.getElementText(xml, "date"); + metadata.publisher = this.getElementText(xml, "publisher"); + metadata.identifiers = getElementsNS(DC_NS, "identifier").map(x => ({ + type: getProperty(x, OPF_NS, 'identifier-type'), + scheme: getProperty(x, OPF_NS, 'scheme'), + identifier: getElementText(x) + })); + metadata.identifier = this.getElementText(xml, "identifier"); + metadata.language = this.getElementText(xml, "language"); + metadata.rights = this.getElementText(xml, "rights"); + metadata.modified_date = this.getPropertyText(xml, "dcterms:modified"); + metadata.layout = this.getPropertyText(xml, "rendition:layout"); + metadata.orientation = this.getPropertyText(xml, "rendition:orientation"); + metadata.flow = this.getPropertyText(xml, "rendition:flow"); + metadata.viewport = this.getPropertyText(xml, "rendition:viewport"); + metadata.media_active_class = this.getPropertyText(xml, "media:active-class"); + metadata.spread = this.getPropertyText(xml, "rendition:spread"); // metadata.page_prog_dir = packageXml.querySelector("spine").getAttribute("page-progression-direction"); + + return metadata; } /** - * Split resources by type + * Parse Manifest * @private + * @param {node} manifestXml + * @return {object} manifest */ - split() { - // HTML - this.html = this.resources.filter(function (item) { - if (item.type === "application/xhtml+xml" || item.type === "text/html") { - return true; - } - }); // Exclude HTML + parseManifest(manifestXml) { + var manifest = {}; //-- Turn items into an array + // var selected = manifestXml.querySelectorAll("item"); - this.assets = this.resources.filter(function (item) { - if (item.type !== "application/xhtml+xml" && item.type !== "text/html") { - return true; - } - }); // Only CSS + var selected = Object(core["qsa"])(manifestXml, "item"); + var items = Array.prototype.slice.call(selected); //-- Create an object with the id as key - this.css = this.resources.filter(function (item) { - if (item.type === "text/css") { - return true; - } + items.forEach(function (item) { + var id = item.getAttribute("id"), + href = item.getAttribute("href") || "", + type = item.getAttribute("media-type") || "", + overlay = item.getAttribute("media-overlay") || "", + properties = item.getAttribute("properties") || ""; + manifest[id] = { + "href": href, + // "url" : href, + "type": type, + "overlay": overlay, + "properties": properties.length ? properties.split(" ") : [] + }; }); + return manifest; } /** - * Convert split resources into Urls + * Parse Spine * @private + * @param {node} spineXml + * @param {Packaging.manifest} manifest + * @return {object} spine */ - splitUrls() { - // All Assets Urls - this.urls = this.assets.map(function (item) { - return item.href; - }.bind(this)); // Css Urls + parseSpine(spineXml, manifest) { + var spine = []; + var selected = Object(core["qsa"])(spineXml, "itemref"); + var items = Array.prototype.slice.call(selected); // var epubcfi = new EpubCFI(); + //-- Add to array to maintain ordering and cross reference with manifest - this.cssUrls = this.css.map(function (item) { - return item.href; + items.forEach(function (item, index) { + var idref = item.getAttribute("idref"); // var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); + + var props = item.getAttribute("properties") || ""; + var propArray = props.length ? props.split(" ") : []; // var manifestProps = manifest[Id].properties; + // var manifestPropArray = manifestProps.length ? manifestProps.split(" ") : []; + + var itemref = { + "id": item.getAttribute("id"), + "idref": idref, + "linear": item.getAttribute("linear") || "yes", + "properties": propArray, + // "href" : manifest[Id].href, + // "url" : manifest[Id].url, + "index": index // "cfiBase" : cfiBase + + }; + spine.push(itemref); }); + return spine; } /** - * Create a url to a resource - * @param {string} url - * @return {Promise} Promise resolves with url string + * Find Unique Identifier + * @private + * @param {node} packageXml + * @return {string} Unique Identifier text */ - createUrl(url) { - var parsedUrl = new utils_url["a" /* default */](url); - var mimeType = mime.lookup(parsedUrl.filename); + findUniqueIdentifier(packageXml) { + var uniqueIdentifierId = packageXml.documentElement.getAttribute("unique-identifier"); - if (this.settings.archive) { - return this.settings.archive.createUrl(url, { - "base64": this.settings.replacements === "base64" - }); - } else { - if (this.settings.replacements === "base64") { - return this.settings.request(url, 'blob').then(blob => { - return Object(core["blob2base64"])(blob); - }).then(blob => { - return Object(core["createBase64Url"])(blob, mimeType); - }); - } else { - return this.settings.request(url, 'blob').then(blob => { - return Object(core["createBlobUrl"])(blob, mimeType); - }); - } + if (!uniqueIdentifierId) { + return ""; } - } - /** - * Create blob urls for all the assets - * @return {Promise} returns replacement urls - */ + var identifier = packageXml.getElementById(uniqueIdentifierId); - replacements() { - if (this.settings.replacements === "none") { - return new Promise(function (resolve) { - resolve(this.urls); - }.bind(this)); + if (!identifier) { + return ""; } - var replacements = this.urls.map(url => { - var absolute = this.settings.resolver(url); - return this.createUrl(absolute).catch(err => { - console.error(err); - return null; - }); - }); - return Promise.all(replacements).then(replacementUrls => { - this.replacementUrls = replacementUrls.filter(url => { - return typeof url === "string"; - }); - return replacementUrls; - }); + if (identifier.localName === "identifier" && identifier.namespaceURI === "http://purl.org/dc/elements/1.1/") { + return identifier.childNodes.length > 0 ? identifier.childNodes[0].nodeValue.trim() : ""; + } + + return ""; } /** - * Replace URLs in CSS resources + * Find TOC NAV * @private - * @param {Archive} [archive] - * @param {method} [resolver] - * @return {Promise} + * @param {element} manifestNode + * @return {string} */ - replaceCss(archive, resolver) { - var replaced = []; - archive = archive || this.settings.archive; - resolver = resolver || this.settings.resolver; - this.cssUrls.forEach(function (href) { - var replacement = this.createCssFile(href, archive, resolver).then(function (replacementUrl) { - // switch the url in the replacementUrls - var indexInUrls = this.urls.indexOf(href); - - if (indexInUrls > -1) { - this.replacementUrls[indexInUrls] = replacementUrl; - } - }.bind(this)); - replaced.push(replacement); - }.bind(this)); - return Promise.all(replaced); + findNavPath(manifestNode) { + // Find item with property "nav" + // Should catch nav regardless of order + // var node = manifestNode.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']"); + var node = Object(core["qsp"])(manifestNode, "item", { + "properties": "nav" + }); + return node ? node.getAttribute("href") : false; } /** - * Create a new CSS file with the replaced URLs + * Find TOC NCX + * media-type="application/x-dtbncx+xml" href="toc.ncx" * @private - * @param {string} href the original css file - * @return {Promise} returns a BlobUrl to the new CSS file or a data url + * @param {element} manifestNode + * @param {element} spineNode + * @return {string} */ - createCssFile(href) { - var newUrl; - - if (path_default.a.isAbsolute(href)) { - return new Promise(function (resolve) { - resolve(); - }); - } - - var absolute = this.settings.resolver(href); // Get the text of the css file from the archive - - var textResponse; - - if (this.settings.archive) { - textResponse = this.settings.archive.getText(absolute); - } else { - textResponse = this.settings.request(absolute, "text"); - } // Get asset links relative to css file - - - var relUrls = this.urls.map(assetHref => { - var resolved = this.settings.resolver(assetHref); - var relative = new utils_path["a" /* default */](absolute).relative(resolved); - return relative; + findNcxPath(manifestNode, spineNode) { + // var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); + var node = Object(core["qsp"])(manifestNode, "item", { + "media-type": "application/x-dtbncx+xml" }); + var tocId; // If we can't find the toc by media-type then try to look for id of the item in the spine attributes as + // according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2, + // "The item that describes the NCX must be referenced by the spine toc attribute." - if (!textResponse) { - // file not found, don't replace - return new Promise(function (resolve) { - resolve(); - }); - } - - return textResponse.then(text => { - // Replacements in the css text - text = Object(replacements["e" /* substitute */])(text, relUrls, this.replacementUrls); // Get the new url + if (!node) { + tocId = spineNode.getAttribute("toc"); - if (this.settings.replacements === "base64") { - newUrl = Object(core["createBase64Url"])(text, "text/css"); - } else { - newUrl = Object(core["createBlobUrl"])(text, "text/css"); + if (tocId) { + // node = manifestNode.querySelector("item[id='" + tocId + "']"); + node = manifestNode.querySelector(`#${tocId}`); } + } - return newUrl; - }, err => { - // handle response errors - return new Promise(function (resolve) { - resolve(); - }); - }); + return node ? node.getAttribute("href") : false; } /** - * Resolve all resources URLs relative to an absolute URL - * @param {string} absolute to be resolved to - * @param {resolver} [resolver] - * @return {string[]} array with relative Urls + * Find the Cover Path + * + * Fallback for Epub 2.0 + * @private + * @param {node} packageXml + * @return {string} href */ - relativeTo(absolute, resolver) { - resolver = resolver || this.settings.resolver; // Get Urls relative to current sections + findCoverPath(packageXml) { + var pkg = Object(core["qs"])(packageXml, "package"); + var epubVersion = pkg.getAttribute("version"); // Try parsing cover with epub 3. + // var node = packageXml.querySelector("item[properties='cover-image']"); - return this.urls.map(function (href) { - var resolved = resolver(href); - var relative = new utils_path["a" /* default */](absolute).relative(resolved); - return relative; - }.bind(this)); + var node = Object(core["qsp"])(packageXml, "item", { + "properties": "cover-image" + }); + if (node) return node.getAttribute("href"); // Fallback to epub 2. + + var metaCover = Object(core["qsp"])(packageXml, "meta", { + "name": "cover" + }); + + if (metaCover) { + var coverId = metaCover.getAttribute("content"); // var cover = packageXml.querySelector("item[id='" + coverId + "']"); + + var cover = packageXml.getElementById(coverId); + return cover ? cover.getAttribute("href") : ""; + } else { + return false; + } } /** - * Get a URL for a resource - * @param {string} path - * @return {string} url + * Get text of a namespaced element + * @private + * @param {node} xml + * @param {string} tag + * @return {string} text */ - get(path) { - var indexInUrls = this.urls.indexOf(path); + getElementText(xml, tag) { + var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag); + var el; + if (!found || found.length === 0) return ""; + el = found[0]; - if (indexInUrls === -1) { - return; + if (el.childNodes.length) { + return el.childNodes[0].nodeValue; } - if (this.replacementUrls.length) { - return new Promise(function (resolve, reject) { - resolve(this.replacementUrls[indexInUrls]); - }.bind(this)); - } else { - return this.createUrl(path); - } + return ""; } /** - * Substitute urls in content, with replacements, - * relative to a url if provided - * @param {string} content - * @param {string} [url] url to resolve to - * @return {string} content with urls substituted + * Get text by property + * @private + * @param {node} xml + * @param {string} property + * @return {string} text */ - substitute(content, url) { - var relUrls; + getPropertyText(xml, property) { + var el = Object(core["qsp"])(xml, "meta", { + "property": property + }); - if (url) { - relUrls = this.relativeTo(url); - } else { - relUrls = this.urls; + if (el && el.childNodes.length) { + return el.childNodes[0].nodeValue; } - return Object(replacements["e" /* substitute */])(content, relUrls, this.replacementUrls); + return ""; + } + /** + * Load JSON Manifest + * @param {document} packageDocument OPF XML + * @return {object} parsed package parts + */ + + + load(json) { + this.metadata = json.metadata; + let spine = json.readingOrder || json.spine; + this.spine = spine.map((item, index) => { + item.index = index; + item.linear = item.linear || "yes"; + return item; + }); + json.resources.forEach((item, index) => { + this.manifest[index] = item; + + if (item.rel && item.rel[0] === "cover") { + this.coverPath = item.href; + } + }); + this.spineNodeIndex = 0; + this.toc = json.toc.map((item, index) => { + item.label = item.title; + return item; + }); + return { + "metadata": this.metadata, + "spine": this.spine, + "manifest": this.manifest, + "navPath": this.navPath, + "ncxPath": this.ncxPath, + "coverPath": this.coverPath, + "spineNodeIndex": this.spineNodeIndex, + "toc": this.toc + }; } destroy() { - this.settings = undefined; this.manifest = undefined; - this.resources = undefined; - this.replacementUrls = undefined; - this.html = undefined; - this.assets = undefined; - this.css = undefined; - this.urls = undefined; - this.cssUrls = undefined; + this.navPath = undefined; + this.ncxPath = undefined; + this.coverPath = undefined; + this.spineNodeIndex = undefined; + this.spine = undefined; + this.metadata = undefined; } } -/* harmony default export */ var resources = (resources_Resources); -// CONCATENATED MODULE: ./src/pagelist.js - +/* harmony default export */ var src_packaging = (packaging_Packaging); +// CONCATENATED MODULE: ./src/navigation.js /** - * Page List Parser - * @param {document} [xml] + * Navigation Parser + * @param {document} xml navigation html / xhtml / ncx */ -class pagelist_PageList { +class navigation_Navigation { constructor(xml) { - this.pages = []; - this.locations = []; - this.epubcfi = new epubcfi["a" /* default */](); - this.firstPage = 0; - this.lastPage = 0; - this.totalPages = 0; - this.toc = undefined; - this.ncx = undefined; + this.toc = []; + this.tocByHref = {}; + this.tocById = {}; + this.landmarks = []; + this.landmarksByType = {}; + this.length = 0; if (xml) { - this.pageList = this.parse(xml); - } - - if (this.pageList && this.pageList.length) { - this.process(this.pageList); + this.parse(xml); } } /** - * Parse PageList Xml - * @param {document} xml + * Parse out the navigation items + * @param {document} xml navigation html / xhtml / ncx */ parse(xml) { - var html = Object(core["qs"])(xml, "html"); - var ncx = Object(core["qs"])(xml, "ncx"); + let isXml = xml.nodeType; + let html; + let ncx; - if (html) { - return this.parseNav(xml); + if (isXml) { + html = Object(core["qs"])(xml, "html"); + ncx = Object(core["qs"])(xml, "ncx"); + } + + if (!isXml) { + this.toc = this.load(xml); + } else if (html) { + this.toc = this.parseNav(xml); + this.landmarks = this.parseLandmarks(xml); } else if (ncx) { - return this.parseNcx(xml); + this.toc = this.parseNcx(xml); } + + this.length = 0; + this.unpack(this.toc); } /** - * Parse a Nav PageList + * Unpack navigation items * @private - * @param {node} navHtml - * @return {PageList.item[]} list + * @param {array} toc */ - parseNav(navHtml) { - var navElement = Object(core["querySelectorByType"])(navHtml, "nav", "page-list"); - var navItems = navElement ? Object(core["qsa"])(navElement, "li") : []; - var length = navItems.length; - var i; - var list = []; + unpack(toc) { var item; - if (!navItems || length === 0) return list; - for (i = 0; i < length; ++i) { - item = this.item(navItems[i]); - list.push(item); - } + for (var i = 0; i < toc.length; i++) { + item = toc[i]; - return list; - } + if (item.href) { + this.tocByHref[item.href] = i; + } - parseNcx(navXml) { - var list = []; - var i = 0; - var item; - var pageList; - var pageTargets; - var length = 0; - pageList = Object(core["qs"])(navXml, "pageList"); - if (!pageList) return list; - pageTargets = Object(core["qsa"])(pageList, "pageTarget"); - length = pageTargets.length; + if (item.id) { + this.tocById[item.id] = i; + } - if (!pageTargets || pageTargets.length === 0) { - return list; - } + this.length++; - for (i = 0; i < length; ++i) { - item = this.ncxItem(pageTargets[i]); - list.push(item); + if (item.subitems.length) { + this.unpack(item.subitems); + } } - - return list; - } - - ncxItem(item) { - var navLabel = Object(core["qs"])(item, "navLabel"); - var navLabelText = Object(core["qs"])(navLabel, "text"); - var pageText = navLabelText.textContent; - var content = Object(core["qs"])(item, "content"); - var href = content.getAttribute("src"); - var page = parseInt(pageText, 10); - return { - "href": href, - "page": page - }; } /** - * Page List Item - * @private - * @param {node} item - * @return {object} pageListItem + * Get an item from the navigation + * @param {string} target + * @return {object} navItem */ - item(item) { - var content = Object(core["qs"])(item, "a"), - href = content.getAttribute("href") || "", - text = content.textContent || "", - page = parseInt(text), - isCfi = href.indexOf("epubcfi"), - split, - packageUrl, - cfi; + get(target) { + var index; - if (isCfi != -1) { - split = href.split("#"); - packageUrl = split[0]; - cfi = split.length > 1 ? split[1] : false; - return { - "cfi": cfi, - "href": href, - "packageUrl": packageUrl, - "page": page - }; - } else { - return { - "href": href, - "page": page - }; + if (!target) { + return this.toc; } - } - /** - * Process pageList items - * @private - * @param {array} pageList - */ - - - process(pageList) { - pageList.forEach(function (item) { - this.pages.push(item.page); - - if (item.cfi) { - this.locations.push(item.cfi); - } - }, this); - this.firstPage = parseInt(this.pages[0]); - this.lastPage = parseInt(this.pages[this.pages.length - 1]); - this.totalPages = this.lastPage - this.firstPage; - } - /** - * Get a PageList result from a EpubCFI - * @param {string} cfi EpubCFI String - * @return {number} page - */ - - - pageFromCfi(cfi) { - var pg = -1; // Check if the pageList has not been set yet - - if (this.locations.length === 0) { - return -1; - } // TODO: check if CFI is valid? - // check if the cfi is in the location list - // var index = this.locations.indexOf(cfi); - - - var index = Object(core["indexOfSorted"])(cfi, this.locations, this.epubcfi.compare); - - if (index != -1) { - pg = this.pages[index]; - } else { - // Otherwise add it to the list of locations - // Insert it in the correct position in the locations page - //index = EPUBJS.core.insert(cfi, this.locations, this.epubcfi.compare); - index = Object(core["locationOf"])(cfi, this.locations, this.epubcfi.compare); // Get the page at the location just before the new one, or return the first - - pg = index - 1 >= 0 ? this.pages[index - 1] : this.pages[0]; - - if (pg !== undefined) {// Add the new page in so that the locations and page array match up - //this.pages.splice(index, 0, pg); - } else { - pg = -1; - } + + if (target.indexOf("#") === 0) { + index = this.tocById[target.substring(1)]; + } else if (target in this.tocByHref) { + index = this.tocByHref[target]; } - return pg; + return this.getByIndex(target, index, this.toc); } /** - * Get an EpubCFI from a Page List Item - * @param {string | number} pg - * @return {string} cfi + * Get an item from navigation subitems recursively by index + * @param {string} target + * @param {number} index + * @param {array} navItems + * @return {object} navItem */ - cfiFromPage(pg) { - var cfi = -1; // check that pg is an int - - if (typeof pg != "number") { - pg = parseInt(pg); - } // check if the cfi is in the page list - // Pages could be unsorted. + getByIndex(target, index, navItems) { + if (navItems.length === 0) { + return; + } + const item = navItems[index]; - var index = this.pages.indexOf(pg); + if (item && (target === item.id || target === item.href)) { + return item; + } else { + let result; - if (index != -1) { - cfi = this.locations[index]; - } // TODO: handle pages not in the list + for (let i = 0; i < navItems.length; ++i) { + result = this.getByIndex(target, index, navItems[i].subitems); + if (result) { + break; + } + } - return cfi; + return result; + } } /** - * Get a Page from Book percentage - * @param {number} percent - * @return {number} page + * Get a landmark by type + * List of types: https://idpf.github.io/epub-vocabs/structure/ + * @param {string} type + * @return {object} landmarkItem */ - pageFromPercentage(percent) { - var pg = Math.round(this.totalPages * percent); - return pg; - } - /** - * Returns a value between 0 - 1 corresponding to the location of a page - * @param {number} pg the page - * @return {number} percentage - */ + landmark(type) { + var index; + if (!type) { + return this.landmarks; + } - percentageFromPage(pg) { - var percentage = (pg - this.firstPage) / this.totalPages; - return Math.round(percentage * 1000) / 1000; + index = this.landmarksByType[type]; + return this.landmarks[index]; } /** - * Returns a value between 0 - 1 corresponding to the location of a cfi - * @param {string} cfi EpubCFI String - * @return {number} percentage + * Parse toc from a Epub > 3.0 Nav + * @private + * @param {document} navHtml + * @return {array} navigation list */ - percentageFromCfi(cfi) { - var pg = this.pageFromCfi(cfi); - var percentage = this.percentageFromPage(pg); - return percentage; + parseNav(navHtml) { + var navElement = Object(core["querySelectorByType"])(navHtml, "nav", "toc"); + var list = []; + if (!navElement) return list; + let navList = Object(core["filterChildren"])(navElement, "ol", true); + if (!navList) return list; + list = this.parseNavList(navList); + return list; } /** - * Destroy + * Parses lists in the toc + * @param {document} navListHtml + * @param {string} parent id + * @return {array} navigation list */ - destroy() { - this.pages = undefined; - this.locations = undefined; - this.epubcfi = undefined; - this.pageList = undefined; - this.toc = undefined; - this.ncx = undefined; - } - -} + parseNavList(navListHtml, parent) { + const result = []; + if (!navListHtml) return result; + if (!navListHtml.children) return result; -/* harmony default export */ var pagelist = (pagelist_PageList); -// EXTERNAL MODULE: ./src/rendition.js + 3 modules -var rendition = __webpack_require__(39); + for (let i = 0; i < navListHtml.children.length; i++) { + const item = this.navItem(navListHtml.children[i], parent); -// EXTERNAL MODULE: external "JSZip" -var external_JSZip_ = __webpack_require__(85); -var external_JSZip_default = /*#__PURE__*/__webpack_require__.n(external_JSZip_); + if (item) { + result.push(item); + } + } -// CONCATENATED MODULE: ./src/archive.js + return result; + } + /** + * Create a navItem + * @private + * @param {element} item + * @return {object} navItem + */ + navItem(item, parent) { + let id = item.getAttribute("id") || undefined; + let content = Object(core["filterChildren"])(item, "a", true) || Object(core["filterChildren"])(item, "span", true); + if (!content) { + return; + } + let src = content.getAttribute("href") || ""; + if (!id) { + id = src; + } + let text = content.textContent || ""; + let subitems = []; + let nested = Object(core["filterChildren"])(item, "ol", true); -/** - * Handles Unzipping a requesting files from an Epub Archive - * @class - */ + if (nested) { + subitems = this.parseNavList(nested, id); + } -class archive_Archive { - constructor() { - this.zip = undefined; - this.urlCache = {}; - this.checkRequirements(); + return { + "id": id, + "href": src, + "label": text, + "subitems": subitems, + "parent": parent + }; } /** - * Checks to see if JSZip exists in global namspace, - * Requires JSZip if it isn't there + * Parse landmarks from a Epub > 3.0 Nav * @private + * @param {document} navHtml + * @return {array} landmarks list */ - checkRequirements() { - try { - this.zip = new external_JSZip_default.a(); - } catch (e) { - throw new Error("JSZip lib not loaded"); - } - } - /** - * Open an archive - * @param {binary} input - * @param {boolean} [isBase64] tells JSZip if the input data is base64 encoded - * @return {Promise} zipfile - */ - + parseLandmarks(navHtml) { + var navElement = Object(core["querySelectorByType"])(navHtml, "nav", "landmarks"); + var navItems = navElement ? Object(core["qsa"])(navElement, "li") : []; + var length = navItems.length; + var i; + var list = []; + var item; + if (!navItems || length === 0) return list; - open(input, isBase64) { - return this.zip.loadAsync(input, { - "base64": isBase64 - }); - } - /** - * Load and Open an archive - * @param {string} zipUrl - * @param {boolean} [isBase64] tells JSZip if the input data is base64 encoded - * @return {Promise} zipfile - */ + for (i = 0; i < length; ++i) { + item = this.landmarkItem(navItems[i]); + if (item) { + list.push(item); + this.landmarksByType[item.type] = i; + } + } - openUrl(zipUrl, isBase64) { - return utils_request(zipUrl, "binary").then(function (data) { - return this.zip.loadAsync(data, { - "base64": isBase64 - }); - }.bind(this)); + return list; } /** - * Request a url from the archive - * @param {string} url a url to request from the archive - * @param {string} [type] specify the type of the returned result - * @return {Promise} + * Create a landmarkItem + * @private + * @param {element} item + * @return {object} landmarkItem */ - request(url, type) { - var deferred = new core["defer"](); - var response; - var path = new utils_path["a" /* default */](url); // If type isn't set, determine it from the file extension - - if (!type) { - type = path.extension; - } - - if (type == "blob") { - response = this.getBlob(url); - } else { - response = this.getText(url); - } + landmarkItem(item) { + let content = Object(core["filterChildren"])(item, "a", true); - if (response) { - response.then(function (r) { - let result = this.handleResponse(r, type); - deferred.resolve(result); - }.bind(this)); - } else { - deferred.reject({ - message: "File not found in the epub: " + url, - stack: new Error().stack - }); + if (!content) { + return; } - return deferred.promise; + let type = content.getAttributeNS("http://www.idpf.org/2007/ops", "type") || undefined; + let href = content.getAttribute("href") || ""; + let text = content.textContent || ""; + return { + "href": href, + "label": text, + "type": type + }; } /** - * Handle the response from request + * Parse from a Epub > 3.0 NC * @private - * @param {any} response - * @param {string} [type] - * @return {any} the parsed result + * @param {document} navHtml + * @return {array} navigation list */ - handleResponse(response, type) { - var r; + parseNcx(tocXml) { + var navPoints = Object(core["qsa"])(tocXml, "navPoint"); + var length = navPoints.length; + var i; + var toc = {}; + var list = []; + var item, parent; + if (!navPoints || length === 0) return list; - if (type == "json") { - r = JSON.parse(response); - } else if (Object(core["isXml"])(type)) { - r = Object(core["parse"])(response, "text/xml"); - } else if (type == "xhtml") { - r = Object(core["parse"])(response, "application/xhtml+xml"); - } else if (type == "html" || type == "htm") { - r = Object(core["parse"])(response, /<\s*a[^>]*\/>/gi.test(response) ? "application/xhtml+xml" : "text/html"); - } else { - r = response; + for (i = 0; i < length; ++i) { + item = this.ncxItem(navPoints[i]); + toc[item.id] = item; + + if (!item.parent) { + list.push(item); + } else { + parent = toc[item.parent]; + parent.subitems.push(item); + } } - return r; + return list; } /** - * Get a Blob from Archive by Url - * @param {string} url - * @param {string} [mimeType] - * @return {Blob} + * Create a ncxItem + * @private + * @param {element} item + * @return {object} ncxItem */ - getBlob(url, mimeType) { - var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash - - var entry = this.zip.file(decodededUrl); + ncxItem(item) { + var id = item.getAttribute("id") || false, + content = Object(core["qs"])(item, "content"), + src = content.getAttribute("src"), + navLabel = Object(core["qs"])(item, "navLabel"), + text = navLabel.textContent ? navLabel.textContent : "", + subitems = [], + parentNode = item.parentNode, + parent; - if (entry) { - mimeType = mimeType || mime.lookup(entry.name); - return entry.async("uint8array").then(function (uint8array) { - return new Blob([uint8array], { - type: mimeType - }); - }); + if (parentNode && (parentNode.nodeName === "navPoint" || parentNode.nodeName.split(':').slice(-1)[0] === "navPoint")) { + parent = parentNode.getAttribute("id"); } + + return { + "id": id, + "href": src, + "label": text, + "subitems": subitems, + "parent": parent + }; } /** - * Get Text from Archive by Url - * @param {string} url - * @param {string} [encoding] - * @return {string} + * Load Spine Items + * @param {object} json the items to be loaded + * @return {Array} navItems */ - getText(url, encoding) { - var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash - - var entry = this.zip.file(decodededUrl); - - if (entry) { - return entry.async("string").then(function (text) { - return text; - }); - } + load(json) { + return json.map(item => { + item.label = item.title; + item.subitems = item.children ? this.load(item.children) : []; + return item; + }); } /** - * Get a base64 encoded result from Archive by Url - * @param {string} url - * @param {string} [mimeType] - * @return {string} base64 encoded + * forEach pass through + * @param {Function} fn function to run on each item + * @return {method} forEach loop */ - getBase64(url, mimeType) { - var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + forEach(fn) { + return this.toc.forEach(fn); + } - var entry = this.zip.file(decodededUrl); +} - if (entry) { - mimeType = mimeType || mime.lookup(entry.name); - return entry.async("base64").then(function (data) { - return "data:" + mimeType + ";base64," + data; - }); - } +/* harmony default export */ var navigation = (navigation_Navigation); +// CONCATENATED MODULE: ./src/utils/mime.js +/* + From Zip.js, by Gildas Lormeau +edited down + */ +var table = { + "application": { + "ecmascript": ["es", "ecma"], + "javascript": "js", + "ogg": "ogx", + "pdf": "pdf", + "postscript": ["ps", "ai", "eps", "epsi", "epsf", "eps2", "eps3"], + "rdf+xml": "rdf", + "smil": ["smi", "smil"], + "xhtml+xml": ["xhtml", "xht"], + "xml": ["xml", "xsl", "xsd", "opf", "ncx"], + "zip": "zip", + "x-httpd-eruby": "rhtml", + "x-latex": "latex", + "x-maker": ["frm", "maker", "frame", "fm", "fb", "book", "fbdoc"], + "x-object": "o", + "x-shockwave-flash": ["swf", "swfl"], + "x-silverlight": "scr", + "epub+zip": "epub", + "font-tdpfr": "pfr", + "inkml+xml": ["ink", "inkml"], + "json": "json", + "jsonml+json": "jsonml", + "mathml+xml": "mathml", + "metalink+xml": "metalink", + "mp4": "mp4s", + // "oebps-package+xml" : "opf", + "omdoc+xml": "omdoc", + "oxps": "oxps", + "vnd.amazon.ebook": "azw", + "widget": "wgt", + // "x-dtbncx+xml" : "ncx", + "x-dtbook+xml": "dtb", + "x-dtbresource+xml": "res", + "x-font-bdf": "bdf", + "x-font-ghostscript": "gsf", + "x-font-linux-psf": "psf", + "x-font-otf": "otf", + "x-font-pcf": "pcf", + "x-font-snf": "snf", + "x-font-ttf": ["ttf", "ttc"], + "x-font-type1": ["pfa", "pfb", "pfm", "afm"], + "x-font-woff": "woff", + "x-mobipocket-ebook": ["prc", "mobi"], + "x-mspublisher": "pub", + "x-nzb": "nzb", + "x-tgif": "obj", + "xaml+xml": "xaml", + "xml-dtd": "dtd", + "xproc+xml": "xpl", + "xslt+xml": "xslt", + "internet-property-stream": "acx", + "x-compress": "z", + "x-compressed": "tgz", + "x-gzip": "gz" + }, + "audio": { + "flac": "flac", + "midi": ["mid", "midi", "kar", "rmi"], + "mpeg": ["mpga", "mpega", "mp2", "mp3", "m4a", "mp2a", "m2a", "m3a"], + "mpegurl": "m3u", + "ogg": ["oga", "ogg", "spx"], + "x-aiff": ["aif", "aiff", "aifc"], + "x-ms-wma": "wma", + "x-wav": "wav", + "adpcm": "adp", + "mp4": "mp4a", + "webm": "weba", + "x-aac": "aac", + "x-caf": "caf", + "x-matroska": "mka", + "x-pn-realaudio-plugin": "rmp", + "xm": "xm", + "mid": ["mid", "rmi"] + }, + "image": { + "gif": "gif", + "ief": "ief", + "jpeg": ["jpeg", "jpg", "jpe"], + "pcx": "pcx", + "png": "png", + "svg+xml": ["svg", "svgz"], + "tiff": ["tiff", "tif"], + "x-icon": "ico", + "bmp": "bmp", + "webp": "webp", + "x-pict": ["pic", "pct"], + "x-tga": "tga", + "cis-cod": "cod" + }, + "text": { + "cache-manifest": ["manifest", "appcache"], + "css": "css", + "csv": "csv", + "html": ["html", "htm", "shtml", "stm"], + "mathml": "mml", + "plain": ["txt", "text", "brf", "conf", "def", "list", "log", "in", "bas"], + "richtext": "rtx", + "tab-separated-values": "tsv", + "x-bibtex": "bib" + }, + "video": { + "mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v", "mp2", "mpa", "mpv2"], + "mp4": ["mp4", "mp4v", "mpg4"], + "quicktime": ["qt", "mov"], + "ogg": "ogv", + "vnd.mpegurl": ["mxu", "m4u"], + "x-flv": "flv", + "x-la-asf": ["lsf", "lsx"], + "x-mng": "mng", + "x-ms-asf": ["asf", "asx", "asr"], + "x-ms-wm": "wm", + "x-ms-wmv": "wmv", + "x-ms-wmx": "wmx", + "x-ms-wvx": "wvx", + "x-msvideo": "avi", + "x-sgi-movie": "movie", + "x-matroska": ["mpv", "mkv", "mk3d", "mks"], + "3gpp2": "3g2", + "h261": "h261", + "h263": "h263", + "h264": "h264", + "jpeg": "jpgv", + "jpm": ["jpm", "jpgm"], + "mj2": ["mj2", "mjp2"], + "vnd.ms-playready.media.pyv": "pyv", + "vnd.uvvu.mp4": ["uvu", "uvvu"], + "vnd.vivo": "viv", + "webm": "webm", + "x-f4v": "f4v", + "x-m4v": "m4v", + "x-ms-vob": "vob", + "x-smv": "smv" } - /** - * Create a Url from an unarchived item - * @param {string} url - * @param {object} [options.base64] use base64 encoding or blob url - * @return {Promise} url promise with Url string - */ - - - createUrl(url, options) { - var deferred = new core["defer"](); - - var _URL = window.URL || window.webkitURL || window.mozURL; - - var tempUrl; - var response; - var useBase64 = options && options.base64; - - if (url in this.urlCache) { - deferred.resolve(this.urlCache[url]); - return deferred.promise; - } +}; - if (useBase64) { - response = this.getBase64(url); +var mime_mimeTypes = function () { + var type, + subtype, + val, + index, + mimeTypes = {}; - if (response) { - response.then(function (tempUrl) { - this.urlCache[url] = tempUrl; - deferred.resolve(tempUrl); - }.bind(this)); - } - } else { - response = this.getBlob(url); + for (type in table) { + if (table.hasOwnProperty(type)) { + for (subtype in table[type]) { + if (table[type].hasOwnProperty(subtype)) { + val = table[type][subtype]; - if (response) { - response.then(function (blob) { - tempUrl = _URL.createObjectURL(blob); - this.urlCache[url] = tempUrl; - deferred.resolve(tempUrl); - }.bind(this)); + if (typeof val == "string") { + mimeTypes[val] = type + "/" + subtype; + } else { + for (index = 0; index < val.length; index++) { + mimeTypes[val[index]] = type + "/" + subtype; + } + } + } } } - - if (!response) { - deferred.reject({ - message: "File not found in the epub: " + url, - stack: new Error().stack - }); - } - - return deferred.promise; - } - /** - * Revoke Temp Url for a achive item - * @param {string} url url of the item in the archive - */ - - - revokeUrl(url) { - var _URL = window.URL || window.webkitURL || window.mozURL; - - var fromCache = this.urlCache[url]; - if (fromCache) _URL.revokeObjectURL(fromCache); } - destroy() { - var _URL = window.URL || window.webkitURL || window.mozURL; - - for (let fromCache in this.urlCache) { - _URL.revokeObjectURL(fromCache); - } + return mimeTypes; +}(); - this.zip = undefined; - this.urlCache = {}; - } +var defaultValue = "text/plain"; //"application/octet-stream"; +function lookup(filename) { + return filename && mime_mimeTypes[filename.split(".").pop().toLowerCase()] || defaultValue; } -/* harmony default export */ var archive = (archive_Archive); -// EXTERNAL MODULE: ./node_modules/localforage/dist/localforage.js -var localforage = __webpack_require__(57); -var localforage_default = /*#__PURE__*/__webpack_require__.n(localforage); - -// CONCATENATED MODULE: ./src/store.js - - +; +/* harmony default export */ var mime = ({ + lookup +}); +// CONCATENATED MODULE: ./src/resources.js @@ -19031,2517 +16379,3733 @@ /** - * Handles saving and requesting files from local storage + * Handle Package Resources * @class - * @param {string} name This should be the name of the application for modals - * @param {function} [requester] - * @param {function} [resolver] + * @param {Manifest} manifest + * @param {object} [options] + * @param {string} [options.replacements="base64"] + * @param {Archive} [options.archive] + * @param {method} [options.resolver] */ -class store_Store { - constructor(name, requester, resolver) { - this.urlCache = {}; - this.storage = undefined; - this.name = name; - this.requester = requester || utils_request; - this.resolver = resolver; - this.online = true; - this.checkRequirements(); - this.addListeners(); - } - /** - * Checks to see if localForage exists in global namspace, - * Requires localForage if it isn't there - * @private - */ - - - checkRequirements() { - try { - let store; - - if (typeof localforage_default.a === "undefined") { - store = localforage_default.a; - } - - this.storage = store.createInstance({ - name: this.name - }); - } catch (e) { - throw new Error("localForage lib not loaded"); - } - } - /** - * Add online and offline event listeners - * @private - */ - - - addListeners() { - this._status = this.status.bind(this); - window.addEventListener('online', this._status); - window.addEventListener('offline', this._status); +class resources_Resources { + constructor(manifest, options) { + this.settings = { + replacements: options && options.replacements || "base64", + archive: options && options.archive, + resolver: options && options.resolver, + request: options && options.request + }; + this.process(manifest); } /** - * Remove online and offline event listeners - * @private + * Process resources + * @param {Manifest} manifest */ - removeListeners() { - window.removeEventListener('online', this._status); - window.removeEventListener('offline', this._status); - this._status = undefined; + process(manifest) { + this.manifest = manifest; + this.resources = Object.keys(manifest).map(function (key) { + return manifest[key]; + }); + this.replacementUrls = []; + this.html = []; + this.assets = []; + this.css = []; + this.urls = []; + this.cssUrls = []; + this.split(); + this.splitUrls(); } /** - * Update the online / offline status + * Split resources by type * @private */ - status(event) { - let online = navigator.onLine; - this.online = online; - - if (online) { - this.emit("online", this); - } else { - this.emit("offline", this); - } - } - /** - * Add all of a book resources to the store - * @param {Resources} resources book resources - * @param {boolean} [force] force resaving resources - * @return {Promise} store objects - */ + split() { + // HTML + this.html = this.resources.filter(function (item) { + if (item.type === "application/xhtml+xml" || item.type === "text/html") { + return true; + } + }); // Exclude HTML + this.assets = this.resources.filter(function (item) { + if (item.type !== "application/xhtml+xml" && item.type !== "text/html") { + return true; + } + }); // Only CSS - add(resources, force) { - let mapped = resources.resources.map(item => { - let { - href - } = item; - let url = this.resolver(href); - let encodedUrl = window.encodeURIComponent(url); - return this.storage.getItem(encodedUrl).then(item => { - if (!item || force) { - return this.requester(url, "binary").then(data => { - return this.storage.setItem(encodedUrl, data); - }); - } else { - return item; - } - }); + this.css = this.resources.filter(function (item) { + if (item.type === "text/css") { + return true; + } }); - return Promise.all(mapped); } /** - * Put binary data from a url to storage - * @param {string} url a url to request from storage - * @param {boolean} [withCredentials] - * @param {object} [headers] - * @return {Promise} + * Convert split resources into Urls + * @private */ - - put(url, withCredentials, headers) { - let encodedUrl = window.encodeURIComponent(url); - return this.storage.getItem(encodedUrl).then(result => { - if (!result) { - return this.requester(url, "binary", withCredentials, headers).then(data => { - return this.storage.setItem(encodedUrl, data); - }); - } - - return result; + + splitUrls() { + // All Assets Urls + this.urls = this.assets.map(function (item) { + return item.href; + }.bind(this)); // Css Urls + + this.cssUrls = this.css.map(function (item) { + return item.href; }); } /** - * Request a url - * @param {string} url a url to request from storage - * @param {string} [type] specify the type of the returned result - * @param {boolean} [withCredentials] - * @param {object} [headers] - * @return {Promise} + * Create a url to a resource + * @param {string} url + * @return {Promise} Promise resolves with url string */ - request(url, type, withCredentials, headers) { - if (this.online) { - // From network - return this.requester(url, type, withCredentials, headers).then(data => { - // save to store if not present - this.put(url); - return data; + createUrl(url) { + var parsedUrl = new utils_url["a" /* default */](url); + var mimeType = mime.lookup(parsedUrl.filename); + + if (this.settings.archive) { + return this.settings.archive.createUrl(url, { + "base64": this.settings.replacements === "base64" }); } else { - // From store - return this.retrieve(url, type); + if (this.settings.replacements === "base64") { + return this.settings.request(url, 'blob').then(blob => { + return Object(core["blob2base64"])(blob); + }).then(blob => { + return Object(core["createBase64Url"])(blob, mimeType); + }); + } else { + return this.settings.request(url, 'blob').then(blob => { + return Object(core["createBlobUrl"])(blob, mimeType); + }); + } } } /** - * Request a url from storage - * @param {string} url a url to request from storage - * @param {string} [type] specify the type of the returned result - * @return {Promise} + * Create blob urls for all the assets + * @return {Promise} returns replacement urls */ - retrieve(url, type) { - var deferred = new core["defer"](); - var response; - var path = new utils_path["a" /* default */](url); // If type isn't set, determine it from the file extension - - if (!type) { - type = path.extension; - } - - if (type == "blob") { - response = this.getBlob(url); - } else { - response = this.getText(url); + replacements() { + if (this.settings.replacements === "none") { + return new Promise(function (resolve) { + resolve(this.urls); + }.bind(this)); } - return response.then(r => { - var deferred = new core["defer"](); - var result; - - if (r) { - result = this.handleResponse(r, type); - deferred.resolve(result); - } else { - deferred.reject({ - message: "File not found in storage: " + url, - stack: new Error().stack - }); - } - - return deferred.promise; + var replacements = this.urls.map(url => { + var absolute = this.settings.resolver(url); + return this.createUrl(absolute).catch(err => { + console.error(err); + return null; + }); + }); + return Promise.all(replacements).then(replacementUrls => { + this.replacementUrls = replacementUrls.filter(url => { + return typeof url === "string"; + }); + return replacementUrls; }); } /** - * Handle the response from request + * Replace URLs in CSS resources * @private - * @param {any} response - * @param {string} [type] - * @return {any} the parsed result + * @param {Archive} [archive] + * @param {method} [resolver] + * @return {Promise} */ - handleResponse(response, type) { - var r; - - if (type == "json") { - r = JSON.parse(response); - } else if (Object(core["isXml"])(type)) { - r = Object(core["parse"])(response, "text/xml"); - } else if (type == "xhtml") { - r = Object(core["parse"])(response, "application/xhtml+xml"); - } else if (type == "html" || type == "htm") { - r = Object(core["parse"])(response, "text/html"); - } else { - r = response; - } + replaceCss(archive, resolver) { + var replaced = []; + archive = archive || this.settings.archive; + resolver = resolver || this.settings.resolver; + this.cssUrls.forEach(function (href) { + var replacement = this.createCssFile(href, archive, resolver).then(function (replacementUrl) { + // switch the url in the replacementUrls + var indexInUrls = this.urls.indexOf(href); - return r; + if (indexInUrls > -1) { + this.replacementUrls[indexInUrls] = replacementUrl; + } + }.bind(this)); + replaced.push(replacement); + }.bind(this)); + return Promise.all(replaced); } /** - * Get a Blob from Storage by Url - * @param {string} url - * @param {string} [mimeType] - * @return {Blob} + * Create a new CSS file with the replaced URLs + * @private + * @param {string} href the original css file + * @return {Promise} returns a BlobUrl to the new CSS file or a data url */ - getBlob(url, mimeType) { - let encodedUrl = window.encodeURIComponent(url); - return this.storage.getItem(encodedUrl).then(function (uint8array) { - if (!uint8array) return; - mimeType = mimeType || mime.lookup(url); - return new Blob([uint8array], { - type: mimeType + createCssFile(href) { + var newUrl; + + if (path_default.a.isAbsolute(href)) { + return new Promise(function (resolve) { + resolve(); }); - }); - } - /** - * Get Text from Storage by Url - * @param {string} url - * @param {string} [mimeType] - * @return {string} - */ + } + var absolute = this.settings.resolver(href); // Get the text of the css file from the archive - getText(url, mimeType) { - let encodedUrl = window.encodeURIComponent(url); - mimeType = mimeType || mime.lookup(url); - return this.storage.getItem(encodedUrl).then(function (uint8array) { - var deferred = new core["defer"](); - var reader = new FileReader(); - var blob; - if (!uint8array) return; - blob = new Blob([uint8array], { - type: mimeType + var textResponse; + + if (this.settings.archive) { + textResponse = this.settings.archive.getText(absolute); + } else { + textResponse = this.settings.request(absolute, "text"); + } // Get asset links relative to css file + + + var relUrls = this.urls.map(assetHref => { + var resolved = this.settings.resolver(assetHref); + var relative = new utils_path["a" /* default */](absolute).relative(resolved); + return relative; + }); + + if (!textResponse) { + // file not found, don't replace + return new Promise(function (resolve) { + resolve(); }); - reader.addEventListener("loadend", () => { - deferred.resolve(reader.result); + } + + return textResponse.then(text => { + // Replacements in the css text + text = Object(replacements["e" /* substitute */])(text, relUrls, this.replacementUrls); // Get the new url + + if (this.settings.replacements === "base64") { + newUrl = Object(core["createBase64Url"])(text, "text/css"); + } else { + newUrl = Object(core["createBlobUrl"])(text, "text/css"); + } + + return newUrl; + }, err => { + // handle response errors + return new Promise(function (resolve) { + resolve(); }); - reader.readAsText(blob, mimeType); - return deferred.promise; }); } /** - * Get a base64 encoded result from Storage by Url - * @param {string} url - * @param {string} [mimeType] - * @return {string} base64 encoded + * Resolve all resources URLs relative to an absolute URL + * @param {string} absolute to be resolved to + * @param {resolver} [resolver] + * @return {string[]} array with relative Urls */ - getBase64(url, mimeType) { - let encodedUrl = window.encodeURIComponent(url); - mimeType = mimeType || mime.lookup(url); - return this.storage.getItem(encodedUrl).then(uint8array => { - var deferred = new core["defer"](); - var reader = new FileReader(); - var blob; - if (!uint8array) return; - blob = new Blob([uint8array], { - type: mimeType - }); - reader.addEventListener("loadend", () => { - deferred.resolve(reader.result); - }); - reader.readAsDataURL(blob, mimeType); - return deferred.promise; - }); + relativeTo(absolute, resolver) { + resolver = resolver || this.settings.resolver; // Get Urls relative to current sections + + return this.urls.map(function (href) { + var resolved = resolver(href); + var relative = new utils_path["a" /* default */](absolute).relative(resolved); + return relative; + }.bind(this)); } /** - * Create a Url from a stored item - * @param {string} url - * @param {object} [options.base64] use base64 encoding or blob url - * @return {Promise} url promise with Url string + * Get a URL for a resource + * @param {string} path + * @return {string} url */ - createUrl(url, options) { - var deferred = new core["defer"](); - - var _URL = window.URL || window.webkitURL || window.mozURL; - - var tempUrl; - var response; - var useBase64 = options && options.base64; + get(path) { + var indexInUrls = this.urls.indexOf(path); - if (url in this.urlCache) { - deferred.resolve(this.urlCache[url]); - return deferred.promise; + if (indexInUrls === -1) { + return; } - if (useBase64) { - response = this.getBase64(url); - - if (response) { - response.then(function (tempUrl) { - this.urlCache[url] = tempUrl; - deferred.resolve(tempUrl); - }.bind(this)); - } + if (this.replacementUrls.length) { + return new Promise(function (resolve, reject) { + resolve(this.replacementUrls[indexInUrls]); + }.bind(this)); } else { - response = this.getBlob(url); - - if (response) { - response.then(function (blob) { - tempUrl = _URL.createObjectURL(blob); - this.urlCache[url] = tempUrl; - deferred.resolve(tempUrl); - }.bind(this)); - } - } - - if (!response) { - deferred.reject({ - message: "File not found in storage: " + url, - stack: new Error().stack - }); + return this.createUrl(path); } - - return deferred.promise; } /** - * Revoke Temp Url for a achive item - * @param {string} url url of the item in the store + * Substitute urls in content, with replacements, + * relative to a url if provided + * @param {string} content + * @param {string} [url] url to resolve to + * @return {string} content with urls substituted */ - revokeUrl(url) { - var _URL = window.URL || window.webkitURL || window.mozURL; + substitute(content, url) { + var relUrls; - var fromCache = this.urlCache[url]; - if (fromCache) _URL.revokeObjectURL(fromCache); + if (url) { + relUrls = this.relativeTo(url); + } else { + relUrls = this.urls; + } + + return Object(replacements["e" /* substitute */])(content, relUrls, this.replacementUrls); } destroy() { - var _URL = window.URL || window.webkitURL || window.mozURL; - - for (let fromCache in this.urlCache) { - _URL.revokeObjectURL(fromCache); - } - - this.urlCache = {}; - this.removeListeners(); + this.settings = undefined; + this.manifest = undefined; + this.resources = undefined; + this.replacementUrls = undefined; + this.html = undefined; + this.assets = undefined; + this.css = undefined; + this.urls = undefined; + this.cssUrls = undefined; } } -event_emitter_default()(store_Store.prototype); -/* harmony default export */ var src_store = (store_Store); -// CONCATENATED MODULE: ./src/displayoptions.js +/* harmony default export */ var resources = (resources_Resources); +// CONCATENATED MODULE: ./src/pagelist.js + /** - * Open DisplayOptions Format Parser - * @class - * @param {document} displayOptionsDocument XML + * Page List Parser + * @param {document} [xml] */ -class displayoptions_DisplayOptions { - constructor(displayOptionsDocument) { - this.interactive = ""; - this.fixedLayout = ""; - this.openToSpread = ""; - this.orientationLock = ""; +class pagelist_PageList { + constructor(xml) { + this.pages = []; + this.locations = []; + this.epubcfi = new epubcfi["a" /* default */](); + this.firstPage = 0; + this.lastPage = 0; + this.totalPages = 0; + this.toc = undefined; + this.ncx = undefined; - if (displayOptionsDocument) { - this.parse(displayOptionsDocument); + if (xml) { + this.pageList = this.parse(xml); + } + + if (this.pageList && this.pageList.length) { + this.process(this.pageList); } } /** - * Parse XML - * @param {document} displayOptionsDocument XML - * @return {DisplayOptions} self + * Parse PageList Xml + * @param {document} xml */ - parse(displayOptionsDocument) { - if (!displayOptionsDocument) { - return this; + parse(xml) { + var html = Object(core["qs"])(xml, "html"); + var ncx = Object(core["qs"])(xml, "ncx"); + + if (html) { + return this.parseNav(xml); + } else if (ncx) { + return this.parseNcx(xml); } + } + /** + * Parse a Nav PageList + * @private + * @param {node} navHtml + * @return {PageList.item[]} list + */ - const displayOptionsNode = Object(core["qs"])(displayOptionsDocument, "display_options"); - if (!displayOptionsNode) { - return this; + parseNav(navHtml) { + var navElement = Object(core["querySelectorByType"])(navHtml, "nav", "page-list"); + var navItems = navElement ? Object(core["qsa"])(navElement, "li") : []; + var length = navItems.length; + var i; + var list = []; + var item; + if (!navItems || length === 0) return list; + + for (i = 0; i < length; ++i) { + item = this.item(navItems[i]); + list.push(item); } - const options = Object(core["qsa"])(displayOptionsNode, "option"); - options.forEach(el => { - let value = ""; + return list; + } - if (el.childNodes.length) { - value = el.childNodes[0].nodeValue; - } + parseNcx(navXml) { + var list = []; + var i = 0; + var item; + var pageList; + var pageTargets; + var length = 0; + pageList = Object(core["qs"])(navXml, "pageList"); + if (!pageList) return list; + pageTargets = Object(core["qsa"])(pageList, "pageTarget"); + length = pageTargets.length; - switch (el.attributes.name.value) { - case "interactive": - this.interactive = value; - break; + if (!pageTargets || pageTargets.length === 0) { + return list; + } - case "fixed-layout": - this.fixedLayout = value; - break; + for (i = 0; i < length; ++i) { + item = this.ncxItem(pageTargets[i]); + list.push(item); + } - case "open-to-spread": - this.openToSpread = value; - break; + return list; + } - case "orientation-lock": - this.orientationLock = value; - break; - } - }); - return this; + ncxItem(item) { + var navLabel = Object(core["qs"])(item, "navLabel"); + var navLabelText = Object(core["qs"])(navLabel, "text"); + var pageText = navLabelText.textContent; + var content = Object(core["qs"])(item, "content"); + var href = content.getAttribute("src"); + var page = parseInt(pageText, 10); + return { + "href": href, + "page": page + }; + } + /** + * Page List Item + * @private + * @param {node} item + * @return {object} pageListItem + */ + + + item(item) { + var content = Object(core["qs"])(item, "a"), + href = content.getAttribute("href") || "", + text = content.textContent || "", + page = parseInt(text), + isCfi = href.indexOf("epubcfi"), + split, + packageUrl, + cfi; + + if (isCfi != -1) { + split = href.split("#"); + packageUrl = split[0]; + cfi = split.length > 1 ? split[1] : false; + return { + "cfi": cfi, + "href": href, + "packageUrl": packageUrl, + "page": page + }; + } else { + return { + "href": href, + "page": page + }; + } } + /** + * Process pageList items + * @private + * @param {array} pageList + */ + + + process(pageList) { + pageList.forEach(function (item) { + this.pages.push(item.page); - destroy() { - this.interactive = undefined; - this.fixedLayout = undefined; - this.openToSpread = undefined; - this.orientationLock = undefined; + if (item.cfi) { + this.locations.push(item.cfi); + } + }, this); + this.firstPage = parseInt(this.pages[0]); + this.lastPage = parseInt(this.pages[this.pages.length - 1]); + this.totalPages = this.lastPage - this.firstPage; } + /** + * Get a PageList result from a EpubCFI + * @param {string} cfi EpubCFI String + * @return {number} page + */ -} -/* harmony default export */ var displayoptions = (displayoptions_DisplayOptions); -// CONCATENATED MODULE: ./src/book.js + pageFromCfi(cfi) { + var pg = -1; // Check if the pageList has not been set yet + if (this.locations.length === 0) { + return -1; + } // TODO: check if CFI is valid? + // check if the cfi is in the location list + // var index = this.locations.indexOf(cfi); + var index = Object(core["indexOfSorted"])(cfi, this.locations, this.epubcfi.compare); + if (index != -1) { + pg = this.pages[index]; + } else { + // Otherwise add it to the list of locations + // Insert it in the correct position in the locations page + //index = EPUBJS.core.insert(cfi, this.locations, this.epubcfi.compare); + index = Object(core["locationOf"])(cfi, this.locations, this.epubcfi.compare); // Get the page at the location just before the new one, or return the first + pg = index - 1 >= 0 ? this.pages[index - 1] : this.pages[0]; + if (pg !== undefined) {// Add the new page in so that the locations and page array match up + //this.pages.splice(index, 0, pg); + } else { + pg = -1; + } + } + return pg; + } + /** + * Get an EpubCFI from a Page List Item + * @param {string | number} pg + * @return {string} cfi + */ + cfiFromPage(pg) { + var cfi = -1; // check that pg is an int + if (typeof pg != "number") { + pg = parseInt(pg); + } // check if the cfi is in the page list + // Pages could be unsorted. + var index = this.pages.indexOf(pg); + if (index != -1) { + cfi = this.locations[index]; + } // TODO: handle pages not in the list + return cfi; + } + /** + * Get a Page from Book percentage + * @param {number} percent + * @return {number} page + */ + pageFromPercentage(percent) { + var pg = Math.round(this.totalPages * percent); + return pg; + } + /** + * Returns a value between 0 - 1 corresponding to the location of a page + * @param {number} pg the page + * @return {number} percentage + */ + percentageFromPage(pg) { + var percentage = (pg - this.firstPage) / this.totalPages; + return Math.round(percentage * 1000) / 1000; + } + /** + * Returns a value between 0 - 1 corresponding to the location of a cfi + * @param {string} cfi EpubCFI String + * @return {number} percentage + */ -const CONTAINER_PATH = "META-INF/container.xml"; -const IBOOKS_DISPLAY_OPTIONS_PATH = "META-INF/com.apple.ibooks.display-options.xml"; -const INPUT_TYPE = { - BINARY: "binary", - BASE64: "base64", - EPUB: "epub", - OPF: "opf", - MANIFEST: "json", - DIRECTORY: "directory" -}; -/** - * An Epub representation with methods for the loading, parsing and manipulation - * of its contents. - * @class - * @param {string} [url] - * @param {object} [options] - * @param {method} [options.requestMethod] a request function to use instead of the default - * @param {boolean} [options.requestCredentials=undefined] send the xhr request withCredentials - * @param {object} [options.requestHeaders=undefined] send the xhr request headers - * @param {string} [options.encoding=binary] optional to pass 'binary' or base64' for archived Epubs - * @param {string} [options.replacements=none] use base64, blobUrl, or none for replacing assets in archived Epubs - * @param {method} [options.canonical] optional function to determine canonical urls for a path - * @param {string} [options.openAs] optional string to determine the input type - * @param {string} [options.store=false] cache the contents in local storage, value should be the name of the reader - * @returns {Book} - * @example new Book("/path/to/book.epub", {}) - * @example new Book({ replacements: "blobUrl" }) - */ -class book_Book { - constructor(url, options) { - // Allow passing just options to the Book - if (typeof options === "undefined" && typeof url !== "string" && url instanceof Blob === false && url instanceof ArrayBuffer === false) { - options = url; - url = undefined; - } + percentageFromCfi(cfi) { + var pg = this.pageFromCfi(cfi); + var percentage = this.percentageFromPage(pg); + return percentage; + } + /** + * Destroy + */ - this.settings = Object(core["extend"])(this.settings || {}, { - requestMethod: undefined, - requestCredentials: undefined, - requestHeaders: undefined, - encoding: undefined, - replacements: undefined, - canonical: undefined, - openAs: undefined, - store: undefined - }); - Object(core["extend"])(this.settings, options); // Promises - this.opening = new core["defer"](); - /** - * @member {promise} opened returns after the book is loaded - * @memberof Book - */ + destroy() { + this.pages = undefined; + this.locations = undefined; + this.epubcfi = undefined; + this.pageList = undefined; + this.toc = undefined; + this.ncx = undefined; + } - this.opened = this.opening.promise; - this.isOpen = false; - this.loading = { - manifest: new core["defer"](), - spine: new core["defer"](), - metadata: new core["defer"](), - cover: new core["defer"](), - navigation: new core["defer"](), - pageList: new core["defer"](), - resources: new core["defer"](), - displayOptions: new core["defer"]() - }; - this.loaded = { - manifest: this.loading.manifest.promise, - spine: this.loading.spine.promise, - metadata: this.loading.metadata.promise, - cover: this.loading.cover.promise, - navigation: this.loading.navigation.promise, - pageList: this.loading.pageList.promise, - resources: this.loading.resources.promise, - displayOptions: this.loading.displayOptions.promise - }; - /** - * @member {promise} ready returns after the book is loaded and parsed - * @memberof Book - * @private - */ +} - this.ready = Promise.all([this.loaded.manifest, this.loaded.spine, this.loaded.metadata, this.loaded.cover, this.loaded.navigation, this.loaded.resources, this.loaded.displayOptions]); // Queue for methods used before opening +/* harmony default export */ var pagelist = (pagelist_PageList); +// EXTERNAL MODULE: ./src/rendition.js + 3 modules +var rendition = __webpack_require__(16); - this.isRendered = false; // this._q = queue(this); +// EXTERNAL MODULE: external "JSZip" +var external_JSZip_ = __webpack_require__(29); +var external_JSZip_default = /*#__PURE__*/__webpack_require__.n(external_JSZip_); - /** - * @member {method} request - * @memberof Book - * @private - */ +// CONCATENATED MODULE: ./src/archive.js - this.request = this.settings.requestMethod || utils_request; - /** - * @member {Spine} spine - * @memberof Book - */ - this.spine = new src_spine(); - /** - * @member {Locations} locations - * @memberof Book - */ - this.locations = new src_locations(this.spine, this.load.bind(this)); - /** - * @member {Navigation} navigation - * @memberof Book - */ - this.navigation = undefined; - /** - * @member {PageList} pagelist - * @memberof Book - */ - this.pageList = undefined; - /** - * @member {Url} url - * @memberof Book - * @private - */ +/** + * Handles Unzipping a requesting files from an Epub Archive + * @class + */ - this.url = undefined; - /** - * @member {Path} path - * @memberof Book - * @private - */ +class archive_Archive { + constructor() { + this.zip = undefined; + this.urlCache = {}; + this.checkRequirements(); + } + /** + * Checks to see if JSZip exists in global namspace, + * Requires JSZip if it isn't there + * @private + */ - this.path = undefined; - /** - * @member {boolean} archived - * @memberof Book - * @private - */ - this.archived = false; - /** - * @member {Archive} archive - * @memberof Book - * @private - */ + checkRequirements() { + try { + this.zip = new external_JSZip_default.a(); + } catch (e) { + throw new Error("JSZip lib not loaded"); + } + } + /** + * Open an archive + * @param {binary} input + * @param {boolean} [isBase64] tells JSZip if the input data is base64 encoded + * @return {Promise} zipfile + */ - this.archive = undefined; - /** - * @member {Store} storage - * @memberof Book - * @private - */ - this.storage = undefined; - /** - * @member {Resources} resources - * @memberof Book - * @private - */ + open(input, isBase64) { + return this.zip.loadAsync(input, { + "base64": isBase64 + }); + } + /** + * Load and Open an archive + * @param {string} zipUrl + * @param {boolean} [isBase64] tells JSZip if the input data is base64 encoded + * @return {Promise} zipfile + */ - this.resources = undefined; - /** - * @member {Rendition} rendition - * @memberof Book - * @private - */ - this.rendition = undefined; - /** - * @member {Container} container - * @memberof Book - * @private - */ + openUrl(zipUrl, isBase64) { + return utils_request(zipUrl, "binary").then(function (data) { + return this.zip.loadAsync(data, { + "base64": isBase64 + }); + }.bind(this)); + } + /** + * Request a url from the archive + * @param {string} url a url to request from the archive + * @param {string} [type] specify the type of the returned result + * @return {Promise} + */ - this.container = undefined; - /** - * @member {Packaging} packaging - * @memberof Book - * @private - */ - this.packaging = undefined; - /** - * @member {DisplayOptions} displayOptions - * @memberof DisplayOptions - * @private - */ + request(url, type) { + var deferred = new core["defer"](); + var response; + var path = new utils_path["a" /* default */](url); // If type isn't set, determine it from the file extension - this.displayOptions = undefined; // this.toc = undefined; + if (!type) { + type = path.extension; + } - if (this.settings.store) { - this.store(this.settings.store); + if (type == "blob") { + response = this.getBlob(url); + } else { + response = this.getText(url); } - if (url) { - this.open(url, this.settings.openAs).catch(error => { - var err = new Error("Cannot load book at " + url); - this.emit(constants["c" /* EVENTS */].BOOK.OPEN_FAILED, err); + if (response) { + response.then(function (r) { + let result = this.handleResponse(r, type); + deferred.resolve(result); + }.bind(this)); + } else { + deferred.reject({ + message: "File not found in the epub: " + url, + stack: new Error().stack }); } + + return deferred.promise; } /** - * Open a epub or url - * @param {string | ArrayBuffer} input Url, Path or ArrayBuffer - * @param {string} [what="binary", "base64", "epub", "opf", "json", "directory"] force opening as a certain type - * @returns {Promise} of when the book has been loaded - * @example book.open("/path/to/book.epub") + * Handle the response from request + * @private + * @param {any} response + * @param {string} [type] + * @return {any} the parsed result */ - open(input, what) { - var opening; - var type = what || this.determineType(input); + handleResponse(response, type) { + var r; - if (type === INPUT_TYPE.BINARY) { - this.archived = true; - this.url = new utils_url["a" /* default */]("/", ""); - opening = this.openEpub(input); - } else if (type === INPUT_TYPE.BASE64) { - this.archived = true; - this.url = new utils_url["a" /* default */]("/", ""); - opening = this.openEpub(input, type); - } else if (type === INPUT_TYPE.EPUB) { - this.archived = true; - this.url = new utils_url["a" /* default */]("/", ""); - opening = this.request(input, "binary", this.settings.requestCredentials, this.settings.requestHeaders).then(this.openEpub.bind(this)); - } else if (type == INPUT_TYPE.OPF) { - this.url = new utils_url["a" /* default */](input); - opening = this.openPackaging(this.url.Path.toString()); - } else if (type == INPUT_TYPE.MANIFEST) { - this.url = new utils_url["a" /* default */](input); - opening = this.openManifest(this.url.Path.toString()); + if (type == "json") { + r = JSON.parse(response); + } else if (Object(core["isXml"])(type)) { + r = Object(core["parse"])(response, "text/xml"); + } else if (type == "xhtml") { + r = Object(core["parse"])(response, "application/xhtml+xml"); + } else if (type == "html" || type == "htm") { + r = Object(core["parse"])(response, /<\s*a[^>]*\/>/gi.test(response) ? "application/xhtml+xml" : "text/html"); } else { - this.url = new utils_url["a" /* default */](input); - opening = this.openContainer(CONTAINER_PATH).then(this.openPackaging.bind(this)); + r = response; } - return opening; + return r; } /** - * Open an archived epub - * @private - * @param {binary} data - * @param {string} [encoding] - * @return {Promise} + * Get a Blob from Archive by Url + * @param {string} url + * @param {string} [mimeType] + * @return {Blob} */ - openEpub(data, encoding) { - return this.unarchive(data, encoding || this.settings.encoding).then(() => { - return this.openContainer(CONTAINER_PATH); - }).then(packagePath => { - return this.openPackaging(packagePath); - }); + getBlob(url, mimeType) { + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + + var entry = this.zip.file(decodededUrl); + + if (entry) { + mimeType = mimeType || mime.lookup(entry.name); + return entry.async("uint8array").then(function (uint8array) { + return new Blob([uint8array], { + type: mimeType + }); + }); + } } /** - * Open the epub container - * @private + * Get Text from Archive by Url * @param {string} url - * @return {string} packagePath + * @param {string} [encoding] + * @return {string} */ - openContainer(url) { - return this.load(url).then(xml => { - this.container = new container(xml); - return this.resolve(this.container.packagePath); - }); + getText(url, encoding) { + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + + var entry = this.zip.file(decodededUrl); + + if (entry) { + return entry.async("string").then(function (text) { + return text; + }); + } } /** - * Open the Open Packaging Format Xml - * @private + * Get a base64 encoded result from Archive by Url * @param {string} url - * @return {Promise} + * @param {string} [mimeType] + * @return {string} base64 encoded */ - openPackaging(url) { - this.path = new utils_path["a" /* default */](url); - return this.load(url).then(xml => { - this.packaging = new src_packaging(xml); - return this.unpack(this.packaging); - }); + getBase64(url, mimeType) { + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + + var entry = this.zip.file(decodededUrl); + + if (entry) { + mimeType = mimeType || mime.lookup(entry.name); + return entry.async("base64").then(function (data) { + return "data:" + mimeType + ";base64," + data; + }); + } } /** - * Open the manifest JSON - * @private + * Create a Url from an unarchived item * @param {string} url - * @return {Promise} + * @param {object} [options.base64] use base64 encoding or blob url + * @return {Promise} url promise with Url string */ - openManifest(url) { - this.path = new utils_path["a" /* default */](url); - return this.load(url).then(json => { - this.packaging = new src_packaging(); - this.packaging.load(json); - return this.unpack(this.packaging); - }); - } - /** - * Load manifest JSON object - * @param {Object} json - * @return {Promise} - */ + createUrl(url, options) { + var deferred = new core["defer"](); + + var _URL = window.URL || window.webkitURL || window.mozURL; + + var tempUrl; + var response; + var useBase64 = options && options.base64; + + if (url in this.urlCache) { + deferred.resolve(this.urlCache[url]); + return deferred.promise; + } + + if (useBase64) { + response = this.getBase64(url); + + if (response) { + response.then(function (tempUrl) { + this.urlCache[url] = tempUrl; + deferred.resolve(tempUrl); + }.bind(this)); + } + } else { + response = this.getBlob(url); + if (response) { + response.then(function (blob) { + tempUrl = _URL.createObjectURL(blob); + this.urlCache[url] = tempUrl; + deferred.resolve(tempUrl); + }.bind(this)); + } + } - openJSON(json) { - this.packaging = new src_packaging(); - this.packaging.load(json); - return this.unpack(this.packaging); + if (!response) { + deferred.reject({ + message: "File not found in the epub: " + url, + stack: new Error().stack + }); + } + + return deferred.promise; } /** - * Load a resource from the Book - * @param {string} path path to the resource to load - * @return {Promise} returns a promise with the requested resource + * Revoke Temp Url for a archive item + * @param {string} url url of the item in the archive */ - load(path) { - var resolved = this.resolve(path); + revokeUrl(url) { + var _URL = window.URL || window.webkitURL || window.mozURL; - if (this.archived) { - return this.archive.request(resolved); - } else { - return this.request(resolved, null, this.settings.requestCredentials, this.settings.requestHeaders); - } + var fromCache = this.urlCache[url]; + if (fromCache) _URL.revokeObjectURL(fromCache); } - /** - * Resolve a path to it's absolute position in the Book - * @param {string} path - * @param {boolean} [absolute] force resolving the full URL - * @return {string} the resolved path string - */ + destroy() { + var _URL = window.URL || window.webkitURL || window.mozURL; - resolve(path, absolute) { - if (!path) { - return; + for (let fromCache in this.urlCache) { + _URL.revokeObjectURL(fromCache); } - var resolved = path; - var isAbsolute = path.indexOf("://") > -1; + this.zip = undefined; + this.urlCache = {}; + } - if (isAbsolute) { - return path; - } +} - if (this.path) { - resolved = this.path.resolve(path); - } +/* harmony default export */ var archive = (archive_Archive); +// EXTERNAL MODULE: ./node_modules/localforage/dist/localforage.js +var localforage = __webpack_require__(23); +var localforage_default = /*#__PURE__*/__webpack_require__.n(localforage); - if (absolute != false && this.url) { - resolved = this.url.resolve(resolved); - } +// CONCATENATED MODULE: ./src/store.js - return resolved; - } - /** - * Get a canonical link to a path - * @param {string} path - * @return {string} the canonical path string - */ - canonical(path) { - var url = path; - if (!path) { - return ""; - } - if (this.settings.canonical) { - url = this.settings.canonical(path); - } else { - url = this.resolve(path, true); - } - return url; +/** + * Handles saving and requesting files from local storage + * @class + * @param {string} name This should be the name of the application for modals + * @param {function} [requester] + * @param {function} [resolver] + */ + +class store_Store { + constructor(name, requester, resolver) { + this.urlCache = {}; + this.storage = undefined; + this.name = name; + this.requester = requester || utils_request; + this.resolver = resolver; + this.online = true; + this.checkRequirements(); + this.addListeners(); } /** - * Determine the type of they input passed to open + * Checks to see if localForage exists in global namspace, + * Requires localForage if it isn't there * @private - * @param {string} input - * @return {string} binary | directory | epub | opf */ - determineType(input) { - var url; - var path; - var extension; - - if (this.settings.encoding === "base64") { - return INPUT_TYPE.BASE64; - } - - if (typeof input != "string") { - return INPUT_TYPE.BINARY; - } + checkRequirements() { + try { + let store; - url = new utils_url["a" /* default */](input); - path = url.path(); - extension = path.extension; // If there's a search string, remove it before determining type + if (typeof localforage_default.a === "undefined") { + store = localforage_default.a; + } - if (extension) { - extension = extension.replace(/\?.*$/, ""); + this.storage = store.createInstance({ + name: this.name + }); + } catch (e) { + throw new Error("localForage lib not loaded"); } + } + /** + * Add online and offline event listeners + * @private + */ - if (!extension) { - return INPUT_TYPE.DIRECTORY; - } - if (extension === "epub") { - return INPUT_TYPE.EPUB; - } + addListeners() { + this._status = this.status.bind(this); + window.addEventListener('online', this._status); + window.addEventListener('offline', this._status); + } + /** + * Remove online and offline event listeners + * @private + */ - if (extension === "opf") { - return INPUT_TYPE.OPF; - } - if (extension === "json") { - return INPUT_TYPE.MANIFEST; - } + removeListeners() { + window.removeEventListener('online', this._status); + window.removeEventListener('offline', this._status); + this._status = undefined; } /** - * unpack the contents of the Books packaging + * Update the online / offline status * @private - * @param {Packaging} packaging object */ - unpack(packaging) { - this.package = packaging; //TODO: deprecated this + status(event) { + let online = navigator.onLine; + this.online = online; - if (this.packaging.metadata.layout === "") { - // rendition:layout not set - check display options if book is pre-paginated - this.load(this.url.resolve(IBOOKS_DISPLAY_OPTIONS_PATH)).then(xml => { - this.displayOptions = new displayoptions(xml); - this.loading.displayOptions.resolve(this.displayOptions); - }).catch(err => { - this.displayOptions = new displayoptions(); - this.loading.displayOptions.resolve(this.displayOptions); - }); + if (online) { + this.emit("online", this); } else { - this.displayOptions = new displayoptions(); - this.loading.displayOptions.resolve(this.displayOptions); + this.emit("offline", this); } + } + /** + * Add all of a book resources to the store + * @param {Resources} resources book resources + * @param {boolean} [force] force resaving resources + * @return {Promise} store objects + */ - this.spine.unpack(this.packaging, this.resolve.bind(this), this.canonical.bind(this)); - this.resources = new resources(this.packaging.manifest, { - archive: this.archive, - resolver: this.resolve.bind(this), - request: this.request.bind(this), - replacements: this.settings.replacements || (this.archived ? "blobUrl" : "base64") - }); - this.loadNavigation(this.packaging).then(() => { - // this.toc = this.navigation.toc; - this.loading.navigation.resolve(this.navigation); + + add(resources, force) { + let mapped = resources.resources.map(item => { + let { + href + } = item; + let url = this.resolver(href); + let encodedUrl = window.encodeURIComponent(url); + return this.storage.getItem(encodedUrl).then(item => { + if (!item || force) { + return this.requester(url, "binary").then(data => { + return this.storage.setItem(encodedUrl, data); + }); + } else { + return item; + } + }); }); + return Promise.all(mapped); + } + /** + * Put binary data from a url to storage + * @param {string} url a url to request from storage + * @param {boolean} [withCredentials] + * @param {object} [headers] + * @return {Promise} + */ - if (this.packaging.coverPath) { - this.cover = this.resolve(this.packaging.coverPath); - } // Resolve promises + put(url, withCredentials, headers) { + let encodedUrl = window.encodeURIComponent(url); + return this.storage.getItem(encodedUrl).then(result => { + if (!result) { + return this.requester(url, "binary", withCredentials, headers).then(data => { + return this.storage.setItem(encodedUrl, data); + }); + } + + return result; + }); + } + /** + * Request a url + * @param {string} url a url to request from storage + * @param {string} [type] specify the type of the returned result + * @param {boolean} [withCredentials] + * @param {object} [headers] + * @return {Promise} + */ - this.loading.manifest.resolve(this.packaging.manifest); - this.loading.metadata.resolve(this.packaging.metadata); - this.loading.spine.resolve(this.spine); - this.loading.cover.resolve(this.cover); - this.loading.resources.resolve(this.resources); - this.loading.pageList.resolve(this.pageList); - this.isOpen = true; - if (this.archived || this.settings.replacements && this.settings.replacements != "none") { - this.replacements().then(() => { - this.loaded.displayOptions.then(() => { - this.opening.resolve(this); - }); - }).catch(err => { - console.error(err); + request(url, type, withCredentials, headers) { + if (this.online) { + // From network + return this.requester(url, type, withCredentials, headers).then(data => { + // save to store if not present + this.put(url); + return data; }); } else { - // Resolve book opened promise - this.loaded.displayOptions.then(() => { - this.opening.resolve(this); - }); + // From store + return this.retrieve(url, type); } } /** - * Load Navigation and PageList from package - * @private - * @param {Packaging} packaging + * Request a url from storage + * @param {string} url a url to request from storage + * @param {string} [type] specify the type of the returned result + * @return {Promise} */ - loadNavigation(packaging) { - let navPath = packaging.navPath || packaging.ncxPath; - let toc = packaging.toc; // From json manifest - - if (toc) { - return new Promise((resolve, reject) => { - this.navigation = new navigation(toc); - - if (packaging.pageList) { - this.pageList = new pagelist(packaging.pageList); // TODO: handle page lists from Manifest - } else this.pageList = new pagelist(); // Fix pageList undefined when loading from manifest - + retrieve(url, type) { + var deferred = new core["defer"](); + var response; + var path = new utils_path["a" /* default */](url); // If type isn't set, determine it from the file extension - resolve(this.navigation); - }); + if (!type) { + type = path.extension; } - if (!navPath) { - return new Promise((resolve, reject) => { - this.navigation = new navigation(); - this.pageList = new pagelist(); - resolve(this.navigation); - }); + if (type == "blob") { + response = this.getBlob(url); + } else { + response = this.getText(url); } - return this.load(navPath, "xml").then(xml => { - this.navigation = new navigation(xml); - this.pageList = new pagelist(xml); - return this.navigation; + return response.then(r => { + var deferred = new core["defer"](); + var result; + + if (r) { + result = this.handleResponse(r, type); + deferred.resolve(result); + } else { + deferred.reject({ + message: "File not found in storage: " + url, + stack: new Error().stack + }); + } + + return deferred.promise; }); } /** - * Gets a Section of the Book from the Spine - * Alias for `book.spine.get` - * @param {string} target - * @return {Section} + * Handle the response from request + * @private + * @param {any} response + * @param {string} [type] + * @return {any} the parsed result */ - section(target) { - return this.spine.get(target); - } - /** - * Sugar to render a book to an element - * @param {element | string} element element or string to add a rendition to - * @param {object} [options] - * @return {Rendition} - */ + handleResponse(response, type) { + var r; + if (type == "json") { + r = JSON.parse(response); + } else if (Object(core["isXml"])(type)) { + r = Object(core["parse"])(response, "text/xml"); + } else if (type == "xhtml") { + r = Object(core["parse"])(response, "application/xhtml+xml"); + } else if (type == "html" || type == "htm") { + r = Object(core["parse"])(response, "text/html"); + } else { + r = response; + } - renderTo(element, options) { - this.rendition = new rendition["a" /* default */](this, options); - this.rendition.attachTo(element); - return this.rendition; + return r; } /** - * Set if request should use withCredentials - * @param {boolean} credentials + * Get a Blob from Storage by Url + * @param {string} url + * @param {string} [mimeType] + * @return {Blob} */ - setRequestCredentials(credentials) { - this.settings.requestCredentials = credentials; + getBlob(url, mimeType) { + let encodedUrl = window.encodeURIComponent(url); + return this.storage.getItem(encodedUrl).then(function (uint8array) { + if (!uint8array) return; + mimeType = mimeType || mime.lookup(url); + return new Blob([uint8array], { + type: mimeType + }); + }); } /** - * Set headers request should use - * @param {object} headers + * Get Text from Storage by Url + * @param {string} url + * @param {string} [mimeType] + * @return {string} */ - setRequestHeaders(headers) { - this.settings.requestHeaders = headers; + getText(url, mimeType) { + let encodedUrl = window.encodeURIComponent(url); + mimeType = mimeType || mime.lookup(url); + return this.storage.getItem(encodedUrl).then(function (uint8array) { + var deferred = new core["defer"](); + var reader = new FileReader(); + var blob; + if (!uint8array) return; + blob = new Blob([uint8array], { + type: mimeType + }); + reader.addEventListener("loadend", () => { + deferred.resolve(reader.result); + }); + reader.readAsText(blob, mimeType); + return deferred.promise; + }); } /** - * Unarchive a zipped epub - * @private - * @param {binary} input epub data - * @param {string} [encoding] - * @return {Archive} + * Get a base64 encoded result from Storage by Url + * @param {string} url + * @param {string} [mimeType] + * @return {string} base64 encoded */ - unarchive(input, encoding) { - this.archive = new archive(); - return this.archive.open(input, encoding); + getBase64(url, mimeType) { + let encodedUrl = window.encodeURIComponent(url); + mimeType = mimeType || mime.lookup(url); + return this.storage.getItem(encodedUrl).then(uint8array => { + var deferred = new core["defer"](); + var reader = new FileReader(); + var blob; + if (!uint8array) return; + blob = new Blob([uint8array], { + type: mimeType + }); + reader.addEventListener("loadend", () => { + deferred.resolve(reader.result); + }); + reader.readAsDataURL(blob, mimeType); + return deferred.promise; + }); } /** - * Store the epubs contents - * @private - * @param {binary} input epub data - * @param {string} [encoding] - * @return {Store} + * Create a Url from a stored item + * @param {string} url + * @param {object} [options.base64] use base64 encoding or blob url + * @return {Promise} url promise with Url string */ - store(name) { - // Use "blobUrl" or "base64" for replacements - let replacementsSetting = this.settings.replacements && this.settings.replacements !== "none"; // Save original url - - let originalUrl = this.url; // Save original request method - - let requester = this.settings.requestMethod || utils_request.bind(this); // Create new Store - - this.storage = new src_store(name, requester, this.resolve.bind(this)); // Replace request method to go through store - - this.request = this.storage.request.bind(this.storage); - this.opened.then(() => { - if (this.archived) { - this.storage.requester = this.archive.request.bind(this.archive); - } // Substitute hook + createUrl(url, options) { + var deferred = new core["defer"](); + var _URL = window.URL || window.webkitURL || window.mozURL; - let substituteResources = (output, section) => { - section.output = this.resources.substitute(output, section.url); - }; // Set to use replacements + var tempUrl; + var response; + var useBase64 = options && options.base64; + if (url in this.urlCache) { + deferred.resolve(this.urlCache[url]); + return deferred.promise; + } - this.resources.settings.replacements = replacementsSetting || "blobUrl"; // Create replacement urls + if (useBase64) { + response = this.getBase64(url); - this.resources.replacements().then(() => { - return this.resources.replaceCss(); - }); - this.storage.on("offline", () => { - // Remove url to use relative resolving for hrefs - this.url = new utils_url["a" /* default */]("/", ""); // Add hook to replace resources in contents + if (response) { + response.then(function (tempUrl) { + this.urlCache[url] = tempUrl; + deferred.resolve(tempUrl); + }.bind(this)); + } + } else { + response = this.getBlob(url); - this.spine.hooks.serialize.register(substituteResources); - }); - this.storage.on("online", () => { - // Restore original url - this.url = originalUrl; // Remove hook + if (response) { + response.then(function (blob) { + tempUrl = _URL.createObjectURL(blob); + this.urlCache[url] = tempUrl; + deferred.resolve(tempUrl); + }.bind(this)); + } + } - this.spine.hooks.serialize.deregister(substituteResources); + if (!response) { + deferred.reject({ + message: "File not found in storage: " + url, + stack: new Error().stack }); - }); - return this.storage; + } + + return deferred.promise; } /** - * Get the cover url - * @return {Promise} coverUrl + * Revoke Temp Url for a archive item + * @param {string} url url of the item in the store */ - coverUrl() { - return this.loaded.cover.then(() => { - if (!this.cover) { - return null; - } + revokeUrl(url) { + var _URL = window.URL || window.webkitURL || window.mozURL; - if (this.archived) { - return this.archive.createUrl(this.cover); - } else { - return this.cover; - } - }); + var fromCache = this.urlCache[url]; + if (fromCache) _URL.revokeObjectURL(fromCache); } - /** - * Load replacement urls - * @private - * @return {Promise} completed loading urls - */ + destroy() { + var _URL = window.URL || window.webkitURL || window.mozURL; - replacements() { - this.spine.hooks.serialize.register((output, section) => { - section.output = this.resources.substitute(output, section.url); - }); - return this.resources.replacements().then(() => { - return this.resources.replaceCss(); - }); + for (let fromCache in this.urlCache) { + _URL.revokeObjectURL(fromCache); + } + + this.urlCache = {}; + this.removeListeners(); } - /** - * Find a DOM Range for a given CFI Range - * @param {EpubCFI} cfiRange a epub cfi range - * @return {Promise} - */ +} - getRange(cfiRange) { - var cfi = new epubcfi["a" /* default */](cfiRange); - var item = this.spine.get(cfi.spinePos); +event_emitter_default()(store_Store.prototype); +/* harmony default export */ var src_store = (store_Store); +// CONCATENATED MODULE: ./src/displayoptions.js - var _request = this.load.bind(this); +/** + * Open DisplayOptions Format Parser + * @class + * @param {document} displayOptionsDocument XML + */ - if (!item) { - return new Promise((resolve, reject) => { - reject("CFI could not be found"); - }); - } +class displayoptions_DisplayOptions { + constructor(displayOptionsDocument) { + this.interactive = ""; + this.fixedLayout = ""; + this.openToSpread = ""; + this.orientationLock = ""; - return item.load(_request).then(function (contents) { - var range = cfi.toRange(item.document); - return range; - }); + if (displayOptionsDocument) { + this.parse(displayOptionsDocument); + } } /** - * Generates the Book Key using the identifer in the manifest or other string provided - * @param {string} [identifier] to use instead of metadata identifier - * @return {string} key + * Parse XML + * @param {document} displayOptionsDocument XML + * @return {DisplayOptions} self */ - key(identifier) { - var ident = identifier || this.packaging.metadata.identifier || this.url.filename; - return `epubjs:${constants["b" /* EPUBJS_VERSION */]}:${ident}`; - } - /** - * Destroy the Book and all associated objects - */ + parse(displayOptionsDocument) { + if (!displayOptionsDocument) { + return this; + } + const displayOptionsNode = Object(core["qs"])(displayOptionsDocument, "display_options"); - destroy() { - this.opened = undefined; - this.loading = undefined; - this.loaded = undefined; - this.ready = undefined; - this.isOpen = false; - this.isRendered = false; - this.spine && this.spine.destroy(); - this.locations && this.locations.destroy(); - this.pageList && this.pageList.destroy(); - this.archive && this.archive.destroy(); - this.resources && this.resources.destroy(); - this.container && this.container.destroy(); - this.packaging && this.packaging.destroy(); - this.rendition && this.rendition.destroy(); - this.displayOptions && this.displayOptions.destroy(); - this.spine = undefined; - this.locations = undefined; - this.pageList = undefined; - this.archive = undefined; - this.resources = undefined; - this.container = undefined; - this.packaging = undefined; - this.rendition = undefined; - this.navigation = undefined; - this.url = undefined; - this.path = undefined; - this.archived = false; - } + if (!displayOptionsNode) { + return this; + } -} //-- Enable binding events to book + const options = Object(core["qsa"])(displayOptionsNode, "option"); + options.forEach(el => { + let value = ""; + if (el.childNodes.length) { + value = el.childNodes[0].nodeValue; + } -event_emitter_default()(book_Book.prototype); -/* harmony default export */ var book = __webpack_exports__["a"] = (book_Book); + switch (el.attributes.name.value) { + case "interactive": + this.interactive = value; + break; -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { + case "fixed-layout": + this.fixedLayout = value; + break; -var DESCRIPTORS = __webpack_require__(16); -var propertyIsEnumerableModule = __webpack_require__(60); -var createPropertyDescriptor = __webpack_require__(25); -var toIndexedObject = __webpack_require__(32); -var toPrimitive = __webpack_require__(41); -var has = __webpack_require__(10); -var IE8_DOM_DEFINE = __webpack_require__(62); - -var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPrimitive(P, true); - if (IE8_DOM_DEFINE) try { - return nativeGetOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); -}; + case "open-to-spread": + this.openToSpread = value; + break; + + case "orientation-lock": + this.orientationLock = value; + break; + } + }); + return this; + } + destroy() { + this.interactive = undefined; + this.fixedLayout = undefined; + this.openToSpread = undefined; + this.orientationLock = undefined; + } -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { +} + +/* harmony default export */ var displayoptions = (displayoptions_DisplayOptions); +// CONCATENATED MODULE: ./src/book.js -"use strict"; -var nativePropertyIsEnumerable = {}.propertyIsEnumerable; -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : nativePropertyIsEnumerable; -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { -var fails = __webpack_require__(13); -var classof = __webpack_require__(40); -var split = ''.split; -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split.call(it, '') : Object(it); -} : Object; -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { -var DESCRIPTORS = __webpack_require__(16); -var fails = __webpack_require__(13); -var createElement = __webpack_require__(63); - -// Thank's IE8 for his funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { -var global = __webpack_require__(7); -var isObject = __webpack_require__(17); -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; + +const CONTAINER_PATH = "META-INF/container.xml"; +const IBOOKS_DISPLAY_OPTIONS_PATH = "META-INF/com.apple.ibooks.display-options.xml"; +const INPUT_TYPE = { + BINARY: "binary", + BASE64: "base64", + EPUB: "epub", + OPF: "opf", + MANIFEST: "json", + DIRECTORY: "directory" }; +/** + * An Epub representation with methods for the loading, parsing and manipulation + * of its contents. + * @class + * @param {string} [url] + * @param {object} [options] + * @param {method} [options.requestMethod] a request function to use instead of the default + * @param {boolean} [options.requestCredentials=undefined] send the xhr request withCredentials + * @param {object} [options.requestHeaders=undefined] send the xhr request headers + * @param {string} [options.encoding=binary] optional to pass 'binary' or base64' for archived Epubs + * @param {string} [options.replacements=none] use base64, blobUrl, or none for replacing assets in archived Epubs + * @param {method} [options.canonical] optional function to determine canonical urls for a path + * @param {string} [options.openAs] optional string to determine the input type + * @param {string} [options.store=false] cache the contents in local storage, value should be the name of the reader + * @returns {Book} + * @example new Book("/path/to/book.epub", {}) + * @example new Book({ replacements: "blobUrl" }) + */ +class book_Book { + constructor(url, options) { + // Allow passing just options to the Book + if (typeof options === "undefined" && typeof url !== "string" && url instanceof Blob === false && url instanceof ArrayBuffer === false) { + options = url; + url = undefined; + } -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { + this.settings = Object(core["extend"])(this.settings || {}, { + requestMethod: undefined, + requestCredentials: undefined, + requestHeaders: undefined, + encoding: undefined, + replacements: undefined, + canonical: undefined, + openAs: undefined, + store: undefined + }); + Object(core["extend"])(this.settings, options); // Promises + + this.opening = new core["defer"](); + /** + * @member {promise} opened returns after the book is loaded + * @memberof Book + */ + + this.opened = this.opening.promise; + this.isOpen = false; + this.loading = { + manifest: new core["defer"](), + spine: new core["defer"](), + metadata: new core["defer"](), + cover: new core["defer"](), + navigation: new core["defer"](), + pageList: new core["defer"](), + resources: new core["defer"](), + displayOptions: new core["defer"]() + }; + this.loaded = { + manifest: this.loading.manifest.promise, + spine: this.loading.spine.promise, + metadata: this.loading.metadata.promise, + cover: this.loading.cover.promise, + navigation: this.loading.navigation.promise, + pageList: this.loading.pageList.promise, + resources: this.loading.resources.promise, + displayOptions: this.loading.displayOptions.promise + }; + /** + * @member {promise} ready returns after the book is loaded and parsed + * @memberof Book + * @private + */ -var store = __webpack_require__(65); + this.ready = Promise.all([this.loaded.manifest, this.loaded.spine, this.loaded.metadata, this.loaded.cover, this.loaded.navigation, this.loaded.resources, this.loaded.displayOptions]); // Queue for methods used before opening -var functionToString = Function.toString; + this.isRendered = false; // this._q = queue(this); -// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper -if (typeof store.inspectSource != 'function') { - store.inspectSource = function (it) { - return functionToString.call(it); - }; -} + /** + * @member {method} request + * @memberof Book + * @private + */ -module.exports = store.inspectSource; + this.request = this.settings.requestMethod || utils_request; + /** + * @member {Spine} spine + * @memberof Book + */ + this.spine = new src_spine(); + /** + * @member {Locations} locations + * @memberof Book + */ -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { + this.locations = new src_locations(this.spine, this.load.bind(this)); + /** + * @member {Navigation} navigation + * @memberof Book + */ -var global = __webpack_require__(7); -var setGlobal = __webpack_require__(42); + this.navigation = undefined; + /** + * @member {PageList} pagelist + * @memberof Book + */ -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || setGlobal(SHARED, {}); + this.pageList = undefined; + /** + * @member {Url} url + * @memberof Book + * @private + */ -module.exports = store; + this.url = undefined; + /** + * @member {Path} path + * @memberof Book + * @private + */ + this.path = undefined; + /** + * @member {boolean} archived + * @memberof Book + * @private + */ -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { + this.archived = false; + /** + * @member {Archive} archive + * @memberof Book + * @private + */ -var IS_PURE = __webpack_require__(34); -var store = __webpack_require__(65); + this.archive = undefined; + /** + * @member {Store} storage + * @memberof Book + * @private + */ -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.6.5', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2020 Denis Pushkarev (zloirock.ru)' -}); + this.storage = undefined; + /** + * @member {Resources} resources + * @memberof Book + * @private + */ + this.resources = undefined; + /** + * @member {Rendition} rendition + * @memberof Book + * @private + */ -/***/ }), -/* 67 */ -/***/ (function(module, exports) { + this.rendition = undefined; + /** + * @member {Container} container + * @memberof Book + * @private + */ -var id = 0; -var postfix = Math.random(); + this.container = undefined; + /** + * @member {Packaging} packaging + * @memberof Book + * @private + */ -module.exports = function (key) { - return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); -}; + this.packaging = undefined; + /** + * @member {DisplayOptions} displayOptions + * @memberof DisplayOptions + * @private + */ + this.displayOptions = undefined; // this.toc = undefined; -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.settings.store) { + this.store(this.settings.store); + } -var has = __webpack_require__(10); -var toIndexedObject = __webpack_require__(32); -var indexOf = __webpack_require__(94).indexOf; -var hiddenKeys = __webpack_require__(44); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~indexOf(result, key) || result.push(key); + if (url) { + this.open(url, this.settings.openAs).catch(error => { + var err = new Error("Cannot load book at " + url); + this.emit(constants["c" /* EVENTS */].BOOK.OPEN_FAILED, err); + }); + } } - return result; -}; - + /** + * Open a epub or url + * @param {string | ArrayBuffer} input Url, Path or ArrayBuffer + * @param {string} [what="binary", "base64", "epub", "opf", "json", "directory"] force opening as a certain type + * @returns {Promise} of when the book has been loaded + * @example book.open("/path/to/book.epub") + */ -/***/ }), -/* 69 */ -/***/ (function(module, exports) { -exports.f = Object.getOwnPropertySymbols; + open(input, what) { + var opening; + var type = what || this.determineType(input); + if (type === INPUT_TYPE.BINARY) { + this.archived = true; + this.url = new utils_url["a" /* default */]("/", ""); + opening = this.openEpub(input); + } else if (type === INPUT_TYPE.BASE64) { + this.archived = true; + this.url = new utils_url["a" /* default */]("/", ""); + opening = this.openEpub(input, type); + } else if (type === INPUT_TYPE.EPUB) { + this.archived = true; + this.url = new utils_url["a" /* default */]("/", ""); + opening = this.request(input, "binary", this.settings.requestCredentials, this.settings.requestHeaders).then(this.openEpub.bind(this)); + } else if (type == INPUT_TYPE.OPF) { + this.url = new utils_url["a" /* default */](input); + opening = this.openPackaging(this.url.Path.toString()); + } else if (type == INPUT_TYPE.MANIFEST) { + this.url = new utils_url["a" /* default */](input); + opening = this.openManifest(this.url.Path.toString()); + } else { + this.url = new utils_url["a" /* default */](input); + opening = this.openContainer(CONTAINER_PATH).then(this.openPackaging.bind(this)); + } -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { + return opening; + } + /** + * Open an archived epub + * @private + * @param {binary} data + * @param {string} [encoding] + * @return {Promise} + */ -var fails = __webpack_require__(13); -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - // Chrome 38 Symbol has incorrect toString conversion - // eslint-disable-next-line no-undef - return !String(Symbol()); -}); + openEpub(data, encoding) { + return this.unarchive(data, encoding || this.settings.encoding).then(() => { + return this.openContainer(CONTAINER_PATH); + }).then(packagePath => { + return this.openPackaging(packagePath); + }); + } + /** + * Open the epub container + * @private + * @param {string} url + * @return {string} packagePath + */ -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { + openContainer(url) { + return this.load(url).then(xml => { + this.container = new container(xml); + return this.resolve(this.container.packagePath); + }); + } + /** + * Open the Open Packaging Format Xml + * @private + * @param {string} url + * @return {Promise} + */ -"use strict"; -var toIndexedObject = __webpack_require__(32); -var addToUnscopables = __webpack_require__(103); -var Iterators = __webpack_require__(27); -var InternalStateModule = __webpack_require__(26); -var defineIterator = __webpack_require__(74); - -var ARRAY_ITERATOR = 'Array Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); - -// `Array.prototype.entries` method -// https://tc39.github.io/ecma262/#sec-array.prototype.entries -// `Array.prototype.keys` method -// https://tc39.github.io/ecma262/#sec-array.prototype.keys -// `Array.prototype.values` method -// https://tc39.github.io/ecma262/#sec-array.prototype.values -// `Array.prototype[@@iterator]` method -// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator -// `CreateArrayIterator` internal method -// https://tc39.github.io/ecma262/#sec-createarrayiterator -module.exports = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); -// `%ArrayIteratorPrototype%.next` method -// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next -}, function () { - var state = getInternalState(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% -// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject -// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject -Iterators.Arguments = Iterators.Array; - -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); + openPackaging(url) { + this.path = new utils_path["a" /* default */](url); + return this.load(url).then(xml => { + this.packaging = new src_packaging(xml); + return this.unpack(this.packaging); + }); + } + /** + * Open the manifest JSON + * @private + * @param {string} url + * @return {Promise} + */ -/***/ }), -/* 72 */ -/***/ (function(module, exports, __webpack_require__) { + openManifest(url) { + this.path = new utils_path["a" /* default */](url); + return this.load(url).then(json => { + this.packaging = new src_packaging(); + this.packaging.load(json); + return this.unpack(this.packaging); + }); + } + /** + * Load manifest JSON object + * @param {Object} json + * @return {Promise} + */ -var DESCRIPTORS = __webpack_require__(16); -var definePropertyModule = __webpack_require__(18); -var anObject = __webpack_require__(14); -var objectKeys = __webpack_require__(73); - -// `Object.defineProperties` method -// https://tc39.github.io/ecma262/#sec-object.defineproperties -module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]); - return O; -}; + openJSON(json) { + this.packaging = new src_packaging(); + this.packaging.load(json); + return this.unpack(this.packaging); + } + /** + * Load a resource from the Book + * @param {string} path path to the resource to load + * @return {Promise} returns a promise with the requested resource + */ -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { -var internalObjectKeys = __webpack_require__(68); -var enumBugKeys = __webpack_require__(47); + load(path) { + var resolved = this.resolve(path); -// `Object.keys` method -// https://tc39.github.io/ecma262/#sec-object.keys -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; + if (this.archived) { + return this.archive.request(resolved); + } else { + return this.request(resolved, null, this.settings.requestCredentials, this.settings.requestHeaders); + } + } + /** + * Resolve a path to it's absolute position in the Book + * @param {string} path + * @param {boolean} [absolute] force resolving the full URL + * @return {string} the resolved path string + */ -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { + resolve(path, absolute) { + if (!path) { + return; + } -"use strict"; + var resolved = path; + var isAbsolute = path.indexOf("://") > -1; -var $ = __webpack_require__(31); -var createIteratorConstructor = __webpack_require__(75); -var getPrototypeOf = __webpack_require__(77); -var setPrototypeOf = __webpack_require__(106); -var setToStringTag = __webpack_require__(37); -var createNonEnumerableProperty = __webpack_require__(15); -var redefine = __webpack_require__(19); -var wellKnownSymbol = __webpack_require__(8); -var IS_PURE = __webpack_require__(34); -var Iterators = __webpack_require__(27); -var IteratorsCore = __webpack_require__(76); - -var IteratorPrototype = IteratorsCore.IteratorPrototype; -var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; -var ITERATOR = wellKnownSymbol('iterator'); -var KEYS = 'keys'; -var VALUES = 'values'; -var ENTRIES = 'entries'; - -var returnThis = function () { return this; }; - -module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; + if (isAbsolute) { + return path; + } - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; + if (this.path) { + resolved = this.path.resolve(path); + } - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); - if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { - if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { - if (setPrototypeOf) { - setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); - } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { - createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); - if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + if (absolute != false && this.url) { + resolved = this.url.resolve(resolved); } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return nativeIterator.call(this); }; + return resolved; } + /** + * Get a canonical link to a path + * @param {string} path + * @return {string} the canonical path string + */ - // define iterator - if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { - createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator); - } - Iterators[NAME] = defaultIterator; - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); - } + canonical(path) { + var url = path; - return methods; -}; + if (!path) { + return ""; + } + if (this.settings.canonical) { + url = this.settings.canonical(path); + } else { + url = this.resolve(path, true); + } -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { + return url; + } + /** + * Determine the type of they input passed to open + * @private + * @param {string} input + * @return {string} binary | directory | epub | opf + */ -"use strict"; -var IteratorPrototype = __webpack_require__(76).IteratorPrototype; -var create = __webpack_require__(50); -var createPropertyDescriptor = __webpack_require__(25); -var setToStringTag = __webpack_require__(37); -var Iterators = __webpack_require__(27); - -var returnThis = function () { return this; }; - -module.exports = function (IteratorConstructor, NAME, next) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); - Iterators[TO_STRING_TAG] = returnThis; - return IteratorConstructor; -}; + determineType(input) { + var url; + var path; + var extension; + if (this.settings.encoding === "base64") { + return INPUT_TYPE.BASE64; + } -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof input != "string") { + return INPUT_TYPE.BINARY; + } -"use strict"; + url = new utils_url["a" /* default */](input); + path = url.path(); + extension = path.extension; // If there's a search string, remove it before determining type -var getPrototypeOf = __webpack_require__(77); -var createNonEnumerableProperty = __webpack_require__(15); -var has = __webpack_require__(10); -var wellKnownSymbol = __webpack_require__(8); -var IS_PURE = __webpack_require__(34); + if (extension) { + extension = extension.replace(/\?.*$/, ""); + } -var ITERATOR = wellKnownSymbol('iterator'); -var BUGGY_SAFARI_ITERATORS = false; + if (!extension) { + return INPUT_TYPE.DIRECTORY; + } -var returnThis = function () { return this; }; + if (extension === "epub") { + return INPUT_TYPE.EPUB; + } -// `%IteratorPrototype%` object -// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object -var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + if (extension === "opf") { + return INPUT_TYPE.OPF; + } -if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + if (extension === "json") { + return INPUT_TYPE.MANIFEST; + } } -} + /** + * unpack the contents of the Books packaging + * @private + * @param {Packaging} packaging object + */ -if (IteratorPrototype == undefined) IteratorPrototype = {}; -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) { - createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis); -} + unpack(packaging) { + this.package = packaging; //TODO: deprecated this -module.exports = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS -}; + if (this.packaging.metadata.layout === "") { + // rendition:layout not set - check display options if book is pre-paginated + this.load(this.url.resolve(IBOOKS_DISPLAY_OPTIONS_PATH)).then(xml => { + this.displayOptions = new displayoptions(xml); + this.loading.displayOptions.resolve(this.displayOptions); + }).catch(err => { + this.displayOptions = new displayoptions(); + this.loading.displayOptions.resolve(this.displayOptions); + }); + } else { + this.displayOptions = new displayoptions(); + this.loading.displayOptions.resolve(this.displayOptions); + } + this.spine.unpack(this.packaging, this.resolve.bind(this), this.canonical.bind(this)); + this.resources = new resources(this.packaging.manifest, { + archive: this.archive, + resolver: this.resolve.bind(this), + request: this.request.bind(this), + replacements: this.settings.replacements || (this.archived ? "blobUrl" : "base64") + }); + this.loadNavigation(this.packaging).then(() => { + // this.toc = this.navigation.toc; + this.loading.navigation.resolve(this.navigation); + }); -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.packaging.coverPath) { + this.cover = this.resolve(this.packaging.coverPath); + } // Resolve promises -var has = __webpack_require__(10); -var toObject = __webpack_require__(36); -var sharedKey = __webpack_require__(43); -var CORRECT_PROTOTYPE_GETTER = __webpack_require__(105); - -var IE_PROTO = sharedKey('IE_PROTO'); -var ObjectPrototype = Object.prototype; - -// `Object.getPrototypeOf` method -// https://tc39.github.io/ecma262/#sec-object.getprototypeof -module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { - O = toObject(O); - if (has(O, IE_PROTO)) return O[IE_PROTO]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectPrototype : null; -}; + this.loading.manifest.resolve(this.packaging.manifest); + this.loading.metadata.resolve(this.packaging.metadata); + this.loading.spine.resolve(this.spine); + this.loading.cover.resolve(this.cover); + this.loading.resources.resolve(this.resources); + this.loading.pageList.resolve(this.pageList); + this.isOpen = true; -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.archived || this.settings.replacements && this.settings.replacements != "none") { + this.replacements().then(() => { + this.loaded.displayOptions.then(() => { + this.opening.resolve(this); + }); + }).catch(err => { + console.error(err); + }); + } else { + // Resolve book opened promise + this.loaded.displayOptions.then(() => { + this.opening.resolve(this); + }); + } + } + /** + * Load Navigation and PageList from package + * @private + * @param {Packaging} packaging + */ -var fails = __webpack_require__(13); -var wellKnownSymbol = __webpack_require__(8); -var IS_PURE = __webpack_require__(34); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = !fails(function () { - var url = new URL('b?a=1&b=2&c=3', 'http://a'); - var searchParams = url.searchParams; - var result = ''; - url.pathname = 'c%20d'; - searchParams.forEach(function (value, key) { - searchParams['delete']('b'); - result += key + value; - }); - return (IS_PURE && !url.toJSON) - || !searchParams.sort - || url.href !== 'http://a/c%20d?a=1&c=3' - || searchParams.get('c') !== '3' - || String(new URLSearchParams('?a=1')) !== 'a=1' - || !searchParams[ITERATOR] - // throws in Edge - || new URL('https://a@b').username !== 'a' - || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' - // not punycoded in Edge - || new URL('http://тест').host !== 'xn--e1aybc' - // not escaped in Chrome 62- - || new URL('http://a#б').hash !== '#%D0%B1' - // fails in Chrome 66- - || result !== 'a1c3' - // throws in Safari - || new URL('http://x', undefined).host !== 'x'; -}); + loadNavigation(packaging) { + let navPath = packaging.navPath || packaging.ncxPath; + let toc = packaging.toc; // From json manifest -/***/ }), -/* 79 */ -/***/ (function(module, exports) { + if (toc) { + return new Promise((resolve, reject) => { + this.navigation = new navigation(toc); -module.exports = function (it, Constructor, name) { - if (!(it instanceof Constructor)) { - throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); - } return it; -}; + if (packaging.pageList) { + this.pageList = new pagelist(packaging.pageList); // TODO: handle page lists from Manifest + } else this.pageList = new pagelist(); // Fix pageList undefined when loading from manifest -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { + resolve(this.navigation); + }); + } -var aFunction = __webpack_require__(126); + if (!navPath) { + return new Promise((resolve, reject) => { + this.navigation = new navigation(); + this.pageList = new pagelist(); + resolve(this.navigation); + }); + } -// optional / simple context binding -module.exports = function (fn, that, length) { - aFunction(fn); - if (that === undefined) return fn; - switch (length) { - case 0: return function () { - return fn.call(that); - }; - case 1: return function (a) { - return fn.call(that, a); - }; - case 2: return function (a, b) { - return fn.call(that, a, b); - }; - case 3: return function (a, b, c) { - return fn.call(that, a, b, c); - }; + return this.load(navPath, "xml").then(xml => { + this.navigation = new navigation(xml); + this.pageList = new pagelist(xml); + return this.navigation; + }); } - return function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - + /** + * Gets a Section of the Book from the Spine + * Alias for `book.spine.get` + * @param {string} target + * @return {Section} + */ -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { -var TO_STRING_TAG_SUPPORT = __webpack_require__(130); -var classofRaw = __webpack_require__(40); -var wellKnownSymbol = __webpack_require__(8); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + section(target) { + return this.spine.get(target); + } + /** + * Sugar to render a book to an element + * @param {element | string} element element or string to add a rendition to + * @param {object} [options] + * @return {Rendition} + */ -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; -// getting tag from ES6+ `Object.prototype.toString` -module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; -}; + renderTo(element, options) { + this.rendition = new rendition["a" /* default */](this, options); + this.rendition.attachTo(element); + return this.rendition; + } + /** + * Set if request should use withCredentials + * @param {boolean} credentials + */ -/***/ }), -/* 82 */ -/***/ (function(module, exports, __webpack_require__) { + setRequestCredentials(credentials) { + this.settings.requestCredentials = credentials; + } + /** + * Set headers request should use + * @param {object} headers + */ -var freeGlobal = __webpack_require__(138); -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + setRequestHeaders(headers) { + this.settings.requestHeaders = headers; + } + /** + * Unarchive a zipped epub + * @private + * @param {binary} input epub data + * @param {string} [encoding] + * @return {Archive} + */ -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); -module.exports = root; + unarchive(input, encoding) { + this.archive = new archive(); + return this.archive.open(input, encoding); + } + /** + * Store the epubs contents + * @private + * @param {binary} input epub data + * @param {string} [encoding] + * @return {Store} + */ -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { + store(name) { + // Use "blobUrl" or "base64" for replacements + let replacementsSetting = this.settings.replacements && this.settings.replacements !== "none"; // Save original url -var root = __webpack_require__(82); + let originalUrl = this.url; // Save original request method -/** Built-in value references. */ -var Symbol = root.Symbol; + let requester = this.settings.requestMethod || utils_request.bind(this); // Create new Store -module.exports = Symbol; + this.storage = new src_store(name, requester, this.resolve.bind(this)); // Replace request method to go through store + this.request = this.storage.request.bind(this.storage); + this.opened.then(() => { + if (this.archived) { + this.storage.requester = this.archive.request.bind(this.archive); + } // Substitute hook -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { -var debounce = __webpack_require__(55), - isObject = __webpack_require__(53); + let substituteResources = (output, section) => { + section.output = this.resources.substitute(output, section.url); + }; // Set to use replacements -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; -/** - * Creates a throttled function that only invokes `func` at most once per - * every `wait` milliseconds. The throttled function comes with a `cancel` - * method to cancel delayed `func` invocations and a `flush` method to - * immediately invoke them. Provide `options` to indicate whether `func` - * should be invoked on the leading and/or trailing edge of the `wait` - * timeout. The `func` is invoked with the last arguments provided to the - * throttled function. Subsequent calls to the throttled function return the - * result of the last `func` invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the throttled function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.throttle` and `_.debounce`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to throttle. - * @param {number} [wait=0] The number of milliseconds to throttle invocations to. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=true] - * Specify invoking on the leading edge of the timeout. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new throttled function. - * @example - * - * // Avoid excessively updating the position while scrolling. - * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); - * - * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. - * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); - * jQuery(element).on('click', throttled); - * - * // Cancel the trailing throttled invocation. - * jQuery(window).on('popstate', throttled.cancel); - */ -function throttle(func, wait, options) { - var leading = true, - trailing = true; + this.resources.settings.replacements = replacementsSetting || "blobUrl"; // Create replacement urls - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - if (isObject(options)) { - leading = 'leading' in options ? !!options.leading : leading; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - return debounce(func, wait, { - 'leading': leading, - 'maxWait': wait, - 'trailing': trailing - }); -} + this.resources.replacements().then(() => { + return this.resources.replaceCss(); + }); + this.storage.on("offline", () => { + // Remove url to use relative resolving for hrefs + this.url = new utils_url["a" /* default */]("/", ""); // Add hook to replace resources in contents -module.exports = throttle; + this.spine.hooks.serialize.register(substituteResources); + }); + this.storage.on("online", () => { + // Restore original url + this.url = originalUrl; // Remove hook + this.spine.hooks.serialize.deregister(substituteResources); + }); + }); + return this.storage; + } + /** + * Get the cover url + * @return {Promise} coverUrl + */ -/***/ }), -/* 85 */ -/***/ (function(module, exports) { -module.exports = __WEBPACK_EXTERNAL_MODULE__85__; + coverUrl() { + return this.loaded.cover.then(() => { + if (!this.cover) { + return null; + } -/***/ }), -/* 86 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (this.archived) { + return this.archive.createUrl(this.cover); + } else { + return this.cover; + } + }); + } + /** + * Load replacement urls + * @private + * @return {Promise} completed loading urls + */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _book__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(58); -/* harmony import */ var _rendition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39); -/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2); -/* harmony import */ var _contents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28); -/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(0); -/* harmony import */ var _utils_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1); -/* harmony import */ var _managers_views_iframe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(54); -/* harmony import */ var _managers_default__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(22); -/* harmony import */ var _managers_continuous__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(56); + replacements() { + this.spine.hooks.serialize.register((output, section) => { + section.output = this.resources.substitute(output, section.url); + }); + return this.resources.replacements().then(() => { + return this.resources.replaceCss(); + }); + } + /** + * Find a DOM Range for a given CFI Range + * @param {EpubCFI} cfiRange a epub cfi range + * @return {Promise} + */ + getRange(cfiRange) { + var cfi = new epubcfi["a" /* default */](cfiRange); + var item = this.spine.get(cfi.spinePos); + var _request = this.load.bind(this); + if (!item) { + return new Promise((resolve, reject) => { + reject("CFI could not be found"); + }); + } + return item.load(_request).then(function (contents) { + var range = cfi.toRange(item.document); + return range; + }); + } + /** + * Generates the Book Key using the identifier in the manifest or other string provided + * @param {string} [identifier] to use instead of metadata identifier + * @return {string} key + */ + key(identifier) { + var ident = identifier || this.packaging.metadata.identifier || this.url.filename; + return `epubjs:${constants["b" /* EPUBJS_VERSION */]}:${ident}`; + } + /** + * Destroy the Book and all associated objects + */ -/** - * Creates a new Book - * @param {string|ArrayBuffer} url URL, Path or ArrayBuffer - * @param {object} options to pass to the book - * @returns {Book} a new Book object - * @example ePub("/path/to/book.epub", {}) - */ -function ePub(url, options) { - return new _book__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](url, options); -} + destroy() { + this.opened = undefined; + this.loading = undefined; + this.loaded = undefined; + this.ready = undefined; + this.isOpen = false; + this.isRendered = false; + this.spine && this.spine.destroy(); + this.locations && this.locations.destroy(); + this.pageList && this.pageList.destroy(); + this.archive && this.archive.destroy(); + this.resources && this.resources.destroy(); + this.container && this.container.destroy(); + this.packaging && this.packaging.destroy(); + this.rendition && this.rendition.destroy(); + this.displayOptions && this.displayOptions.destroy(); + this.spine = undefined; + this.locations = undefined; + this.pageList = undefined; + this.archive = undefined; + this.resources = undefined; + this.container = undefined; + this.packaging = undefined; + this.rendition = undefined; + this.navigation = undefined; + this.url = undefined; + this.path = undefined; + this.archived = false; + } -ePub.VERSION = _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EPUBJS_VERSION */ "b"]; +} //-- Enable binding events to book -if (typeof global !== "undefined") { - global.EPUBJS_VERSION = _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EPUBJS_VERSION */ "b"]; -} -ePub.Book = _book__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]; -ePub.Rendition = _rendition__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]; -ePub.Contents = _contents__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"]; -ePub.CFI = _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"]; -ePub.utils = _utils_core__WEBPACK_IMPORTED_MODULE_4__; -/* harmony default export */ __webpack_exports__["default"] = (ePub); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30))) +event_emitter_default()(book_Book.prototype); +/* harmony default export */ var book = __webpack_exports__["a"] = (book_Book); /***/ }), -/* 87 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -// TODO: Remove from `core-js@4` since it's moved to entry points -__webpack_require__(88); -var redefine = __webpack_require__(19); -var fails = __webpack_require__(13); -var wellKnownSymbol = __webpack_require__(8); -var regexpExec = __webpack_require__(48); -var createNonEnumerableProperty = __webpack_require__(15); - -var SPECIES = wellKnownSymbol('species'); - -var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { - // #replace needs built-in support for named groups. - // #match works fine because it just return the exec results, even if it has - // a "grops" property. - var re = /./; - re.exec = function () { - var result = []; - result.groups = { a: '7' }; - return result; - }; - return ''.replace(re, '$') !== '7'; -}); - -// IE <= 11 replaces $0 with the whole match, as if it was $& -// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0 -var REPLACE_KEEPS_$0 = (function () { - return 'a'.replace(/./, '$0') === '$0'; -})(); - -var REPLACE = wellKnownSymbol('replace'); -// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string -var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () { - if (/./[REPLACE]) { - return /./[REPLACE]('a', '$0') === ''; - } - return false; -})(); +var conventions = __webpack_require__(14); -// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec -// Weex JS has frozen built-in prototypes, so use try / catch wrapper -var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () { - var re = /(?:)/; - var originalExec = re.exec; - re.exec = function () { return originalExec.apply(this, arguments); }; - var result = 'ab'.split(re); - return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; -}); - -module.exports = function (KEY, length, exec, sham) { - var SYMBOL = wellKnownSymbol(KEY); +var NAMESPACE = conventions.NAMESPACE; - var DELEGATES_TO_SYMBOL = !fails(function () { - // String methods call symbol-named RegEp methods - var O = {}; - O[SYMBOL] = function () { return 7; }; - return ''[KEY](O) != 7; - }); +/** + * A prerequisite for `[].filter`, to drop elements that are empty + * @param {string} input + * @returns {boolean} + */ +function notEmptyString (input) { + return input !== '' +} +/** + * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * + * @param {string} input + * @returns {string[]} (can be empty) + */ +function splitOnASCIIWhitespace(input) { + // U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE + return input ? input.split(/[\t\n\f\r ]+/).filter(notEmptyString) : [] +} - var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () { - // Symbol-named RegExp methods call .exec - var execCalled = false; - var re = /a/; - - if (KEY === 'split') { - // We can't use real regex here since it causes deoptimization - // and serious performance degradation in V8 - // https://github.com/zloirock/core-js/issues/306 - re = {}; - // RegExp[@@split] doesn't call the regex's exec method, but first creates - // a new one. We need to return the patched regex when creating the new one. - re.constructor = {}; - re.constructor[SPECIES] = function () { return re; }; - re.flags = ''; - re[SYMBOL] = /./[SYMBOL]; - } +/** + * Adds element as a key to current if it is not already present. + * + * @param {Record} current + * @param {string} element + * @returns {Record} + */ +function orderedSetReducer (current, element) { + if (!current.hasOwnProperty(element)) { + current[element] = true; + } + return current; +} - re.exec = function () { execCalled = true; return null; }; +/** + * @see https://infra.spec.whatwg.org/#ordered-set + * @param {string} input + * @returns {string[]} + */ +function toOrderedSet(input) { + if (!input) return []; + var list = splitOnASCIIWhitespace(input); + return Object.keys(list.reduce(orderedSetReducer, {})) +} - re[SYMBOL](''); - return !execCalled; - }); +/** + * Uses `list.indexOf` to implement something like `Array.prototype.includes`, + * which we can not rely on being available. + * + * @param {any[]} list + * @returns {function(any): boolean} + */ +function arrayIncludes (list) { + return function(element) { + return list && list.indexOf(element) !== -1; + } +} - if ( - !DELEGATES_TO_SYMBOL || - !DELEGATES_TO_EXEC || - (KEY === 'replace' && !( - REPLACE_SUPPORTS_NAMED_GROUPS && - REPLACE_KEEPS_$0 && - !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE - )) || - (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) - ) { - var nativeRegExpMethod = /./[SYMBOL]; - var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { - if (regexp.exec === regexpExec) { - if (DELEGATES_TO_SYMBOL && !forceStringMethod) { - // The native String method already delegates to @@method (this - // polyfilled function), leasing to infinite recursion. - // We avoid it by directly calling the native @@method method. - return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; - } - return { done: true, value: nativeMethod.call(str, regexp, arg2) }; - } - return { done: false }; - }, { - REPLACE_KEEPS_$0: REPLACE_KEEPS_$0, - REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE - }); - var stringMethod = methods[0]; - var regexMethod = methods[1]; +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} - redefine(String.prototype, KEY, stringMethod); - redefine(RegExp.prototype, SYMBOL, length == 2 - // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) - // 21.2.5.11 RegExp.prototype[@@split](string, limit) - ? function (string, arg) { return regexMethod.call(string, this, arg); } - // 21.2.5.6 RegExp.prototype[@@match](string) - // 21.2.5.9 RegExp.prototype[@@search](string) - : function (string) { return regexMethod.call(string, this); } - ); - } +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknown Class:"+Class) + } + pt.constructor = Class + } +} - if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true); +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + +/** + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + */ +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + }, + toString:function(isHTML,nodeFilter){ + for(var buf = [], i = 0;i=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + //console.log() + var i = this.length; + while(i--){ + var attr = this[i]; + //console.log(attr.nodeName,key) + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * The DOMImplementation interface represents an object providing methods + * which are not dependent on any particular document. + * Such an object is returned by the `Document.implementation` property. + * + * __The individual methods describe the differences compared to the specs.__ + * + * @constructor + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN + * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial) + * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core + * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core + * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard + */ +function DOMImplementation() { +} + +DOMImplementation.prototype = { + /** + * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported. + * The different implementations fairly diverged in what kind of features were reported. + * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use. + * + * @deprecated It is deprecated and modern browsers return true in all cases. + * + * @param {string} feature + * @param {string} [version] + * @returns {boolean} always true + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN + * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core + * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard + */ + hasFeature: function(feature, version) { + return true; + }, + /** + * Creates an XML Document object of the specified type with its document element. + * + * __It behaves slightly different from the description in the living standard__: + * - There is no interface/class `XMLDocument`, it returns a `Document` instance. + * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared. + * - this implementation is not validating names or qualified names + * (when parsing XML strings, the SAX parser takes care of that) + * + * @param {string|null} namespaceURI + * @param {string} qualifiedName + * @param {DocumentType=null} doctype + * @returns {Document} + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN + * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial) + * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core + * + * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract + * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names + * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names + */ + createDocument: function(namespaceURI, qualifiedName, doctype){ + var doc = new Document(); + doc.implementation = this; + doc.childNodes = new NodeList(); + doc.doctype = doctype || null; + if (doctype){ + doc.appendChild(doctype); + } + if (qualifiedName){ + var root = doc.createElementNS(namespaceURI, qualifiedName); + doc.appendChild(root); + } + return doc; + }, + /** + * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`. + * + * __This behavior is slightly different from the in the specs__: + * - this implementation is not validating names or qualified names + * (when parsing XML strings, the SAX parser takes care of that) + * + * @param {string} qualifiedName + * @param {string} [publicId] + * @param {string} [systemId] + * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation + * or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()` + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN + * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core + * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard + * + * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract + * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names + * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names + */ + createDocumentType: function(qualifiedName, publicId, systemId){ + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId || ''; + node.systemId = systemId || ''; -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { + return node; + } +}; -var global = __webpack_require__(7); -var inspectSource = __webpack_require__(64); -var WeakMap = global.WeakMap; +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ -module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap)); +function Node() { +}; +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + /** + * Look up the prefix associated to the given namespace URI, starting from this node. + * **The default namespace declarations are ignored by this method.** + * See Namespace Prefix Lookup for details on the algorithm used by this method. + * + * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._ + * + * @param {string | null} namespaceURI + * @returns {string | null} + * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix + * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo + * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix + * @see https://github.com/xmldom/xmldom/issues/322 + */ + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { -var has = __webpack_require__(10); -var ownKeys = __webpack_require__(91); -var getOwnPropertyDescriptorModule = __webpack_require__(59); -var definePropertyModule = __webpack_require__(18); - -module.exports = function (target, source) { - var keys = ownKeys(source); - var defineProperty = definePropertyModule.f; - var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } -}; +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { +copy(NodeType,Node); +copy(NodeType,Node.prototype); -var getBuiltIn = __webpack_require__(45); -var getOwnPropertyNamesModule = __webpack_require__(93); -var getOwnPropertySymbolsModule = __webpack_require__(69); -var anObject = __webpack_require__(14); - -// all object keys, includes non-enumerable and symbols -module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = getOwnPropertyNamesModule.f(anObject(it)); - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; -}; +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { -var global = __webpack_require__(7); +function Document(){ +} -module.exports = global; +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns === NAMESPACE.XMLNS){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns === NAMESPACE.XMLNS){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} -var internalObjectKeys = __webpack_require__(68); -var enumBugKeys = __webpack_require__(47); +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + /** + * The DocumentType node of the document. + * + * @readonly + * @type DocumentType + */ + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){ + this.documentElement = newChild; + } -// `Object.getOwnPropertyNames` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertynames -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == ELEMENT_NODE){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + /** + * The `getElementsByClassName` method of `Document` interface returns an array-like object + * of all child elements which have **all** of the given class name(s). + * + * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters. + * + * + * Warning: This is a live LiveNodeList. + * Changes in the DOM will reflect in the array as the changes occur. + * If an element selected by this array no longer qualifies for the selector, + * it will automatically be removed. Be aware of this for iteration purposes. + * + * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName + * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname + */ + getElementsByClassName: function(classNames) { + var classNamesSet = toOrderedSet(classNames) + return new LiveNodeList(this, function(base) { + var ls = []; + if (classNamesSet.length > 0) { + _visitNode(base.documentElement, function(node) { + if(node !== base && node.nodeType === ELEMENT_NODE) { + var nodeClassNames = node.getAttribute('class') + // can be null if the attribute does not exist + if (nodeClassNames) { + // before splitting and iterating just compare them for the most common case + var matches = classNames === nodeClassNames; + if (!matches) { + var nodeClassNamesSet = toOrderedSet(nodeClassNames) + matches = classNamesSet.every(arrayIncludes(nodeClassNamesSet)) + } + if(matches) { + ls.push(node); + } + } + } + }); + } + return ls; + }); + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.localName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } }; +_extends(Document,Node); -/***/ }), -/* 94 */ -/***/ (function(module, exports, __webpack_require__) { - -var toIndexedObject = __webpack_require__(32); -var toLength = __webpack_require__(46); -var toAbsoluteIndex = __webpack_require__(95); - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; +function Element() { + this._nsMap = {}; }; - -module.exports = { - // `Array.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.github.io/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + //console.log(this == oldAttr.ownerElement) + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + + }); + } }; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; -/***/ }), -/* 95 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(35); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). -module.exports = function (index, length) { - var integer = toInteger(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { }; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { -var fails = __webpack_require__(13); +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); -var replacement = /#|\.prototype\./; +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : typeof detection == 'function' ? fails(detection) - : !!detection; +function Entity() { }; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); +function EntityReference() { }; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); -module.exports = isForced; +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){ + return nodeSerializeToString.call(node,isHtml,nodeFilter); +} +Node.prototype.toString = nodeSerializeToString; +function nodeSerializeToString(isHtml,nodeFilter){ + var buf = []; + var refNode = this.nodeType == 9 && this.documentElement || this; + var prefix = refNode.prefix; + var uri = refNode.namespaceURI; + + if(uri && prefix == null){ + //console.log(prefix) + var prefix = refNode.lookupPrefix(uri); + if(prefix == null){ + //isHTML = true; + var visibleNamespaces=[ + {namespace:uri,prefix:null} + //{namespace:uri,prefix:''} + ] + } + } + serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces); + //console.log('###',this.nodeType,uri,prefix,buf.join('')) + return buf.join(''); +} + +function needNamespaceDefine(node, isHTML, visibleNamespaces) { + var prefix = node.prefix || ''; + var uri = node.namespaceURI; + // According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) , + // and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl : + // > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty. + // in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using) + // and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared : + // > [...] Furthermore, the attribute value [...] must not be an empty string. + // so serializing empty namespace value like xmlns:ds="" would produce an invalid XML document. + if (!uri) { + return false; + } + if (prefix === "xml" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) { + return false; + } + + var i = visibleNamespaces.length + while (i--) { + var ns = visibleNamespaces[i]; + // get namespace prefix + if (ns.prefix === prefix) { + return ns.namespace !== uri; + } + } + return true; +} +/** + * Well-formed constraint: No < in Attribute Values + * The replacement text of any entity referred to directly or indirectly in an attribute value must not contain a <. + * @see https://www.w3.org/TR/xml/#CleanAttrVals + * @see https://www.w3.org/TR/xml/#NT-AttValue + */ +function addSerializedAttribute(buf, qualifiedName, value) { + buf.push(' ', qualifiedName, '="', value.replace(/[<&"]/g,_xmlEncoder), '"') +} -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { +function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){ + if (!visibleNamespaces) { + visibleNamespaces = []; + } -"use strict"; + if(nodeFilter){ + node = nodeFilter(node); + if(node){ + if(typeof node == 'string'){ + buf.push(node); + return; + } + }else{ + return; + } + //buf.sort.apply(attrs, attributeSorter); + } -var anObject = __webpack_require__(14); + switch(node.nodeType){ + case ELEMENT_NODE: + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + + isHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML + + var prefixedNodeName = nodeName + if (!isHTML && !node.prefix && node.namespaceURI) { + var defaultNS + // lookup current default ns from `xmlns` attribute + for (var ai = 0; ai < attrs.length; ai++) { + if (attrs.item(ai).name === 'xmlns') { + defaultNS = attrs.item(ai).value + break + } + } + if (!defaultNS) { + // lookup current default ns in visibleNamespaces + for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) { + var namespace = visibleNamespaces[nsi] + if (namespace.prefix === '' && namespace.namespace === node.namespaceURI) { + defaultNS = namespace.namespace + break + } + } + } + if (defaultNS !== node.namespaceURI) { + for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) { + var namespace = visibleNamespaces[nsi] + if (namespace.namespace === node.namespaceURI) { + if (namespace.prefix) { + prefixedNodeName = namespace.prefix + ':' + nodeName + } + break + } + } + } + } -// `RegExp.prototype.flags` getter implementation -// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags -module.exports = function () { - var that = anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.dotAll) result += 's'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; -}; + buf.push('<', prefixedNodeName); + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + while(child){ + if(child.data){ + buf.push(child.data); + }else{ + serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice()); + } + child = child.nextSibling; + } + }else + { + while(child){ + serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice()); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + // remove added visible namespaces + //visibleNamespaces.length = startVisibleNamespaces; + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice()); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return addSerializedAttribute(buf, node.name, node.value); + case TEXT_NODE: + /** + * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form, + * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. + * If they are needed elsewhere, they must be escaped using either numeric character references or the strings + * `&` and `<` respectively. + * The right angle bracket (>) may be represented using the string " > ", and must, for compatibility, + * be escaped using either `>` or a character reference when it appears in the string `]]>` in content, + * when that string is not marking the end of a CDATA section. + * + * In the content of elements, character data is any string of characters + * which does not contain the start-delimiter of any markup + * and does not include the CDATA-section-close delimiter, `]]>`. + * + * @see https://www.w3.org/TR/xml/#NT-CharData + */ + return buf.push(node.data + .replace(/[<&]/g,_xmlEncoder) + .replace(/]]>/g, ']]>') + ); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM ', sysid, '>'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i /a/y and it causes SyntaxError, -// so we use an intermediate function. -function RE(s, f) { - return RegExp(s, f); + __set__ = function(object,key,value){ + //console.log(value) + object['$$'+key] = value + } + } +}catch(e){//ie8 } -exports.UNSUPPORTED_Y = fails(function () { - // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError - var re = RE('a', 'y'); - re.lastIndex = 2; - return re.exec('abcd') != null; -}); - -exports.BROKEN_CARET = fails(function () { - // https://bugzilla.mozilla.org/show_bug.cgi?id=773687 - var re = RE('^r', 'gy'); - re.lastIndex = 2; - return re.exec('str') != null; -}); +//if(typeof require == 'function'){ + exports.DocumentType = DocumentType; + exports.DOMException = DOMException; + exports.DOMImplementation = DOMImplementation; + exports.Element = Element; + exports.Node = Node; + exports.NodeList = NodeList; + exports.XMLSerializer = XMLSerializer; +//} /***/ }), -/* 99 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { -var NATIVE_SYMBOL = __webpack_require__(70); +var freeGlobal = __webpack_require__(52); + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); -module.exports = NATIVE_SYMBOL - // eslint-disable-next-line no-undef - && !Symbol.sham - // eslint-disable-next-line no-undef - && typeof Symbol.iterator == 'symbol'; +module.exports = root; /***/ }), -/* 100 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var root = __webpack_require__(26); -var charAt = __webpack_require__(49).charAt; +/** Built-in value references. */ +var Symbol = root.Symbol; -// `AdvanceStringIndex` abstract operation -// https://tc39.github.io/ecma262/#sec-advancestringindex -module.exports = function (S, index, unicode) { - return index + (unicode ? charAt(S, index).length : 1); -}; +module.exports = Symbol; /***/ }), -/* 101 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { -var classof = __webpack_require__(40); -var regexpExec = __webpack_require__(48); +var debounce = __webpack_require__(21), + isObject = __webpack_require__(19); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ +function throttle(func, wait, options) { + var leading = true, + trailing = true; -// `RegExpExec` abstract operation -// https://tc39.github.io/ecma262/#sec-regexpexec -module.exports = function (R, S) { - var exec = R.exec; - if (typeof exec === 'function') { - var result = exec.call(R, S); - if (typeof result !== 'object') { - throw TypeError('RegExp exec method returned something other than an Object or null'); - } - return result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - - if (classof(R) !== 'RegExp') { - throw TypeError('RegExp#exec called on incompatible receiver'); + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); +} - return regexpExec.call(R, S); -}; - +module.exports = throttle; /***/ }), -/* 102 */ +/* 29 */ /***/ (function(module, exports) { -// iterable DOM collections -// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods -module.exports = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 -}; - - -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(8); -var create = __webpack_require__(50); -var definePropertyModule = __webpack_require__(18); - -var UNSCOPABLES = wellKnownSymbol('unscopables'); -var ArrayPrototype = Array.prototype; - -// Array.prototype[@@unscopables] -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -if (ArrayPrototype[UNSCOPABLES] == undefined) { - definePropertyModule.f(ArrayPrototype, UNSCOPABLES, { - configurable: true, - value: create(null) - }); -} - -// add a key to Array.prototype[@@unscopables] -module.exports = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; -}; - +module.exports = __WEBPACK_EXTERNAL_MODULE__29__; /***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -var getBuiltIn = __webpack_require__(45); +/* 30 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -module.exports = getBuiltIn('document', 'documentElement'); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _book__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24); +/* harmony import */ var _rendition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var _epubcfi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2); +/* harmony import */ var _contents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12); +/* harmony import */ var _utils_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(0); +/* harmony import */ var _utils_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1); +/* harmony import */ var _managers_views_iframe__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20); +/* harmony import */ var _managers_default__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(10); +/* harmony import */ var _managers_continuous__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(22); -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { -var fails = __webpack_require__(13); -module.exports = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - return Object.getPrototypeOf(new F()) !== F.prototype; -}); -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { -var anObject = __webpack_require__(14); -var aPossiblePrototype = __webpack_require__(107); -// `Object.setPrototypeOf` method -// https://tc39.github.io/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -/* eslint-disable no-proto */ -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; - setter.call(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter.call(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); +/** + * Creates a new Book + * @param {string|ArrayBuffer} url URL, Path or ArrayBuffer + * @param {object} options to pass to the book + * @returns {Book} a new Book object + * @example ePub("/path/to/book.epub", {}) + */ -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { +function ePub(url, options) { + return new _book__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"](url, options); +} -var isObject = __webpack_require__(17); +ePub.VERSION = _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EPUBJS_VERSION */ "b"]; -module.exports = function (it) { - if (!isObject(it) && it !== null) { - throw TypeError("Can't set " + String(it) + ' as a prototype'); - } return it; -}; +if (typeof global !== "undefined") { + global.EPUBJS_VERSION = _utils_constants__WEBPACK_IMPORTED_MODULE_5__[/* EPUBJS_VERSION */ "b"]; +} +ePub.Book = _book__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]; +ePub.Rendition = _rendition__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]; +ePub.Contents = _contents__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"]; +ePub.CFI = _epubcfi__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"]; +ePub.utils = _utils_core__WEBPACK_IMPORTED_MODULE_4__; +/* harmony default export */ __webpack_exports__["default"] = (ePub); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(17))) /***/ }), -/* 108 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var assign = __webpack_require__(109) - , normalizeOpts = __webpack_require__(117) - , isCallable = __webpack_require__(118) - , contains = __webpack_require__(119) +var assign = __webpack_require__(32) + , normalizeOpts = __webpack_require__(40) + , isCallable = __webpack_require__(41) + , contains = __webpack_require__(42) , d; @@ -21602,19 +20166,19 @@ /***/ }), -/* 109 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(110)() +module.exports = __webpack_require__(33)() ? Object.assign - : __webpack_require__(111); + : __webpack_require__(34); /***/ }), -/* 110 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21630,14 +20194,14 @@ /***/ }), -/* 111 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var keys = __webpack_require__(112) - , value = __webpack_require__(116) +var keys = __webpack_require__(35) + , value = __webpack_require__(39) , max = Math.max; module.exports = function (dest, src /*, …srcn*/) { @@ -21660,19 +20224,19 @@ /***/ }), -/* 112 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(113)() +module.exports = __webpack_require__(36)() ? Object.keys - : __webpack_require__(114); + : __webpack_require__(37); /***/ }), -/* 113 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21689,13 +20253,13 @@ /***/ }), -/* 114 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isValue = __webpack_require__(51); +var isValue = __webpack_require__(18); var keys = Object.keys; @@ -21705,7 +20269,7 @@ /***/ }), -/* 115 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21716,13 +20280,13 @@ /***/ }), -/* 116 */ +/* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isValue = __webpack_require__(51); +var isValue = __webpack_require__(18); module.exports = function (value) { if (!isValue(value)) throw new TypeError("Cannot use null or undefined"); @@ -21731,13 +20295,13 @@ /***/ }), -/* 117 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isValue = __webpack_require__(51); +var isValue = __webpack_require__(18); var forEach = Array.prototype.forEach, create = Object.create; @@ -21758,7 +20322,7 @@ /***/ }), -/* 118 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -21772,837 +20336,1264 @@ /***/ }), -/* 119 */ +/* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(120)() +module.exports = __webpack_require__(43)() ? String.prototype.contains - : __webpack_require__(121); - - -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var str = "razdwatrzy"; - -module.exports = function () { - if (typeof str.contains !== "function") return false; - return (str.contains("dwa") === true) && (str.contains("foo") === false); -}; - - -/***/ }), -/* 121 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var indexOf = String.prototype.indexOf; - -module.exports = function (searchString/*, position*/) { - return indexOf.call(this, searchString, arguments[1]) > -1; -}; - - -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function (fn) { - if (typeof fn !== "function") throw new TypeError(fn + " is not a function"); - return fn; -}; - - -/***/ }), -/* 123 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var charAt = __webpack_require__(49).charAt; -var InternalStateModule = __webpack_require__(26); -var defineIterator = __webpack_require__(74); - -var STRING_ITERATOR = 'String Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); - -// `String.prototype[@@iterator]` method -// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator -defineIterator(String, 'String', function (iterated) { - setInternalState(this, { - type: STRING_ITERATOR, - string: String(iterated), - index: 0 - }); -// `%StringIteratorPrototype%.next` method -// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next -}, function next() { - var state = getInternalState(this); - var string = state.string; - var index = state.index; - var point; - if (index >= string.length) return { value: undefined, done: true }; - point = charAt(string, index); - state.index += point.length; - return { value: point, done: false }; -}); - - -/***/ }), -/* 124 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var DESCRIPTORS = __webpack_require__(16); -var fails = __webpack_require__(13); -var objectKeys = __webpack_require__(73); -var getOwnPropertySymbolsModule = __webpack_require__(69); -var propertyIsEnumerableModule = __webpack_require__(60); -var toObject = __webpack_require__(36); -var IndexedObject = __webpack_require__(61); - -var nativeAssign = Object.assign; -var defineProperty = Object.defineProperty; - -// `Object.assign` method -// https://tc39.github.io/ecma262/#sec-object.assign -module.exports = !nativeAssign || fails(function () { - // should have correct order of operations (Edge bug) - if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', { - enumerable: true, - get: function () { - defineProperty(this, 'b', { - value: 3, - enumerable: false - }); - } - }), { b: 2 })).b !== 1) return true; - // should work with symbols and should have deterministic property order (V8 bug) - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var symbol = Symbol(); - var alphabet = 'abcdefghijklmnopqrst'; - A[symbol] = 7; - alphabet.split('').forEach(function (chr) { B[chr] = chr; }); - return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = toObject(target); - var argumentsLength = arguments.length; - var index = 1; - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - var propertyIsEnumerable = propertyIsEnumerableModule.f; - while (argumentsLength > index) { - var S = IndexedObject(arguments[index++]); - var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) { - key = keys[j++]; - if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key]; - } - } return T; -} : nativeAssign; - - -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var bind = __webpack_require__(80); -var toObject = __webpack_require__(36); -var callWithSafeIterationClosing = __webpack_require__(127); -var isArrayIteratorMethod = __webpack_require__(128); -var toLength = __webpack_require__(46); -var createProperty = __webpack_require__(129); -var getIteratorMethod = __webpack_require__(52); - -// `Array.from` method implementation -// https://tc39.github.io/ecma262/#sec-array.from -module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { - var O = toObject(arrayLike); - var C = typeof this == 'function' ? this : Array; - var argumentsLength = arguments.length; - var mapfn = argumentsLength > 1 ? arguments[1] : undefined; - var mapping = mapfn !== undefined; - var iteratorMethod = getIteratorMethod(O); - var index = 0; - var length, result, step, iterator, next, value; - if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2); - // if the target is not iterable or it's an array with the default iterator - use a simple case - if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) { - iterator = iteratorMethod.call(O); - next = iterator.next; - result = new C(); - for (;!(step = next.call(iterator)).done; index++) { - value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; - createProperty(result, index, value); - } - } else { - length = toLength(O.length); - result = new C(length); - for (;length > index; index++) { - value = mapping ? mapfn(O[index], index) : O[index]; - createProperty(result, index, value); - } - } - result.length = index; - return result; -}; - - -/***/ }), -/* 126 */ -/***/ (function(module, exports) { - -module.exports = function (it) { - if (typeof it != 'function') { - throw TypeError(String(it) + ' is not a function'); - } return it; -}; - - -/***/ }), -/* 127 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(14); - -// call something on iterator step with safe closing on error -module.exports = function (iterator, fn, value, ENTRIES) { - try { - return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch (error) { - var returnMethod = iterator['return']; - if (returnMethod !== undefined) anObject(returnMethod.call(iterator)); - throw error; - } -}; - - -/***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(8); -var Iterators = __webpack_require__(27); - -var ITERATOR = wellKnownSymbol('iterator'); -var ArrayPrototype = Array.prototype; - -// check on default Array iterator -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); -}; - - -/***/ }), -/* 129 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var toPrimitive = __webpack_require__(41); -var definePropertyModule = __webpack_require__(18); -var createPropertyDescriptor = __webpack_require__(25); - -module.exports = function (object, key, value) { - var propertyKey = toPrimitive(key); - if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; -}; - - -/***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(8); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var test = {}; - -test[TO_STRING_TAG] = 'z'; - -module.exports = String(test) === '[object z]'; + : __webpack_require__(44); /***/ }), -/* 131 */ +/* 43 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js -var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 -var base = 36; -var tMin = 1; -var tMax = 26; -var skew = 38; -var damp = 700; -var initialBias = 72; -var initialN = 128; // 0x80 -var delimiter = '-'; // '\x2D' -var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars -var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators -var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process'; -var baseMinusTMin = base - tMin; -var floor = Math.floor; -var stringFromCharCode = String.fromCharCode; - -/** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - */ -var ucs2decode = function (string) { - var output = []; - var counter = 0; - var length = string.length; - while (counter < length) { - var value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // It's a high surrogate, and there is a next character. - var extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // It's an unmatched surrogate; only append this code unit, in case the - // next code unit is the high surrogate of a surrogate pair. - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; -}; - -/** - * Converts a digit/integer into a basic code point. - */ -var digitToBasic = function (digit) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26); -}; - -/** - * Bias adaptation function as per section 3.4 of RFC 3492. - * https://tools.ietf.org/html/rfc3492#section-3.4 - */ -var adapt = function (delta, numPoints, firstTime) { - var k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for (; delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); - } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); -}; - -/** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - */ -// eslint-disable-next-line max-statements -var encode = function (input) { - var output = []; - - // Convert the input in UCS-2 to an array of Unicode code points. - input = ucs2decode(input); - - // Cache the length. - var inputLength = input.length; - - // Initialize the state. - var n = initialN; - var delta = 0; - var bias = initialBias; - var i, currentValue; - - // Handle the basic code points. - for (i = 0; i < input.length; i++) { - currentValue = input[i]; - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); - } - } - - var basicLength = output.length; // number of basic code points. - var handledCPCount = basicLength; // number of code points that have been handled; - // Finish the basic string with a delimiter unless it's empty. - if (basicLength) { - output.push(delimiter); - } - - // Main encoding loop: - while (handledCPCount < inputLength) { - // All non-basic code points < n have been handled already. Find the next larger one: - var m = maxInt; - for (i = 0; i < input.length; i++) { - currentValue = input[i]; - if (currentValue >= n && currentValue < m) { - m = currentValue; - } - } - - // Increase `delta` enough to advance the decoder's state to , but guard against overflow. - var handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - throw RangeError(OVERFLOW_ERROR); - } - - delta += (m - n) * handledCPCountPlusOne; - n = m; - - for (i = 0; i < input.length; i++) { - currentValue = input[i]; - if (currentValue < n && ++delta > maxInt) { - throw RangeError(OVERFLOW_ERROR); - } - if (currentValue == n) { - // Represent delta as a generalized variable-length integer. - var q = delta; - for (var k = base; /* no condition */; k += base) { - var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - if (q < t) break; - var qMinusT = q - t; - var baseMinusT = base - t; - output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT))); - q = floor(qMinusT / baseMinusT); - } - - output.push(stringFromCharCode(digitToBasic(q))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); - delta = 0; - ++handledCPCount; - } - } - - ++delta; - ++n; - } - return output.join(''); -}; +var str = "razdwatrzy"; -module.exports = function (input) { - var encoded = []; - var labels = input.toLowerCase().replace(regexSeparators, '\u002E').split('.'); - var i, label; - for (i = 0; i < labels.length; i++) { - label = labels[i]; - encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label); - } - return encoded.join('.'); +module.exports = function () { + if (typeof str.contains !== "function") return false; + return (str.contains("dwa") === true) && (str.contains("foo") === false); }; /***/ }), -/* 132 */ +/* 44 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` -__webpack_require__(71); -var $ = __webpack_require__(31); -var getBuiltIn = __webpack_require__(45); -var USE_NATIVE_URL = __webpack_require__(78); -var redefine = __webpack_require__(19); -var redefineAll = __webpack_require__(133); -var setToStringTag = __webpack_require__(37); -var createIteratorConstructor = __webpack_require__(75); -var InternalStateModule = __webpack_require__(26); -var anInstance = __webpack_require__(79); -var hasOwn = __webpack_require__(10); -var bind = __webpack_require__(80); -var classof = __webpack_require__(81); -var anObject = __webpack_require__(14); -var isObject = __webpack_require__(17); -var create = __webpack_require__(50); -var createPropertyDescriptor = __webpack_require__(25); -var getIterator = __webpack_require__(134); -var getIteratorMethod = __webpack_require__(52); -var wellKnownSymbol = __webpack_require__(8); - -var $fetch = getBuiltIn('fetch'); -var Headers = getBuiltIn('Headers'); -var ITERATOR = wellKnownSymbol('iterator'); -var URL_SEARCH_PARAMS = 'URLSearchParams'; -var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS); -var getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR); -var plus = /\+/g; -var sequences = Array(4); +var indexOf = String.prototype.indexOf; -var percentSequence = function (bytes) { - return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\da-f]{2}){' + bytes + '})', 'gi')); +module.exports = function (searchString/*, position*/) { + return indexOf.call(this, searchString, arguments[1]) > -1; }; -var percentDecode = function (sequence) { - try { - return decodeURIComponent(sequence); - } catch (error) { - return sequence; - } -}; -var deserialize = function (it) { - var result = it.replace(plus, ' '); - var bytes = 4; - try { - return decodeURIComponent(result); - } catch (error) { - while (bytes) { - result = result.replace(percentSequence(bytes--), percentDecode); - } - return result; - } -}; +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { -var find = /[!'()~]|%20/g; +"use strict"; -var replace = { - '!': '%21', - "'": '%27', - '(': '%28', - ')': '%29', - '~': '%7E', - '%20': '+' -}; -var replacer = function (match) { - return replace[match]; +module.exports = function (fn) { + if (typeof fn !== "function") throw new TypeError(fn + " is not a function"); + return fn; }; -var serialize = function (it) { - return encodeURIComponent(it).replace(find, replacer); -}; -var parseSearchParams = function (result, query) { - if (query) { - var attributes = query.split('&'); - var index = 0; - var attribute, entry; - while (index < attributes.length) { - attribute = attributes[index++]; - if (attribute.length) { - entry = attribute.split('='); - result.push({ - key: deserialize(entry.shift()), - value: deserialize(entry.join('=')) - }); - } - } - } -}; +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { -var updateSearchParams = function (query) { - this.entries.length = 0; - parseSearchParams(this.entries, query); -}; +var conventions = __webpack_require__(14); +var dom = __webpack_require__(25) +var entities = __webpack_require__(47); +var sax = __webpack_require__(48); + +var DOMImplementation = dom.DOMImplementation; + +var NAMESPACE = conventions.NAMESPACE; + +var ParseError = sax.ParseError; +var XMLReader = sax.XMLReader; + +function DOMParser(options){ + this.options = options ||{locator:{}}; +} + +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var isHTML = /\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1; + var entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES; + if(locator){ + domBuilder.setDocumentLocator(locator) + } -var validateArgumentsLength = function (passed, required) { - if (passed < required) throw TypeError('Not enough arguments'); -}; + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(isHTML){ + defaultNSMap[''] = NAMESPACE.HTML; + } + defaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML; + if(source && typeof source === 'string'){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} -var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) { - setInternalState(this, { - type: URL_SEARCH_PARAMS_ITERATOR, - iterator: getIterator(getInternalParamsState(params).entries), - kind: kind - }); -}, 'Iterator', function next() { - var state = getInternalIteratorState(this); - var kind = state.kind; - var step = state.iterator.next(); - var entry = step.value; - if (!step.done) { - step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value]; - } return step; -}); +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + this.doc.doctype = dt; + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + throw new ParseError(error, this.locator); + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} -// `URLSearchParams` constructor -// https://url.spec.whatwg.org/#interface-urlsearchparams -var URLSearchParamsConstructor = function URLSearchParams(/* init */) { - anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS); - var init = arguments.length > 0 ? arguments[0] : undefined; - var that = this; - var entries = []; - var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key; - - setInternalState(that, { - type: URL_SEARCH_PARAMS, - entries: entries, - updateURL: function () { /* empty */ }, - updateSearchParams: updateSearchParams - }); +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) - if (init !== undefined) { - if (isObject(init)) { - iteratorMethod = getIteratorMethod(init); - if (typeof iteratorMethod === 'function') { - iterator = iteratorMethod.call(init); - next = iterator.next; - while (!(step = next.call(iterator)).done) { - entryIterator = getIterator(anObject(step.value)); - entryNext = entryIterator.next; - if ( - (first = entryNext.call(entryIterator)).done || - (second = entryNext.call(entryIterator)).done || - !entryNext.call(entryIterator).done - ) throw TypeError('Expected sequence with length 2'); - entries.push({ key: first.value + '', value: second.value + '' }); - } - } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' }); +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); } else { - parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + ''); + hander.currentElement.appendChild(node); } - } -}; +}//appendChild and setAttributeNS are preformance key -var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype; +exports.__DOMHandler = DOMHandler; +exports.DOMParser = DOMParser; -redefineAll(URLSearchParamsPrototype, { - // `URLSearchParams.prototype.appent` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-append - append: function append(name, value) { - validateArgumentsLength(arguments.length, 2); - var state = getInternalParamsState(this); - state.entries.push({ key: name + '', value: value + '' }); - state.updateURL(); - }, - // `URLSearchParams.prototype.delete` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-delete - 'delete': function (name) { - validateArgumentsLength(arguments.length, 1); - var state = getInternalParamsState(this); - var entries = state.entries; - var key = name + ''; - var index = 0; - while (index < entries.length) { - if (entries[index].key === key) entries.splice(index, 1); - else index++; - } - state.updateURL(); - }, - // `URLSearchParams.prototype.get` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-get - get: function get(name) { - validateArgumentsLength(arguments.length, 1); - var entries = getInternalParamsState(this).entries; - var key = name + ''; - var index = 0; - for (; index < entries.length; index++) { - if (entries[index].key === key) return entries[index].value; - } - return null; - }, - // `URLSearchParams.prototype.getAll` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-getall - getAll: function getAll(name) { - validateArgumentsLength(arguments.length, 1); - var entries = getInternalParamsState(this).entries; - var key = name + ''; - var result = []; - var index = 0; - for (; index < entries.length; index++) { - if (entries[index].key === key) result.push(entries[index].value); - } - return result; - }, - // `URLSearchParams.prototype.has` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-has - has: function has(name) { - validateArgumentsLength(arguments.length, 1); - var entries = getInternalParamsState(this).entries; - var key = name + ''; - var index = 0; - while (index < entries.length) { - if (entries[index++].key === key) return true; - } - return false; - }, - // `URLSearchParams.prototype.set` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-set - set: function set(name, value) { - validateArgumentsLength(arguments.length, 1); - var state = getInternalParamsState(this); - var entries = state.entries; - var found = false; - var key = name + ''; - var val = value + ''; - var index = 0; - var entry; - for (; index < entries.length; index++) { - entry = entries[index]; - if (entry.key === key) { - if (found) entries.splice(index--, 1); - else { - found = true; - entry.value = val; - } - } - } - if (!found) entries.push({ key: key, value: val }); - state.updateURL(); - }, - // `URLSearchParams.prototype.sort` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-sort - sort: function sort() { - var state = getInternalParamsState(this); - var entries = state.entries; - // Array#sort is not stable in some engines - var slice = entries.slice(); - var entry, entriesIndex, sliceIndex; - entries.length = 0; - for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) { - entry = slice[sliceIndex]; - for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) { - if (entries[entriesIndex].key > entry.key) { - entries.splice(entriesIndex, 0, entry); - break; - } - } - if (entriesIndex === sliceIndex) entries.push(entry); - } - state.updateURL(); - }, - // `URLSearchParams.prototype.forEach` method - forEach: function forEach(callback /* , thisArg */) { - var entries = getInternalParamsState(this).entries; - var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3); - var index = 0; - var entry; - while (index < entries.length) { - entry = entries[index++]; - boundFunction(entry.value, entry.key, this); - } - }, - // `URLSearchParams.prototype.keys` method - keys: function keys() { - return new URLSearchParamsIterator(this, 'keys'); - }, - // `URLSearchParams.prototype.values` method - values: function values() { - return new URLSearchParamsIterator(this, 'values'); - }, - // `URLSearchParams.prototype.entries` method - entries: function entries() { - return new URLSearchParamsIterator(this, 'entries'); - } -}, { enumerable: true }); - -// `URLSearchParams.prototype[@@iterator]` method -redefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries); - -// `URLSearchParams.prototype.toString` method -// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior -redefine(URLSearchParamsPrototype, 'toString', function toString() { - var entries = getInternalParamsState(this).entries; - var result = []; - var index = 0; - var entry; - while (index < entries.length) { - entry = entries[index++]; - result.push(serialize(entry.key) + '=' + serialize(entry.value)); - } return result.join('&'); -}, { enumerable: true }); +/** + * @deprecated Import/require from main entry point instead + */ +exports.DOMImplementation = dom.DOMImplementation; -setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS); +/** + * @deprecated Import/require from main entry point instead + */ +exports.XMLSerializer = dom.XMLSerializer; -$({ global: true, forced: !USE_NATIVE_URL }, { - URLSearchParams: URLSearchParamsConstructor -}); -// Wrap `fetch` for correct work with polyfilled `URLSearchParams` -// https://github.com/zloirock/core-js/issues/674 -if (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') { - $({ global: true, enumerable: true, forced: true }, { - fetch: function fetch(input /* , init */) { - var args = [input]; - var init, body, headers; - if (arguments.length > 1) { - init = arguments[1]; - if (isObject(init)) { - body = init.body; - if (classof(body) === URL_SEARCH_PARAMS) { - headers = init.headers ? new Headers(init.headers) : new Headers(); - if (!headers.has('content-type')) { - headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); - } - init = create(init, { - body: createPropertyDescriptor(0, String(body)), - headers: createPropertyDescriptor(0, headers) - }); - } - } - args.push(init); - } return $fetch.apply(this, args); - } - }); -} +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = { - URLSearchParams: URLSearchParamsConstructor, - getState: getInternalParamsState -}; +var freeze = __webpack_require__(14).freeze; + +/** + * The entities that are predefined in every XML document. + * + * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#sec-predefined-ent W3C XML 1.1 + * @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent W3C XML 1.0 + * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined_entities_in_XML Wikipedia + */ +exports.XML_ENTITIES = freeze({amp:'&', apos:"'", gt:'>', lt:'<', quot:'"'}) + +/** + * A map of currently 241 entities that are detected in an HTML document. + * They contain all entries from `XML_ENTITIES`. + * + * @see XML_ENTITIES + * @see DOMParser.parseFromString + * @see DOMImplementation.prototype.createHTMLDocument + * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec + * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names + * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML + * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML) + * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML) + */ +exports.HTML_ENTITIES = freeze({ + lt: '<', + gt: '>', + amp: '&', + quot: '"', + apos: "'", + Agrave: "À", + Aacute: "Á", + Acirc: "Â", + Atilde: "Ã", + Auml: "Ä", + Aring: "Å", + AElig: "Æ", + Ccedil: "Ç", + Egrave: "È", + Eacute: "É", + Ecirc: "Ê", + Euml: "Ë", + Igrave: "Ì", + Iacute: "Í", + Icirc: "Î", + Iuml: "Ï", + ETH: "Ð", + Ntilde: "Ñ", + Ograve: "Ò", + Oacute: "Ó", + Ocirc: "Ô", + Otilde: "Õ", + Ouml: "Ö", + Oslash: "Ø", + Ugrave: "Ù", + Uacute: "Ú", + Ucirc: "Û", + Uuml: "Ü", + Yacute: "Ý", + THORN: "Þ", + szlig: "ß", + agrave: "à", + aacute: "á", + acirc: "â", + atilde: "ã", + auml: "ä", + aring: "å", + aelig: "æ", + ccedil: "ç", + egrave: "è", + eacute: "é", + ecirc: "ê", + euml: "ë", + igrave: "ì", + iacute: "í", + icirc: "î", + iuml: "ï", + eth: "ð", + ntilde: "ñ", + ograve: "ò", + oacute: "ó", + ocirc: "ô", + otilde: "õ", + ouml: "ö", + oslash: "ø", + ugrave: "ù", + uacute: "ú", + ucirc: "û", + uuml: "ü", + yacute: "ý", + thorn: "þ", + yuml: "ÿ", + nbsp: "\u00a0", + iexcl: "¡", + cent: "¢", + pound: "£", + curren: "¤", + yen: "¥", + brvbar: "¦", + sect: "§", + uml: "¨", + copy: "©", + ordf: "ª", + laquo: "«", + not: "¬", + shy: "­­", + reg: "®", + macr: "¯", + deg: "°", + plusmn: "±", + sup2: "²", + sup3: "³", + acute: "´", + micro: "µ", + para: "¶", + middot: "·", + cedil: "¸", + sup1: "¹", + ordm: "º", + raquo: "»", + frac14: "¼", + frac12: "½", + frac34: "¾", + iquest: "¿", + times: "×", + divide: "÷", + forall: "∀", + part: "∂", + exist: "∃", + empty: "∅", + nabla: "∇", + isin: "∈", + notin: "∉", + ni: "∋", + prod: "∏", + sum: "∑", + minus: "−", + lowast: "∗", + radic: "√", + prop: "∝", + infin: "∞", + ang: "∠", + and: "∧", + or: "∨", + cap: "∩", + cup: "∪", + 'int': "∫", + there4: "∴", + sim: "∼", + cong: "≅", + asymp: "≈", + ne: "≠", + equiv: "≡", + le: "≤", + ge: "≥", + sub: "⊂", + sup: "⊃", + nsub: "⊄", + sube: "⊆", + supe: "⊇", + oplus: "⊕", + otimes: "⊗", + perp: "⊥", + sdot: "⋅", + Alpha: "Α", + Beta: "Β", + Gamma: "Γ", + Delta: "Δ", + Epsilon: "Ε", + Zeta: "Ζ", + Eta: "Η", + Theta: "Θ", + Iota: "Ι", + Kappa: "Κ", + Lambda: "Λ", + Mu: "Μ", + Nu: "Ν", + Xi: "Ξ", + Omicron: "Ο", + Pi: "Π", + Rho: "Ρ", + Sigma: "Σ", + Tau: "Τ", + Upsilon: "Υ", + Phi: "Φ", + Chi: "Χ", + Psi: "Ψ", + Omega: "Ω", + alpha: "α", + beta: "β", + gamma: "γ", + delta: "δ", + epsilon: "ε", + zeta: "ζ", + eta: "η", + theta: "θ", + iota: "ι", + kappa: "κ", + lambda: "λ", + mu: "μ", + nu: "ν", + xi: "ξ", + omicron: "ο", + pi: "π", + rho: "ρ", + sigmaf: "ς", + sigma: "σ", + tau: "τ", + upsilon: "υ", + phi: "φ", + chi: "χ", + psi: "ψ", + omega: "ω", + thetasym: "ϑ", + upsih: "ϒ", + piv: "ϖ", + OElig: "Œ", + oelig: "œ", + Scaron: "Š", + scaron: "š", + Yuml: "Ÿ", + fnof: "ƒ", + circ: "ˆ", + tilde: "˜", + ensp: " ", + emsp: " ", + thinsp: " ", + zwnj: "‌", + zwj: "‍", + lrm: "‎", + rlm: "‏", + ndash: "–", + mdash: "—", + lsquo: "‘", + rsquo: "’", + sbquo: "‚", + ldquo: "“", + rdquo: "”", + bdquo: "„", + dagger: "†", + Dagger: "‡", + bull: "•", + hellip: "…", + permil: "‰", + prime: "′", + Prime: "″", + lsaquo: "‹", + rsaquo: "›", + oline: "‾", + euro: "€", + trade: "™", + larr: "←", + uarr: "↑", + rarr: "→", + darr: "↓", + harr: "↔", + crarr: "↵", + lceil: "⌈", + rceil: "⌉", + lfloor: "⌊", + rfloor: "⌋", + loz: "◊", + spades: "♠", + clubs: "♣", + hearts: "♥", + diams: "♦" +}); + +/** + * @deprecated use `HTML_ENTITIES` instead + * @see HTML_ENTITIES + */ +exports.entityMap = exports.HTML_ENTITIES /***/ }), -/* 133 */ +/* 48 */ /***/ (function(module, exports, __webpack_require__) { -var redefine = __webpack_require__(19); +var NAMESPACE = __webpack_require__(14).NAMESPACE; -module.exports = function (target, src, options) { - for (var key in src) redefine(target, key, src[key], options); - return target; -}; +//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] +//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] +//[5] Name ::= NameStartChar (NameChar)* +var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF +var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"); +var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); +//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ +//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') + +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE +var S_TAG = 0;//tag name offerring +var S_ATTR = 1;//attr name offerring +var S_ATTR_SPACE=2;//attr name end and space offer +var S_EQ = 3;//=space? +var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only) +var S_ATTR_END = 5;//attr value end and no space(quot end) +var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer) +var S_TAG_CLOSE = 7;//closed el +/** + * Creates an error that will not be caught by XMLReader aka the SAX parser. + * + * @param {string} message + * @param {any?} locator Optional, can provide details about the location in the source + * @constructor + */ +function ParseError(message, locator) { + this.message = message + this.locator = locator + if(Error.captureStackTrace) Error.captureStackTrace(this, ParseError); +} +ParseError.prototype = new Error(); +ParseError.prototype.name = ParseError.name + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + if(end>start){ + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + } + function position(p,m){ + while(p>=lineEnd && (m = linePattern.exec(source))){ + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p-lineStart+1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + try{ + var tagStart = source.indexOf('<',start); + if(tagStart<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(tagStart>start){ + appendText(tagStart); + } + switch(source.charAt(tagStart+1)){ + case '/': + var end = source.indexOf('>',tagStart+3); + var tagName = source.substring(tagStart + 2, end).replace(/[ \t\n\r]+$/g, ''); + var config = parseStack.pop(); + if(end<0){ + + tagName = source.substring(tagStart+2).replace(/[\s<].*/,''); + errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName); + end = tagStart+1+tagName.length; + }else if(tagName.match(/\s + locator&&position(tagStart); + end = parseInstruction(source,tagStart,domBuilder); + break; + case '!':// start){ + start = end; + }else{ + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart,start)+1); + } + } +} +function copyLocator(f,t){ + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; +} -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){ + + /** + * @param {string} qname + * @param {string} value + * @param {number} startIndex + */ + function addAttribute(qname, value, startIndex) { + if (el.attributeNames.hasOwnProperty(qname)) { + errorHandler.fatalError('Attribute ' + qname + ' redefined') + } + el.addValue(qname, value, startIndex) + } + var attrName; + var value; + var p = ++start; + var s = S_TAG;//status + while(true){ + var c = source.charAt(p); + switch(c){ + case '=': + if(s === S_ATTR){//attrName + attrName = source.slice(start,p); + s = S_EQ; + }else if(s === S_ATTR_SPACE){ + s = S_EQ; + }else{ + //fatalError: equal must after attrName or space after attrName + throw new Error('attribute equal must after attrName'); // No known test case + } + break; + case '\'': + case '"': + if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE + ){//equal + if(s === S_ATTR){ + errorHandler.warning('attribute value must after "="') + attrName = source.slice(start,p) + } + start = p+1; + p = source.indexOf(c,start) + if(p>0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + addAttribute(attrName, value, start-1); + s = S_ATTR_END; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_ATTR_NOQUOT_VALUE){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + addAttribute(attrName, value, start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_ATTR_END + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); // No known test case + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s =S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") // No known test case + } + break; + case ''://end document + errorHandler.error('unexpected end of input'); + if(s == S_TAG){ + el.setTagName(source.slice(start,p)); + } + return p; + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break;//normal + case S_ATTR_NOQUOT_VALUE://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_SPACE: + if(s === S_ATTR_SPACE){ + value = attrName; + } + if(s == S_ATTR_NOQUOT_VALUE){ + errorHandler.warning('attribute "'+value+'" missed quot(")!'); + addAttribute(attrName, value.replace(/&#?\w+;/g,entityReplacer), start) + }else{ + if(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + } + addAttribute(value, value, start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + addAttribute(attrName, value, start) + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) { + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!') + } + addAttribute(attrName, attrName, start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + }//end outer switch + //console.log('p++',p) + p++; + } +} +/** + * @return true if has new namespace define + */ +function appendElement(el,domBuilder,currentNSMap){ + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = NAMESPACE.XMLNS + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = NAMESPACE.XML; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix || ''] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = source.lastIndexOf('') + if(pos',start+4); + //append comment source.substring(4,end)//