Merge branch 'main' into merge_1.6.6
@@ -29,5 +29,5 @@ jobs:
|
||||
flake8 tests --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||
- name: Coding Style Violations
|
||||
run: |
|
||||
flake8 novelwriter --count --max-line-length=99 --ignore E221,E226,E228,E241 --show-source --statistics
|
||||
flake8 tests --count --max-line-length=99 --ignore E221,E226,E228,E241 --show-source --statistics
|
||||
flake8 novelwriter --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics
|
||||
flake8 tests --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
testLinux:
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"]
|
||||
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: "3.10"
|
||||
architecture: x64
|
||||
- name: Install Packages
|
||||
run: |
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: "3.10"
|
||||
architecture: x64
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
|
||||
@@ -1,5 +1,234 @@
|
||||
# novelWriter Changelog
|
||||
|
||||
## Version 2.0 RC 1 [2022-10-17]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a release candidate of the next release version, and is intended for testing purposes.
|
||||
Please be careful when using this version on live writing projects, and make sure you take frequent
|
||||
backups.
|
||||
|
||||
Please check the changelog for an overview of changes. The full release notes will be added to the
|
||||
final release.
|
||||
|
||||
**Note:** As of the 2.0 release, novelWriter requires Qt 5.10 or higher and Python 3.7 or higher.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Note:** This will no longer be release 1.7, but 2.0 instead due to the major changes to the User
|
||||
Interface. PR #1146.
|
||||
|
||||
**Features**
|
||||
|
||||
* The add new documents feature has been made a little smarter and now tries to choose whether the
|
||||
added document should be a sibling or a child to the selected document. Issue #1107. PR #1110.
|
||||
* A folder in the Project Tree can now be converted to a Novel Document or Project Note from the
|
||||
item's context menu. This makes sense now that documents can have child items. Issue #1071.
|
||||
PR #1128.
|
||||
* All child elements of an item in the Project Tree can now be collectively expanded or collapsed
|
||||
from the context menu. The same action can be triggered on the entire tree from the menu button
|
||||
at the top. Issue #1122. PR #1129.
|
||||
* If using the auto-insert feature for spaces next to punctuation designed for for instance French,
|
||||
any existing spaces are first stripped before the correct space character is added. Some users
|
||||
find it hard to unlearn the reflex to type the space. Issue #1061. PR #1131.
|
||||
* The Project Tree now has Quick Links for navigating directly between root folders. This is
|
||||
convenient for very large projects. Issue #1137. PR #1165.
|
||||
* It is now possible to filter out entire root folders on the Build Tool. Issue #1138. PR #1168.
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Fix a typo in the Lorem Ipsum tool and set a max width for the views bar. PR #1065.
|
||||
* The language set in the Build Tool is now properly exported to Open Document files. Previously,
|
||||
it would be set to English regardless of the user's selection. Issue #1073. PR #1077.
|
||||
* Since the text editor cursor extends to the right of its position in the window, it would
|
||||
disappear under the right-hand margin if it reached the edge. A minimum margin of the width of
|
||||
the cursor has been added to the editor, and the same value subtracted from the margin of the
|
||||
viewbox. Thus, the cursor no longer disappears. Issue #1112. PR #1113.
|
||||
* The `Shift+Enter` key combination no longer inserts a Unicode line separator in the text editor.
|
||||
Issue #1150. PR #1151.
|
||||
* Fixed an issue where idle time would not be properly reset when a new project was created.
|
||||
Issue #1149. PR #1153.
|
||||
* Removed the context menu that would appear on the Views Bar, from which the bar could be hidden.
|
||||
This is some feature imposed by the Qt library, and it is not wanted. Issue #1147. PR #1153.
|
||||
|
||||
**Known Issues**
|
||||
|
||||
* An attempt has been made to fix the missing mime icon for novelWriter projects on Linux. The
|
||||
newer versions of Nautilus don't seem to display the correct icon due to some changes in the way
|
||||
icons are extracted from the theme. The icon displays fine in other places. PR #1068.
|
||||
|
||||
**Internationalisation**
|
||||
|
||||
* Norwegian and US English translations have been updated. PR #1170.
|
||||
|
||||
**User Interface**
|
||||
|
||||
* The New Project Wizard has been updated based on user feedback. The "Working Title" setting is
|
||||
now called "Project Name". The number of root folders one can create on the options page has been
|
||||
reduced to the standard ones. An option to add sample notes has been added, and the option to
|
||||
generate chapter folders has been removed. The "Minimal Project" option also no longer creates
|
||||
folders. An Archive root folder is automatically added to all new projects, and a Trash folder is
|
||||
added to custom projects. PR #1067.
|
||||
* The border around a lot of Widgets on the main GUI have been removed. PR #1069.
|
||||
* The Views Bar has been updated since the beta re;ease with better icons, tooltips, and an
|
||||
expanding menu on the Settings button. The Build Tool can now also be accessed from the Views
|
||||
Bar. PR #1069.
|
||||
* The editor theme setting in Preferences has been moved back to the General tab where users seem
|
||||
to expect to find it. PR #1069.
|
||||
* A toolbar has been added to the Outline View where the user can select which Novel folder to
|
||||
view. A refresh button for a forced reload of the selected Novel folder has been added, and the
|
||||
menu to select which columns to show has been added to a new button. This makes it easier to find
|
||||
for users instead of having to right-click the table header. Issue #1105. PRs #1063, #1094, and
|
||||
#1111.
|
||||
* The Rebuild Outline and Auto-Update Outline options have been removed from the Main Menu.
|
||||
PR #1063.
|
||||
* The Project Tree has been redesigned. The header is now hidden, and the columns resize
|
||||
automatically. A toolbar has been added with buttons for moving items up and down in the tree, a
|
||||
button for adding new files, folders and root folders, and a menu button for further options
|
||||
affecting the whole tree. These features have mostly bee removed from the Main Menu. PR #1079.
|
||||
* The context menu of the Project Tree has been rewritten completely. It is now possible to set
|
||||
importance and status directly from this menu. Part of issue #973. PRs #1079 and #1105.
|
||||
* The Edit Item dialog has been replaced with a simple Edit Label dialog. Most of the features
|
||||
handled by the old dialog have been moved to the Project Tree context menu. PR #1082.
|
||||
* The Novel View has been redesigned to match the new Outline View and Project Tree. The header is
|
||||
now hidden, and the columns auto-size. The third column can be selected from a set of options, or
|
||||
be hidden entirely. A button with a menu can be used to select which Novel folder to show.
|
||||
Issue #1041. PR #1084.
|
||||
* An arrow icon has been added behind each item in the Novel View. Clicking it, will pop up a
|
||||
tooltip showing the collected meta data for the heading the item represents. PR #1088.
|
||||
* The Project Details dialog now supports multiple novel folders. Issue #1078. PRs #1130 and #1167.
|
||||
* The Split and Merge tools have been rewritten to work with the new feature of allowing documents
|
||||
to have child documents. The tools have also had more options added to them. The feature is now
|
||||
accessible through the Project Tree item's context menu, and is no longer available from the Main
|
||||
Menu. Issues #1072 and #1032. PRs #1148 and #1154.
|
||||
|
||||
**Installation and Packaging**
|
||||
|
||||
* AppImage distribution has been added by @Ryex. Issue #1091. PR #1092.
|
||||
|
||||
**Code Improvements**
|
||||
|
||||
* A new test project generator function has been added to replace the dependency on the New Project
|
||||
tools in the app itself. This ensures that changing the in-app feature doesn't affect the entire
|
||||
test suite. Over time, this generator function should also replace the minimal sample project
|
||||
saved in the test suite. PR #1067.
|
||||
* The index class has been rewritten. The index data is now stored in a hierarchy of objects rather
|
||||
than a set of nested dictionaries. The `itemIndex` holds all the data collected from the project,
|
||||
and the `tagsIndex` is a reverse lookup index for linking tags back to where they are used. The
|
||||
reading/writing of the index to disk between sessions is now handled by pack/unpack functions in
|
||||
each object. The index will be regenerated when the user first opens a project as it has been
|
||||
completely restructured. PR #1074.
|
||||
* The index instance is now an instance of the project class, not the main GUI. PR #1074.
|
||||
* The Outline View has been restructured into a single parent widget in the same manner as the
|
||||
Novel View was in the previous pre-release. Related to #1041. PR #1063.
|
||||
* A lot of main GUI objects have been given new names in the code to better represent what they do.
|
||||
PR #1081.
|
||||
* The converter for the old 1.0 project structure has been simplified. Mostly to reduce the amount
|
||||
of code and number of translation labels needed for it. It now produces a single error if
|
||||
something went wrong. PR #1083.
|
||||
* A number of unused icons have been removed from the code base. PR #1164.
|
||||
* All checks for Qt versions below 5.10 have been removed. PR #1174.
|
||||
|
||||
**Not Implemented**
|
||||
|
||||
* An idea to make the indexer run in the global thread pool was not implemented. Issue #1076.
|
||||
* Feature #997 is now obsolete due to the changes made to the Edit Item dialog in #1082.
|
||||
* Feature #1106 is not implemented. It proposes to hide the option to select Novel folder if there
|
||||
is only one. We will see if this is really needed based on user feedback.
|
||||
|
||||
----
|
||||
|
||||
## Version 1.7 Beta 1 [2022-05-17]
|
||||
|
||||
**Note:** The 1.7 release cycle was renamed 2.0 on 2022-10-06. See #1144.
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a beta release of the next release version, and is intended for testing purposes. Please be
|
||||
careful when using this version on live writing projects, and make sure you take frequent backups.
|
||||
|
||||
Please check the changelog for an overview of changes. The full release notes will be added to the
|
||||
final release.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Features**
|
||||
|
||||
* A simple tool to add Lorem Ipsum placeholder text has been added to the Insert menu. PR #1028.
|
||||
* Status and Importance flags can now be reorganised in Project Settings. Issue #1035. PR #1040.
|
||||
* It is now possible to create multiple Root Folders of the same kind. This makes it possible to
|
||||
add multiple Novel root folders in a project, for instance. Issue #967. PR #1031.
|
||||
* All documents can now be dragged and dropped anywhere in the project tree. The document layout
|
||||
may be converted in the process. PR #1031.
|
||||
* Documents in the project tree can now have other documents as child documents. Issue #1002.
|
||||
PR #1047.
|
||||
* Folders in the project tree that are not empty, can now be moved to trash. PR #1048.
|
||||
* Empty folders are deleted on request, and not moved to trash. Issue #1052. PR #1055.
|
||||
|
||||
**User Interface**
|
||||
|
||||
* The tabs under the project tree and to the right of the main window have been replaced with a
|
||||
toolbar on the left hand side. The toolbar has a set of buttons to change view between Project,
|
||||
Novel and Outline. The three buttons that were available under the project tree have been moved
|
||||
to the bottom of the new toolbar. Issue #1056. PR #1057.
|
||||
* When a document changes from a project document to a note, and back again, the Status flag
|
||||
setting is preserved. Previously, the Importance setting would overwrite it during the
|
||||
conversion. PR #1030.
|
||||
* Item labels, Status labels, and other labels on the GUI are now run through a "simplify" function
|
||||
before being accepted. This functions strips out all whitespaces and consecutive whitespaces and
|
||||
replace them with single plain whitespaces. This is a safer format to store in XML, and also
|
||||
makes sure there aren't invisible characters floating around in the labels. PR #1038.
|
||||
* Due to the changes to how drag and drop works, there are no longer any restrictions on folders
|
||||
and documents. Only root folders remain restricted in terms of moving. Root folders can only be
|
||||
reordered with the Move Up and Move Down commands. PR #1047.
|
||||
* The label for the highlighting of redundant spaces in the Preferences dialog has been updated to
|
||||
better reflect what it does. Issue #1043. PR #1046.
|
||||
* The New Project Wizard will now try to check if the path selected for the new project can
|
||||
actually be used before letting the user proceed to the next page. Issue #1058. PR #1062.
|
||||
|
||||
**Internationalisation**
|
||||
|
||||
* Dutch translations have been added by Martijn van der Kleijn (@mvdkleijn). PR #1027.
|
||||
|
||||
**Functionality**
|
||||
|
||||
* Documents that are missing in the project index when a project is opened are automatically
|
||||
re-indexed. This also handles cases where the cached index is missing. PR #1039.
|
||||
|
||||
**Installation and Packaging**
|
||||
|
||||
* Python 3.6 is no longer supported. PR #1004.
|
||||
* Ubuntu 18.04 packages will no longer be released, due to dropping Python 3.6. Issue #1005.
|
||||
PR #1014.
|
||||
|
||||
**Project File Format**
|
||||
|
||||
* The item nodes in the content section of the main project XML file have been compacted. It now
|
||||
consists of a main item node and meta and a name node. All settings have been made attributes of
|
||||
one of these three nodes, except the item label which is the text value of the name node. The
|
||||
file format version has been bumped to 1.4. Issue #995. PR #993.
|
||||
* Both Importance and Status flag values are now saved to the project file. This means if a
|
||||
document changes layout, the value is no longer lost. PR #1030.
|
||||
|
||||
**Code Improvements**
|
||||
|
||||
* The linting settings have been updated to select between mutually exclusive options in
|
||||
pycodestyle. PR #1014.
|
||||
* The Tokenizer class has been converted to an abstract base class. PR #1026.
|
||||
* The class handling Status and Importance flags has been completely rewritten. The flags are now
|
||||
handled using a unique random key as reference rather than relying on the text of the label
|
||||
itself. This makes it a lot easier to rename them as there is no need to update project items.
|
||||
PR #1034.
|
||||
* Many of the decisions regarding where items are allowed to belong has been delegated to the
|
||||
NWItem class that holds the item. Some is also handled by the NWTree class that holds the project
|
||||
tree. A new maintenance function in the NWTree class will also ensure that the meta data of an
|
||||
item is correct and up to date. This is especially important after an item has been moved, but is
|
||||
also checked when items are initially loaded. PRs #1031 and #1054.
|
||||
* Item handles are now generated using the standard library random number generator. The new
|
||||
handles have the same format as the old algorithm, so they are compatible. PR #1044.
|
||||
|
||||
----
|
||||
|
||||
## Version 1.6.6 [2022-10-25]
|
||||
|
||||
### Release Notes
|
||||
|
||||
@@ -2,75 +2,131 @@
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||
identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall
|
||||
community
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||
any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Publishing others' private information, such as a physical or email address,
|
||||
without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project leader at issues (at) novelwriter.io. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
reported to the community leaders responsible for enforcement at issues (at)
|
||||
novelwriter.io. All complaints will be reviewed and investigated promptly and
|
||||
fairly.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of
|
||||
actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||
community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.1, available at
|
||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
Community Impact Guidelines were inspired by
|
||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||
[https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
https://www.contributor-covenant.org/faq
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
|
||||
@@ -11,11 +11,14 @@
|
||||
|
||||
## Translations
|
||||
|
||||
The default language is English (UK) with English (US) as an option.
|
||||
|
||||
* Dutch: Martijn van der Kleijn (@mvdkleijn)
|
||||
* French: Jan Lüdke (@jyhelle)
|
||||
* Latin American Spanish: Tommy Marplatt (@tmarplatt)
|
||||
* Norwegian: Veronica Berglyd Olsen (@vkbo)
|
||||
* Portuguese: Bruno Meneguello (@bkmeneguello)
|
||||
* Simplified Chinese: Qianzhi Long (@longqzh)
|
||||
* Latin American Spanish: Tommy Marplatt (@tmarplatt)
|
||||
|
||||
## Libraries
|
||||
|
||||
@@ -31,7 +34,7 @@ The following libraries are dependencies of novelWriter:
|
||||
|
||||
Some of the assets bundled with novelWriter were adapted from the following sources:
|
||||
|
||||
* Typicons icons by Stephen Hutchings (CC BY-SA 4.0)
|
||||
* Typicons icons by [Stephen Hutchings](https://github.com/stephenhutchings/typicons.font) (CC BY-SA 4.0)
|
||||
* Tomorrow syntax themes by Chris Kempson (MIT License)
|
||||
* Owl syntax themes by Sarah Drasner (MIT License)
|
||||
* Solarized themes by Ethan Schoonover, added by @nullbasis (MIT License)
|
||||
|
||||
@@ -29,11 +29,13 @@ The full documentation is available at
|
||||
The full credits are listed in
|
||||
[CREDITS.md](https://github.com/vkbo/novelWriter/blob/main/CREDITS.md).
|
||||
|
||||
You can also follow novelWriter on Mastodon at [fosstodon.org/@novelwriter](https://fosstodon.org/@novelwriter).
|
||||
|
||||
## Implementation
|
||||
|
||||
The application is written in Python 3 (3.6+) using Qt5 and PyQt5 (5.3+). It is developed on Linux,
|
||||
but should in principle work fine on other operating systems as well as long as dependencies are
|
||||
met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS.
|
||||
The application is written with Python 3 (3.7+) using Qt5 and PyQt5 (5.10+). It is developed on
|
||||
Linux, but should in principle work fine on other operating systems as well as long as dependencies
|
||||
are met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS.
|
||||
|
||||
## Installation
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 423 KiB After Width: | Height: | Size: 534 KiB |
|
Before Width: | Height: | Size: 431 KiB After Width: | Height: | Size: 539 KiB |
|
Before Width: | Height: | Size: 286 KiB After Width: | Height: | Size: 379 KiB |
@@ -39,11 +39,13 @@ too. novelWriter can be run directly from the Python source, installed from the
|
||||
|
||||
* Website: https://novelwriter.io
|
||||
* Documentation: https://novelwriter.readthedocs.io
|
||||
* Internationalisation: https://crowdin.com/project/novelwriter
|
||||
* Source Code: https://github.com/vkbo/novelWriter
|
||||
* Source Releases: https://github.com/vkbo/novelWriter/releases
|
||||
* Issue Tracker: https://github.com/vkbo/novelWriter/issues
|
||||
* Feature Discussions: https://github.com/vkbo/novelWriter/discussions
|
||||
* PyPi Project: https://pypi.org/project/novelWriter
|
||||
* Social Media: https://fosstodon.org/@novelwriter
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
@@ -71,5 +71,5 @@ On Windows, file extensions may not be visible by default, so make sure you only
|
||||
extension, and don't end up with two.
|
||||
|
||||
The QSS files are Qt Style Sheet files. See Qt's
|
||||
`The Style Sheet Syntax <https://doc.qt.io/qt-5/stylesheet-syntax.html>`_` documentation for more
|
||||
`The Style Sheet Syntax <https://doc.qt.io/qt-5/stylesheet-syntax.html>`_ documentation for more
|
||||
details.
|
||||
|
||||
@@ -34,7 +34,7 @@ The following Python packages are needed to run novelWriter:
|
||||
* ``lxml`` – needed for full XML support.
|
||||
* ``PyEnchant`` – needed for spell checking (optional).
|
||||
|
||||
PyQt/Qt should be at least 5.3, but ideally 5.10 or higher for nearly all features to work. For
|
||||
PyQt/Qt should be at least 5.10, but ideally 5.13 or higher for nearly all features to work. For
|
||||
instance, searching using regular expressions with full Unicode support requires 5.13. There is no
|
||||
known minimum version requirement for package ``lxml``, but the code was originally written with
|
||||
4.2, which is therefore set as the minimum. It may work on lower versions. You have to test it.
|
||||
|
||||
@@ -115,7 +115,7 @@ Windows
|
||||
-------
|
||||
|
||||
First, make sure you have Python installed on your system. If you don't, you can download it from
|
||||
`python.org`_. Python 3.6 or higher is required, but it is recommended that you install the latest
|
||||
`python.org`_. Python 3.7 or higher is required, but it is recommended that you install the latest
|
||||
version.
|
||||
|
||||
Make sure you select the "Add Python to PATH" option during installation, otherwise the ``python``
|
||||
|
||||
@@ -40,8 +40,7 @@ Application Data
|
||||
|
||||
novelWriter also stores a bit of data that is generated by the user's actions. This includes the
|
||||
list of recent projects form the :guilabel:`Open Project` dialog. Custom themes are also saved
|
||||
here. The system paths are provided by the Qt QStandardPaths_ class and its AppDataLocation value
|
||||
on Qt 5.4 or greater, or DataLocation for earlier versions.
|
||||
here. The system paths are provided by the Qt QStandardPaths_ class and its AppDataLocation.
|
||||
|
||||
The standard paths are:
|
||||
|
||||
|
||||
@@ -11,13 +11,32 @@ changes require minor actions from the user.
|
||||
The key changes in the formats are listed below, as well as the user actions required where
|
||||
applicable.
|
||||
|
||||
.. caution::
|
||||
|
||||
When you update a project from one format version to the next, the project can no longer be
|
||||
opened by a version of novelWriter prior to the version where the new file format was
|
||||
introduced. You will get a notification about any updates to your project file format and will
|
||||
have the option to decline the upgrade.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_4:
|
||||
|
||||
Format 1.4 Changes
|
||||
==================
|
||||
|
||||
This project format was introduced in novelWriter version 1.7.
|
||||
|
||||
This format changes the way project items (folders, documents and notes) are stored. It is a more
|
||||
compact format that is simpler and faster to parse, and easier to extend. The conversion is done
|
||||
automatically the first time a project is loaded. No user action is required.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_3:
|
||||
|
||||
Format 1.3 Changes
|
||||
==================
|
||||
|
||||
This project format vas introduces in novelWriter version 1.5.
|
||||
This project format was introduced in novelWriter version 1.5.
|
||||
|
||||
With this format, the number of document layouts was reduced from 8 to 2. The conversion of
|
||||
document layouts is performed automatically when the project is opened.
|
||||
@@ -55,7 +74,7 @@ should be used only a few places in any given project. These are as follows:
|
||||
Format 1.2 Changes
|
||||
==================
|
||||
|
||||
This project format was introduces in novelWriter version 0.10.
|
||||
This project format was introduced in novelWriter version 0.10.
|
||||
|
||||
With this format, the way auto-replace entries were stored in the main project XML file changed.
|
||||
Opening an old project automatically converts the storage format up to and including version 1.1.1.
|
||||
@@ -69,7 +88,7 @@ auto-replace is not being used, can still be opened in novelWriter as of version
|
||||
Format 1.1 Changes
|
||||
==================
|
||||
|
||||
This project format was introduces in novelWriter version 0.7.
|
||||
This project format was introduced in novelWriter version 0.7.
|
||||
|
||||
With this format, the ``content`` folder was introduced in the project storage. Previously, all
|
||||
novelWriter documents were saved in a series of folders numbered from ``data_0`` to ``data_f``.
|
||||
|
||||
@@ -25,7 +25,7 @@ The main shorcuts are as follows:
|
||||
":kbd:`Alt`:kbd:`4`", "Switch focus to outline view. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`4`."
|
||||
":kbd:`Alt`:kbd:`Left`", "Move backward in the view history of the document viewer."
|
||||
":kbd:`Alt`:kbd:`Right`", "Move forward in the view history of the document viewer."
|
||||
":kbd:`Ctrl`:kbd:`.`", "Open menu to correct word under cursor."
|
||||
":kbd:`Ctrl`:kbd:`.`", "Open the context menu in the project tree or the document editor."
|
||||
":kbd:`Ctrl`:kbd:`,`", "Open the :guilabel:`Preferences` dialog."
|
||||
":kbd:`Ctrl`:kbd:`/`", "Toggle block format as comment."
|
||||
":kbd:`Ctrl`:kbd:`0`", "Remove block formatting for block under cursor."
|
||||
@@ -42,13 +42,13 @@ The main shorcuts are as follows:
|
||||
":kbd:`Ctrl`:kbd:`B`", "Format selected text, or word under cursor, with strong emphasis (bold)."
|
||||
":kbd:`Ctrl`:kbd:`C`", "Copy selected text to clipboard."
|
||||
":kbd:`Ctrl`:kbd:`D`", "Strikethrough selected text, or word under cursor."
|
||||
":kbd:`Ctrl`:kbd:`E`", "If in the project tree, edit a document or folder settings."
|
||||
":kbd:`Ctrl`:kbd:`F`", "Open the search bar and search for the selected word, if any is selected."
|
||||
":kbd:`Ctrl`:kbd:`G`", "Find next occurrence of search word in current document."
|
||||
":kbd:`Ctrl`:kbd:`H`", "Open the search and replace bar and search for the selected word, if any is selected. (On Mac, this is :kbd:`Cmd`:kbd:`=`.)"
|
||||
":kbd:`Ctrl`:kbd:`I`", "Format selected text, or word under cursor, with emphasis (italic)."
|
||||
":kbd:`Ctrl`:kbd:`K`", "Activate the insert commands. The commands are listed in :ref:`a_kb_ins`."
|
||||
":kbd:`Ctrl`:kbd:`N`", "Create new document."
|
||||
":kbd:`Ctrl`:kbd:`L`", "Open the :guilabel:`Quick Links` menu in the Project Tree."
|
||||
":kbd:`Ctrl`:kbd:`N`", "Create new project item."
|
||||
":kbd:`Ctrl`:kbd:`O`", "Open selected document."
|
||||
":kbd:`Ctrl`:kbd:`Q`", "Exit novelWriter."
|
||||
":kbd:`Ctrl`:kbd:`R`", "If in the project tree, open a document for viewing. If the editor has focus, open current document for viewing."
|
||||
@@ -59,7 +59,6 @@ The main shorcuts are as follows:
|
||||
":kbd:`Ctrl`:kbd:`Y`", "Redo latest undo."
|
||||
":kbd:`Ctrl`:kbd:`Z`", "Undo latest changes."
|
||||
":kbd:`Ctrl`:kbd:`F7`", "Toggle spell checking."
|
||||
":kbd:`Ctrl`:kbd:`F10`", "Toggle automatic updating of project outline."
|
||||
":kbd:`Ctrl`:kbd:`Up`", "Move item one step up in the project tree."
|
||||
":kbd:`Ctrl`:kbd:`Down`", "Move item one step down in the project tree."
|
||||
":kbd:`Ctrl`:kbd:`Del`", "Delete next word in editor."
|
||||
@@ -73,7 +72,6 @@ The main shorcuts are as follows:
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`A`", "Select all text in current paragraph."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`G`", "Find previous occurrence of search word in current document."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`I`", "Import text to the current document from a text file."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`N`", "Create new folder."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`O`", "Open a project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`R`", "Close the document viewer."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`S`", "Save the current project."
|
||||
@@ -88,7 +86,6 @@ The main shorcuts are as follows:
|
||||
":kbd:`F7`", "Re-run spell checker."
|
||||
":kbd:`F8`", "Activate :guilabel:`Focus Mode`, hiding the project tree and document viewer."
|
||||
":kbd:`F9`", "Re-build the project index."
|
||||
":kbd:`F10`", "Re-build the project outline."
|
||||
":kbd:`F11`", "Activate full screen mode."
|
||||
":kbd:`Shift`:kbd:`F1`", "Open the local user manual (PDF) if it is available."
|
||||
":kbd:`Shift`:kbd:`F3`", "Find previous occurrence of search word in current document."
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
The maintenance of translations has been moved to the Crowdin service. The translation strings can
|
||||
be edited there at the [novelWriter project page](https://crowdin.com/project/novelwriter).
|
||||
However, please read the Translation Guidelines section below.
|
||||
|
||||
You can still use the manual approach listed below, and then upload the file through the website's
|
||||
interface. The translation strings for that language will then be updated and queued for approval.
|
||||
@@ -11,6 +12,22 @@ To verify a language file translated through the Crowdin tool, download and extr
|
||||
[Generate an Updated Translation File](#generate-an-updated-translation-file) below.
|
||||
|
||||
|
||||
# Translation Guidelines
|
||||
|
||||
When contributing translations, keep the following things in mind.
|
||||
|
||||
* For descriptive labels and dialog boxes, make sure you do _not_ change the meaning of the text
|
||||
when you translate it from English. The user must receive the same instructions or information
|
||||
regardless of language. This is improtant, otherwise the documentation will be inconsistent with
|
||||
the user interface and it will become a lot more difficult to handle user issues and questions.
|
||||
* If you think a label or description is misleading or incomplete, please file an issue report. The
|
||||
correct way to handle such changes is to change the text in the code first, which will then be
|
||||
forwarded to _all_ translators such that the GUI is consistent across all languages.
|
||||
* For very short labels, like button labels. it may be fine to replace the word with a similar
|
||||
word, but only as long as the user understands what it is supposed to do. Some buttons and tabs
|
||||
have limited space. If necessary, it is OK to use abbreviations.
|
||||
|
||||
|
||||
# Direct Approach Using Qt Linguist
|
||||
|
||||
Here you will find instructions for translating novelWriter to a new language directly using Qt
|
||||
|
||||
@@ -60,9 +60,9 @@ __license__ = "GPLv3"
|
||||
__author__ = "Veronica Berglyd Olsen"
|
||||
__maintainer__ = "Veronica Berglyd Olsen"
|
||||
__email__ = "code@vkbo.net"
|
||||
__version__ = "1.6.6"
|
||||
__hexversion__ = "0x010606f0"
|
||||
__date__ = "2022-10-25"
|
||||
__version__ = "2.0-rc1"
|
||||
__hexversion__ = "0x020000c1"
|
||||
__date__ = "2022-10-17"
|
||||
__status__ = "Stable"
|
||||
__domain__ = "novelwriter.io"
|
||||
__url__ = "https://novelwriter.io"
|
||||
@@ -72,32 +72,6 @@ __helpurl__ = "https://github.com/vkbo/novelWriter/discussions"
|
||||
__releaseurl__ = "https://github.com/vkbo/novelWriter/releases/latest"
|
||||
__docurl__ = "https://novelwriter.readthedocs.io"
|
||||
|
||||
##
|
||||
# Logging
|
||||
# =========
|
||||
# Standard used for logging levels in novelWriter:
|
||||
# CRITICAL Use for errors that result in termination of the program
|
||||
# ERROR Use when an action fails, but execution continues
|
||||
# WARNING When something unexpected, but non-critical happens
|
||||
# INFO Any useful user information like open, save, exit initiated
|
||||
# ----------- SPAM Threshold : Output above should be minimal -----------------
|
||||
# DEBUG Use for descriptions of main program flow
|
||||
# VERBOSE Use for outputting values and program flow details
|
||||
##
|
||||
|
||||
# Add verbose logging level
|
||||
VERBOSE = 5
|
||||
logging.addLevelName(VERBOSE, "VERBOSE")
|
||||
|
||||
|
||||
def logVerbose(self, message, *args, **kws):
|
||||
if self.isEnabledFor(VERBOSE):
|
||||
self._log(VERBOSE, message, args, **kws)
|
||||
|
||||
|
||||
logging.Logger.verbose = logVerbose
|
||||
|
||||
# Initiating logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -122,7 +96,6 @@ def main(sysArgs=None):
|
||||
"version",
|
||||
"info",
|
||||
"debug",
|
||||
"verbose",
|
||||
"style=",
|
||||
"config=",
|
||||
"data=",
|
||||
@@ -143,7 +116,6 @@ def main(sysArgs=None):
|
||||
" -v, --version Print program version and exit.\n"
|
||||
" --info Print additional runtime information.\n"
|
||||
" --debug Print debug output. Includes --info.\n"
|
||||
" --verbose Increase verbosity of debug output. Includes --debug.\n"
|
||||
" --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n"
|
||||
" --config= Alternative config file.\n"
|
||||
" --data= Alternative user data path.\n"
|
||||
@@ -181,9 +153,6 @@ def main(sysArgs=None):
|
||||
elif inOpt == "--debug":
|
||||
logLevel = logging.DEBUG
|
||||
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
|
||||
elif inOpt == "--verbose":
|
||||
logLevel = VERBOSE
|
||||
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
|
||||
elif inOpt == "--style":
|
||||
qtStyle = inArg
|
||||
elif inOpt == "--config":
|
||||
@@ -209,19 +178,19 @@ def main(sysArgs=None):
|
||||
# Check Packages and Versions
|
||||
errorData = []
|
||||
errorCode = 0
|
||||
if sys.hexversion < 0x030600f0:
|
||||
if sys.hexversion < 0x030700f0:
|
||||
errorData.append(
|
||||
"At least Python 3.6 is required, found %s" % CONFIG.verPyString
|
||||
"At least Python 3.7 is required, found %s" % CONFIG.verPyString
|
||||
)
|
||||
errorCode |= 0x04
|
||||
if CONFIG.verQtValue < 50300:
|
||||
if CONFIG.verQtValue < 51000:
|
||||
errorData.append(
|
||||
"At least Qt5 version 5.3 is required, found %s" % CONFIG.verQtString
|
||||
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
|
||||
)
|
||||
errorCode |= 0x08
|
||||
if CONFIG.verPyQtValue < 50300:
|
||||
if CONFIG.verPyQtValue < 51000:
|
||||
errorData.append(
|
||||
"At least PyQt5 version 5.3 is required, found %s" % CONFIG.verPyQtString
|
||||
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
|
||||
)
|
||||
errorCode |= 0x10
|
||||
|
||||
|
||||
@@ -2,104 +2,104 @@
|
||||
"Synopsis": "Synopsis",
|
||||
"Comment": "Opmerking",
|
||||
"Notes": "Notities",
|
||||
"0": "Nul",
|
||||
"1": "Één",
|
||||
"2": "Twee",
|
||||
"3": "Drie",
|
||||
"4": "Vier",
|
||||
"5": "Vijf",
|
||||
"6": "Zes",
|
||||
"7": "Zeven",
|
||||
"8": "Acht",
|
||||
"9": "Negen",
|
||||
"10": "Tien",
|
||||
"11": "Elf",
|
||||
"12": "Twaalf",
|
||||
"13": "Dertien",
|
||||
"14": "Veertien",
|
||||
"15": "Vijftien",
|
||||
"16": "Zestien",
|
||||
"17": "Zeventien",
|
||||
"18": "Achttien",
|
||||
"19": "Negentien",
|
||||
"20": "Twintig",
|
||||
"21": "Eenentwintig",
|
||||
"22": "Tweeentwintig",
|
||||
"23": "Drieentwintig",
|
||||
"24": "Vierentwintig",
|
||||
"25": "Vijfentwintig",
|
||||
"26": "Zesentwintig",
|
||||
"27": "Zevenentwintig",
|
||||
"28": "Achtentwintig",
|
||||
"29": "Negenentwintig",
|
||||
"30": "Dertig",
|
||||
"31": "Eenendertig",
|
||||
"32": "Tweeendertig",
|
||||
"33": "Drieendertig",
|
||||
"34": "Vierendertig",
|
||||
"35": "Vijfendertig",
|
||||
"36": "Zesendertig",
|
||||
"37": "Zevenendertig",
|
||||
"38": "Achtendertig",
|
||||
"39": "Negenendertig",
|
||||
"40": "Veertig",
|
||||
"41": "Eenenveertig",
|
||||
"42": "Tweeënveertig",
|
||||
"43": "Drieenveertig",
|
||||
"44": "Vierenveertig",
|
||||
"45": "Vijfenveertig",
|
||||
"46": "Zesenveertig",
|
||||
"47": "Zevenenveertig",
|
||||
"48": "Achtenveertig",
|
||||
"49": "Negenenveertig",
|
||||
"50": "Vijftig",
|
||||
"51": "Eenenvijftig",
|
||||
"52": "Tweeenvijftig",
|
||||
"53": "Drieenvijftig",
|
||||
"54": "Vierenvijftig",
|
||||
"55": "Vijfenvijftig",
|
||||
"56": "Zesenvijftig",
|
||||
"57": "Zevenenvijftig",
|
||||
"58": "Achtenvijftig",
|
||||
"59": "Negenenvijftig",
|
||||
"60": "Zestig",
|
||||
"61": "Eenenzestig",
|
||||
"62": "Tweeenzestig",
|
||||
"63": "Drieenzestig",
|
||||
"64": "Vierenzestig",
|
||||
"65": "Vijfenzestig",
|
||||
"66": "Zesenzestig",
|
||||
"67": "Zevenenzestig",
|
||||
"68": "Achtenzestig",
|
||||
"69": "Negenenzestig",
|
||||
"70": "Zeventig",
|
||||
"71": "Eenenzeventig",
|
||||
"72": "Tweeenzeventig",
|
||||
"73": "Drieenzeventig",
|
||||
"74": "Vierenzeventig",
|
||||
"75": "Vijfenzeventig",
|
||||
"76": "Zesenzeventig",
|
||||
"77": "Zevenenzeventig",
|
||||
"78": "Achtenzeventig",
|
||||
"79": "Negenenzeventig",
|
||||
"80": "Tachtig",
|
||||
"81": "Eenentachtig",
|
||||
"82": "Tweeentachtig",
|
||||
"83": "Drieentachtig",
|
||||
"84": "Vierentachtig",
|
||||
"85": "Vijfentachtig",
|
||||
"86": "Zesentachtig",
|
||||
"87": "Zevenentachtig",
|
||||
"88": "Achtentachtig",
|
||||
"89": "Negenentachtig",
|
||||
"90": "Negentig",
|
||||
"91": "Eenennegentig",
|
||||
"92": "Tweeennegentig",
|
||||
"93": "Drieennegentig",
|
||||
"94": "Vierennegentig",
|
||||
"95": "Vijfennegentig",
|
||||
"96": "Zesennegentig",
|
||||
"97": "Zevenennegentig",
|
||||
"98": "Achtennegentig",
|
||||
"99": "Negenennegentig"
|
||||
"0": "nul",
|
||||
"1": "één",
|
||||
"2": "twee",
|
||||
"3": "drie",
|
||||
"4": "vier",
|
||||
"5": "vijf",
|
||||
"6": "zes",
|
||||
"7": "zeven",
|
||||
"8": "acht",
|
||||
"9": "negen",
|
||||
"10": "tien",
|
||||
"11": "elf",
|
||||
"12": "twaalf",
|
||||
"13": "dertien",
|
||||
"14": "veertien",
|
||||
"15": "vijftien",
|
||||
"16": "zestien",
|
||||
"17": "zeventien",
|
||||
"18": "achttien",
|
||||
"19": "negentien",
|
||||
"20": "twintig",
|
||||
"21": "eenentwintig",
|
||||
"22": "tweeëntwintig",
|
||||
"23": "drieëntwintig",
|
||||
"24": "vierentwintig",
|
||||
"25": "vijfentwintig",
|
||||
"26": "zesentwintig",
|
||||
"27": "zevenentwintig",
|
||||
"28": "achtentwintig",
|
||||
"29": "negenentwintig",
|
||||
"30": "dertig",
|
||||
"31": "eenendertig",
|
||||
"32": "tweeëndertig",
|
||||
"33": "drieëndertig",
|
||||
"34": "vierendertig",
|
||||
"35": "vijfendertig",
|
||||
"36": "zesendertig",
|
||||
"37": "zevenendertig",
|
||||
"38": "achtendertig",
|
||||
"39": "negenendertig",
|
||||
"40": "veertig",
|
||||
"41": "eenenveertig",
|
||||
"42": "tweeënveertig",
|
||||
"43": "drieënveertig",
|
||||
"44": "vierenveertig",
|
||||
"45": "vijfenveertig",
|
||||
"46": "zesenveertig",
|
||||
"47": "zevenenveertig",
|
||||
"48": "achtenveertig",
|
||||
"49": "negenenveertig",
|
||||
"50": "vijftig",
|
||||
"51": "eenenvijftig",
|
||||
"52": "tweeënvijftig",
|
||||
"53": "drieënvijftig",
|
||||
"54": "vierenvijftig",
|
||||
"55": "vijfenvijftig",
|
||||
"56": "zesenvijftig",
|
||||
"57": "zevenenvijftig",
|
||||
"58": "achtenvijftig",
|
||||
"59": "negenenvijftig",
|
||||
"60": "zestig",
|
||||
"61": "eenenzestig",
|
||||
"62": "tweeënzestig",
|
||||
"63": "drieënzestig",
|
||||
"64": "vierenzestig",
|
||||
"65": "vijfenzestig",
|
||||
"66": "zesenzestig",
|
||||
"67": "zevenenzestig",
|
||||
"68": "achtenzestig",
|
||||
"69": "negenenzestig",
|
||||
"70": "zeventig",
|
||||
"71": "eenenzeventig",
|
||||
"72": "tweeënzeventig",
|
||||
"73": "drieënzeventig",
|
||||
"74": "vierenzeventig",
|
||||
"75": "vijfenzeventig",
|
||||
"76": "zesenzeventig",
|
||||
"77": "zevenenzeventig",
|
||||
"78": "achtenzeventig",
|
||||
"79": "negenenzeventig",
|
||||
"80": "tachtig",
|
||||
"81": "eenentachtig",
|
||||
"82": "tweeëntachtig",
|
||||
"83": "drieëntachtig",
|
||||
"84": "vierentachtig",
|
||||
"85": "vijfentachtig",
|
||||
"86": "zesentachtig",
|
||||
"87": "zevenentachtig",
|
||||
"88": "achtentachtig",
|
||||
"89": "negenentachtig",
|
||||
"90": "negentig",
|
||||
"91": "eenennegentig",
|
||||
"92": "tweeënnegentig",
|
||||
"93": "drieënnegentig",
|
||||
"94": "vierennegentig",
|
||||
"95": "vijfennegentig",
|
||||
"96": "zesennegentig",
|
||||
"97": "zevenennegentig",
|
||||
"98": "achtennegentig",
|
||||
"99": "negenennegentig"
|
||||
}
|
||||
|
||||
@@ -18,10 +18,10 @@ licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[Map]
|
||||
add = typ_plus.svg
|
||||
backward = typ_chevron-left.svg
|
||||
bookmark = typ_bookmark.svg
|
||||
bullet-off = typ_media-record-outline.svg
|
||||
bullet-on = typ_media-record.svg
|
||||
check = typ_tick.svg
|
||||
clear = typ_backspace.svg
|
||||
close = typ_times.svg
|
||||
cls_archive = typ_delete.svg
|
||||
cls_character = typ_user.svg
|
||||
@@ -35,28 +35,24 @@ cls_timeline = typ_calendar.svg
|
||||
cls_trash = typ_trash.svg
|
||||
cls_world = typ_location.svg
|
||||
cross = typ_times.svg
|
||||
delete = typ_delete.svg
|
||||
doc_h0 = mixed_heading0.svg
|
||||
doc_h1 = mixed_heading1.svg
|
||||
doc_h2 = mixed_heading2.svg
|
||||
doc_h3 = mixed_heading3.svg
|
||||
doc_h4 = mixed_heading4.svg
|
||||
done = typ_input-checked.svg
|
||||
down = typ_chevron-down.svg
|
||||
edit = typ_pencil.svg
|
||||
forward = typ_chevron-right.svg
|
||||
hash = typ_hash.svg
|
||||
maximise = typ_arrow-maximise.svg
|
||||
menu = typ_th-menu.svg
|
||||
minimise = typ_arrow-minimise.svg
|
||||
proj_chapter = mixed_document-chapter.svg
|
||||
proj_details = typ_th-list-grey.svg
|
||||
proj_document = typ_document-text.svg
|
||||
proj_folder = typ_folder.svg
|
||||
proj_note = mixed_document-note.svg
|
||||
proj_section = mixed_document-section.svg
|
||||
proj_scene = mixed_document-scene.svg
|
||||
proj_stats = typ_chart-bar-grey.svg
|
||||
proj_title = mixed_document-title.svg
|
||||
reference = typ_at.svg
|
||||
refresh = typ_refresh.svg
|
||||
remove = typ_minus.svg
|
||||
save = typ_download.svg
|
||||
search = typ_search.svg
|
||||
search_cancel = typ_cancel-grey.svg
|
||||
search_case = nw_search-case.svg
|
||||
@@ -74,3 +70,15 @@ status_stats = typ_chart-bar-grey.svg
|
||||
status_time = typ_stopwatch-grey.svg
|
||||
sticky-off = typ_pin-outline.svg
|
||||
sticky-on = typ_pin.svg
|
||||
up = typ_chevron-up.svg
|
||||
view_build = typ_export.svg
|
||||
view_editor = mixed_edit.svg
|
||||
view_novel = typ_book-grey.svg
|
||||
view_outline = typ_puzzle-outline.svg
|
||||
|
||||
deco_doc_h0 = nw_deco-h0.svg
|
||||
deco_doc_h1 = nw_deco-h1.svg
|
||||
deco_doc_h2 = nw_deco-h2.svg
|
||||
deco_doc_h3 = nw_deco-h3.svg
|
||||
deco_doc_h4 = nw_deco-h4.svg
|
||||
deco_doc_more = nw_deco-noveltree-more.svg
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#999999;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg7536"
|
||||
sodipodi:docname="mixed_edit.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<sodipodi:namedview
|
||||
id="namedview1259"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:pageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="34.625"
|
||||
inkscape:cx="8.7364621"
|
||||
inkscape:cy="11.98556"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1330"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7536" />
|
||||
<metadata
|
||||
id="metadata7542">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7540" />
|
||||
<path
|
||||
id="path7534"
|
||||
style="display:inline;fill:#aeaeae;fill-opacity:1;stroke-width:1.10527"
|
||||
d="M 19.160156 0 C 18.73463 0 18.312122 0.160533 17.988281 0.484375 L 14.052734 4.421875 L 4.1054688 4.421875 C 3.4953635 4.421875 3 4.9141801 3 5.5253906 L 3 17.037109 L 3 18.429688 L 3 22.894531 C 3 23.505741 3.4953635 24 4.1054688 24 L 18.474609 24 C 19.084713 24 19.578125 23.505741 19.578125 22.894531 L 19.578125 18.429688 L 19.578125 17.037109 L 19.578125 9.9472656 L 23.515625 6.0117188 C 23.839466 5.6878766 24 5.2623116 24 4.8378906 C 24 4.4134695 23.839466 3.9918109 23.515625 3.6679688 L 20.332031 0.484375 C 20.008189 0.160533 19.584576 0 19.160156 0 z M 19.160156 2.4394531 L 21.560547 4.8398438 L 20.130859 6.2695312 L 17.730469 3.8691406 L 19.160156 2.4394531 z M 16.949219 4.6503906 L 19.349609 7.0507812 L 12.394531 14.005859 L 9.9941406 11.605469 L 16.949219 4.6503906 z M 5.2109375 6.6308594 L 11.841797 6.6308594 L 8.328125 10.146484 C 8.0042828 10.470327 7.7997073 11.043101 7.6328125 11.570312 C 7.4559704 12.122943 7.421875 12.737735 7.421875 13.195312 L 7.421875 16.578125 L 10.804688 16.578125 C 11.262267 16.578125 12.02928 16.467813 12.541016 16.257812 C 13.053858 16.047812 13.530778 15.874623 13.853516 15.550781 L 17.369141 12.158203 L 17.369141 17.037109 L 17.369141 18.429688 L 17.369141 21.789062 L 5.2109375 21.789062 L 5.2109375 18.429688 L 5.2109375 17.037109 L 5.2109375 6.6308594 z M 9.5644531 12.525391 L 11.505859 14.435547 L 9.6308594 14.369141 L 9.5644531 12.525391 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@@ -1,37 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2469"
|
||||
cx="19.470242"
|
||||
cy="9.4077778"
|
||||
r="2.2222221" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,49 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2469"
|
||||
cx="19.470242"
|
||||
cy="9.4077778"
|
||||
r="2.2222221" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="14.592222"
|
||||
cx="19.470242"
|
||||
id="circle2471"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<g
|
||||
transform="matrix(1.1111111,0,0,1.1111111,-1.3333334,-1.3333332)"
|
||||
id="g2616">
|
||||
<path
|
||||
d="m 4.029904,3.7531206 c -1.0041608,1.0041608 -1.0041608,2.6319041 0,3.6360649 L 8.6392724,11.999839 4.029904,16.610493 c -1.0041608,1.004161 -1.0041608,2.631904 0,3.636065 C 4.5313415,20.749281 5.189639,21 5.8479364,21 c 0.658298,0 1.316595,-0.250719 1.818033,-0.753442 L 15.913973,11.999839 7.6659694,3.7531206 c -1.002876,-1.0041608 -2.6331904,-1.0041608 -3.6360654,0 z"
|
||||
id="path1895"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.28573728" />
|
||||
<circle
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path2467"
|
||||
cx="18.723217"
|
||||
cy="5"
|
||||
r="2" />
|
||||
<circle
|
||||
r="2"
|
||||
cy="9.6669998"
|
||||
cx="18.723217"
|
||||
id="circle2469"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2471"
|
||||
cx="18.723217"
|
||||
cy="14.333"
|
||||
r="2" />
|
||||
<circle
|
||||
r="2"
|
||||
cy="19"
|
||||
cx="18.723217"
|
||||
id="circle2473"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="4"
|
||||
height="24"
|
||||
viewBox="0 0 4 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#848484;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="0"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 902 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="4"
|
||||
height="24"
|
||||
viewBox="0 0 4 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#99cc99;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="0"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 902 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="20"
|
||||
height="24"
|
||||
viewBox="0 0 20 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#d64848;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="16"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="36"
|
||||
height="24"
|
||||
viewBox="0 0 36 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="32"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="52"
|
||||
height="24"
|
||||
viewBox="0 0 52 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="48"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
d="M 9.7,18.2 16,12 9.7,5.8 C 9.5,5.6 9.2,5.5 9,5.5 8.8,5.5 8.5,5.6 8.3,5.8 8.1,6 8,6.2 8,6.5 v 11 c 0,0.3 0.1,0.5 0.3,0.7 0.2,0.2 0.5,0.3 0.7,0.3 0.2,0 0.5,-0.1 0.7,-0.3 z"
|
||||
id="path3096"
|
||||
style="fill:#848484;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 928 B |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg13156">
|
||||
<metadata
|
||||
id="metadata13162">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs13160" />
|
||||
<path
|
||||
d="M 19.496214,4.4886395 H 9.4810665 c -1.2679176,0 -2.8382927,0.8082224 -3.5754075,1.8397825 L 3.2917056,9.9869555 2.0908895,11.668499 c -0.1211833,0.175265 -0.1221848,0.492744 0.003,0.665006 l 1.1897995,1.66652 2.622967,3.672554 c 0.7361133,1.030558 2.3054869,1.838782 3.574406,1.838782 H 19.496214 C 20.877302,19.511361 22,18.387661 22,17.007573 V 6.9924263 C 22,5.612339 20.877302,4.4886395 19.496214,4.4886395 Z M 17.19974,14.296473 c 0.391593,0.391592 0.391593,1.02455 0,1.416141 -0.195295,0.195296 -0.451683,0.293445 -0.70807,0.293445 -0.256388,0 -0.512776,-0.09815 -0.708071,-0.293445 l -2.296474,-2.296473 -2.296473,2.296473 c -0.195295,0.195296 -0.451683,0.293445 -0.708071,0.293445 -0.256388,0 -0.512775,-0.09815 -0.7080706,-0.293445 -0.3915923,-0.391591 -0.3915923,-1.024549 0,-1.416141 L 12.070984,12 9.7745104,9.7035265 c -0.3915923,-0.3915921 -0.3915923,-1.0245494 0,-1.4161417 0.3915926,-0.3915922 1.0245496,-0.3915922 1.4161416,0 l 2.296473,2.2964732 2.296474,-2.2964732 c 0.391592,-0.3915922 1.024549,-0.3915922 1.416141,0 0.391593,0.3915923 0.391593,1.0245496 0,1.4161417 L 14.903267,12 Z"
|
||||
id="path13154"
|
||||
style="stroke-width:1.00151;fill:#d64848;fill-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg8707">
|
||||
<metadata
|
||||
id="metadata8713">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8711" />
|
||||
<path
|
||||
d="M 20,0 H 5.3333333 C 4.98,0 4.64,0.14 4.3906667,0.3906667 l -4,4 -0.076,0.082667 c -0.1853334,0.22 -0.3,0.4973334 -0.3133334,0.8 L 0,5.344 V 20 c 0,2.205333 1.7946667,4 4,4 h 12 c 1.738667,0 3.221333,-1.114667 3.772,-2.666667 h 0.894667 c 1.869333,0 3.333333,-1.756 3.333333,-4 V 4 C 24,1.7946667 22.205333,0 20,0 Z M 4,21.333333 C 3.2653333,21.333333 2.6666667,20.736 2.6666667,20 V 6.6666667 H 5.3333333 V 21.333333 Z M 17.333333,20 c 0,0.736 -0.598666,1.333333 -1.333333,1.333333 H 6.6666667 V 6.6666667 H 16 C 16.734667,6.6666667 17.333333,7.264 17.333333,8 Z m 4,-2.666667 c 0,0.826667 -0.432,1.333334 -0.666666,1.333334 H 20 V 8 C 20,5.7946667 18.205333,4 16,4 H 4.552 L 5.8853333,2.6666667 H 20 C 20.734667,2.6666667 21.333333,3.264 21.333333,4 Z"
|
||||
id="path8705"
|
||||
style="stroke-width:1.33333;fill:#aeaeae;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -9,9 +9,9 @@
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2608">
|
||||
id="svg901">
|
||||
<metadata
|
||||
id="metadata2614">
|
||||
id="metadata907">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
@@ -23,9 +23,9 @@
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2612" />
|
||||
id="defs905" />
|
||||
<path
|
||||
d="M 16.203226,2 H 7.796774 C 6.05874,2 4.6443545,3.4143855 4.6443545,5.1524195 V 19.86371 c 0,0.540115 0.1092839,0.994063 0.3236484,1.350287 0.5926549,0.982504 1.9072138,1.059213 2.9559187,0.0084 L 11.25708,17.889239 c 0.394052,-0.393002 1.091787,-0.393002 1.485841,0 l 3.333158,3.333158 C 16.592024,21.738349 17.128987,22 17.673304,22 c 0.837492,0 1.682342,-0.660957 1.682342,-2.13629 V 5.1524195 C 19.355646,3.4143855 17.941259,2 16.203226,2 Z M 7.796774,4.101613 h 8.406452 c 0.578994,0 1.050806,0.4718121 1.050806,1.0508065 V 15.560658 l -2.575527,-2.361162 c -1.477434,-1.35449 -3.880628,-1.353439 -5.3580615,0 l -2.574476,2.361162 V 5.1524195 c 0,-0.5789944 0.4718121,-1.0508065 1.0508065,-1.0508065 z m 6.431987,12.301792 C 13.635055,15.809699 12.843798,15.482898 12,15.482898 c -0.843797,0 -1.635054,0.327852 -2.2287605,0.920507 l -3.025272,3.025272 v -2.442075 l 3.2848215,-3.011611 c 1.085483,-0.995114 2.851889,-0.995114 3.937372,0 l 3.285871,3.011611 v 2.442075 z"
|
||||
id="path2606"
|
||||
style="stroke-width:1.05081;fill:#6699cc;fill-opacity:1" />
|
||||
id="path899"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.05081" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -5,13 +5,13 @@
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
id="svg8980"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
id="metadata8986">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
@@ -23,9 +23,9 @@
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
id="defs8984" />
|
||||
<path
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.28574"
|
||||
id="path8978"
|
||||
d="m 3.7531209,6.4345258 c -1.004161,1.002875 -1.004161,2.63319 0,3.6360652 l 8.2467181,8.248004 8.246719,-8.248004 C 20.749281,9.5691528 21,8.9108558 21,8.2525578 c 0,-0.658297 -0.250719,-1.316595 -0.753442,-1.818032 -1.004161,-1.004161 -2.631904,-1.004161 -3.636065,0 L 11.999839,11.043894 7.3891859,6.4345258 c -1.004161,-1.004161 -2.631905,-1.004161 -3.636065,0 z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -5,13 +5,13 @@
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
id="svg8980"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
id="metadata8986">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
@@ -23,9 +23,9 @@
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
id="defs8984" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:1.28574"
|
||||
id="path8978"
|
||||
d="m 20.246879,17.565474 c 1.004161,-1.002875 1.004161,-2.63319 0,-3.636065 L 12.000161,5.6814052 3.7534421,13.929409 c -0.502723,0.501438 -0.753442,1.159735 -0.753442,1.818033 0,0.658297 0.250719,1.316595 0.753442,1.818032 1.004161,1.004161 2.631904,1.004161 3.636065,0 l 4.6106539,-4.609368 4.610653,4.609368 c 1.004161,1.004161 2.631905,1.004161 3.636065,0 z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg13801">
|
||||
<metadata
|
||||
id="metadata13807">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs13805" />
|
||||
<path
|
||||
style="display:inline;fill:#cda66f;fill-opacity:1"
|
||||
id="path6288"
|
||||
d="m 20.987,16 c 0,-0.105 -0.004,-0.211 -0.039,-0.316 l -2,-6 C 18.812,9.275 18.431,9 18,9 h -0.219 c -0.094,0.188 -0.21,0.368 -0.367,0.525 L 15.932,11 h 1.348 l 1.667,5 H 5.054 L 6.721,11 H 8.069 L 6.586,9.525 C 6.429,9.368 6.312,9.188 6.219,9 H 6 C 5.569,9 5.188,9.275 5.052,9.684 l -2,6 C 3.017,15.789 3.013,15.895 3.013,16 3,16 3,21 3,21 c 0,0.553 0.447,1 1,1 h 16 c 0.553,0 1,-0.447 1,-1 0,0 0,-5 -0.013,-5 z" />
|
||||
<path
|
||||
d="M 16.707,7.404 C 16.518,7.216 16.259,7.121 16,7.121 c -0.259,0 -0.518,0.095 -0.707,0.283 L 13,9.697 V 3 C 13,2.448 12.552,2 12,2 11.448,2 11,2.448 11,3 V 9.697 L 8.707,7.404 C 8.518,7.216 8.267,7.111 8,7.111 c -0.267,0 -0.518,0.105 -0.707,0.293 -0.39,0.39 -0.39,1.024 0,1.414 L 12,13.5 16.709,8.816 C 17.097,8.429 17.097,7.794 16.707,7.404 Z"
|
||||
id="path13799"
|
||||
style="display:inline;fill:#99cc99;fill-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg1169"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1173" />
|
||||
<path
|
||||
d="M 6.8888889,16.888889 V 17.5 c 2.0667778,-3.150889 4.4000001,-4.831444 7.3333331,-4.888889 v 3.666666 c 0,0.673444 0.624556,1.222223 1.397,1.222223 0.444889,0 0.825,-0.193112 1.079223,-0.477889 C 19.061,14.542222 24,9.5555555 24,9.5555555 c 0,0 -4.939,-4.9891115 -7.302778,-7.5007781 -0.254222,-0.2505555 -0.633111,-0.4436667 -1.078,-0.4436667 -0.772444,0 -1.397,0.5463333 -1.397,1.2222222 v 3.6666667 c -5.6955553,0 -7.3333331,5.9534434 -7.3333331,10.3888894 z m -3.6666667,5.5 H 20.333333 c 0.675889,0 1.222222,-0.547557 1.222222,-1.222223 V 13.77711 c -0.811555,0.826222 -1.66711,1.702555 -2.444444,2.501889 v 3.665444 H 4.4444445 V 5.2777775 H 13 V 2.833333 H 3.2222222 C 2.5463333,2.833333 2,3.3808886 2,4.0555552 V 21.166666 c 0,0.674666 0.5463333,1.222223 1.2222222,1.222223 z"
|
||||
id="path1167"
|
||||
style="stroke-width:1.22222;fill:#aeaeae;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg3369">
|
||||
<metadata
|
||||
id="metadata3375">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3373" />
|
||||
<path
|
||||
d="m 10.828125,20 h -4 c -0.553,0 -1,0.447 -1,1 0,0.553 0.447,1 1,1 h 10 c 0.553,0 1,-0.447 1,-1 0,-0.553 -0.447,-1 -1,-1 h -4 v -1.23 c 1.64,-0.371 3.146,-1.188 4.363,-2.406 1.7,-1.7 2.637,-3.96 2.637,-6.364 0,-2.067 -0.692,-4.029 -1.968,-5.619 l 0.675,-0.673 c 0.391,-0.391 0.391,-1.023 10e-4,-1.415 -0.391,-0.391 -1.024,-0.39 -1.415,-0.001 l -2.052,2.049 0.708,0.708 c 1.322,1.322 2.051,3.081 2.051,4.951 0,1.87 -0.729,3.627 -2.051,4.949 -1.322,1.322 -3.079,2.051 -4.949,2.051 -1.87,0 -3.627,-0.729 -4.949,-2.051 -0.391,-0.391 -1.023,-0.391 -1.414,0 -0.391,0.39 -0.391,1.023 0,1.414 1.699,1.7 3.959,2.637 6.363,2.637 z m 0,-16 c 1.657,0 3.157,0.672 4.243,1.757 1.085,1.086 1.757,2.586 1.757,4.243 0,1.656 -0.672,3.156 -1.757,4.242 -1.086,1.086 -2.586,1.758 -4.243,1.758 -1.658,0 -3.157,-0.672 -4.242,-1.757 -1.085,-1.086 -1.756,-2.586 -1.756,-4.243 0,-1.657 0.671,-3.157 1.756,-4.243 1.085,-1.085 2.584,-1.757 4.242,-1.757 z"
|
||||
id="path3367"
|
||||
style="fill:#aeaeae;fill-opacity:1;stroke-width:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg5204">
|
||||
<metadata
|
||||
id="metadata5210">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs5208" />
|
||||
<path
|
||||
id="rect928"
|
||||
d="M 7.75 2 C 6.7805 2 6 2.7805 6 3.75 L 6 5.5 L 4.1621094 5.5 C 3.2410844 5.5 2.5 6.2805 2.5 7.25 C 2.5 8.2195 3.2410844 9 4.1621094 9 L 6 9 L 6 15 L 4.1621094 15 C 3.2410844 15 2.5 15.7805 2.5 16.75 C 2.5 17.7195 3.2410844 18.5 4.1621094 18.5 L 6 18.5 L 6 20.25 C 6 21.2195 6.7805 22 7.75 22 C 8.7195 22 9.5 21.2195 9.5 20.25 L 9.5 18.5 L 14.5 18.5 L 14.5 20.25 C 14.5 21.2195 15.2805 22 16.25 22 C 17.2195 22 18 21.2195 18 20.25 L 18 18.5 L 19.837891 18.5 C 20.758916 18.5 21.5 17.7195 21.5 16.75 C 21.5 15.7805 20.758916 15 19.837891 15 L 18 15 L 18 9 L 19.837891 9 C 20.758916 9 21.5 8.2195 21.5 7.25 C 21.5 6.2805 20.758916 5.5 19.837891 5.5 L 18 5.5 L 18 3.75 C 18 2.7805 17.2195 2 16.25 2 C 15.2805 2 14.5 2.7805 14.5 3.75 L 14.5 5.5 L 9.5 5.5 L 9.5 3.75 C 9.5 2.7805 8.7195 2 7.75 2 z M 9.5 9 L 14.5 9 L 14.5 15 L 9.5 15 L 9.5 9 z "
|
||||
style="fill:#6699cc;fill-opacity:1;stroke:none;stroke-width:1.7544229;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg11367"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata11373">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs11371" />
|
||||
<path
|
||||
style="display:inline;fill:#99cc99;fill-opacity:1;stroke-width:1.28570998"
|
||||
id="path11365"
|
||||
d="m 13.499143,15.642429 c -0.45,0 -0.885857,-0.178715 -1.209857,-0.502715 L 8.859,11.710714 c -0.668571,-0.669857 -0.668571,-1.755 0,-2.423571 0.669857,-0.669857 1.755,-0.669857 2.426143,0 L 13.105714,11.109 17.573571,4.0954286 c 0.459,-0.828 1.504286,-1.1275715 2.332286,-0.6672857 0.826714,0.4602857 1.125,1.5042857 0.666,2.331 l -5.572286,9.0000001 c -0.261,0.470571 -0.727714,0.790714 -1.26,0.865286 z" />
|
||||
<path
|
||||
d="M 17.142857,21 H 6.8571429 C 4.7305714,21 3,19.269429 3,17.142857 V 6.8571429 C 3,4.7305714 4.7305714,3 6.8571429,3 h 6.4285711 c 0.711,0 1.285715,0.576 1.285715,1.2857143 0,0.7097143 -0.574715,1.2857143 -1.285715,1.2857143 H 6.8571429 c -0.7097143,0 -1.2857143,0.5772857 -1.2857143,1.2857143 V 17.142857 c 0,0.708429 0.576,1.285714 1.2857143,1.285714 H 17.142857 c 0.709714,0 1.285714,-0.577285 1.285714,-1.285714 V 13.285714 C 18.428571,12.576 19.003286,12 19.714286,12 20.425286,12 21,12.576 21,13.285714 v 3.857143 C 21,19.269429 19.269429,21 17.142857,21 Z"
|
||||
id="path16196"
|
||||
style="display:inline;fill:#aeaeae;fill-opacity:1;stroke-width:1.28570998" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg873">
|
||||
<metadata
|
||||
id="metadata879">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs877" />
|
||||
<path
|
||||
id="path871"
|
||||
style="display:inline;fill:#6699cc;fill-opacity:1;stroke-width:1.19007"
|
||||
d="m 10.330622,1.9999997 c -4.5924663,0 -8.3306193,3.738153 -8.3306193,8.3306193 0,1.391929 0.3467825,2.702587 0.9532665,3.857242 0.084308,-0.108411 0.1590865,-0.228838 0.2534294,-0.323181 L 4.7482003,12.323178 C 4.5237338,11.697056 4.378519,11.032991 4.3785189,10.330619 c 0,-3.2810129 2.6710902,-5.949778 5.9521031,-5.949778 0.702303,0 1.36649,0.1429324 1.992559,0.3673563 L 14.141363,2.9300158 C 12.997884,2.3384803 11.704084,1.9999997 10.330622,1.9999997 Z m 5.635898,3.4852355 -0.60451,0.6045104 2.545919,2.5482442 0.460357,-0.4626829 C 18.332278,8.0413114 18.299136,7.9066594 18.256684,7.7754 Z m 0.292955,4.4245521 c 0.0083,0.1189097 0.01733,0.2373427 0.01861,0.3580557 l 0.169728,-0.169728 z m 2.059986,2.6993717 -5.710299,5.710299 c 0.105352,-0.03032 0.217183,-0.04484 0.320855,-0.07906 l 0.892816,0.89049 1.799581,1.797261 0.07208,0.07208 0.07672,0.06743 C 16.486443,21.66984 17.375591,22 18.275281,22 c 2.054056,0 3.724716,-1.671795 3.724716,-3.72704 0,-0.999657 -0.390465,-1.936781 -1.099745,-2.638921 l -1.129969,-1.174145 -0.639387,-0.639386 -0.890489,-0.892815 c 0.03403,-0.103138 0.04885,-0.213757 0.07906,-0.318531 z m -11.7600542,2.28784 -0.4929085,0.492908 0.5417343,0.541734 0.57196,-0.571959 C 6.960254,15.221393 6.7588057,15.062002 6.5594068,14.896999 Z m 2.7179722,1.285747 -1.209021,1.209021 0.5417345,0.541734 1.6577535,-1.655429 c -0.3372847,-0.0036 -0.668706,-0.03764 -0.990467,-0.09533 z" />
|
||||
<path
|
||||
d="m 15.96652,2.4766329 c -0.396657,0 -0.792437,0.1507259 -1.095095,0.4533829 L 3.57173,14.229712 c -0.3026571,0.302657 -0.5759103,0.751428 -0.7742385,1.227621 -0.1983282,0.47826 -0.3208556,0.99063 -0.3208556,1.418274 v 4.647756 h 4.6477558 c 0.427645,0 0.9376894,-0.122526 1.4159495,-0.320855 0.4782601,-0.198328 0.9272894,-0.471583 1.2299463,-0.774239 L 21.069984,9.1285734 c 0.302656,-0.302657 0.453382,-0.7017958 0.453382,-1.0974191 0,-0.3966562 -0.150726,-0.7924369 -0.453382,-1.0950939 L 17.063939,2.9300158 C 16.761281,2.6273588 16.362143,2.4766329 15.96652,2.4766329 Z m 0,2.2785396 3.275981,3.2759818 -1.334572,1.3368983 -3.275982,-3.2759819 z M 13.901884,6.8221334 15.173682,8.0939305 6.6082326,16.661704 5.3364357,15.387582 Z m 2.004185,2.0041848 1.271796,1.2717968 -8.5654475,8.565448 -1.2741221,-1.271796 z M 4.7063497,16.250176 c 0.010333,-0.02065 3.0644031,3.034179 3.0644031,3.034179 C 7.43814,19.422771 7.2039295,19.456408 7.1243917,19.456408 H 5.5759147 L 4.5435968,18.424084 v -1.548477 c 0,-0.07953 0.033633,-0.315548 0.1627529,-0.625436 z"
|
||||
style="display:inline;fill:#99cc99;fill-opacity:1;stroke-width:1.19007"
|
||||
id="path15590" />
|
||||
<path
|
||||
id="rect19553"
|
||||
d="m 2.4766359,18.937425 v 2.585938 h 2.5605469 z"
|
||||
style="display:inline;opacity:0.95;fill:#0a0a0a;fill-opacity:1;stroke:none;stroke-width:1.88249397;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg11920">
|
||||
<metadata
|
||||
id="metadata11926">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs11924" />
|
||||
<path
|
||||
d="M 22.461538,10.769231 V 8.615385 C 22.461538,6.24 20.52923,4.3076923 18.153846,4.3076923 H 17.219692 C 17.046153,1.8683077 14.816,0 12,0 9.1839995,0 6.9538461,1.8683077 6.7803077,4.3076923 H 5.8461538 C 3.4707692,4.3076923 1.5384615,6.24 1.5384615,8.615385 v 2.153846 c 0,1.245538 0.6326154,2.273231 1.5938462,2.764307 C 2.6916923,13.764923 2.3101538,14.110769 2.032,14.548923 1.7095384,15.058462 1.5384615,15.666462 1.5384615,16.307692 v 3.384616 C 1.5384615,22.067692 3.4707692,24 5.8461538,24 H 9.2307695 C 10.432,24 11.484308,23.388308 11.990154,22.401231 l 0.04431,0.08123 C 12.569847,23.432615 13.592616,24 14.76923,24 h 3.384616 c 2.375384,0 4.307692,-1.932308 4.307692,-4.307692 v -3.384616 c 0,-1.246769 -0.633845,-2.275692 -1.596308,-2.765538 0.955077,-0.505846 1.596308,-1.545846 1.596308,-2.772923 z m -2.461539,8.923077 c 0,1.015384 -0.830769,1.846154 -1.846153,1.846154 H 14.76923 c -0.438154,0 -0.891077,-0.265847 -0.481231,-0.94277 0.30277,-0.344615 0.481231,-0.761846 0.481231,-1.211077 0,-1.190153 -1.239384,-2.153846 -2.769231,-2.153846 -1.529846,0 -2.7692295,0.963693 -2.7692295,2.153846 0,0.369231 0.116923,0.708923 0.313846,1.012923 0.6239995,0.828308 0.167384,1.140924 -0.313846,1.140924 H 5.8461538 C 4.8307692,21.538462 4,20.707692 4,19.692308 v -3.384616 c 0,-0.317538 0.1390769,-0.64123 0.4726153,-0.64123 0.128,0 0.2818462,0.048 0.4701539,0.16 0.3446154,0.302769 0.7630769,0.48123 1.2110769,0.48123 1.1889231,0 2.1538462,-1.240615 2.1538462,-2.76923 0,-1.528616 -0.9649231,-2.769231 -2.1538462,-2.769231 -0.3692308,0 -0.7089231,0.116923 -1.0116923,0.313846 C 4.8504615,11.293538 4.6227692,11.382154 4.4504615,11.382154 4.1304615,11.382154 4,11.080615 4,10.769231 V 8.615385 C 4,7.6 4.8307692,6.7692308 5.8461538,6.7692308 h 3.3846157 c 0.48123,0 0.9378465,-0.3126154 0.299077,-1.1409231 -0.182154,-0.304 -0.299077,-0.6436923 -0.299077,-1.0129231 0,-1.1901538 1.2393835,-2.1538461 2.7692305,-2.1538461 1.529847,0 2.76923,0.9636923 2.76923,2.1538461 0,0.4492308 -0.17846,0.8664616 -0.48123,1.2110769 -0.409846,0.6769231 0.04308,0.9427693 0.48123,0.9427693 h 3.384616 C 19.16923,6.7692308 20,7.6 20,8.615385 v 2.153846 c 0,0.317538 -0.139076,0.641231 -0.472616,0.641231 -0.128,0 -0.281846,-0.048 -0.470154,-0.16 -0.344615,-0.30277 -0.763077,-0.481231 -1.211077,-0.481231 -1.188923,0 -2.153846,1.240615 -2.153846,2.769231 0,1.528615 0.964923,2.76923 2.153846,2.76923 0.369231,0 0.708923,-0.116923 1.011693,-0.313846 0.291693,-0.210461 0.519384,-0.300308 0.691692,-0.299077 0.318769,0 0.449232,0.301539 0.449232,0.612923 v 3.384616 z M 4,12.546462 c 0.1427692,0.03938 0.2904615,0.06646 0.4492307,0.06646 0.4209231,0 0.8406154,-0.146461 1.2775385,-0.448 l 0.084923,-0.05046 C 5.9310769,12.036923 6.0430769,12 6.1538461,12 c 0.4356923,0 0.9230769,0.658462 0.9230769,1.538462 0,0.88 -0.4873846,1.538461 -0.9230769,1.538461 -0.1329231,0 -0.2670769,-0.05908 -0.3987692,-0.174769 l -0.176,-0.128 C 5.2086153,14.548923 4.8356923,14.435692 4.4726153,14.435692 4.3076923,14.435692 4.1513846,14.464002 4,14.508312 Z M 19.550769,14.464 c -0.420922,0 -0.840616,0.146462 -1.277539,0.448 l -0.08492,0.05046 c -0.119384,0.07754 -0.231383,0.114461 -0.340923,0.114461 -0.435692,0 -0.923077,-0.658461 -0.923077,-1.538461 0,-0.88 0.487385,-1.538462 0.923077,-1.538462 0.132924,0 0.267077,0.05908 0.39877,0.174769 l 0.175999,0.128 c 0.371693,0.225231 0.743385,0.338462 1.106462,0.338462 0.167384,0 0.322461,-0.03077 0.472616,-0.07631 v 1.965539 c -0.144,-0.03938 -0.291693,-0.06646 -0.450462,-0.06646 z m -8.54523,7.074462 C 11.129847,21.112615 11.12,20.534154 10.630154,19.820308 l -0.05415,-0.09108 c -0.07631,-0.120616 -0.115692,-0.232616 -0.115692,-0.343385 0,-0.435692 0.657231,-0.923077 1.538462,-0.923077 0.88123,0 1.538461,0.487385 1.538461,0.923077 0,0.132923 -0.05908,0.267077 -0.176,0.4 l -0.128,0.174769 c -0.4,0.660923 -0.382769,1.204923 -0.270769,1.580308 h -1.956923 z"
|
||||
id="path11918"
|
||||
style="stroke-width:1.23077;fill:#aeaeae;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
@@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg7030"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata7036">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7034" />
|
||||
<g
|
||||
style="fill:#aeaeae;fill-opacity:1"
|
||||
transform="matrix(0.95238095,0,0,0.95238095,0.5714286,0.09523812)"
|
||||
id="g7028">
|
||||
<path
|
||||
style="fill:#aeaeae;fill-opacity:1"
|
||||
id="path7026"
|
||||
d="M 19.414,8.902 C 19.518,8.854 19.62,8.794 19.707,8.707 l 0.5,-0.5 c 0.391,-0.391 0.391,-1.023 0,-1.414 -0.391,-0.391 -1.023,-0.391 -1.414,0 l -0.5,0.5 -0.115,0.173 C 16.791,6.154 14.99,5.276 12.989,5.056 L 13,5 V 4 h 1 C 14.55,4 15,3.55 15,3 15,2.45 14.55,2 14,2 H 10 C 9.45,2 9,2.45 9,3 9,3.55 9.45,4 10,4 h 1 v 1 l 0.012,0.057 C 6.506,5.549 3,9.364 3,14 c 0,4.971 4.029,9 9,9 4.971,0 9,-4.029 9,-9 0,-1.894 -0.588,-3.648 -1.586,-5.098 z M 12,21 C 8.141,21 5,17.86 5,14 5,10.14 8.141,7 12,7 c 3.859,0 7,3.14 7,7 0,3.86 -3.141,7 -7,7 z m 1,-8 v -2 c 0,-0.55 -0.45,-1 -1,-1 -0.55,0 -1,0.45 -1,1 v 3 c 0,0.55 0.45,1 1,1 h 3 c 0.55,0 1,-0.45 1,-1 0,-0.55 -0.45,-1 -1,-1 z M 12,8 c -3.312,0 -6,2.688 -6,6 0,3.312 2.688,6 6,6 3.312,0 6,-2.688 6,-6 0,-3.312 -2.688,-6 -6,-6 z m 0,11 C 9.243,19 7,16.757 7,14 7,11.243 9.243,9 12,9 c 2.757,0 5,2.243 5,5 0,2.757 -2.243,5 -5,5 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg4455"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs4459" />
|
||||
<path
|
||||
d="M19 17h-14c-1.103 0-2 .897-2 2s.897 2 2 2h14c1.103 0 2-.897 2-2s-.897-2-2-2zM19 10h-14c-1.103 0-2 .897-2 2s.897 2 2 2h14c1.103 0 2-.897 2-2s-.897-2-2-2zM19 3h-14c-1.103 0-2 .897-2 2s.897 2 2 2h14c1.103 0 2-.897 2-2s-.897-2-2-2z"
|
||||
id="path4453"
|
||||
style="fill:#6699cc;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 571 B |
@@ -18,10 +18,10 @@ licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[Map]
|
||||
add = typ_plus.svg
|
||||
backward = typ_chevron-left.svg
|
||||
bookmark = typ_bookmark.svg
|
||||
bullet-off = typ_media-record-outline.svg
|
||||
bullet-on = typ_media-record.svg
|
||||
check = typ_tick.svg
|
||||
clear = typ_backspace.svg
|
||||
close = typ_times.svg
|
||||
cls_archive = typ_delete.svg
|
||||
cls_character = typ_user.svg
|
||||
@@ -35,28 +35,24 @@ cls_timeline = typ_calendar.svg
|
||||
cls_trash = typ_trash.svg
|
||||
cls_world = typ_location.svg
|
||||
cross = typ_times.svg
|
||||
delete = typ_delete.svg
|
||||
doc_h0 = mixed_heading0.svg
|
||||
doc_h1 = mixed_heading1.svg
|
||||
doc_h2 = mixed_heading2.svg
|
||||
doc_h3 = mixed_heading3.svg
|
||||
doc_h4 = mixed_heading4.svg
|
||||
done = typ_input-checked.svg
|
||||
down = typ_chevron-down.svg
|
||||
edit = typ_pencil.svg
|
||||
forward = typ_chevron-right.svg
|
||||
hash = typ_hash.svg
|
||||
maximise = typ_arrow-maximise.svg
|
||||
menu = typ_th-menu.svg
|
||||
minimise = typ_arrow-minimise.svg
|
||||
proj_chapter = mixed_document-chapter.svg
|
||||
proj_details = typ_th-list-grey.svg
|
||||
proj_document = typ_document-text.svg
|
||||
proj_folder = typ_folder.svg
|
||||
proj_note = mixed_document-note.svg
|
||||
proj_section = mixed_document-section.svg
|
||||
proj_scene = mixed_document-scene.svg
|
||||
proj_stats = typ_chart-bar-grey.svg
|
||||
proj_title = mixed_document-title.svg
|
||||
reference = typ_at.svg
|
||||
refresh = typ_refresh.svg
|
||||
remove = typ_minus.svg
|
||||
save = typ_download.svg
|
||||
search = typ_search.svg
|
||||
search_cancel = typ_cancel-grey.svg
|
||||
search_case = nw_search-case.svg
|
||||
@@ -74,3 +70,15 @@ status_stats = typ_chart-bar-grey.svg
|
||||
status_time = typ_stopwatch-grey.svg
|
||||
sticky-off = typ_pin-outline.svg
|
||||
sticky-on = typ_pin.svg
|
||||
up = typ_chevron-up.svg
|
||||
view_build = typ_export.svg
|
||||
view_editor = mixed_edit.svg
|
||||
view_novel = typ_book-grey.svg
|
||||
view_outline = typ_puzzle-outline.svg
|
||||
|
||||
deco_doc_h0 = nw_deco-h0.svg
|
||||
deco_doc_h1 = nw_deco-h1.svg
|
||||
deco_doc_h2 = nw_deco-h2.svg
|
||||
deco_doc_h3 = nw_deco-h3.svg
|
||||
deco_doc_h4 = nw_deco-h4.svg
|
||||
deco_doc_more = nw_deco-noveltree-more.svg
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ededed;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#787878;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#333333;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#333333;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ededed;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg7536"
|
||||
sodipodi:docname="mixed_edit.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<sodipodi:namedview
|
||||
id="namedview1259"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:pageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="34.625"
|
||||
inkscape:cx="3.1913357"
|
||||
inkscape:cy="11.98556"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1330"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7536" />
|
||||
<metadata
|
||||
id="metadata7542">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7540" />
|
||||
<path
|
||||
id="path7534"
|
||||
style="display:inline;fill:#000000;fill-opacity:0.72156864;stroke-width:1.10527"
|
||||
d="M 19.160156 0 C 18.73463 0 18.312122 0.160533 17.988281 0.484375 L 14.052734 4.421875 L 4.1054688 4.421875 C 3.4953635 4.421875 3 4.9141801 3 5.5253906 L 3 17.037109 L 3 18.429688 L 3 22.894531 C 3 23.505741 3.4953635 24 4.1054688 24 L 18.474609 24 C 19.084713 24 19.578125 23.505741 19.578125 22.894531 L 19.578125 18.429688 L 19.578125 17.037109 L 19.578125 9.9472656 L 23.515625 6.0117188 C 23.839466 5.6878766 24 5.2623116 24 4.8378906 C 24 4.4134695 23.839466 3.9918109 23.515625 3.6679688 L 20.332031 0.484375 C 20.008189 0.160533 19.584576 0 19.160156 0 z M 19.160156 2.4394531 L 21.560547 4.8398438 L 20.130859 6.2695312 L 17.730469 3.8691406 L 19.160156 2.4394531 z M 16.949219 4.6503906 L 19.349609 7.0507812 L 12.394531 14.005859 L 9.9941406 11.605469 L 16.949219 4.6503906 z M 5.2109375 6.6308594 L 11.841797 6.6308594 L 8.328125 10.146484 C 8.0042828 10.470327 7.7997073 11.043101 7.6328125 11.570312 C 7.4559704 12.122943 7.421875 12.737735 7.421875 13.195312 L 7.421875 16.578125 L 10.804688 16.578125 C 11.262267 16.578125 12.02928 16.467813 12.541016 16.257812 C 13.053858 16.047812 13.530778 15.874623 13.853516 15.550781 L 17.369141 12.158203 L 17.369141 17.037109 L 17.369141 18.429688 L 17.369141 21.789062 L 5.2109375 21.789062 L 5.2109375 18.429688 L 5.2109375 17.037109 L 5.2109375 6.6308594 z M 9.5644531 12.525391 L 11.505859 14.435547 L 9.6308594 14.369141 L 9.5644531 12.525391 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@@ -1,37 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2469"
|
||||
cx="19.470242"
|
||||
cy="9.4077778"
|
||||
r="2.2222221" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,49 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2469"
|
||||
cx="19.470242"
|
||||
cy="9.4077778"
|
||||
r="2.2222221" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="14.592222"
|
||||
cx="19.470242"
|
||||
id="circle2471"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,55 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg1897"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata1903">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs1901" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.42859697"
|
||||
id="path1895"
|
||||
d="m 3.1443377,2.8368008 c -1.1157342,1.1157342 -1.1157342,2.9243378 0,4.040072 L 8.2658581,11.999821 3.1443377,17.12277 c -1.1157342,1.115734 -1.1157342,2.924338 0,4.040072 C 3.7014904,21.721423 4.4329321,22 5.1643736,22 5.8958159,22 6.627257,21.721423 7.1844103,21.162842 L 16.348859,11.999821 7.1844103,2.8368008 c -1.1143067,-1.1157343 -2.9257671,-1.1157343 -4.0400726,0 z" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="4.2222223"
|
||||
cx="19.470242"
|
||||
id="path2467"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2469"
|
||||
cx="19.470242"
|
||||
cy="9.4077778"
|
||||
r="2.2222221" />
|
||||
<circle
|
||||
r="2.2222221"
|
||||
cy="14.592222"
|
||||
cx="19.470242"
|
||||
id="circle2471"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.99999988;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="circle2473"
|
||||
cx="19.470242"
|
||||
cy="19.777779"
|
||||
r="2.2222221" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="4"
|
||||
height="24"
|
||||
viewBox="0 0 4 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#848484;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="0"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 902 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="4"
|
||||
height="24"
|
||||
viewBox="0 0 4 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#718c00;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="0"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 902 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="20"
|
||||
height="24"
|
||||
viewBox="0 0 20 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#c82829;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="16"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="36"
|
||||
height="24"
|
||||
viewBox="0 0 36 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="32"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="52"
|
||||
height="24"
|
||||
viewBox="0 0 52 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<rect
|
||||
style="fill:#333333;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
id="rect1955"
|
||||
width="4"
|
||||
height="22"
|
||||
x="48"
|
||||
y="1"
|
||||
rx="2"
|
||||
ry="2" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
d="M 9.7,18.2 16,12 9.7,5.8 C 9.5,5.6 9.2,5.5 9,5.5 8.8,5.5 8.5,5.6 8.3,5.8 8.1,6 8,6.2 8,6.5 v 11 c 0,0.3 0.1,0.5 0.3,0.7 0.2,0.2 0.5,0.3 0.7,0.3 0.2,0 0.5,-0.1 0.7,-0.3 z"
|
||||
id="path3096"
|
||||
style="fill:#848484;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 928 B |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg13156"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata13162">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs13160" />
|
||||
<path
|
||||
style="stroke-width:1.00151;fill:#c82829;fill-opacity:1"
|
||||
id="path13154"
|
||||
d="M 19.496214,4.4886395 H 9.4810665 c -1.2679176,0 -2.8382927,0.8082224 -3.5754075,1.8397825 L 3.2917056,9.9869555 2.0908895,11.668499 c -0.1211833,0.175265 -0.1221848,0.492744 0.003,0.665006 l 1.1897995,1.66652 2.622967,3.672554 c 0.7361133,1.030558 2.3054869,1.838782 3.574406,1.838782 H 19.496214 C 20.877302,19.511361 22,18.387661 22,17.007573 V 6.9924263 C 22,5.612339 20.877302,4.4886395 19.496214,4.4886395 Z M 17.19974,14.296473 c 0.391593,0.391592 0.391593,1.02455 0,1.416141 -0.195295,0.195296 -0.451683,0.293445 -0.70807,0.293445 -0.256388,0 -0.512776,-0.09815 -0.708071,-0.293445 l -2.296474,-2.296473 -2.296473,2.296473 c -0.195295,0.195296 -0.451683,0.293445 -0.708071,0.293445 -0.256388,0 -0.512775,-0.09815 -0.7080706,-0.293445 -0.3915923,-0.391591 -0.3915923,-1.024549 0,-1.416141 L 12.070984,12 9.7745104,9.7035265 c -0.3915923,-0.3915921 -0.3915923,-1.0245494 0,-1.4161417 0.3915926,-0.3915922 1.0245496,-0.3915922 1.4161416,0 l 2.296473,2.2964732 2.296474,-2.2964732 c 0.391592,-0.3915922 1.024549,-0.3915922 1.416141,0 0.391593,0.3915923 0.391593,1.0245496 0,1.4161417 L 14.903267,12 Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg8707">
|
||||
<metadata
|
||||
id="metadata8713">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8711" />
|
||||
<path
|
||||
d="M 20,0 H 5.3333333 C 4.98,0 4.64,0.14 4.3906667,0.3906667 l -4,4 -0.076,0.082667 c -0.1853334,0.22 -0.3,0.4973334 -0.3133334,0.8 L 0,5.344 V 20 c 0,2.205333 1.7946667,4 4,4 h 12 c 1.738667,0 3.221333,-1.114667 3.772,-2.666667 h 0.894667 c 1.869333,0 3.333333,-1.756 3.333333,-4 V 4 C 24,1.7946667 22.205333,0 20,0 Z M 4,21.333333 C 3.2653333,21.333333 2.6666667,20.736 2.6666667,20 V 6.6666667 H 5.3333333 V 21.333333 Z M 17.333333,20 c 0,0.736 -0.598666,1.333333 -1.333333,1.333333 H 6.6666667 V 6.6666667 H 16 C 16.734667,6.6666667 17.333333,7.264 17.333333,8 Z m 4,-2.666667 c 0,0.826667 -0.432,1.333334 -0.666666,1.333334 H 20 V 8 C 20,5.7946667 18.205333,4 16,4 H 4.552 L 5.8853333,2.6666667 H 20 C 20.734667,2.6666667 21.333333,3.264 21.333333,4 Z"
|
||||
id="path8705"
|
||||
style="stroke-width:1.33333;fill:#000000;fill-opacity:0.72156864" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -5,13 +5,13 @@
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg2608"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
version="1.2"
|
||||
width="24"
|
||||
version="1.2">
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg901">
|
||||
<metadata
|
||||
id="metadata2614">
|
||||
id="metadata907">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
@@ -23,9 +23,9 @@
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2612" />
|
||||
id="defs905" />
|
||||
<path
|
||||
style="stroke-width:1.05081;fill:#4271ae;fill-opacity:1"
|
||||
id="path2606"
|
||||
d="M 16.203226,2 H 7.796774 C 6.05874,2 4.6443545,3.4143855 4.6443545,5.1524195 V 19.86371 c 0,0.540115 0.1092839,0.994063 0.3236484,1.350287 0.5926549,0.982504 1.9072138,1.059213 2.9559187,0.0084 L 11.25708,17.889239 c 0.394052,-0.393002 1.091787,-0.393002 1.485841,0 l 3.333158,3.333158 C 16.592024,21.738349 17.128987,22 17.673304,22 c 0.837492,0 1.682342,-0.660957 1.682342,-2.13629 V 5.1524195 C 19.355646,3.4143855 17.941259,2 16.203226,2 Z M 7.796774,4.101613 h 8.406452 c 0.578994,0 1.050806,0.4718121 1.050806,1.0508065 V 15.560658 l -2.575527,-2.361162 c -1.477434,-1.35449 -3.880628,-1.353439 -5.3580615,0 l -2.574476,2.361162 V 5.1524195 c 0,-0.5789944 0.4718121,-1.0508065 1.0508065,-1.0508065 z m 6.431987,12.301792 C 13.635055,15.809699 12.843798,15.482898 12,15.482898 c -0.843797,0 -1.635054,0.327852 -2.2287605,0.920507 l -3.025272,3.025272 v -2.442075 l 3.2848215,-3.011611 c 1.085483,-0.995114 2.851889,-0.995114 3.937372,0 l 3.285871,3.011611 v 2.442075 z" />
|
||||
d="M 16.203226,2 H 7.796774 C 6.05874,2 4.6443545,3.4143855 4.6443545,5.1524195 V 19.86371 c 0,0.540115 0.1092839,0.994063 0.3236484,1.350287 0.5926549,0.982504 1.9072138,1.059213 2.9559187,0.0084 L 11.25708,17.889239 c 0.394052,-0.393002 1.091787,-0.393002 1.485841,0 l 3.333158,3.333158 C 16.592024,21.738349 17.128987,22 17.673304,22 c 0.837492,0 1.682342,-0.660957 1.682342,-2.13629 V 5.1524195 C 19.355646,3.4143855 17.941259,2 16.203226,2 Z M 7.796774,4.101613 h 8.406452 c 0.578994,0 1.050806,0.4718121 1.050806,1.0508065 V 15.560658 l -2.575527,-2.361162 c -1.477434,-1.35449 -3.880628,-1.353439 -5.3580615,0 l -2.574476,2.361162 V 5.1524195 c 0,-0.5789944 0.4718121,-1.0508065 1.0508065,-1.0508065 z m 6.431987,12.301792 C 13.635055,15.809699 12.843798,15.482898 12,15.482898 c -0.843797,0 -1.635054,0.327852 -2.2287605,0.920507 l -3.025272,3.025272 v -2.442075 l 3.2848215,-3.011611 c 1.085483,-0.995114 2.851889,-0.995114 3.937372,0 l 3.285871,3.011611 v 2.442075 z"
|
||||
id="path899"
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.05081" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8980"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata8986">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8984" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.28574"
|
||||
id="path8978"
|
||||
d="m 3.7531209,6.4345258 c -1.004161,1.002875 -1.004161,2.63319 0,3.6360652 l 8.2467181,8.248004 8.246719,-8.248004 C 20.749281,9.5691528 21,8.9108558 21,8.2525578 c 0,-0.658297 -0.250719,-1.316595 -0.753442,-1.818032 -1.004161,-1.004161 -2.631904,-1.004161 -3.636065,0 L 11.999839,11.043894 7.3891859,6.4345258 c -1.004161,-1.004161 -2.631905,-1.004161 -3.636065,0 z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8980"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata8986">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8984" />
|
||||
<path
|
||||
style="fill:#4271ae;fill-opacity:1;stroke-width:1.28574"
|
||||
id="path8978"
|
||||
d="m 20.246879,17.565474 c 1.004161,-1.002875 1.004161,-2.63319 0,-3.636065 L 12.000161,5.6814052 3.7534421,13.929409 c -0.502723,0.501438 -0.753442,1.159735 -0.753442,1.818033 0,0.658297 0.250719,1.316595 0.753442,1.818032 1.004161,1.004161 2.631904,1.004161 3.636065,0 l 4.6106539,-4.609368 4.610653,4.609368 c 1.004161,1.004161 2.631905,1.004161 3.636065,0 z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg13801">
|
||||
<metadata
|
||||
id="metadata13807">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs13805" />
|
||||
<path
|
||||
style="display:inline;fill:#a2694f;fill-opacity:1"
|
||||
id="path6288"
|
||||
d="m 20.987,16 c 0,-0.105 -0.004,-0.211 -0.039,-0.316 l -2,-6 C 18.812,9.275 18.431,9 18,9 h -0.219 c -0.094,0.188 -0.21,0.368 -0.367,0.525 L 15.932,11 h 1.348 l 1.667,5 H 5.054 L 6.721,11 H 8.069 L 6.586,9.525 C 6.429,9.368 6.312,9.188 6.219,9 H 6 C 5.569,9 5.188,9.275 5.052,9.684 l -2,6 C 3.017,15.789 3.013,15.895 3.013,16 3,16 3,21 3,21 c 0,0.553 0.447,1 1,1 h 16 c 0.553,0 1,-0.447 1,-1 0,0 0,-5 -0.013,-5 z" />
|
||||
<path
|
||||
d="M 16.707,7.404 C 16.518,7.216 16.259,7.121 16,7.121 c -0.259,0 -0.518,0.095 -0.707,0.283 L 13,9.697 V 3 C 13,2.448 12.552,2 12,2 11.448,2 11,2.448 11,3 V 9.697 L 8.707,7.404 C 8.518,7.216 8.267,7.111 8,7.111 c -0.267,0 -0.518,0.105 -0.707,0.293 -0.39,0.39 -0.39,1.024 0,1.414 L 12,13.5 16.709,8.816 C 17.097,8.429 17.097,7.794 16.707,7.404 Z"
|
||||
id="path13799"
|
||||
style="display:inline;fill:#718c00;fill-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg1169"
|
||||
sodipodi:docname="typ_export.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview2676"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:pageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="34.625"
|
||||
inkscape:cx="6.4259928"
|
||||
inkscape:cy="11.98556"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1330"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg1169" />
|
||||
<defs
|
||||
id="defs1173" />
|
||||
<path
|
||||
d="M 6.8888889,16.888889 V 17.5 c 2.0667778,-3.150889 4.4000001,-4.831444 7.3333331,-4.888889 v 3.666666 c 0,0.673444 0.624556,1.222223 1.397,1.222223 0.444889,0 0.825,-0.193112 1.079223,-0.477889 C 19.061,14.542222 24,9.5555555 24,9.5555555 c 0,0 -4.939,-4.9891115 -7.302778,-7.5007781 -0.254222,-0.2505555 -0.633111,-0.4436667 -1.078,-0.4436667 -0.772444,0 -1.397,0.5463333 -1.397,1.2222222 v 3.6666667 c -5.6955553,0 -7.3333331,5.9534434 -7.3333331,10.3888894 z m -3.6666667,5.5 H 20.333333 c 0.675889,0 1.222222,-0.547557 1.222222,-1.222223 V 13.77711 c -0.811555,0.826222 -1.66711,1.702555 -2.444444,2.501889 v 3.665444 H 4.4444445 V 5.2777775 H 13 V 2.833333 H 3.2222222 C 2.5463333,2.833333 2,3.3808886 2,4.0555552 V 21.166666 c 0,0.674666 0.5463333,1.222223 1.2222222,1.222223 z"
|
||||
id="path1167"
|
||||
style="stroke-width:1.22222;fill:#000000;fill-opacity:0.72156864" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg3369"
|
||||
viewBox="0 0 24 24"
|
||||
height="24"
|
||||
width="24"
|
||||
version="1.2">
|
||||
<metadata
|
||||
id="metadata3375">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3373" />
|
||||
<path
|
||||
style="fill:#333333;fill-opacity:1;stroke-width:1"
|
||||
id="path3367"
|
||||
d="m 10.828125,20 h -4 c -0.553,0 -1,0.447 -1,1 0,0.553 0.447,1 1,1 h 10 c 0.553,0 1,-0.447 1,-1 0,-0.553 -0.447,-1 -1,-1 h -4 v -1.23 c 1.64,-0.371 3.146,-1.188 4.363,-2.406 1.7,-1.7 2.637,-3.96 2.637,-6.364 0,-2.067 -0.692,-4.029 -1.968,-5.619 l 0.675,-0.673 c 0.391,-0.391 0.391,-1.023 10e-4,-1.415 -0.391,-0.391 -1.024,-0.39 -1.415,-0.001 l -2.052,2.049 0.708,0.708 c 1.322,1.322 2.051,3.081 2.051,4.951 0,1.87 -0.729,3.627 -2.051,4.949 -1.322,1.322 -3.079,2.051 -4.949,2.051 -1.87,0 -3.627,-0.729 -4.949,-2.051 -0.391,-0.391 -1.023,-0.391 -1.414,0 -0.391,0.39 -0.391,1.023 0,1.414 1.699,1.7 3.959,2.637 6.363,2.637 z m 0,-16 c 1.657,0 3.157,0.672 4.243,1.757 1.085,1.086 1.757,2.586 1.757,4.243 0,1.656 -0.672,3.156 -1.757,4.242 -1.086,1.086 -2.586,1.758 -4.243,1.758 -1.658,0 -3.157,-0.672 -4.242,-1.757 -1.085,-1.086 -1.756,-2.586 -1.756,-4.243 0,-1.657 0.671,-3.157 1.756,-4.243 1.085,-1.085 2.584,-1.757 4.242,-1.757 z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg5204">
|
||||
<metadata
|
||||
id="metadata5210">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs5208" />
|
||||
<path
|
||||
id="rect928"
|
||||
d="M 7.75 2 C 6.7805 2 6 2.7805 6 3.75 L 6 5.5 L 4.1621094 5.5 C 3.2410844 5.5 2.5 6.2805 2.5 7.25 C 2.5 8.2195 3.2410844 9 4.1621094 9 L 6 9 L 6 15 L 4.1621094 15 C 3.2410844 15 2.5 15.7805 2.5 16.75 C 2.5 17.7195 3.2410844 18.5 4.1621094 18.5 L 6 18.5 L 6 20.25 C 6 21.2195 6.7805 22 7.75 22 C 8.7195 22 9.5 21.2195 9.5 20.25 L 9.5 18.5 L 14.5 18.5 L 14.5 20.25 C 14.5 21.2195 15.2805 22 16.25 22 C 17.2195 22 18 21.2195 18 20.25 L 18 18.5 L 19.837891 18.5 C 20.758916 18.5 21.5 17.7195 21.5 16.75 C 21.5 15.7805 20.758916 15 19.837891 15 L 18 15 L 18 9 L 19.837891 9 C 20.758916 9 21.5 8.2195 21.5 7.25 C 21.5 6.2805 20.758916 5.5 19.837891 5.5 L 18 5.5 L 18 3.75 C 18 2.7805 17.2195 2 16.25 2 C 15.2805 2 14.5 2.7805 14.5 3.75 L 14.5 5.5 L 9.5 5.5 L 9.5 3.75 C 9.5 2.7805 8.7195 2 7.75 2 z M 9.5 9 L 14.5 9 L 14.5 15 L 9.5 15 L 9.5 9 z "
|
||||
style="fill:#4271ae;fill-opacity:1;stroke:none;stroke-width:1.7544229;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg11367">
|
||||
<metadata
|
||||
id="metadata11373">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs11371" />
|
||||
<path
|
||||
d="m 13.499143,15.642429 c -0.45,0 -0.885857,-0.178715 -1.209857,-0.502715 L 8.859,11.710714 c -0.668571,-0.669857 -0.668571,-1.755 0,-2.423571 0.669857,-0.669857 1.755,-0.669857 2.426143,0 L 13.105714,11.109 17.573571,4.0954286 c 0.459,-0.828 1.504286,-1.1275715 2.332286,-0.6672857 0.826714,0.4602857 1.125,1.5042857 0.666,2.331 l -5.572286,9.0000001 c -0.261,0.470571 -0.727714,0.790714 -1.26,0.865286 z"
|
||||
id="path11365"
|
||||
style="display:inline;fill:#718c00;fill-opacity:1;stroke-width:1.28570998" />
|
||||
<path
|
||||
style="display:inline;fill:#333333;fill-opacity:1;stroke-width:1.28570998"
|
||||
id="path16196"
|
||||
d="M 17.142857,21 H 6.8571429 C 4.7305714,21 3,19.269429 3,17.142857 V 6.8571429 C 3,4.7305714 4.7305714,3 6.8571429,3 h 6.4285711 c 0.711,0 1.285715,0.576 1.285715,1.2857143 0,0.7097143 -0.574715,1.2857143 -1.285715,1.2857143 H 6.8571429 c -0.7097143,0 -1.2857143,0.5772857 -1.2857143,1.2857143 V 17.142857 c 0,0.708429 0.576,1.285714 1.2857143,1.285714 H 17.142857 c 0.709714,0 1.285714,-0.577285 1.285714,-1.285714 V 13.285714 C 18.428571,12.576 19.003286,12 19.714286,12 20.425286,12 21,12.576 21,13.285714 v 3.857143 C 21,19.269429 19.269429,21 17.142857,21 Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg11920">
|
||||
<metadata
|
||||
id="metadata11926">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs11924" />
|
||||
<path
|
||||
d="M 22.461538,10.769231 V 8.615385 C 22.461538,6.24 20.52923,4.3076923 18.153846,4.3076923 H 17.219692 C 17.046153,1.8683077 14.816,0 12,0 9.1839995,0 6.9538461,1.8683077 6.7803077,4.3076923 H 5.8461538 C 3.4707692,4.3076923 1.5384615,6.24 1.5384615,8.615385 v 2.153846 c 0,1.245538 0.6326154,2.273231 1.5938462,2.764307 C 2.6916923,13.764923 2.3101538,14.110769 2.032,14.548923 1.7095384,15.058462 1.5384615,15.666462 1.5384615,16.307692 v 3.384616 C 1.5384615,22.067692 3.4707692,24 5.8461538,24 H 9.2307695 C 10.432,24 11.484308,23.388308 11.990154,22.401231 l 0.04431,0.08123 C 12.569847,23.432615 13.592616,24 14.76923,24 h 3.384616 c 2.375384,0 4.307692,-1.932308 4.307692,-4.307692 v -3.384616 c 0,-1.246769 -0.633845,-2.275692 -1.596308,-2.765538 0.955077,-0.505846 1.596308,-1.545846 1.596308,-2.772923 z m -2.461539,8.923077 c 0,1.015384 -0.830769,1.846154 -1.846153,1.846154 H 14.76923 c -0.438154,0 -0.891077,-0.265847 -0.481231,-0.94277 0.30277,-0.344615 0.481231,-0.761846 0.481231,-1.211077 0,-1.190153 -1.239384,-2.153846 -2.769231,-2.153846 -1.529846,0 -2.7692295,0.963693 -2.7692295,2.153846 0,0.369231 0.116923,0.708923 0.313846,1.012923 0.6239995,0.828308 0.167384,1.140924 -0.313846,1.140924 H 5.8461538 C 4.8307692,21.538462 4,20.707692 4,19.692308 v -3.384616 c 0,-0.317538 0.1390769,-0.64123 0.4726153,-0.64123 0.128,0 0.2818462,0.048 0.4701539,0.16 0.3446154,0.302769 0.7630769,0.48123 1.2110769,0.48123 1.1889231,0 2.1538462,-1.240615 2.1538462,-2.76923 0,-1.528616 -0.9649231,-2.769231 -2.1538462,-2.769231 -0.3692308,0 -0.7089231,0.116923 -1.0116923,0.313846 C 4.8504615,11.293538 4.6227692,11.382154 4.4504615,11.382154 4.1304615,11.382154 4,11.080615 4,10.769231 V 8.615385 C 4,7.6 4.8307692,6.7692308 5.8461538,6.7692308 h 3.3846157 c 0.48123,0 0.9378465,-0.3126154 0.299077,-1.1409231 -0.182154,-0.304 -0.299077,-0.6436923 -0.299077,-1.0129231 0,-1.1901538 1.2393835,-2.1538461 2.7692305,-2.1538461 1.529847,0 2.76923,0.9636923 2.76923,2.1538461 0,0.4492308 -0.17846,0.8664616 -0.48123,1.2110769 -0.409846,0.6769231 0.04308,0.9427693 0.48123,0.9427693 h 3.384616 C 19.16923,6.7692308 20,7.6 20,8.615385 v 2.153846 c 0,0.317538 -0.139076,0.641231 -0.472616,0.641231 -0.128,0 -0.281846,-0.048 -0.470154,-0.16 -0.344615,-0.30277 -0.763077,-0.481231 -1.211077,-0.481231 -1.188923,0 -2.153846,1.240615 -2.153846,2.769231 0,1.528615 0.964923,2.76923 2.153846,2.76923 0.369231,0 0.708923,-0.116923 1.011693,-0.313846 0.291693,-0.210461 0.519384,-0.300308 0.691692,-0.299077 0.318769,0 0.449232,0.301539 0.449232,0.612923 v 3.384616 z M 4,12.546462 c 0.1427692,0.03938 0.2904615,0.06646 0.4492307,0.06646 0.4209231,0 0.8406154,-0.146461 1.2775385,-0.448 l 0.084923,-0.05046 C 5.9310769,12.036923 6.0430769,12 6.1538461,12 c 0.4356923,0 0.9230769,0.658462 0.9230769,1.538462 0,0.88 -0.4873846,1.538461 -0.9230769,1.538461 -0.1329231,0 -0.2670769,-0.05908 -0.3987692,-0.174769 l -0.176,-0.128 C 5.2086153,14.548923 4.8356923,14.435692 4.4726153,14.435692 4.3076923,14.435692 4.1513846,14.464002 4,14.508312 Z M 19.550769,14.464 c -0.420922,0 -0.840616,0.146462 -1.277539,0.448 l -0.08492,0.05046 c -0.119384,0.07754 -0.231383,0.114461 -0.340923,0.114461 -0.435692,0 -0.923077,-0.658461 -0.923077,-1.538461 0,-0.88 0.487385,-1.538462 0.923077,-1.538462 0.132924,0 0.267077,0.05908 0.39877,0.174769 l 0.175999,0.128 c 0.371693,0.225231 0.743385,0.338462 1.106462,0.338462 0.167384,0 0.322461,-0.03077 0.472616,-0.07631 v 1.965539 c -0.144,-0.03938 -0.291693,-0.06646 -0.450462,-0.06646 z m -8.54523,7.074462 C 11.129847,21.112615 11.12,20.534154 10.630154,19.820308 l -0.05415,-0.09108 c -0.07631,-0.120616 -0.115692,-0.232616 -0.115692,-0.343385 0,-0.435692 0.657231,-0.923077 1.538462,-0.923077 0.88123,0 1.538461,0.487385 1.538461,0.923077 0,0.132923 -0.05908,0.267077 -0.176,0.4 l -0.128,0.174769 c -0.4,0.660923 -0.382769,1.204923 -0.270769,1.580308 h -1.956923 z"
|
||||
id="path11918"
|
||||
style="stroke-width:1.23077;fill:#000000;fill-opacity:0.72156864" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
@@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg7030">
|
||||
<metadata
|
||||
id="metadata7036">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7034" />
|
||||
<g
|
||||
id="g7028"
|
||||
transform="matrix(0.95238095,0,0,0.95238095,0.5714286,0.09523812)"
|
||||
style="fill:#333333;fill-opacity:1">
|
||||
<path
|
||||
d="M 19.414,8.902 C 19.518,8.854 19.62,8.794 19.707,8.707 l 0.5,-0.5 c 0.391,-0.391 0.391,-1.023 0,-1.414 -0.391,-0.391 -1.023,-0.391 -1.414,0 l -0.5,0.5 -0.115,0.173 C 16.791,6.154 14.99,5.276 12.989,5.056 L 13,5 V 4 h 1 C 14.55,4 15,3.55 15,3 15,2.45 14.55,2 14,2 H 10 C 9.45,2 9,2.45 9,3 9,3.55 9.45,4 10,4 h 1 v 1 l 0.012,0.057 C 6.506,5.549 3,9.364 3,14 c 0,4.971 4.029,9 9,9 4.971,0 9,-4.029 9,-9 0,-1.894 -0.588,-3.648 -1.586,-5.098 z M 12,21 C 8.141,21 5,17.86 5,14 5,10.14 8.141,7 12,7 c 3.859,0 7,3.14 7,7 0,3.86 -3.141,7 -7,7 z m 1,-8 v -2 c 0,-0.55 -0.45,-1 -1,-1 -0.55,0 -1,0.45 -1,1 v 3 c 0,0.55 0.45,1 1,1 h 3 c 0.55,0 1,-0.45 1,-1 0,-0.55 -0.45,-1 -1,-1 z M 12,8 c -3.312,0 -6,2.688 -6,6 0,3.312 2.688,6 6,6 3.312,0 6,-2.688 6,-6 0,-3.312 -2.688,-6 -6,-6 z m 0,11 C 9.243,19 7,16.757 7,14 7,11.243 9.243,9 12,9 c 2.757,0 5,2.243 5,5 0,2.757 -2.243,5 -5,5 z"
|
||||
id="path7026"
|
||||
style="fill:#333333;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg4455"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs4459" />
|
||||
<path
|
||||
d="M19 17h-14c-1.103 0-2 .897-2 2s.897 2 2 2h14c1.103 0 2-.897 2-2s-.897-2-2-2zM19 10h-14c-1.103 0-2 .897-2 2s.897 2 2 2h14c1.103 0 2-.897 2-2s-.897-2-2-2zM19 3h-14c-1.103 0-2 .897-2 2s.897 2 2 2h14c1.103 0 2-.897 2-2s-.897-2-2-2z"
|
||||
id="path4453"
|
||||
style="fill:#4271ae;fill-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 571 B |
@@ -0,0 +1,100 @@
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus diam nibh, tincidunt et quam at, fringilla malesuada risus. Nullam eleifend, sem nec varius tincidunt, urna mi varius dolor, sit amet gravida risus eros at purus. Etiam vehicula hendrerit elit, sit amet pulvinar dolor viverra sed. Curabitur metus ex, gravida at sodales sed, tristique eget diam. Suspendisse ultricies lorem sed ullamcorper rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tempus magna mi, sit amet sagittis arcu viverra ut.
|
||||
Fusce in pretium tellus. Donec finibus vitae arcu at consectetur. Suspendisse et ultricies nisl. Integer et nisi vel sem aliquam scelerisque. Curabitur placerat massa et mi feugiat vulputate. In ac orci vitae risus dictum porttitor quis ut dui. Vivamus egestas condimentum risus quis fermentum. Nam lorem ante, rhoncus vel porttitor in, sodales in purus. Mauris ultricies ex metus, molestie ullamcorper arcu suscipit id.
|
||||
Cras dapibus porta eros, a tincidunt sapien mattis sit amet. Pellentesque ac metus in dui accumsan tristique eget eu tellus. Nam laoreet sapien vitae hendrerit ullamcorper. Mauris accumsan semper dui vitae pellentesque. Donec non velit cursus, eleifend nulla a, porttitor tellus. Donec elementum lobortis imperdiet. Etiam fermentum pretium arcu, sed consequat dui mattis nec. Mauris cursus fringilla magna, at pharetra justo. Sed tincidunt consequat urna, quis varius lacus dapibus id. Fusce sagittis lorem vitae sodales tempor. Ut vel feugiat lacus, in iaculis risus. Aliquam viverra tortor nec nibh tristique varius. Mauris interdum leo vitae massa sagittis venenatis.
|
||||
Quisque cursus eu orci at viverra. Donec libero libero, sagittis a sagittis vitae, efficitur sed nibh. Donec imperdiet malesuada est. Etiam consequat quam arcu, quis egestas libero sagittis a. Donec purus urna, volutpat id ante nec, iaculis maximus velit. Vivamus malesuada lacus sed velit consequat fringilla. Pellentesque ornare accumsan aliquam. Suspendisse tempor vel nisi quis iaculis. Curabitur porta ligula ac libero molestie, nec viverra ex feugiat. Donec lacinia eget lorem eu lacinia. Maecenas vestibulum ornare dui a aliquet.
|
||||
Proin id lobortis nunc, ut feugiat urna. Nam dictum odio tortor, bibendum sollicitudin erat suscipit eu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Suspendisse eu imperdiet lectus. Nullam faucibus elit leo, sit amet pulvinar diam iaculis ac. Pellentesque accumsan vulputate orci sed ornare. Fusce at tortor ac libero volutpat tempus nec a diam. Nam eu libero tristique, rutrum magna suscipit, malesuada ligula.
|
||||
Praesent suscipit imperdiet arcu vitae faucibus. Phasellus massa mauris, pharetra at posuere vel, fringilla sed quam. Morbi nec congue ante, vel vulputate massa. Suspendisse imperdiet mollis dignissim. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pulvinar odio tellus, non cursus turpis malesuada sit amet. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque ex lorem, hendrerit ac enim et, tempor sodales ante. Curabitur quis tristique mauris, quis imperdiet metus. Mauris tristique interdum congue. Phasellus finibus condimentum pretium. Sed et tellus vel quam molestie aliquet.
|
||||
Phasellus sagittis ligula nibh, nec hendrerit libero maximus et. Morbi vestibulum, tortor non efficitur semper, velit lacus molestie augue, ac volutpat elit ante ac augue. Pellentesque ut tristique odio, vel ornare eros. Nunc at ullamcorper arcu, in ornare risus. Vivamus sed libero auctor, vulputate lectus ut, luctus lectus. Maecenas finibus at nulla vel congue. Nullam finibus mauris leo, ac volutpat sem pulvinar eget. Maecenas in posuere tellus, in placerat est. Ut at est semper, ullamcorper ligula ac, volutpat nisi. Donec tempus tellus sed lorem posuere, a rutrum odio faucibus. Donec porta sem ac tortor vulputate, sed pharetra sapien convallis. Praesent ac feugiat odio. In risus eros, pharetra sit amet porta eu, lacinia vel nunc.
|
||||
Praesent consectetur tincidunt mauris ut dignissim. Aenean sagittis ornare mi at sagittis. Proin id suscipit ipsum. Mauris lacinia commodo molestie. Fusce nec pharetra purus. Nulla eget velit varius, tincidunt erat tincidunt, cursus odio. Aliquam accumsan risus non nibh hendrerit fermentum. Aliquam erat volutpat. Phasellus non tincidunt lacus. Quisque sagittis augue eu egestas maximus. Integer sed eleifend neque, nec finibus sapien. Aliquam malesuada urna nec justo sodales dignissim. Cras volutpat maximus euismod. Pellentesque consequat lorem non augue placerat dignissim. Ut dolor nisl, malesuada sed nunc quis, malesuada dignissim nibh. Nam hendrerit hendrerit sapien quis auctor.
|
||||
Aenean feugiat enim eros, interdum tincidunt eros aliquam sit amet. Fusce hendrerit mi vulputate nisi vestibulum tempor. Vestibulum at dui et nisl viverra condimentum id sit amet leo. Phasellus vitae leo commodo, blandit magna ut, commodo enim. Donec ex elit, mattis non tincidunt quis, posuere ut sapien. Aliquam lacus mauris, commodo sed libero vitae, rhoncus sodales massa. Phasellus commodo, leo sit amet sollicitudin luctus, massa purus aliquet lectus, at rutrum nulla ante eget felis. Nulla facilisi. Aenean cursus ut diam non volutpat. Aliquam nec erat non ipsum ultricies hendrerit. Phasellus blandit ac lacus non laoreet. Etiam ultricies risus mauris, a volutpat nibh cursus in. Maecenas viverra odio sit amet libero feugiat tempor. Nullam eu tristique magna. Praesent sed lacus ligula.
|
||||
Sed iaculis viverra mollis. Phasellus sed eros sit amet lectus vulputate ornare sed non dui. Donec pretium dui quis felis feugiat elementum. Quisque eleifend eget nunc eu cursus. Etiam finibus lectus non ipsum ornare malesuada. Integer nec eros ullamcorper, pharetra neque at, suscipit ex. Nam faucibus sapien est, vel viverra ante viverra a.
|
||||
Ut quis euismod lorem. Fusce auctor quam eu velit semper, sed pretium odio semper. Fusce vehicula porta dignissim. Integer suscipit ultrices ultricies. Aenean pharetra cursus sem. Suspendisse ut porttitor neque. In luctus purus sagittis risus gravida pulvinar. Integer eu ante convallis, pharetra velit vel, sodales urna. Curabitur pretium sapien arcu, eget dignissim neque ornare in. Vivamus eget metus et diam pulvinar aliquam vel eu turpis. Donec augue metus, dapibus eu porta a, faucibus in felis. Etiam sodales arcu a ex fermentum, sit amet rutrum est auctor. Integer gravida lorem in mauris tincidunt lobortis.
|
||||
Etiam lobortis dictum dapibus. Nulla tincidunt placerat aliquam. Mauris non ornare nisi. Integer hendrerit ornare nibh, non vehicula sapien maximus eu. Proin purus erat, dapibus id dui commodo, blandit sodales mauris. Sed a vulputate lectus. Curabitur vel tincidunt orci. Vivamus cursus augue non nisl dictum, eget venenatis mi eleifend. Integer in ultricies ligula. Phasellus et sodales est, eget mollis magna. Sed lacinia, ligula eget feugiat ullamcorper, eros ipsum dignissim sapien, in suscipit mauris odio at metus. Suspendisse eget felis eu nulla porttitor dignissim at eu felis. Duis pulvinar est mauris, sit amet volutpat lacus hendrerit non. Aliquam finibus rhoncus mauris. Nunc dui nunc, lacinia aliquam finibus ut, maximus quis odio. Sed tempus dui vel orci vehicula, a tristique risus consectetur.
|
||||
Ut egestas velit eu urna imperdiet cursus. Aenean blandit pretium turpis, quis sollicitudin lacus dignissim eu. In eu orci posuere, volutpat velit et, varius velit. Mauris rutrum sem nunc, nec sagittis lectus accumsan at. Morbi vestibulum est ut dolor maximus, non euismod magna consequat. Morbi pharetra gravida velit ac suscipit. Fusce vitae turpis eget ante tempus bibendum. Integer sollicitudin vulputate neque eu pulvinar. Etiam consequat pulvinar lorem eu dignissim. Fusce luctus id lacus ut fermentum. Vestibulum ligula neque, finibus et aliquam vel, consequat id lacus. Quisque pretium elit a tincidunt aliquam.
|
||||
Maecenas varius magna in dictum dapibus. Vestibulum eget mattis velit, ac accumsan tellus. Donec luctus lorem in nisl convallis, eget egestas erat varius. Phasellus et lacinia dui. Praesent id nunc elementum, ultricies dolor a, pulvinar tellus. In a auctor mi, in fermentum justo. Proin sit amet vulputate leo, eu ultrices sem. Integer at sagittis ex, eu scelerisque velit.
|
||||
Curabitur auctor mollis nunc quis venenatis. Cras lectus ligula, auctor in tellus eget, aliquet molestie odio. Vivamus vel venenatis sem. Sed ac purus suscipit, pulvinar sapien sed, commodo arcu. Donec eget metus ipsum. Quisque posuere congue hendrerit. Phasellus eu scelerisque ipsum, ut vulputate diam. Curabitur sollicitudin tortor sapien, a finibus arcu consequat non. Suspendisse tempus magna porttitor mauris laoreet, quis tincidunt lectus iaculis. Fusce nibh magna, finibus ac enim at, volutpat dapibus metus. Duis iaculis sapien non erat vestibulum auctor.
|
||||
Maecenas nec porta leo. Fusce aliquam massa sit amet blandit interdum. Donec malesuada enim in eros laoreet iaculis. Integer fermentum faucibus nunc, et congue massa mattis eu. Pellentesque sed sodales orci. Praesent pulvinar lacus eget turpis condimentum imperdiet. Nullam molestie, ipsum a molestie accumsan, lectus quam sodales eros, malesuada faucibus ex leo malesuada velit. Fusce molestie ligula at sapien dictum semper non rutrum sapien. Ut facilisis gravida ante nec faucibus. Sed aliquet luctus auctor. In tempor libero at eleifend convallis. Phasellus in tristique ligula. Vestibulum eget quam dapibus, luctus enim vel, sagittis eros. Cras laoreet sapien diam, eu posuere nisl blandit quis.
|
||||
Vestibulum bibendum a massa ac faucibus. Maecenas vestibulum arcu id diam mattis, non varius orci aliquet. Vivamus sit amet ultrices velit. Donec vitae lorem vel lectus dignissim porta. Sed ac dui dui. Suspendisse lectus ante, pellentesque non euismod vel, finibus ut erat. Vestibulum accumsan facilisis velit, at posuere velit malesuada at. Mauris aliquam tortor sed pretium viverra. Ut et porttitor ex. In quis tellus vitae neque dignissim finibus nec eu dolor. Phasellus viverra nulla a vestibulum auctor. Praesent in lorem gravida, mattis enim commodo, volutpat tellus. Quisque non urna ac eros sollicitudin blandit sit amet ut risus. Integer sed diam a metus tristique consectetur vitae non velit. Aliquam justo est, pharetra vel libero in, molestie varius enim.
|
||||
Fusce vestibulum auctor varius. Maecenas malesuada, purus quis congue vehicula, arcu purus congue nunc, non convallis felis magna quis nisi. Curabitur nisi diam, imperdiet et sollicitudin quis, ultricies nec enim. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus rutrum, lectus at condimentum condimentum, felis justo lacinia orci, non venenatis nisl ex sed enim. Aenean semper ligula a diam cursus, ac sollicitudin ligula pretium. Etiam eleifend lorem nec massa tempor sollicitudin. Phasellus dignissim velit dignissim mauris vestibulum, sit amet sagittis sem blandit. Donec lobortis varius nunc sit amet posuere. Cras eu est lobortis, aliquet nisi in, varius mauris. Curabitur vitae leo laoreet sem condimentum vestibulum et eget enim. Nullam sed turpis ac nunc ornare tristique sit amet vel arcu. Cras efficitur ullamcorper lorem, et scelerisque lectus volutpat a. Maecenas ut urna in lacus rutrum volutpat.
|
||||
Pellentesque pretium, neque quis cursus sagittis, justo mauris euismod turpis, non feugiat lacus augue a magna. Nam ornare dictum erat et consequat. Vivamus fringilla odio velit, vitae convallis arcu vulputate et. Maecenas tristique purus ac velit cursus fringilla. Suspendisse id blandit dui, eu facilisis metus. Proin a erat rutrum, tempus lectus ut, consequat nisi. In dui sem, bibendum nec nibh nec, sollicitudin varius ipsum. Nulla id lectus eu eros placerat faucibus eget nec nunc. Nullam urna lectus, tempus nec libero a, egestas malesuada enim.
|
||||
Curabitur vestibulum a nibh eget varius. Sed lacus ipsum, porta sit amet egestas sit amet, pellentesque a dui. Etiam auctor mollis orci, eget pulvinar magna tristique quis. Proin condimentum ornare nibh, sed interdum orci congue at. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas quis lacinia tellus. Nullam ac nibh auctor, fermentum velit ac, rutrum ipsum. Nam egestas sodales hendrerit.
|
||||
Suspendisse a feugiat mauris. Nunc eget nisi augue. Suspendisse pharetra justo sit amet sollicitudin tincidunt. Duis pretium, leo quis euismod sagittis, ex ante sodales purus, vel tempor odio nisi ut diam. Praesent odio erat, ultricies et eros ac, pulvinar aliquet justo. Pellentesque non vestibulum sem, a vulputate purus. Nunc rutrum nulla vitae mattis pharetra. Integer dui diam, pulvinar sit amet velit bibendum, aliquet dictum nulla. Nam ut magna et lorem ornare dignissim eget quis mauris. Vestibulum aliquet mi ac rutrum varius. Mauris a imperdiet eros. Curabitur lobortis lectus vitae leo aliquam auctor. Ut et tincidunt dui.
|
||||
Mauris luctus risus eu tempor pulvinar. Mauris et mi nec ligula imperdiet vulputate a congue ex. Proin et venenatis mauris. Vivamus viverra accumsan lorem at gravida. Aliquam non pretium ante. Morbi aliquam risus sapien, quis consequat tellus maximus vitae. Sed consequat libero in molestie faucibus. Donec vestibulum arcu a sodales volutpat. Nullam ultricies ante quis quam accumsan rutrum. Quisque eu egestas velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu risus vestibulum enim iaculis pellentesque iaculis eu ligula. Nam rutrum, mauris sit amet efficitur eleifend, massa quam consequat metus, eget sodales leo sem eget risus. Aliquam dui libero, maximus at dui nec, consectetur maximus ligula. Sed gravida erat eget tristique lobortis.
|
||||
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean turpis velit, vestibulum a consequat vitae, efficitur id urna. Cras dapibus dui et scelerisque luctus. Sed vel malesuada justo. Suspendisse molestie iaculis lacus eu tempor. Praesent laoreet lectus quis malesuada volutpat. Fusce consectetur mollis ligula, a lobortis justo suscipit id. Integer eget tellus in arcu viverra accumsan eu et odio. Praesent ut felis risus. Pellentesque convallis felis et quam condimentum, at pellentesque nulla eleifend. Sed eget efficitur dui. Vivamus congue, leo eu lacinia condimentum, erat mi dignissim purus, sit amet convallis lorem sem sed ligula. Duis viverra leo enim, in pharetra felis consectetur viverra. Integer euismod feugiat ipsum eget vestibulum. Morbi fermentum dui vitae tincidunt dictum.
|
||||
Phasellus non eros ut ipsum pretium condimentum. Vestibulum tristique convallis aliquam. Phasellus tempor leo sit amet diam tristique, a auctor urna hendrerit. Mauris at velit euismod, sollicitudin mi at, scelerisque est. Mauris pulvinar consequat quam, eget varius augue tincidunt id. Curabitur turpis lectus, eleifend a egestas id, malesuada non diam. Proin aliquet tellus urna, venenatis consequat tortor finibus et. Quisque at tempor magna.
|
||||
Donec nec congue erat. Donec mauris lorem, dignissim euismod massa non, egestas pulvinar est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean aliquam venenatis eleifend. Vivamus consectetur ante et fringilla sodales. Nam vestibulum felis non sapien suscipit consectetur et interdum velit. Sed at placerat massa. Proin quis leo lectus. Integer diam velit, gravida quis rhoncus eget, tempor at ante. Aliquam pharetra dictum mi ac venenatis. Nunc volutpat id magna a pellentesque. In rutrum leo et ligula finibus, ut pretium lorem tristique. Curabitur vel orci iaculis, pellentesque justo et, ullamcorper orci. Quisque erat ante, venenatis ac lacinia ut, maximus ac odio. Aliquam varius bibendum varius.
|
||||
Duis ipsum orci, semper sit amet volutpat quis, scelerisque a nunc. Donec iaculis, erat vitae malesuada rutrum, nisl leo gravida nisi, et dignissim eros eros at mi. Cras volutpat est erat. Maecenas ex felis, porttitor vitae egestas sit amet, tincidunt efficitur tortor. Curabitur ac purus massa. Etiam porta maximus tristique. Morbi placerat pulvinar lectus sed tempus. Morbi fringilla odio posuere, volutpat mi sed, congue lorem. Cras convallis volutpat eros mattis vestibulum. Ut sit amet sodales eros, ac condimentum purus. Vivamus et elit augue. Pellentesque efficitur gravida ullamcorper. Sed non faucibus tellus, et consectetur urna. Pellentesque at turpis fringilla ipsum interdum hendrerit eu in dui. Nullam dictum eget metus non sollicitudin. Proin facilisis tincidunt euismod.
|
||||
Nunc et dui porta, suscipit mi vitae, pretium ante. Mauris a accumsan magna. Fusce tincidunt, nunc ut ullamcorper laoreet, nibh risus dignissim eros, a maximus arcu nunc congue arcu. Vivamus imperdiet quam lorem, vulputate consequat ante aliquet id. Sed porttitor mollis ullamcorper. Praesent dui justo, hendrerit quis vulputate sit amet, vulputate id libero. Etiam quam odio, dictum sit amet nisi in, semper placerat erat. Vivamus lacinia augue a dolor tincidunt dignissim. Curabitur ut massa sit amet elit tincidunt maximus.
|
||||
Integer sed lorem ac lacus tincidunt condimentum quis vel diam. Etiam vitae justo interdum, accumsan ex vel, pretium magna. Aenean id turpis malesuada, semper nisi vel, hendrerit leo. Vestibulum feugiat neque nec lacus auctor efficitur. Ut quis lobortis lacus, sit amet tempor orci. Donec a fringilla sem, nec sollicitudin ex. Sed vel faucibus libero. Sed pharetra leo sed porta ullamcorper. In auctor semper metus, id semper nunc rutrum a. Morbi rhoncus nulla quis ex condimentum, vel congue lectus tempor. Duis a venenatis est. Etiam dolor justo, rhoncus at lobortis quis, malesuada at quam. Donec facilisis convallis mi vitae rhoncus. Integer est ipsum, sollicitudin eu nulla in, accumsan egestas nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc finibus sagittis nisl, et luctus ex.
|
||||
In molestie est luctus magna hendrerit, non tristique felis ultricies. Curabitur non lectus placerat, tincidunt ipsum quis, mollis nunc. Nam lacinia ullamcorper hendrerit. Fusce porttitor nisi laoreet, elementum velit vitae, venenatis mi. Aliquam venenatis dui ac justo varius fermentum. Etiam nec ligula eu neque aliquam placerat mollis ac dolor. Pellentesque gravida, enim commodo tempus faucibus, lorem nibh vulputate arcu, sodales pellentesque metus ligula volutpat sem. In scelerisque nisi ac ante lacinia auctor.
|
||||
Nunc at sodales libero, ut rutrum elit. Etiam vitae venenatis metus. Nullam faucibus turpis nisl. Maecenas varius sit amet lectus a ornare. Cras eget tortor mauris. Phasellus mattis nec tortor non sagittis. Integer eget placerat massa. Praesent eu porttitor leo. Vivamus sed bibendum sapien, sit amet maximus libero. Donec at lobortis lacus.
|
||||
Maecenas convallis eros nibh, nec pellentesque magna lacinia vulputate. Donec posuere neque ut lacinia iaculis. Quisque varius dictum condimentum. Aliquam lacinia elit sed sem porttitor tempus a ac ipsum. Aliquam suscipit ex vel tellus mollis, nec suscipit nunc ullamcorper. Cras urna magna, feugiat a odio a, pharetra congue velit. Proin quis hendrerit odio. Proin non orci ut sem ultricies sodales. Morbi dictum orci non enim tempor, ut condimentum erat maximus. Nam sagittis ornare lacus, at sodales dolor porttitor nec. Mauris dignissim ipsum in massa rutrum blandit. Nulla sit amet ante vestibulum, pharetra tellus eu, elementum tortor. Donec nec fringilla mi.
|
||||
Donec rhoncus odio a iaculis ullamcorper. Nam condimentum volutpat ante quis viverra. Vestibulum malesuada nibh tincidunt rutrum interdum. Sed dapibus et nisl vel ornare. Nunc ullamcorper nibh nec commodo eleifend. Nulla facilisi. Nullam ut est auctor ligula viverra dictum pellentesque id odio. Aenean eleifend ullamcorper mollis. Morbi quis rutrum dolor, vel dignissim purus. In vel metus scelerisque, auctor est quis, efficitur orci. Donec volutpat dui eu vulputate maximus. In hac habitasse platea dictumst. Quisque vel vulputate lorem. Phasellus lacinia tempus lectus, sed tristique magna hendrerit eu. Nullam non metus euismod dolor fringilla imperdiet et vitae purus. Sed varius ex tortor, vel rutrum turpis sagittis ac.
|
||||
Sed nec tincidunt turpis, sit amet suscipit nisi. Curabitur ultrices orci ligula, nec cursus eros placerat non. Pellentesque faucibus venenatis nisi in condimentum. Morbi facilisis mauris odio, id facilisis ex dictum ut. Duis bibendum ultricies elit, sit amet dapibus risus ultricies quis. Nulla eget ullamcorper risus, ac imperdiet nulla. Proin ultrices nisi eu turpis elementum hendrerit. Maecenas euismod pretium quam accumsan finibus. Morbi augue enim, laoreet nec nunc id, lobortis hendrerit lorem. Nunc mattis cursus dui vel lacinia. Aenean massa tellus, laoreet sit amet turpis vel, pharetra facilisis dui.
|
||||
Nunc sit amet tellus vel ligula vulputate dapibus. Donec non congue nisi. Mauris risus elit, vehicula a imperdiet a, tempor gravida ipsum. Sed erat magna, volutpat ac nunc sit amet, aliquam lobortis est. Mauris quis urna sem. Sed risus justo, vestibulum ac pharetra in, dignissim id nibh. Etiam nibh justo, auctor in tellus euismod, rhoncus lobortis dolor. Proin felis lectus, hendrerit nec dignissim nec, molestie a lorem. Phasellus commodo pellentesque ligula nec imperdiet. In quis sem a erat euismod elementum at sit amet sem.
|
||||
Praesent tortor enim, iaculis sit amet placerat in, sodales non erat. Phasellus porttitor, massa vel posuere tincidunt, mauris magna ultrices mi, in aliquet sapien sapien ut libero. Sed accumsan odio ut mollis dignissim. Aliquam varius egestas condimentum. Etiam id massa condimentum, scelerisque velit sed, vulputate augue. Duis mollis augue eu felis venenatis dapibus. Vivamus non gravida nulla. Integer a mi mollis, pharetra ipsum eget, tincidunt sapien.
|
||||
Phasellus libero arcu, aliquet rutrum commodo vel, efficitur quis libero. Morbi sed eros ante. Quisque efficitur leo eget nulla lobortis, eget imperdiet sem vehicula. Nunc commodo lorem sit amet felis aliquam, non facilisis velit tristique. Aliquam dapibus rutrum dignissim. Phasellus elementum nulla a enim venenatis, at ornare sapien feugiat. Proin ut sem eu nulla rutrum volutpat non non quam. Fusce vel pellentesque lectus, vitae pellentesque est. Praesent sit amet dolor non purus feugiat pharetra. Donec ullamcorper diam vitae sem varius, eget imperdiet nisi viverra. Fusce fermentum dui risus. Etiam sed diam ut libero sollicitudin faucibus at in sapien. Suspendisse bibendum purus at urna vehicula, sed maximus nisi pharetra. Proin posuere nisl ac consectetur sollicitudin. Nam auctor in ex scelerisque imperdiet.
|
||||
Donec consequat arcu non lacus ullamcorper, a fermentum felis lobortis. Nunc tempor est quam, ut finibus odio rutrum sit amet. Proin hendrerit tincidunt nunc, sed tincidunt nisi tempor eget. Phasellus maximus a risus ut luctus. Duis libero enim, varius a tellus vitae, dignissim facilisis felis. Vestibulum iaculis tempor condimentum. Sed mollis velit justo, quis mollis lectus imperdiet sed. Quisque laoreet eget eros porta imperdiet. Curabitur pretium velit quis sapien placerat, in blandit metus suscipit. Ut pretium urna lectus, sed interdum arcu fermentum et.
|
||||
Sed euismod nunc quam, nec tincidunt dui tempus at. Mauris molestie, quam vel lobortis dignissim, justo sem porta orci, nec commodo enim orci eget dolor. Pellentesque eros risus, fermentum non urna et, ultrices pharetra augue. Curabitur at tincidunt arcu. Etiam vel sollicitudin libero. Nulla dapibus orci odio, sit amet mattis quam sodales ac. Sed iaculis at eros volutpat egestas. In at fringilla massa. Proin at mattis turpis. Phasellus non metus et leo fermentum pretium non nec odio. Ut ante orci, interdum vel gravida eget, mollis in tortor. Sed rutrum ornare arcu in efficitur. Nulla facilisi.
|
||||
Aenean vestibulum nisl sed eleifend ullamcorper. Suspendisse viverra imperdiet nisi, sed imperdiet tortor vulputate ut. Nunc consequat nisi eu laoreet mollis. Quisque metus ante, fringilla at rutrum id, consectetur vel enim. Pellentesque posuere tempor urna, sit amet vulputate urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; In hac habitasse platea dictumst. Nullam quis elementum purus. Cras eleifend sed justo vitae faucibus. Morbi interdum neque vitae elementum sollicitudin. Etiam eleifend, sapien at interdum consectetur, ex mauris dictum sem, in convallis dolor felis sollicitudin augue. Curabitur id tortor ex. Mauris finibus, lectus convallis euismod congue, est tortor suscipit velit, ac dictum augue risus ut lectus. Vestibulum ultricies luctus hendrerit. Integer elit nibh, condimentum id tempus nec, euismod nec nunc.
|
||||
Sed porttitor hendrerit eros vitae suscipit. Vestibulum quis est elit. Sed neque leo, condimentum quis condimentum sed, posuere ut ex. Suspendisse mattis est nunc, in ullamcorper felis pellentesque sed. In hac habitasse platea dictumst. Maecenas tempus et turpis vestibulum porttitor. Quisque nulla odio, rhoncus et porta ut, hendrerit non sapien. Proin consequat, ex sed consequat iaculis, magna dolor consequat dui, eget rhoncus magna lorem in turpis. Cras urna sem, tincidunt ac aliquet id, imperdiet vitae neque. Fusce ac risus nisi. In erat urna, feugiat ac purus non, volutpat pulvinar ipsum. Morbi ultricies eros at nulla ullamcorper, nec lobortis arcu convallis. In maximus efficitur quam id maximus.
|
||||
Etiam posuere urna non diam accumsan tempor. Donec facilisis blandit leo sed convallis. Nullam ut nisl vel dolor varius accumsan vitae a dui. Nunc ullamcorper nunc ac rhoncus pretium. Mauris ac lectus urna. Phasellus quis interdum nisi. Suspendisse mi ex, mollis a euismod vel, pretium et est. Mauris condimentum in ipsum quis lacinia. Mauris scelerisque molestie nibh, auctor lobortis felis convallis ac. Praesent vestibulum luctus urna non tincidunt. Quisque id nisl pretium, bibendum nisl nec, gravida quam. Curabitur eget cursus purus, non commodo felis. Vestibulum non lectus nec quam auctor dictum. Curabitur molestie elit mi, non tempor nisi aliquam in. Etiam fringilla lacinia est.
|
||||
Pellentesque eleifend pulvinar eros, quis pulvinar arcu fermentum sed. Nam augue lectus, malesuada id mattis nec, ullamcorper sed nisi. Phasellus volutpat nisl eu commodo feugiat. Morbi eget sapien iaculis, consectetur est in, tempus metus. Donec hendrerit lectus aliquam ex faucibus pellentesque. Praesent lobortis libero sit amet metus commodo faucibus. Sed gravida eget mi at finibus.
|
||||
Vivamus nec ligula vitae augue auctor viverra. Sed vulputate eget libero a porta. Aenean nisl turpis, tincidunt et placerat sit amet, bibendum quis libero. Nullam ultrices a ex sit amet dapibus. Suspendisse id congue lorem. In viverra convallis neque. In facilisis dui quis rhoncus semper. Ut id imperdiet libero. Fusce condimentum, sem id elementum aliquam, quam augue tincidunt felis, at suscipit lorem eros eget augue. Suspendisse eros dui, consectetur a arcu in, hendrerit dapibus risus. Proin purus erat, tincidunt eget ante sit amet, consequat convallis erat. Praesent et ornare nisl, id vehicula nulla.
|
||||
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean dignissim pellentesque mi, consectetur ornare leo egestas vitae. Suspendisse dignissim sapien orci, sed vestibulum neque maximus at. Sed lobortis urna consequat, sollicitudin lectus eget, finibus ante. Phasellus accumsan dolor non porttitor gravida. Duis eget eros ac lectus blandit posuere. Quisque sagittis nibh nunc, eu egestas nisi cursus at. Praesent accumsan fringilla neque eget iaculis. Nunc vulputate tempus tellus non porta. Sed faucibus vel dui in posuere. Sed quam arcu, accumsan id placerat sollicitudin, congue in diam.
|
||||
Cras sed nunc in turpis dignissim vehicula non a libero. Sed iaculis nulla fermentum lacinia porta. Pellentesque sit amet efficitur est. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis et ultrices justo. Etiam ut blandit nibh. In tempus lorem nec ultrices sagittis. Vivamus vel nulla faucibus, bibendum sapien ut, tristique diam. Donec pulvinar nisi nec semper blandit. Duis porttitor nibh enim, iaculis efficitur est sagittis a. Maecenas at eros ac quam pellentesque tempus nec ac magna. Donec pulvinar enim non congue facilisis. Donec eros orci, finibus vel lectus molestie, interdum scelerisque libero. Proin congue arcu lorem, in lobortis libero placerat vel. Nullam cursus est id lectus laoreet tempus et sed ex. Sed erat odio, molestie mattis egestas iaculis, sollicitudin eu ex.
|
||||
Donec sodales metus ut mi suscipit, quis pretium lorem ultrices. Donec placerat ante at pellentesque vulputate. Etiam id augue vel eros facilisis interdum. Mauris imperdiet, arcu sit amet tincidunt posuere, risus quam luctus diam, eget tincidunt ipsum magna a mauris. In hac habitasse platea dictumst. Fusce lacinia sem ut ullamcorper tristique. Nunc mattis massa tellus, vitae lacinia sem tincidunt ut. Phasellus sodales justo ut ligula iaculis, sit amet ultricies arcu lacinia. Nam ac dignissim orci. Nullam nec orci nec est bibendum ultrices. Nam pulvinar consequat eros, ut laoreet massa blandit nec. Proin tristique venenatis pretium. Curabitur vitae dui est. Integer fermentum, ligula in faucibus porttitor, sem nunc rhoncus turpis, a faucibus lectus risus quis eros. Pellentesque et lorem eu dolor placerat interdum. Aliquam luctus scelerisque leo eu faucibus.
|
||||
Vivamus id hendrerit odio, nec pellentesque magna. Proin augue eros, egestas nec eleifend ac, varius a sapien. Pellentesque viverra orci at condimentum euismod. Nam placerat lacus et augue porttitor blandit. Fusce scelerisque metus mollis nisl sollicitudin congue. Phasellus dictum velit arcu. Duis lacinia quam mauris, rhoncus porta enim dignissim posuere. Curabitur tempor urna eget ex cursus iaculis. Sed semper nisi nec nibh tempor pellentesque. Nulla vel turpis ac ipsum maximus porttitor eu sed nisl. Aliquam accumsan elit risus, eget sollicitudin ipsum lobortis at. Nulla sagittis faucibus sodales. Curabitur viverra pharetra quam quis efficitur. Integer eget justo maximus, dignissim magna vitae, consectetur metus. Suspendisse tincidunt, nunc eu vehicula faucibus, arcu felis accumsan velit, id rhoncus dui sapien vel purus.
|
||||
Nullam lacinia urna commodo vehicula fringilla. Donec tellus est, bibendum a quam in, pellentesque auctor odio. Donec vehicula velit et leo consequat, sed eleifend mauris aliquam. Vivamus nibh ligula, blandit eu leo quis, pretium malesuada augue. Pellentesque at lacinia magna. Sed nec dolor porttitor, finibus erat ut, fringilla leo. Phasellus sed ex pellentesque, semper elit auctor, fermentum turpis. Vestibulum dictum sodales augue volutpat pretium. Integer pharetra volutpat nisl at dignissim. Mauris mattis, turpis nec volutpat maximus, sapien dolor elementum urna, ac iaculis neque dui non urna. Duis scelerisque magna nec nunc mattis maximus. In lobortis massa ante, non sagittis turpis viverra nec. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer viverra velit a fringilla sodales.
|
||||
Suspendisse id arcu ut nisl ultrices convallis ornare in lectus. Nunc ultrices nulla vitae libero rutrum lobortis. Nullam hendrerit consectetur augue sit amet ornare. Cras dui est, pharetra at augue rhoncus, pharetra congue enim. Suspendisse maximus magna ut neque porta, in porttitor lorem pretium. Ut a dignissim magna, non tincidunt tortor. Vestibulum posuere tempus leo vitae blandit. Cras convallis ex a mi maximus fringilla a ac metus. Nunc sodales tincidunt semper. Praesent at risus eu neque tempus consectetur vel a odio.
|
||||
Fusce bibendum ex a risus feugiat tincidunt. In ac volutpat quam, vestibulum molestie nibh. Maecenas pretium ultricies augue vitae luctus. Ut congue leo ante, consequat ullamcorper mi commodo sit amet. Duis et libero leo. Nam eu dictum sem, quis commodo tellus. Sed et dolor eu nisi varius sodales sed eu quam. Aenean eget auctor mauris, vitae faucibus nunc. Nam ultrices elit eu libero porta, vitae cursus odio aliquet. Vivamus sit amet interdum tellus. Suspendisse suscipit fringilla nisi, id scelerisque nisi aliquet vitae. Aliquam est nibh, commodo nec neque et, consequat ultrices nibh. Suspendisse efficitur id massa sed bibendum. Phasellus vitae posuere est.
|
||||
Ut nec aliquet ex. Integer sapien nunc, tincidunt eu dolor ut, dictum pulvinar lorem. Donec nec augue nibh. Curabitur euismod, lorem ut mattis volutpat, nunc dui pharetra mauris, sed rutrum magna lacus non lacus. Nam ac rhoncus turpis, et dignissim erat. Fusce suscipit blandit mauris vel aliquam. Aenean id orci sed augue dapibus pellentesque ac ac sem. Nulla vel purus sapien. Integer vestibulum porttitor posuere. Mauris tincidunt elit nec risus tincidunt ornare. Duis bibendum, magna eu interdum bibendum, lectus nulla dictum dui, non condimentum sapien tortor sit amet orci. Integer ligula ligula, sodales vel nulla non, commodo semper eros. Quisque cursus tempus fringilla. Sed at nisl odio. Ut malesuada turpis ac libero consequat aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||
Suspendisse tempus magna et massa euismod faucibus. Pellentesque sollicitudin nisl in pharetra aliquam. Vestibulum blandit massa ut turpis ornare, nec imperdiet metus interdum. Fusce molestie aliquet justo, ac condimentum justo. Praesent quis dolor vestibulum, posuere arcu eget, molestie nisi. Donec ac urna tempor, tempus lectus non, scelerisque est. Aliquam imperdiet dictum urna, non malesuada urna. Proin et tellus quis sapien dignissim vehicula. Vestibulum tortor metus, iaculis ac eros ut, laoreet vulputate nibh. Cras tempor vitae erat eget consequat. Sed ut nisl convallis, placerat quam quis, tincidunt turpis. Suspendisse sit amet rutrum augue. Duis sem justo, dictum eu dui at, eleifend commodo orci. Curabitur at erat odio. Phasellus porttitor interdum nibh, sit amet aliquet libero. Etiam convallis mattis massa, a rhoncus ligula condimentum et.
|
||||
Duis ut diam ac lectus viverra volutpat et eget dolor. Nam tincidunt mauris vitae aliquet laoreet. Nam id ipsum eget ante euismod vulputate. Mauris elementum, tellus vitae rutrum vestibulum, libero orci finibus risus, in lacinia libero massa vitae elit. Nam et vestibulum justo, sed gravida orci. In ultrices mollis ultricies. Pellentesque odio leo, sagittis lacinia odio eu, accumsan auctor nibh. In non sem elementum, mollis justo sed, ornare nisi. Fusce interdum lobortis turpis ut dictum. Integer lacinia mollis nunc, nec condimentum quam hendrerit in.
|
||||
Donec condimentum, dolor in aliquet facilisis, leo ex feugiat nisi, a commodo libero urna id enim. Donec faucibus urna eget pulvinar dapibus. Curabitur ultricies justo at ligula aliquam blandit. Mauris nisi urna, porttitor eu bibendum vitae, ultrices eu risus. In ac pulvinar nisl. Vestibulum viverra tellus purus, eget rutrum arcu venenatis et. Pellentesque nibh risus, sagittis eu hendrerit eget, sollicitudin sit amet enim. Quisque molestie ornare tellus sit amet placerat.
|
||||
Ut finibus metus sit amet velit posuere, in egestas massa congue. Nulla sagittis, nisi eget pretium vestibulum, mauris libero elementum mauris, vel sollicitudin ligula metus vitae elit. Sed feugiat lectus sed ante maximus pharetra. Praesent felis eros, gravida sed varius in, faucibus ut metus. Nulla eget pretium nulla. Aliquam ultricies viverra magna, vel semper ligula accumsan ut. Pellentesque sollicitudin bibendum pretium. Vivamus volutpat commodo eleifend. Maecenas ornare ac nisl at tristique. Vivamus tellus lectus, euismod nec pellentesque non, lobortis ut nunc. Quisque hendrerit mi eget hendrerit ultrices.
|
||||
Nunc rhoncus ligula ac libero consequat, semper commodo eros feugiat. Phasellus iaculis neque vitae luctus porttitor. Pellentesque suscipit mi ac ipsum bibendum mollis id at velit. Curabitur consectetur sollicitudin tincidunt. In a enim convallis, consequat justo nec, dignissim urna. Sed nisl ex, semper vitae lectus non, laoreet volutpat purus. Suspendisse ut mattis urna, quis hendrerit odio. Sed tincidunt libero pulvinar sem rhoncus, eu elementum enim ornare. Proin eu placerat ex. Cras euismod sem at ullamcorper scelerisque.
|
||||
Nam fringilla, velit in ultrices pellentesque, nisl magna tempor felis, vel congue purus lectus sed metus. Cras consectetur quis massa id bibendum. Praesent sed purus odio. Fusce volutpat dolor ut magna congue auctor. In at magna lacinia, bibendum nisi in, pellentesque nisl. Pellentesque metus ligula, malesuada non turpis et, vulputate ultrices lectus. Sed erat leo, maximus id elementum sagittis, lacinia a metus. Proin mattis id lorem non malesuada. Aliquam sodales quam id gravida condimentum.
|
||||
Phasellus quis bibendum risus, at porttitor sem. Nulla aliquet molestie eros quis sagittis. Ut lorem massa, ullamcorper vitae odio in, hendrerit vehicula urna. Quisque et viverra ex. Aliquam erat volutpat. Curabitur at interdum elit, ut tincidunt erat. Pellentesque quis augue pellentesque, finibus ante eget, feugiat quam. Cras nec efficitur ligula. Cras porta ac ipsum in ullamcorper. Nulla nunc erat, egestas egestas rhoncus viverra, mattis quis purus. Morbi convallis fringilla iaculis. Ut a sem mi. Praesent at velit ac dui euismod pulvinar. Donec mollis vehicula lorem vel tempus. Duis et scelerisque magna.
|
||||
Suspendisse sollicitudin a libero ut convallis. Donec interdum faucibus dolor, id imperdiet nibh mollis eget. Sed sem augue, bibendum nec risus quis, mollis scelerisque magna. Cras molestie velit eget est pulvinar, a pharetra sapien tempor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla accumsan semper arcu id porttitor. Sed lacinia massa ut nibh gravida consectetur. Donec semper ante sed scelerisque varius. Vestibulum ullamcorper varius dui, sed aliquam elit aliquam nec. Sed auctor, dui sit amet mollis egestas, libero neque interdum est, efficitur elementum nibh lacus sed libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam blandit lacus in lacinia tristique.
|
||||
Suspendisse scelerisque posuere nunc, non consectetur orci facilisis in. Donec aliquet fermentum mattis. Morbi fringilla id urna eget consectetur. Vivamus turpis est, efficitur a tempus ac, ornare vel lorem. Aenean bibendum metus non ante rutrum sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam erat volutpat. Suspendisse dui eros, sagittis nec ante in, gravida varius ante. Mauris sapien neque, lobortis et euismod vel, venenatis at risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vestibulum metus arcu, sed faucibus lacus ultrices eget. Integer porta aliquam bibendum.
|
||||
Etiam tempus pulvinar dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed sed nulla vehicula, iaculis nibh sit amet, blandit urna. Maecenas metus ante, posuere vitae bibendum quis, consequat sit amet magna. Cras venenatis nunc urna, vel posuere diam congue eu. Cras sit amet ipsum laoreet, tincidunt nunc ac, convallis elit. Praesent lacinia enim nibh, et efficitur leo convallis vel. Etiam varius diam arcu, sit amet convallis dui interdum vitae. In hac habitasse platea dictumst. Nullam commodo maximus turpis, quis congue mauris fermentum quis. Donec laoreet elit non lorem gravida pharetra. Ut aliquam purus a semper sodales.
|
||||
Donec nec sollicitudin nisi. Proin ipsum est, rhoncus vel commodo ut, tristique eget justo. Praesent tristique massa sed odio sodales viverra. Aliquam at nisi vel turpis pulvinar volutpat. Phasellus rhoncus scelerisque mollis. Nunc et cursus nulla, in consectetur magna. Praesent et mollis nibh, non tristique dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas malesuada odio velit, eget finibus mauris congue eget. Praesent vestibulum mollis ex id ultricies. Integer sodales tempus vulputate. Phasellus blandit quam quis tortor blandit convallis. Donec tempor mi id urna venenatis fermentum.
|
||||
Vestibulum ut sapien non tellus eleifend vestibulum eu vitae magna. Donec in lectus eget nisi ornare efficitur sed ut ex. Cras volutpat metus rhoncus hendrerit fringilla. Vivamus rutrum rutrum neque, eu imperdiet augue malesuada a. Aenean tristique massa vel diam vehicula pulvinar sit amet vel velit. Aenean faucibus luctus magna, non auctor nunc tempor ut. Etiam eleifend auctor metus, ac rhoncus massa. Aenean dignissim ornare tincidunt. Donec pulvinar sapien ante, vel dignissim sapien dictum sed. In eu ante in tortor fringilla viverra sit amet quis metus. Aenean in ex elementum, gravida nunc non, pretium nibh. Donec laoreet arcu sit amet dolor tempus pulvinar. Nullam at pharetra nisl. Donec sed justo sed arcu luctus ultrices. Fusce at venenatis eros.
|
||||
Maecenas placerat quam ut massa suscipit lacinia. Maecenas et posuere risus. Proin interdum, libero sit amet consectetur pulvinar, dolor magna dignissim velit, sed hendrerit nulla ex sed nisi. Morbi dictum lobortis velit. Proin molestie mi at tortor finibus, quis ullamcorper enim maximus. Nullam varius, urna id volutpat volutpat, ligula lectus placerat eros, id sollicitudin dolor ligula eget sem. Curabitur quis augue vitae neque egestas tristique. Nam lacus libero, viverra faucibus risus et, placerat vestibulum neque.
|
||||
In et convallis ante. Nulla hendrerit turpis eget consequat molestie. Fusce pharetra nunc ornare leo commodo, eu consequat odio dictum. Cras est diam, consequat et eleifend sed, faucibus quis neque. Morbi fermentum sem non ipsum mollis, id tempus risus blandit. Phasellus vulputate, ante finibus molestie finibus, velit enim mattis neque, et posuere felis risus a nisl. Cras a risus eu eros porttitor malesuada. Maecenas in mattis diam, sed tempor ex. In hac habitasse platea dictumst. Aliquam in magna quis arcu ultrices fringilla. Cras rhoncus tortor sed lacus blandit commodo. Nullam placerat augue vitae diam rutrum, ut eleifend ligula pellentesque. Aenean blandit lectus orci, egestas dapibus nisi finibus at.
|
||||
Quisque id dapibus nisi, in placerat ante. Sed ut feugiat arcu. Etiam facilisis augue in nisi placerat facilisis. Donec vitae porttitor nibh. Nulla et nisl id purus egestas lobortis non id lorem. Nam viverra vulputate sapien, et posuere ex tincidunt a. Pellentesque venenatis turpis non purus rutrum faucibus. Nam non dapibus sem, sit amet rutrum neque. Vestibulum tempor, libero et faucibus feugiat, metus tellus condimentum nunc, sit amet pretium diam est a ipsum.
|
||||
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed nulla neque, vulputate in aliquet quis, mollis non tellus. Ut aliquet lacus tellus, sed vehicula lectus aliquet ut. Nullam mattis in felis in condimentum. Vivamus facilisis, justo ac volutpat posuere, turpis ligula hendrerit tortor, eu ullamcorper quam dui non ex. Praesent feugiat, ligula eu aliquam interdum, mauris magna sagittis enim, eget facilisis felis lectus eget velit. In accumsan pharetra tincidunt. Sed mi massa, sodales nec nisi sed, lobortis fermentum ipsum. Nulla facilisi. Sed at accumsan felis. Donec sed condimentum metus, mollis gravida velit.
|
||||
Nulla at lobortis nisl. Sed eu laoreet felis. Maecenas velit erat, mattis a condimentum eu, fermentum vel elit. Aenean mattis rutrum risus, in interdum metus volutpat sed. Nulla at dignissim lorem, in convallis tellus. Suspendisse ac risus sit amet diam ullamcorper feugiat. Maecenas sed lectus id erat cursus aliquam vel eget nisi. Ut tempus, risus id mollis lobortis, sem metus suscipit nibh, ut dapibus lectus tellus quis ipsum. In nec hendrerit nibh. In vel consectetur ex, a ullamcorper sem. Donec mauris massa, dictum non luctus a, feugiat eu metus. Donec maximus ex sit amet sem vehicula finibus egestas eget ex. Etiam volutpat ut nulla quis euismod.
|
||||
Nunc consequat ut augue quis cursus. Aliquam placerat, enim eget scelerisque rhoncus, massa erat placerat tortor, ut varius dui felis in neque. Suspendisse potenti. Aliquam et magna tristique, volutpat sem eget, elementum lectus. Vivamus nunc velit, sagittis sed massa vel, vestibulum molestie urna. Cras at erat pharetra, porttitor turpis mattis, tempus magna. Nulla commodo enim mi, eu porttitor sapien pellentesque id. Aenean quis ligula eu mauris scelerisque porttitor quis ut orci. Praesent tincidunt risus mi. Nunc dignissim, arcu quis dictum consectetur, est massa imperdiet felis, ut scelerisque magna mi vel nisi. Mauris imperdiet, diam sit amet ultricies porttitor, odio sapien placerat ligula, in condimentum sem augue non justo. Duis a lorem augue.
|
||||
Aenean vitae venenatis dolor, at ultricies purus. Vivamus velit urna, tempus vitae ornare id, semper in metus. In sed mi et odio pulvinar ultricies ut quis enim. Duis erat dolor, aliquam sed sodales id, porttitor vitae turpis. Fusce feugiat venenatis ex quis aliquet. Nulla pretium elit vel nisi suscipit condimentum. Nunc dapibus, mi id venenatis ultrices, libero purus rhoncus erat, a eleifend metus nisl at elit.
|
||||
Aenean eget porttitor risus. Donec ac lacus feugiat, faucibus ante sed, convallis neque. Donec pharetra in sem eget congue. Quisque ac neque in urna varius interdum. Donec justo nisi, volutpat nec lobortis vitae, pulvinar sit amet lorem. Maecenas porttitor magna orci. In eleifend risus ut lectus facilisis aliquam. Nullam nibh nulla, sodales quis tempus sed, condimentum quis nulla. Proin vitae hendrerit ante. Morbi tincidunt pharetra metus, quis lobortis elit viverra sit amet. Vivamus mattis eros erat, ut semper velit pretium sed. Nulla ac vulputate leo.
|
||||
Praesent at ex at lacus dictum viverra vel nec nisi. Duis maximus nisi et eleifend fringilla. Cras lacinia arcu id turpis dignissim posuere. Sed faucibus nisi dignissim, sagittis orci quis, dapibus metus. Nullam ultricies libero eu auctor finibus. Vestibulum auctor odio in tortor molestie interdum. Proin nec libero mi. Donec tempor dignissim velit a molestie. Duis feugiat cursus turpis, in dignissim justo imperdiet non. Suspendisse faucibus dui non viverra interdum. Nullam dignissim interdum egestas. Phasellus vitae eros quis lectus bibendum scelerisque. Donec dui mauris, iaculis non molestie a, elementum sed felis. Donec iaculis congue tempor. Vestibulum dolor nisi, maximus quis cursus ut, vulputate non orci. Maecenas nisi ex, maximus ut aliquam commodo, interdum sed lorem.
|
||||
Cras sed vehicula risus, sed suscipit eros. Suspendisse scelerisque sapien sit amet volutpat porta. Sed sagittis orci eget feugiat eleifend. Nulla viverra ex vitae mauris lacinia imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum arcu augue, euismod non elit non, feugiat aliquet ligula. Nulla ut neque vehicula, malesuada ex sit amet, finibus sem. Maecenas eleifend molestie justo a lobortis.
|
||||
Aliquam at erat vitae neque porttitor ullamcorper. Integer et rutrum leo. Vivamus dui erat, luctus at purus et, auctor tincidunt felis. Proin fermentum maximus dui quis tempor. Nullam pellentesque at ex eget mollis. In hac habitasse platea dictumst. Maecenas efficitur turpis malesuada vulputate dapibus. Integer id faucibus diam. Aliquam lectus turpis, mollis vitae dolor eget, mattis faucibus est. Vestibulum id libero at est congue facilisis. Pellentesque tellus mauris, bibendum eget dui id, sagittis maximus enim. Sed condimentum ac lectus vel vulputate. Praesent lectus orci, pharetra id metus nec, fermentum congue nulla.
|
||||
Nunc vel sem sem. Integer varius tincidunt lorem, id porta massa venenatis porta. Maecenas dictum mollis pharetra. In ex justo, auctor ac tempus id, lacinia et erat. Fusce dignissim purus in metus facilisis, vitae congue nunc tempor. Nam a euismod elit. Vestibulum tincidunt sed orci et porta. Vestibulum eget dui id mi efficitur fermentum.
|
||||
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut quis lorem vitae dui ullamcorper iaculis eget sed purus. Maecenas at ex lectus. Donec ut ligula eros. Nulla consectetur sed ligula quis volutpat. Integer rhoncus, justo egestas molestie scelerisque, nibh nibh finibus neque, dapibus vulputate quam lectus interdum tortor. Donec ultrices, tellus et suscipit tempor, urna lectus congue lorem, porta laoreet nibh purus id nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse malesuada hendrerit turpis vel feugiat. Suspendisse at mi cursus, dictum ipsum in, tristique mi. Cras diam nisi, aliquam vel lacinia sed, vehicula id diam. Sed consectetur tempus massa, a pellentesque dolor posuere vel. Curabitur et finibus quam. Fusce orci magna, faucibus ac tellus id, fermentum tempor neque. Ut libero augue, egestas eget fringilla eget, suscipit vitae orci.
|
||||
Nunc posuere nisi purus, a bibendum elit interdum id. Donec accumsan metus non rutrum porttitor. Donec in sollicitudin lorem. Sed porta magna et lobortis consequat. Sed eget tempus nibh. Ut sed ante vel ex interdum commodo. Fusce eget nisi nec mauris tristique scelerisque. Ut eleifend nunc ultrices mattis ultricies. Vivamus id sodales lacus. Vivamus dignissim elementum ante, sit amet ornare ipsum lacinia sit amet. Proin maximus pulvinar nibh vitae luctus. Sed at gravida metus, at ultricies eros. Integer porta velit auctor, dictum elit non, dictum dolor.
|
||||
Suspendisse potenti. Morbi lobortis orci nisi, ac sollicitudin libero cursus sed. Integer vestibulum sem ac ante rutrum, at pellentesque tortor bibendum. Etiam at arcu et sapien molestie sodales. Nam fringilla turpis eget mi convallis, quis iaculis metus varius. Vivamus finibus purus ut nunc sodales pulvinar. Praesent varius, odio sed luctus tempus, orci augue sodales orci, a posuere nisi ante et justo. Ut ultricies rhoncus feugiat. Ut arcu massa, scelerisque vitae metus rhoncus, aliquet ultricies urna.
|
||||
Nulla facilisi. Aliquam at porttitor quam. Pellentesque eu faucibus nunc. Sed nec leo leo. Integer cursus ex a magna lacinia interdum. Vivamus luctus lacinia odio in sollicitudin. Curabitur sem felis, condimentum sed nisi at, posuere ullamcorper arcu. Vivamus convallis vel nisl id suscipit. Maecenas semper dictum nibh, nec malesuada dolor semper id. Maecenas turpis massa, vulputate ac euismod quis, viverra id lorem. Integer imperdiet tincidunt bibendum. Donec laoreet viverra volutpat. Aliquam arcu elit, euismod vitae felis quis, venenatis commodo lectus.
|
||||
Fusce mattis mi est. Proin augue dui, ultricies quis facilisis tristique, vehicula quis ex. Nunc blandit aliquet aliquet. Aliquam nibh sem, tempus a justo sit amet, viverra ullamcorper sem. Suspendisse potenti. Pellentesque quis risus eget ipsum tincidunt ornare ultrices at sapien. Phasellus viverra nec urna auctor dapibus. Curabitur id porttitor justo. Vestibulum risus sapien, dignissim vel libero ac, scelerisque fringilla risus. Donec porta at ex quis volutpat. Suspendisse potenti. Phasellus leo metus, pellentesque et laoreet sed, tempus ut ligula. Sed convallis elit libero, sed ornare odio mattis et.
|
||||
Ut lobortis libero vel nibh dignissim ullamcorper. Curabitur sed tortor id leo bibendum dignissim at sit amet dolor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed vitae urna justo. Quisque in fringilla velit. Nullam venenatis laoreet tellus, sagittis sodales dolor facilisis ut. Integer tincidunt at est aliquet commodo. Cras sed urna ut sapien varius rhoncus. Duis pharetra a magna ut tincidunt.
|
||||
Sed mattis nunc ut pulvinar sodales. Nullam bibendum, ex vulputate volutpat porttitor, sapien mi gravida augue, at scelerisque mi ipsum sit amet risus. Phasellus non lacus molestie, faucibus nibh vitae, bibendum ex. Mauris et elit ut augue tincidunt pellentesque. Vestibulum vehicula pretium magna in faucibus. In fringilla tincidunt nisi. Integer porta vehicula risus eu commodo. Quisque iaculis laoreet vestibulum. Donec vitae aliquam metus, a gravida purus. Integer sit amet ligula vitae tortor lacinia mollis. Phasellus leo tellus, mattis ut maximus quis, ultricies in mauris. Praesent a scelerisque quam.
|
||||
Nunc tempor feugiat accumsan. Aliquam erat volutpat. Cras ut mi odio. Aenean sed purus sed nunc luctus tempor sit amet id ligula. Morbi nec faucibus neque, a luctus nisl. Maecenas aliquam lorem sed blandit maximus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
|
||||
In hac habitasse platea dictumst. Cras blandit nibh lacus, nec venenatis nulla elementum nec. Nam tincidunt posuere augue rhoncus mattis. Cras interdum tincidunt massa, ac tristique libero porta in. Integer hendrerit gravida nisi, ut fringilla ligula ullamcorper nec. Fusce erat nulla, ullamcorper vel pulvinar eget, feugiat molestie velit. Integer viverra sollicitudin velit, vitae accumsan orci aliquet ac. Suspendisse aliquet augue ac mollis hendrerit. Proin euismod sagittis metus ac pretium. Nam augue nulla, posuere ac tortor nec, ornare interdum risus. Proin non massa eros. Morbi aliquet ante et purus placerat faucibus.
|
||||
Quisque pharetra dolor vitae magna vehicula fermentum quis nec odio. In commodo tincidunt turpis non scelerisque. Nam tempor consequat justo suscipit convallis. Sed sit amet augue at lorem porta eleifend sit amet sit amet velit. Fusce eu eros quis risus mattis vehicula eu at quam. Nulla faucibus elementum tincidunt. Sed in diam accumsan, blandit felis a, cursus mauris.
|
||||
Nunc in hendrerit augue. Phasellus vel purus ullamcorper, auctor ante sed, auctor nisi. Nunc rutrum est erat, ut consequat elit mattis ac. Suspendisse potenti. Maecenas purus libero, pharetra quis vestibulum at, egestas eget enim. Vestibulum ut condimentum tortor. Aliquam vestibulum mattis placerat. Morbi non leo eu nisl maximus lobortis eget eget sapien. Donec sollicitudin ipsum nulla, non dignissim massa pretium sed. Nulla et molestie nibh, nec aliquet arcu.
|
||||
Cras euismod ligula justo, at dignissim nibh mattis vitae. Integer bibendum sit amet urna vitae dapibus. Fusce gravida ut enim eget molestie. Quisque finibus nisl ut odio mattis, ut viverra justo pretium. Nunc convallis cursus tincidunt. Integer vel hendrerit orci. Donec leo orci, elementum at cursus a, eleifend a nisl. Nunc massa nunc, blandit non ex pretium, volutpat feugiat tortor. Phasellus gravida nibh ipsum, ac consequat ante eleifend eu. Nulla venenatis auctor efficitur. Vestibulum eleifend eros id nibh interdum, id tempus tortor molestie. Nam id finibus quam. Aenean eu vulputate ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur hendrerit mi ac venenatis suscipit.
|
||||
Vestibulum lobortis maximus metus, a commodo massa ultricies et. Etiam ut lectus quis lacus euismod consequat. Maecenas tincidunt, felis dapibus aliquam gravida, est sapien tempus nibh, et rutrum dolor orci in dui. Proin tellus nisl, imperdiet mollis elit ac, gravida lacinia sapien. Aenean quis lectus id ante gravida lobortis. In sollicitudin et ex et facilisis. Curabitur in velit at augue commodo placerat. Nulla facilisi. Fusce facilisis est eu dolor rhoncus, a bibendum felis tincidunt. Sed sit amet feugiat ante. Sed accumsan, ipsum nec bibendum semper, justo elit dignissim magna, eu lacinia sem lorem sed justo. Etiam posuere sollicitudin nisi ac placerat. Duis maximus nisl nec nisi accumsan posuere.
|
||||
Aliquam erat volutpat. Suspendisse tincidunt ut neque eu tincidunt. Nulla porttitor eu mi sed gravida. Maecenas in cursus nisl, et fringilla quam. Nulla posuere, turpis vel vestibulum condimentum, magna dui eleifend orci, nec semper metus risus id augue. Proin pretium risus id elit consequat tristique. Phasellus eget tortor eleifend, euismod arcu at, ullamcorper nibh. Etiam id ultricies dui, non mattis purus. Morbi sit amet mi diam. Nullam dictum erat vitae tortor lobortis imperdiet. Etiam venenatis ante non laoreet gravida.
|
||||
Vestibulum eget egestas mauris. Nulla facilisi. Vivamus ut dignissim turpis. Nulla quis tincidunt libero. Ut eget metus eleifend, volutpat enim ac, semper metus. Nunc vel ex nec neque maximus rhoncus vel et orci. Ut vitae congue sem, et porttitor diam.
|
||||
Duis sit amet est nec nibh scelerisque pellentesque ac in quam. Donec eget erat nec diam mattis feugiat eget a ex. Morbi interdum est non tortor accumsan porta. In hendrerit libero sit amet ex blandit, ut vestibulum quam dapibus. Integer quis velit id nibh tempor volutpat. Suspendisse euismod, sapien nec tempor malesuada, augue nunc tincidunt diam, et viverra dui massa sit amet velit. Proin efficitur, nisl non vulputate maximus, sapien nulla pharetra odio, vel eleifend neque velit at est. Phasellus leo sem, pharetra placerat lorem faucibus, pellentesque euismod mi. Nam vel diam neque. Praesent mollis feugiat magna vitae pellentesque. Proin elementum rhoncus ante, eget eleifend arcu volutpat quis. Fusce id enim sed odio mollis pulvinar sed a nulla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
|
||||
Aliquam vulputate justo ut arcu lacinia accumsan. Phasellus quis convallis arcu, vel viverra urna. Curabitur tincidunt nibh id iaculis facilisis. In tellus arcu, elementum vel luctus at, tempor quis magna. Morbi maximus, elit in pharetra lacinia, ex lorem imperdiet risus, eget vehicula sapien enim sed nunc. Aliquam faucibus sodales tortor, vel fermentum quam finibus eu. Duis non dolor accumsan, lobortis neque a, pharetra purus. Donec a tincidunt urna. Cras eleifend elit ac tortor dictum rutrum. Donec ut est et diam tristique pellentesque. In mattis diam justo, sit amet rutrum ante varius nec. Sed in orci sit amet neque finibus fermentum. Aenean risus lectus, laoreet vitae finibus non, semper non sem. Donec vel porttitor mi. Duis efficitur posuere odio, in facilisis magna fringilla et. Donec quis tristique erat.
|
||||
Suspendisse mattis mattis mi at tristique. Ut ultricies sagittis iaculis. Aliquam sagittis, diam in commodo sagittis, odio nisl venenatis enim, suscipit venenatis felis diam vitae enim. Morbi a molestie urna, ac lacinia nunc. Nam quis metus augue. Fusce tristique orci ut euismod cursus. Pellentesque sed elit ac nisl placerat porttitor. Quisque molestie pharetra eros sed hendrerit. In tincidunt tellus in consequat ultricies. Nam condimentum sollicitudin aliquam. Nulla non odio urna. Aliquam gravida tincidunt erat at semper. Sed quis tempor turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
|
||||
Maecenas cursus massa tincidunt tortor placerat tempor. In justo nisl, posuere eu erat eget, vestibulum ultrices nulla. Vivamus vel est a erat gravida dapibus ut ac mauris. Integer eleifend gravida odio, aliquet tincidunt justo sollicitudin et. Ut ut ex in diam feugiat varius quis sit amet lectus. Aliquam sit amet nibh condimentum, sollicitudin neque id, vulputate orci. In vestibulum hendrerit libero, ut dapibus dui efficitur a. Aenean tristique at arcu id viverra. Maecenas cursus massa vel felis laoreet pretium. Praesent viverra tincidunt risus non sodales. Nulla id dignissim est, sed pharetra purus. Aliquam commodo, eros varius sagittis faucibus, diam lorem viverra erat, vel egestas ipsum dui sed turpis. Aenean placerat rhoncus nibh vel finibus.
|
||||
Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut porttitor, nulla sed pharetra laoreet, lacus orci molestie mi, sed ullamcorper felis arcu id sapien. Curabitur et commodo velit. In pharetra arcu at augue pulvinar, commodo elementum augue condimentum. Sed mattis ipsum sed tempor faucibus. Donec non dolor sed purus ultrices condimentum sit amet vel nisi. Cras dignissim tellus et sapien porta elementum. Maecenas in eros vel orci congue dignissim. Donec et luctus libero. Phasellus vitae porttitor nisi. Donec a nibh nisi. Nulla in nibh nec tellus accumsan pretium. Aenean ultrices id est blandit malesuada. Integer blandit metus sed suscipit scelerisque. In ac urna cursus, vehicula justo nec, facilisis metus. Vivamus id scelerisque diam.
|
||||
In egestas nulla non tortor viverra laoreet. Fusce porttitor sem urna, sed varius justo maximus a. Duis ligula libero, elementum quis viverra mattis, vehicula nec sem. Aenean ut libero eu est auctor placerat. Nam quam dui, accumsan eget ipsum in, ornare volutpat purus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit, justo ut fermentum tincidunt, ex dolor suscipit eros, sed pretium lacus dolor vel tortor. Aliquam erat volutpat.
|
||||
Phasellus sagittis risus nec accumsan congue. Maecenas enim elit, mattis sit amet enim tristique, vestibulum sodales leo. Curabitur vel vehicula velit. Proin elementum dui at purus pulvinar, et dictum nisl sagittis. Nulla aliquet quam ultrices dapibus rutrum. Integer ultrices dapibus mauris, a vehicula elit posuere ut. Nullam lacinia mattis nulla, dignissim aliquam massa consequat at. Mauris ut mi dictum, iaculis urna rhoncus, euismod massa. Phasellus elementum libero id turpis imperdiet dictum. Nunc ac ipsum vitae orci ullamcorper tempus. Quisque lacinia quam sed molestie sagittis. Aenean sed rutrum sapien, et scelerisque sem.
|
||||
Suspendisse tincidunt, leo in vulputate rhoncus, neque augue feugiat purus, ac tempor libero nisi vitae ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean at augue quis ante porttitor blandit vitae non magna. Donec vel ligula hendrerit, sodales massa et, placerat libero. Etiam lectus felis, luctus et varius hendrerit, dignissim at massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus velit tortor, rutrum ut tristique non, feugiat at turpis. In iaculis leo metus, eu laoreet nunc viverra vel. Nam porttitor vitae diam vel pellentesque. In ullamcorper nulla id purus cursus accumsan. Etiam et mi turpis. Praesent volutpat sem odio, vitae dapibus libero posuere ac. Mauris dignissim ultricies felis, eu vestibulum turpis fringilla vitae. Sed porttitor ornare consectetur. Nulla id justo mollis, iaculis leo sit amet, bibendum eros. Donec ac interdum sapien.
|
||||
Praesent dolor urna, tincidunt a neque eu, hendrerit luctus odio. Pellentesque ac odio in est maximus maximus. Donec et lectus aliquet massa egestas euismod cursus et magna. Nam id mi hendrerit, rutrum eros iaculis, sodales enim. Nullam porttitor urna ac malesuada tincidunt. Suspendisse a turpis sapien. Curabitur rhoncus vel libero ut volutpat. Nam a sapien sem. Duis ac convallis eros, ut auctor nulla.
|
||||
Interdum et malesuada fames ac ante ipsum primis in faucibus. In sagittis lorem vitae est laoreet dictum. Integer posuere est ac tortor sagittis, quis mattis ligula laoreet. Curabitur urna sem, finibus id euismod at, varius ac sem. Donec tristique tristique est, a dictum lorem ornare eu. Praesent tempor diam ligula, at placerat leo placerat nec. Nam eget dui vulputate, vestibulum nisi ut, vehicula dui. Aenean elementum tincidunt lectus at vestibulum. Nam tristique mauris sit amet sapien iaculis facilisis. Nam accumsan, nibh ac aliquam venenatis, dolor lacus pretium dolor, accumsan feugiat lectus tellus facilisis sem. Nullam a dui sit amet tortor elementum rhoncus. Aliquam mattis eget quam et lobortis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse ultricies, magna eu imperdiet efficitur, tellus sapien suscipit massa, sit amet finibus dolor libero vitae ante. Maecenas vel aliquam massa.
|
||||
@@ -2,88 +2,16 @@
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<h2>Release Notes for 1.6</h2>
|
||||
<p><i>Released on 20 February 2022</i></p>
|
||||
<h2>Release Notes for 2.0 RC 1</h2>
|
||||
<p><i>Released on 17 October 2022</i></p>
|
||||
|
||||
<p>This release does not introduce any major new features, but is instead a collection of minor
|
||||
improvements and tweaks based on user requests. There are also a number of changes under the hood
|
||||
to improve the structure and performance of novelWriter.</p>
|
||||
<p><u>Some key improvements to the user interface are:</u></p>
|
||||
<p>✓ The max text width setting in Preferences now also applies to the document viewer, and
|
||||
the setting itself on the Preference dialog has been simplified a bit.</p>
|
||||
<p>✓ When text is selected in the document editor, the number of words selected is displayed
|
||||
in the editor's footer area.</p>
|
||||
<p>✓ The search tool in the document editor now shows the number of results in the
|
||||
document.</p>
|
||||
<p>✓ The Enter and Ctrl+O keyboard shortcuts should now work the same way in all tree
|
||||
views.</p>
|
||||
<p>✓ It is now possible to set a blank section title format on the Build Novel Project tool
|
||||
and get empty paragraphs in the output. Previously, a blank format would just remove the section
|
||||
break entirely. This change allows the user to define hard and soft scene breaks using level three
|
||||
and four headings. The scene and section titles can be hidden completely with two new switches
|
||||
added to the user interface.</p>
|
||||
<p><u>Other feature changes include:</u></p>
|
||||
<p>✓ The project index is now automatically rebuilt in the event it is empty or incomplete
|
||||
when the project is opened.</p>
|
||||
<p>✓ The user can now add their own syntax and GUI theme files in the app folder in their
|
||||
user area on the host operating system. Where the custom files must be added is described in the
|
||||
documentation.</p>
|
||||
<p>✓ A Windows installer is yet again provided for novelWriter. If you have novelWriter
|
||||
installed using another method, make sure you uninstall it properly first as the two methods are
|
||||
not compatible.</p>
|
||||
<p>✓ Release versions for Ubuntu 21.04 have been dropped, and added for the upcoming Ubuntu
|
||||
22.04.</p>
|
||||
<p>✓ Most translations have been updated. A Dutch translation is in the works.</p>
|
||||
<p>This is a release candidate of the next release version, and is intended for testing purposes.
|
||||
Please be careful when using this version on live writing projects, and make sure you take frequent
|
||||
backups.</p>
|
||||
<p>Please check the changelog for an overview of changes. The full release notes will be added to
|
||||
the final release.</p>
|
||||
|
||||
<p><i>See also the <a href="https://github.com/vkbo/novelWriter/releases">Releases</a> page.</i></p>
|
||||
|
||||
<h2>Patch Notes</h2>
|
||||
|
||||
<h3>Patch 1.6.1 – 16 March 2022</h3>
|
||||
|
||||
<p>This is a bugfix and patch release that fixes two recursion/loop issues. One would potentially
|
||||
cause a crash if the window was resized rapidly, and one would cause a hang with certain search
|
||||
parameters in the editor's search box. The Latin American Spanish translation has also been
|
||||
updated.</p>
|
||||
|
||||
<h3>Patch 1.6.2 – 20 March 2022</h3>
|
||||
|
||||
<p>This is a bugfix release that fixes a couple of minor issues. Projects containing one or more
|
||||
empty documents would trigger a rebuild of the index each time the project was opened. This has now
|
||||
been fixed. Another fix resolves an error message being written to the console logging output when
|
||||
a new document was created. Both errors were harmless.</p>
|
||||
|
||||
<h3>Patch 1.6.3 – 18 August 2022</h3>
|
||||
|
||||
<p>This is a bugfix release that fixes a rare problem causing novelWriter to crash if the spell
|
||||
checker language setting was configured to an empty value.</p>
|
||||
<p>A few other minor issues have also been fixed: The project language setting is now properly
|
||||
exported to ODT documents. Spaces are no longer inserted automatically in front of colons in
|
||||
certain meta data settings when the feature is enabled (it is primarily used for French). Lastly,
|
||||
the slider splitting the editor and viewer panels can no longer be dragged until the viewer
|
||||
disappears. It was not necessarily obvious how the viewer panel could be restored in such cases.
|
||||
</p>
|
||||
|
||||
<h3>Patch 1.6.4 – 29 September 2022</h3>
|
||||
|
||||
<p>This is a bugfix release that fixes a critical bug in the insert non-breaking spaces feature. It
|
||||
basically no longer worked in the 1.6.3 release. This release also fixes a minor issue where the
|
||||
text cursor sometimes disappears when reaching the right-hand edge of the text editor window.</p>
|
||||
|
||||
<h3>Patch 1.6.5 – 13 October 2022</h3>
|
||||
|
||||
<p>This is a bugfix release that fixes a few minor issues. The idle time for new projects would
|
||||
be artificially inflated as the clock was not reset when the project was first created. This only
|
||||
affects the first entry in the writing statistics. A scaling issue for the Preferences dialog has
|
||||
also been fixed. It only affected screens with UI scaling enabled. Lastly, typing Shift+Enter in
|
||||
the text editor now creates a regular line break instead of a special line separator. The line
|
||||
separator serves no purpose in plain text, and was producing inconsistencies in how text is
|
||||
processed and displayed.</p>
|
||||
|
||||
<h3>Patch 1.6.6 – 25 October 2022</h3>
|
||||
|
||||
<p>This is a bugfix release that fixes a minor issues with following tags in the editor. It is now
|
||||
possible to also follow tags that contain spaces.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -10,7 +10,7 @@ licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
|
||||
window = 54, 54, 54
|
||||
windowtext = 174, 174, 174
|
||||
base = 62, 62, 62
|
||||
alternatebase = 67, 67, 67
|
||||
alternatebase = 78, 78, 78
|
||||
text = 174, 174, 174
|
||||
tooltipbase = 255, 255, 192
|
||||
tooltiptext = 21, 21, 13
|
||||
|
||||
@@ -10,7 +10,7 @@ licenseurl = https://github.com/altercation/solarized/blob/master/LICENSE
|
||||
window = 0, 43, 54
|
||||
windowtext = 253, 246, 227
|
||||
base = 7, 54, 66
|
||||
alternatebase = 67, 67, 67
|
||||
alternatebase = 0, 43, 54
|
||||
text = 253, 246, 227
|
||||
tooltipbase = 133, 153, 0
|
||||
tooltiptext = 0, 43, 54
|
||||
|
||||
@@ -35,7 +35,7 @@ from PyQt5.QtCore import QCoreApplication
|
||||
from PyQt5.QtWidgets import qApp
|
||||
|
||||
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
|
||||
from novelwriter.error import logException
|
||||
from novelwriter.error import formatException, logException
|
||||
from novelwriter.constants import nwConst, nwUnicode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -45,52 +45,54 @@ logger = logging.getLogger(__name__)
|
||||
# Checker Functions
|
||||
# =============================================================================================== #
|
||||
|
||||
def checkString(value, default, allowNone=False):
|
||||
def checkStringNone(value, default):
|
||||
"""Check if a variable is a string or a None.
|
||||
"""
|
||||
if allowNone and (value is None or value == "None"):
|
||||
if value is None or value == "None":
|
||||
return None
|
||||
if isinstance(value, str):
|
||||
return str(value)
|
||||
return default
|
||||
|
||||
|
||||
def checkInt(value, default, allowNone=False):
|
||||
"""Check if a variable is an integer or a None.
|
||||
def checkString(value, default):
|
||||
"""Check if a variable is a string.
|
||||
"""
|
||||
if isinstance(value, str):
|
||||
return str(value)
|
||||
return default
|
||||
|
||||
|
||||
def checkInt(value, default):
|
||||
"""Check if a variable is an integer.
|
||||
"""
|
||||
if allowNone and (value is None or value == "None"):
|
||||
return None
|
||||
try:
|
||||
return int(value)
|
||||
except Exception:
|
||||
return default
|
||||
|
||||
|
||||
def checkFloat(value, default, allowNone=False):
|
||||
"""Check if a variable is a float or a None.
|
||||
def checkFloat(value, default):
|
||||
"""Check if a variable is a float.
|
||||
"""
|
||||
if allowNone and (value is None or value == "None"):
|
||||
return None
|
||||
try:
|
||||
return float(value)
|
||||
except Exception:
|
||||
return default
|
||||
|
||||
|
||||
def checkBool(value, default, allowNone=False):
|
||||
"""Check if a variable is a boolean or a None.
|
||||
def checkBool(value, default):
|
||||
"""Check if a variable is a boolean.
|
||||
"""
|
||||
if allowNone and (value is None or value == "None"):
|
||||
return None
|
||||
|
||||
if isinstance(value, str):
|
||||
if isinstance(value, bool):
|
||||
return value
|
||||
elif isinstance(value, str):
|
||||
if value == "True":
|
||||
return True
|
||||
elif value == "False":
|
||||
return False
|
||||
else:
|
||||
return default
|
||||
|
||||
elif isinstance(value, int):
|
||||
if value == 1:
|
||||
return True
|
||||
@@ -98,7 +100,6 @@ def checkBool(value, default, allowNone=False):
|
||||
return False
|
||||
else:
|
||||
return default
|
||||
|
||||
return default
|
||||
|
||||
|
||||
@@ -174,14 +175,10 @@ def hexToInt(value, default=0):
|
||||
return default
|
||||
|
||||
|
||||
def checkIntRange(value, first, last, default):
|
||||
"""Check that an int is in a given range. If it isn't, return the
|
||||
default value.
|
||||
def minmax(value, minVal, maxVal):
|
||||
"""Make sure an integer is between min and max value (inclusive).
|
||||
"""
|
||||
if isinstance(value, int):
|
||||
if value >= first and value <= last:
|
||||
return value
|
||||
return default
|
||||
return min(maxVal, max(minVal, value))
|
||||
|
||||
|
||||
def checkIntTuple(value, valid, default):
|
||||
@@ -219,51 +216,45 @@ def formatInt(value):
|
||||
return str(value)
|
||||
|
||||
|
||||
def formatTimeStamp(theTime, fileSafe=False):
|
||||
def formatTimeStamp(value, fileSafe=False):
|
||||
"""Take a number (on the format returned by time.time()) and convert
|
||||
it to a timestamp string.
|
||||
"""
|
||||
if fileSafe:
|
||||
return datetime.fromtimestamp(theTime).strftime(nwConst.FMT_FSTAMP)
|
||||
return datetime.fromtimestamp(value).strftime(nwConst.FMT_FSTAMP)
|
||||
else:
|
||||
return datetime.fromtimestamp(theTime).strftime(nwConst.FMT_TSTAMP)
|
||||
return datetime.fromtimestamp(value).strftime(nwConst.FMT_TSTAMP)
|
||||
|
||||
|
||||
def formatTime(tS):
|
||||
def formatTime(t):
|
||||
"""Format a time in seconds in HH:MM:SS format or d-HH:MM:SS format
|
||||
if a full day or longer.
|
||||
"""
|
||||
if isinstance(tS, int):
|
||||
if tS >= 86400:
|
||||
return f"{tS//86400:d}-{tS%86400//3600:02d}:{tS%3600//60:02d}:{tS%60:02d}"
|
||||
if isinstance(t, int):
|
||||
if t >= 86400:
|
||||
return f"{t//86400:d}-{t%86400//3600:02d}:{t%3600//60:02d}:{t%60:02d}"
|
||||
else:
|
||||
return f"{tS//3600:02d}:{tS%3600//60:02d}:{tS%60:02d}"
|
||||
return f"{t//3600:02d}:{t%3600//60:02d}:{t%60:02d}"
|
||||
return "ERROR"
|
||||
|
||||
|
||||
def parseTimeStamp(theStamp, default, allowNone=False):
|
||||
"""Parses a text representation of a timestamp and converts it into
|
||||
a float. Note that negative timestamps cause an OSError on Windows.
|
||||
See https://bugs.python.org/issue29097
|
||||
"""
|
||||
if str(theStamp).lower() == "none" and allowNone:
|
||||
return None
|
||||
try:
|
||||
return datetime.strptime(theStamp, nwConst.FMT_TSTAMP).timestamp()
|
||||
except Exception:
|
||||
return default
|
||||
|
||||
|
||||
# =============================================================================================== #
|
||||
# String Functions
|
||||
# =============================================================================================== #
|
||||
|
||||
def simplified(string):
|
||||
"""Take a string an strip leading and trailing whitespaces, and
|
||||
replace all occurences of (multiple) whitespaces with a 0x20 space.
|
||||
"""
|
||||
return " ".join(str(string).strip().split())
|
||||
|
||||
|
||||
def splitVersionNumber(value):
|
||||
"""Split a version string on the form aa.bb.cc into major, minor
|
||||
and patch, and computes an integer value aabbcc.
|
||||
"""
|
||||
if not isinstance(value, str):
|
||||
return [0, 0, 0, 0]
|
||||
return 0, 0, 0, 0
|
||||
|
||||
vMajor = 0
|
||||
vMinor = 0
|
||||
@@ -282,114 +273,114 @@ def splitVersionNumber(value):
|
||||
|
||||
vInt = vMajor*10000 + vMinor*100 + vPatch
|
||||
|
||||
return [vMajor, vMinor, vPatch, vInt]
|
||||
return vMajor, vMinor, vPatch, vInt
|
||||
|
||||
|
||||
def transferCase(theSource, theTarget):
|
||||
def transferCase(source, target):
|
||||
"""Transfers the case of the source word to the target word. This
|
||||
will consider all upper or lower, and first char capitalisation.
|
||||
"""
|
||||
theResult = theTarget
|
||||
theResult = target
|
||||
|
||||
if not isinstance(theSource, str) or not isinstance(theTarget, str):
|
||||
if not isinstance(source, str) or not isinstance(target, str):
|
||||
return theResult
|
||||
if len(theTarget) < 1 or len(theSource) < 1:
|
||||
if len(target) < 1 or len(source) < 1:
|
||||
return theResult
|
||||
|
||||
if theSource.istitle():
|
||||
theResult = theTarget.title()
|
||||
if source.istitle():
|
||||
theResult = target.title()
|
||||
|
||||
if theSource.isupper():
|
||||
theResult = theTarget.upper()
|
||||
elif theSource.islower():
|
||||
theResult = theTarget.lower()
|
||||
if source.isupper():
|
||||
theResult = target.upper()
|
||||
elif source.islower():
|
||||
theResult = target.lower()
|
||||
|
||||
return theResult
|
||||
|
||||
|
||||
def fuzzyTime(secDiff):
|
||||
def fuzzyTime(seconds):
|
||||
"""Converts a time difference in seconds into a fuzzy time string.
|
||||
"""
|
||||
if secDiff < 0:
|
||||
if seconds < 0:
|
||||
return QCoreApplication.translate(
|
||||
"Common", "in the future"
|
||||
)
|
||||
elif secDiff < 30:
|
||||
elif seconds < 30:
|
||||
return QCoreApplication.translate(
|
||||
"Common", "just now"
|
||||
)
|
||||
elif secDiff < 90:
|
||||
elif seconds < 90:
|
||||
return QCoreApplication.translate(
|
||||
"Common", "a minute ago"
|
||||
)
|
||||
elif secDiff < 3300: # 55 minutes
|
||||
elif seconds < 3300: # 55 minutes
|
||||
return QCoreApplication.translate(
|
||||
"Common", "{0} minutes ago"
|
||||
).format(int(round(secDiff/60)))
|
||||
elif secDiff < 5400: # 90 minutes
|
||||
).format(int(round(seconds/60)))
|
||||
elif seconds < 5400: # 90 minutes
|
||||
return QCoreApplication.translate(
|
||||
"Common", "an hour ago"
|
||||
)
|
||||
elif secDiff < 84600: # 23.5 hours
|
||||
elif seconds < 84600: # 23.5 hours
|
||||
return QCoreApplication.translate(
|
||||
"Common", "{0} hours ago"
|
||||
).format(int(round(secDiff/3600)))
|
||||
elif secDiff < 129600: # 1.5 days
|
||||
).format(int(round(seconds/3600)))
|
||||
elif seconds < 129600: # 1.5 days
|
||||
return QCoreApplication.translate(
|
||||
"Common", "a day ago"
|
||||
)
|
||||
elif secDiff < 561600: # 6.5 days
|
||||
elif seconds < 561600: # 6.5 days
|
||||
return QCoreApplication.translate(
|
||||
"Common", "{0} days ago"
|
||||
).format(int(round(secDiff/86400)))
|
||||
elif secDiff < 907200: # 10.5 days
|
||||
).format(int(round(seconds/86400)))
|
||||
elif seconds < 907200: # 10.5 days
|
||||
return QCoreApplication.translate(
|
||||
"Common", "a week ago"
|
||||
)
|
||||
elif secDiff < 2419200: # 28 days
|
||||
elif seconds < 2419200: # 28 days
|
||||
return QCoreApplication.translate(
|
||||
"Common", "{0} weeks ago"
|
||||
).format(int(round(secDiff/604800)))
|
||||
elif secDiff < 3888000: # 45 days
|
||||
).format(int(round(seconds/604800)))
|
||||
elif seconds < 3888000: # 45 days
|
||||
return QCoreApplication.translate(
|
||||
"Common", "a month ago"
|
||||
)
|
||||
elif secDiff < 29808000: # 345 days
|
||||
elif seconds < 29808000: # 345 days
|
||||
return QCoreApplication.translate(
|
||||
"Common", "{0} months ago"
|
||||
).format(int(round(secDiff/2592000)))
|
||||
elif secDiff < 47336400: # 1.5 years
|
||||
).format(int(round(seconds/2592000)))
|
||||
elif seconds < 47336400: # 1.5 years
|
||||
return QCoreApplication.translate(
|
||||
"Common", "a year ago"
|
||||
)
|
||||
else:
|
||||
return QCoreApplication.translate(
|
||||
"Common", "{0} years ago"
|
||||
).format(int(round(secDiff/31557600)))
|
||||
).format(int(round(seconds/31557600)))
|
||||
|
||||
|
||||
def numberToRoman(numVal, toLower=False):
|
||||
def numberToRoman(value, toLower=False):
|
||||
"""Convert an integer to a Roman number.
|
||||
"""
|
||||
if not isinstance(numVal, int):
|
||||
if not isinstance(value, int):
|
||||
return "NAN"
|
||||
if numVal < 1 or numVal > 4999:
|
||||
if value < 1 or value > 4999:
|
||||
return "OOR"
|
||||
|
||||
theValues = [
|
||||
lookup = [
|
||||
(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"),
|
||||
(50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"),
|
||||
]
|
||||
|
||||
romNum = ""
|
||||
for theDiv, theSym in theValues:
|
||||
n = numVal//theDiv
|
||||
romNum += n*theSym
|
||||
numVal -= n*theDiv
|
||||
if numVal <= 0:
|
||||
roman = ""
|
||||
for divisor, symbol in lookup:
|
||||
n = value//divisor
|
||||
roman += n*symbol
|
||||
value -= n*divisor
|
||||
if value <= 0:
|
||||
break
|
||||
|
||||
return romNum.lower() if toLower else romNum
|
||||
return roman.lower() if toLower else roman
|
||||
|
||||
|
||||
# =============================================================================================== #
|
||||
@@ -447,51 +438,70 @@ def jsonEncode(data, n=0, nmax=0):
|
||||
# File and File System Functions
|
||||
# =============================================================================================== #
|
||||
|
||||
def readTextFile(filePath):
|
||||
def readTextFile(path):
|
||||
"""Read the content of a text file in a robust manner.
|
||||
"""
|
||||
if not os.path.isfile(filePath):
|
||||
if not os.path.isfile(path):
|
||||
return ""
|
||||
|
||||
fileText = ""
|
||||
text = ""
|
||||
try:
|
||||
with open(filePath, mode="r", encoding="utf-8") as inFile:
|
||||
fileText = inFile.read()
|
||||
with open(path, mode="r", encoding="utf-8") as inFile:
|
||||
text = inFile.read()
|
||||
except Exception:
|
||||
logger.error("Could not read file: %s", filePath)
|
||||
logger.error("Could not read file: %s", path)
|
||||
logException()
|
||||
return ""
|
||||
|
||||
return fileText
|
||||
return text
|
||||
|
||||
|
||||
def makeFileNameSafe(value):
|
||||
"""Returns a filename safe string of the value.
|
||||
"""
|
||||
cleanName = ""
|
||||
clean = ""
|
||||
for c in str(value).strip():
|
||||
if c.isalpha() or c.isdigit() or c == " ":
|
||||
cleanName += c
|
||||
return cleanName
|
||||
clean += c
|
||||
return clean
|
||||
|
||||
|
||||
def sha256sum(filePath):
|
||||
def ensureFolder(path, parent=None, errLog=None):
|
||||
"""Make sure a folder exists, and if it doesn't, create it.
|
||||
"""
|
||||
try:
|
||||
if parent:
|
||||
path = os.path.join(parent, path)
|
||||
if not os.path.isdir(path):
|
||||
os.mkdir(path)
|
||||
except Exception as exc:
|
||||
logger.error("Could not create folder: %s", path)
|
||||
logException()
|
||||
if isinstance(errLog, list):
|
||||
errLog.append(f"Could not create folder: {path}")
|
||||
errLog.append(formatException(exc))
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def sha256sum(path):
|
||||
"""Make a shasum of a file using a buffer.
|
||||
Based on: https://stackoverflow.com/a/44873382/5825851
|
||||
"""
|
||||
hDigest = hashlib.sha256()
|
||||
digest = hashlib.sha256()
|
||||
bData = bytearray(65536)
|
||||
mData = memoryview(bData)
|
||||
try:
|
||||
with open(filePath, mode="rb", buffering=0) as inFile:
|
||||
with open(path, mode="rb", buffering=0) as inFile:
|
||||
for n in iter(lambda: inFile.readinto(mData), 0):
|
||||
hDigest.update(mData[:n])
|
||||
digest.update(mData[:n])
|
||||
except Exception:
|
||||
logger.error("Could not create sha256sum of: %s", filePath)
|
||||
logger.error("Could not create sha256sum of: %s", path)
|
||||
logException()
|
||||
return None
|
||||
|
||||
return hDigest.hexdigest()
|
||||
return digest.hexdigest()
|
||||
|
||||
|
||||
# =============================================================================================== #
|
||||
@@ -513,87 +523,59 @@ def getGuiItem(objName):
|
||||
|
||||
class NWConfigParser(ConfigParser):
|
||||
|
||||
CNF_STR = 0
|
||||
CNF_INT = 1
|
||||
CNF_FLOAT = 2
|
||||
CNF_BOOL = 3
|
||||
CNF_S_LST = 4
|
||||
CNF_I_LST = 5
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def rdStr(self, section, option, default):
|
||||
"""Read string value.
|
||||
"""
|
||||
return self._parseLine(section, option, default, self.CNF_STR)
|
||||
return self.get(section, option, fallback=default)
|
||||
|
||||
def rdInt(self, section, option, default):
|
||||
"""Read integer value.
|
||||
"""
|
||||
return self._parseLine(section, option, default, self.CNF_INT)
|
||||
try:
|
||||
return self.getint(section, option, fallback=default)
|
||||
except ValueError:
|
||||
logger.error("Could not read '%s':'%s' from config", section, option)
|
||||
return default
|
||||
|
||||
def rdFlt(self, section, option, default):
|
||||
"""Read float value.
|
||||
"""
|
||||
return self._parseLine(section, option, default, self.CNF_FLOAT)
|
||||
try:
|
||||
return self.getfloat(section, option, fallback=default)
|
||||
except ValueError:
|
||||
logger.error("Could not read '%s':'%s' from config", section, option)
|
||||
return default
|
||||
|
||||
def rdBool(self, section, option, default):
|
||||
"""Read boolean value.
|
||||
"""
|
||||
return self._parseLine(section, option, default, self.CNF_BOOL)
|
||||
try:
|
||||
return self.getboolean(section, option, fallback=default)
|
||||
except ValueError:
|
||||
logger.error("Could not read '%s':'%s' from config", section, option)
|
||||
return default
|
||||
|
||||
def rdStrList(self, section, option, default):
|
||||
"""Read string list.
|
||||
"""
|
||||
return self._parseLine(section, option, default, self.CNF_S_LST)
|
||||
result = default.copy() if isinstance(default, list) else []
|
||||
if self.has_option(section, option):
|
||||
data = self.get(section, option, fallback="").split(",")
|
||||
for i in range(min(len(data), len(result))):
|
||||
result[i] = data[i].strip()
|
||||
return result
|
||||
|
||||
def rdIntList(self, section, option, default):
|
||||
"""Read integer list.
|
||||
"""
|
||||
return self._parseLine(section, option, default, self.CNF_I_LST)
|
||||
|
||||
##
|
||||
# Internal Functions
|
||||
##
|
||||
|
||||
def _unpackList(self, value, default, type):
|
||||
"""Unpack a comma-separated string of items into a list.
|
||||
"""
|
||||
inList = value.split(",")
|
||||
outList = []
|
||||
if isinstance(default, list):
|
||||
outList = default.copy()
|
||||
for i in range(min(len(inList), len(outList))):
|
||||
try:
|
||||
if type == self.CNF_S_LST:
|
||||
outList[i] = inList[i].strip()
|
||||
elif type == self.CNF_I_LST:
|
||||
outList[i] = int(inList[i].strip())
|
||||
except Exception:
|
||||
continue
|
||||
return outList
|
||||
|
||||
def _parseLine(self, section, option, default, type):
|
||||
"""Parse a line and return the correct datatype.
|
||||
"""
|
||||
result = default.copy() if isinstance(default, list) else []
|
||||
if self.has_option(section, option):
|
||||
try:
|
||||
if type == self.CNF_STR:
|
||||
return self.get(section, option)
|
||||
elif type == self.CNF_INT:
|
||||
return self.getint(section, option)
|
||||
elif type == self.CNF_FLOAT:
|
||||
return self.getfloat(section, option)
|
||||
elif type == self.CNF_BOOL:
|
||||
return self.getboolean(section, option)
|
||||
elif type in (self.CNF_I_LST, self.CNF_S_LST):
|
||||
return self._unpackList(self.get(section, option), default, type)
|
||||
except ValueError:
|
||||
logger.error("Could not read '%s':'%s' from config", str(section), str(option))
|
||||
logException()
|
||||
return default
|
||||
|
||||
return default
|
||||
data = self.get(section, option, fallback="").split(",")
|
||||
for i in range(min(len(data), len(result))):
|
||||
result[i] = checkInt(data[i].strip(), result[i])
|
||||
return result
|
||||
|
||||
# END Class NWConfigParser
|
||||
|
||||
@@ -37,7 +37,7 @@ from PyQt5.QtCore import (
|
||||
)
|
||||
|
||||
from novelwriter.error import logException, formatException
|
||||
from novelwriter.common import splitVersionNumber, formatTimeStamp, NWConfigParser
|
||||
from novelwriter.common import ensureFolder, splitVersionNumber, formatTimeStamp, NWConfigParser
|
||||
from novelwriter.constants import nwFiles, nwUnicode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -52,25 +52,22 @@ class Config:
|
||||
|
||||
# Set Application Variables
|
||||
self.appName = "novelWriter"
|
||||
self.appHandle = self.appName.lower()
|
||||
|
||||
# Config Error Handling
|
||||
self.hasError = False # True if the config class encountered an error
|
||||
self.errData = [] # List of error messages
|
||||
self.appHandle = "novelwriter"
|
||||
|
||||
# Set Paths
|
||||
self.cmdOpen = None # Path from command line for project to be opened on launch
|
||||
self.confPath = None # Folder where the config is saved
|
||||
self.confFile = None # The config file name
|
||||
self.dataPath = None # Folder where app data is stored
|
||||
self.lastPath = None # The last user-selected folder (browse dialogs)
|
||||
self.appPath = None # The full path to the novelwriter package folder
|
||||
self.appRoot = None # The full path to the novelwriter root folder
|
||||
self.appIcon = None # The full path to the novelwriter icon file
|
||||
self.assetPath = None # The full path to the novelwriter/assets folder
|
||||
self.pdfDocs = None # The location of the PDF manual, if it exists
|
||||
self.cmdOpen = None # Path from command line for project to be opened on launch
|
||||
self.confPath = None # Folder where the config is saved
|
||||
self.dataPath = None # Folder where app data is stored
|
||||
self.lastPath = None # The last user-selected folder (browse dialogs)
|
||||
self.appPath = None # The full path to the novelwriter package folder
|
||||
self.appRoot = None # The full path to the novelwriter root folder
|
||||
self.appIcon = None # The full path to the novelwriter icon file
|
||||
self.assetPath = None # The full path to the novelwriter/assets folder
|
||||
self.pdfDocs = None # The location of the PDF manual, if it exists
|
||||
|
||||
# Runtime Settings and Variables
|
||||
self.hasError = False # True if the config class encountered an error
|
||||
self.errData = [] # List of error messages
|
||||
self.confChanged = False # True whenever the config has chenged, false after save
|
||||
|
||||
# General
|
||||
@@ -94,16 +91,14 @@ class Config:
|
||||
self.qtTrans = {}
|
||||
|
||||
# Sizes
|
||||
self.winGeometry = [1200, 650]
|
||||
self.prefGeometry = [700, 615]
|
||||
self.treeColWidth = [200, 50, 30]
|
||||
self.novelColWidth = [200, 50]
|
||||
self.projColWidth = [200, 60, 140]
|
||||
self.mainPanePos = [300, 800]
|
||||
self.docPanePos = [400, 400]
|
||||
self.viewPanePos = [500, 150]
|
||||
self.outlnPanePos = [500, 150]
|
||||
self.isFullScreen = False
|
||||
self.winGeometry = [1200, 650]
|
||||
self.prefGeometry = [700, 615]
|
||||
self.projColWidth = [200, 60, 140]
|
||||
self.mainPanePos = [300, 800]
|
||||
self.docPanePos = [400, 400]
|
||||
self.viewPanePos = [500, 150]
|
||||
self.outlnPanePos = [500, 150]
|
||||
self.isFullScreen = False
|
||||
|
||||
# Features
|
||||
self.hideVScroll = False # Hide vertical scroll bars on main widgets
|
||||
@@ -117,7 +112,7 @@ class Config:
|
||||
# Text Editor
|
||||
self.textFont = None # Editor font
|
||||
self.textSize = 12 # Editor font size
|
||||
self.textWidth = 600 # Editor text width
|
||||
self.textWidth = 700 # Editor text width
|
||||
self.textMargin = 40 # Editor/viewer text margin
|
||||
self.tabWidth = 40 # Editor tabulator width
|
||||
|
||||
@@ -222,8 +217,8 @@ class Config:
|
||||
self.osUnknown = True
|
||||
|
||||
# Other System Info
|
||||
self.hostName = "Unknown"
|
||||
self.kernelVer = "Unknown"
|
||||
self.hostName = QSysInfo.machineHostName()
|
||||
self.kernelVer = QSysInfo.kernelVersion()
|
||||
|
||||
# Packages
|
||||
self.hasEnchant = False # The pyenchant package
|
||||
@@ -266,31 +261,15 @@ class Config:
|
||||
self.confPath = confPath
|
||||
|
||||
if dataPath is None:
|
||||
if self.verQtValue >= 50400:
|
||||
dataRoot = QStandardPaths.writableLocation(QStandardPaths.AppDataLocation)
|
||||
else:
|
||||
dataRoot = QStandardPaths.writableLocation(QStandardPaths.DataLocation)
|
||||
dataRoot = QStandardPaths.writableLocation(QStandardPaths.AppDataLocation)
|
||||
self.dataPath = os.path.join(os.path.abspath(dataRoot), self.appHandle)
|
||||
else:
|
||||
logger.info("Setting data path from alternative path: %s", dataPath)
|
||||
self.dataPath = dataPath
|
||||
|
||||
logger.verbose("Config path: %s", self.confPath)
|
||||
logger.verbose("Data path: %s", self.dataPath)
|
||||
logger.debug("Config path: %s", self.confPath)
|
||||
logger.debug("Data path: %s", self.dataPath)
|
||||
|
||||
# Check Data Path Subdirs
|
||||
dataDirs = ["syntax", "themes"]
|
||||
for dataDir in dataDirs:
|
||||
dirPath = os.path.join(self.dataPath, dataDir)
|
||||
if not os.path.isdir(dirPath):
|
||||
try:
|
||||
os.mkdir(dirPath)
|
||||
logger.info("Created folder: %s", dirPath)
|
||||
except Exception:
|
||||
logger.error("Could not create folder: %s", dirPath)
|
||||
logException()
|
||||
|
||||
self.confFile = self.appHandle+".conf"
|
||||
self.lastPath = os.path.expanduser("~")
|
||||
self.appPath = getattr(sys, "_MEIPASS", os.path.abspath(os.path.dirname(__file__)))
|
||||
self.appRoot = os.path.abspath(os.path.join(self.appPath, os.path.pardir))
|
||||
@@ -310,50 +289,33 @@ class Config:
|
||||
self.nwLangPath = os.path.join(self.assetPath, "i18n")
|
||||
|
||||
logger.debug("Assets: %s", self.assetPath)
|
||||
logger.verbose("App path: %s", self.appPath)
|
||||
logger.verbose("Last path: %s", self.lastPath)
|
||||
logger.debug("App path: %s", self.appPath)
|
||||
logger.debug("Last path: %s", self.lastPath)
|
||||
|
||||
# If the config folder does not exist, create it.
|
||||
# This assumes that the os config folder itself exists.
|
||||
if not os.path.isdir(self.confPath):
|
||||
try:
|
||||
os.mkdir(self.confPath)
|
||||
except Exception as exc:
|
||||
logger.error("Could not create folder: %s", self.confPath)
|
||||
logException()
|
||||
self.hasError = True
|
||||
self.errData.append("Could not create folder: %s" % self.confPath)
|
||||
self.errData.append(formatException(exc))
|
||||
self.confPath = None
|
||||
# If the config and data folders don't not exist, create them
|
||||
# This assumes that the os config and data folders exist
|
||||
if not ensureFolder(self.confPath, errLog=self.errData):
|
||||
self.hasError = True
|
||||
self.confPath = None
|
||||
|
||||
if not ensureFolder(self.dataPath, errLog=self.errData):
|
||||
self.hasError = True
|
||||
self.dataPath = None
|
||||
|
||||
# We don't error on these failing since they are not essential
|
||||
if self.dataPath is not None:
|
||||
ensureFolder("syntax", parent=self.dataPath)
|
||||
ensureFolder("themes", parent=self.dataPath)
|
||||
|
||||
# Check if config file exists
|
||||
if self.confPath is not None:
|
||||
if os.path.isfile(os.path.join(self.confPath, self.confFile)):
|
||||
if os.path.isfile(os.path.join(self.confPath, nwFiles.CONF_FILE)):
|
||||
# If it exists, load it
|
||||
self.loadConfig()
|
||||
else:
|
||||
# If it does not exist, save a copy of the default values
|
||||
self.saveConfig()
|
||||
|
||||
# If the data folder does not exist, create it.
|
||||
# This assumes that the os data folder itself exists.
|
||||
if self.dataPath is not None:
|
||||
if not os.path.isdir(self.dataPath):
|
||||
try:
|
||||
os.mkdir(self.dataPath)
|
||||
except Exception as exc:
|
||||
logger.error("Could not create folder: %s", self.dataPath)
|
||||
logException()
|
||||
self.hasError = True
|
||||
self.errData.append("Could not create folder: %s" % self.dataPath)
|
||||
self.errData.append(formatException(exc))
|
||||
self.dataPath = None
|
||||
|
||||
# Host and Kernel
|
||||
if self.verQtValue >= 50600:
|
||||
self.hostName = QSysInfo.machineHostName()
|
||||
self.kernelVer = QSysInfo.kernelVersion()
|
||||
|
||||
# Load recent projects cache
|
||||
self.loadRecentCache()
|
||||
|
||||
@@ -399,7 +361,7 @@ class Config:
|
||||
|
||||
def listLanguages(self, lngSet):
|
||||
"""List localisation files in the i18n folder. The default GUI
|
||||
language 'en_GB' is British English.
|
||||
language is British English (en_GB).
|
||||
"""
|
||||
if lngSet == self.LANG_NW:
|
||||
fPre = "nw_"
|
||||
@@ -432,7 +394,7 @@ class Config:
|
||||
return False
|
||||
|
||||
theConf = NWConfigParser()
|
||||
cnfPath = os.path.join(self.confPath, self.confFile)
|
||||
cnfPath = os.path.join(self.confPath, nwFiles.CONF_FILE)
|
||||
try:
|
||||
with open(cnfPath, mode="r", encoding="utf-8") as inFile:
|
||||
theConf.read_file(inFile)
|
||||
@@ -460,8 +422,6 @@ class Config:
|
||||
cnfSec = "Sizes"
|
||||
self.winGeometry = theConf.rdIntList(cnfSec, "geometry", self.winGeometry)
|
||||
self.prefGeometry = theConf.rdIntList(cnfSec, "preferences", self.prefGeometry)
|
||||
self.treeColWidth = theConf.rdIntList(cnfSec, "treecols", self.treeColWidth)
|
||||
self.novelColWidth = theConf.rdIntList(cnfSec, "novelcols", self.novelColWidth)
|
||||
self.projColWidth = theConf.rdIntList(cnfSec, "projcols", self.projColWidth)
|
||||
self.mainPanePos = theConf.rdIntList(cnfSec, "mainpane", self.mainPanePos)
|
||||
self.docPanePos = theConf.rdIntList(cnfSec, "docpane", self.docPanePos)
|
||||
@@ -581,8 +541,6 @@ class Config:
|
||||
theConf["Sizes"] = {
|
||||
"geometry": self._packList(self.winGeometry),
|
||||
"preferences": self._packList(self.prefGeometry),
|
||||
"treecols": self._packList(self.treeColWidth),
|
||||
"novelcols": self._packList(self.novelColWidth),
|
||||
"projcols": self._packList(self.projColWidth),
|
||||
"mainpane": self._packList(self.mainPanePos),
|
||||
"docpane": self._packList(self.docPanePos),
|
||||
@@ -659,7 +617,7 @@ class Config:
|
||||
}
|
||||
|
||||
# Write config file
|
||||
cnfPath = os.path.join(self.confPath, self.confFile)
|
||||
cnfPath = os.path.join(self.confPath, nwFiles.CONF_FILE)
|
||||
try:
|
||||
with open(cnfPath, mode="w", encoding="utf-8") as outFile:
|
||||
theConf.write(outFile)
|
||||
@@ -744,7 +702,7 @@ class Config:
|
||||
"""
|
||||
if thePath in self.recentProj:
|
||||
del self.recentProj[thePath]
|
||||
logger.verbose("Removed recent: %s", thePath)
|
||||
logger.debug("Removed recent: %s", thePath)
|
||||
self.saveRecentCache()
|
||||
else:
|
||||
logger.error("Unknown recent: %s", thePath)
|
||||
@@ -755,29 +713,6 @@ class Config:
|
||||
# Setters
|
||||
##
|
||||
|
||||
def setConfPath(self, newPath):
|
||||
"""Set the path and filename to the config file.
|
||||
"""
|
||||
if newPath is None:
|
||||
return True
|
||||
if not os.path.isfile(newPath):
|
||||
logger.error("File not found, using default config path instead")
|
||||
return False
|
||||
self.confPath = os.path.dirname(newPath)
|
||||
self.confFile = os.path.basename(newPath)
|
||||
return True
|
||||
|
||||
def setDataPath(self, newPath):
|
||||
"""Set the data path.
|
||||
"""
|
||||
if newPath is None:
|
||||
return True
|
||||
if not os.path.isdir(newPath):
|
||||
logger.error("Path not found, using default data path instead")
|
||||
return False
|
||||
self.dataPath = os.path.abspath(newPath)
|
||||
return True
|
||||
|
||||
def setLastPath(self, lastPath):
|
||||
"""Set the last used path (by the user).
|
||||
"""
|
||||
@@ -811,20 +746,6 @@ class Config:
|
||||
self.confChanged = True
|
||||
return True
|
||||
|
||||
def setTreeColWidths(self, colWidths):
|
||||
"""Set the column widths of the main project tree.
|
||||
"""
|
||||
self.treeColWidth = [int(x/self.guiScale) for x in colWidths]
|
||||
self.confChanged = True
|
||||
return True
|
||||
|
||||
def setNovelColWidths(self, colWidths):
|
||||
"""Set the column widths of the novel tree.
|
||||
"""
|
||||
self.novelColWidth = [int(x/self.guiScale) for x in colWidths]
|
||||
self.confChanged = True
|
||||
return True
|
||||
|
||||
def setProjColWidths(self, colWidths):
|
||||
"""Set the column widths of the Load Project dialog.
|
||||
"""
|
||||
@@ -910,12 +831,6 @@ class Config:
|
||||
def getPreferencesSize(self):
|
||||
return [int(x*self.guiScale) for x in self.prefGeometry]
|
||||
|
||||
def getTreeColWidths(self):
|
||||
return [int(x*self.guiScale) for x in self.treeColWidth]
|
||||
|
||||
def getNovelColWidths(self):
|
||||
return [int(x*self.guiScale) for x in self.novelColWidth]
|
||||
|
||||
def getProjColWidths(self):
|
||||
return [int(x*self.guiScale) for x in self.projColWidth]
|
||||
|
||||
@@ -978,12 +893,12 @@ class Config:
|
||||
"""
|
||||
try:
|
||||
import enchant # noqa: F401
|
||||
self.hasEnchant = True
|
||||
logger.debug("Checking package 'pyenchant': OK")
|
||||
except Exception:
|
||||
except ImportError:
|
||||
self.hasEnchant = False
|
||||
logger.debug("Checking package 'pyenchant': Missing")
|
||||
|
||||
else:
|
||||
self.hasEnchant = True
|
||||
logger.debug("Checking package 'pyenchant': OK")
|
||||
return
|
||||
|
||||
# END Class Config
|
||||
|
||||
@@ -25,7 +25,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP
|
||||
|
||||
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType, nwOutline
|
||||
from novelwriter.enum import nwItemClass, nwItemLayout, nwOutline
|
||||
|
||||
|
||||
def trConst(tString):
|
||||
@@ -34,7 +34,7 @@ def trConst(tString):
|
||||
return QCoreApplication.translate("Constant", tString)
|
||||
|
||||
|
||||
class nwConst():
|
||||
class nwConst:
|
||||
|
||||
# Date and Time Formats
|
||||
FMT_TSTAMP = "%Y-%m-%d %H:%M:%S" # Default format
|
||||
@@ -42,32 +42,13 @@ class nwConst():
|
||||
FMT_DSTAMP = "%Y-%m-%d" # Date only format
|
||||
|
||||
# Various Hard Limits
|
||||
MAX_DEPTH = 30 # Maximum folder depth of a project
|
||||
MAX_DOCSIZE = 5000000 # Maxium size of a single document
|
||||
MAX_BUILDSIZE = 10000000 # Maxium size of a project build
|
||||
|
||||
# END Class nwConst
|
||||
|
||||
|
||||
class nwLists():
|
||||
"""Lists used for grouping various other constants.
|
||||
"""
|
||||
# Regular user-accessible item types
|
||||
REG_TYPES = {nwItemType.ROOT, nwItemType.FOLDER, nwItemType.FILE}
|
||||
|
||||
# Item classes where the full list of novel layouts are allowed
|
||||
CLS_NOVEL = {nwItemClass.NOVEL, nwItemClass.ARCHIVE}
|
||||
|
||||
# Item classes which do not require items to have same class
|
||||
FREE_CLASS = {nwItemClass.ARCHIVE, nwItemClass.TRASH}
|
||||
|
||||
# Deprecated nwItemLayout entries
|
||||
DEP_LAYOUT = ("TITLE", "PAGE", "BOOK", "PARTITION", "UNNUMBERED", "CHAPTER", "SCENE")
|
||||
|
||||
# END Class nwLists
|
||||
|
||||
|
||||
class nwRegEx():
|
||||
class nwRegEx:
|
||||
|
||||
FMT_EI = r"(?<![\w\\])(_)(?![\s_])(.+?)(?<![\s\\])(\1)(?!\w)"
|
||||
FMT_EB = r"(?<![\w\\])([\*]{2})(?![\s\*])(.+?)(?<![\s\\])(\1)(?!\w)"
|
||||
@@ -76,8 +57,18 @@ class nwRegEx():
|
||||
# END Class nwRegEx
|
||||
|
||||
|
||||
class nwFiles():
|
||||
class nwHeaders:
|
||||
|
||||
H_VALID = ("H0", "H1", "H2", "H3", "H4")
|
||||
H_LEVEL = {"H0": 0, "H1": 1, "H2": 2, "H3": 3, "H4": 4}
|
||||
TT_NONE = "T000000"
|
||||
|
||||
# END Class nwHeaders
|
||||
|
||||
|
||||
class nwFiles:
|
||||
|
||||
CONF_FILE = "novelwriter.conf"
|
||||
PROJ_FILE = "nwProject.nwx"
|
||||
PROJ_DICT = "wordlist.txt"
|
||||
PROJ_LOCK = "nwProject.lock"
|
||||
@@ -126,7 +117,7 @@ class nwKeyWords:
|
||||
# END Class nwKeyWords
|
||||
|
||||
|
||||
class nwLabels():
|
||||
class nwLabels:
|
||||
|
||||
CLASS_NAME = {
|
||||
nwItemClass.NO_CLASS: QT_TRANSLATE_NOOP("Constant", "None"),
|
||||
@@ -167,6 +158,7 @@ class nwLabels():
|
||||
"doc_h1": QT_TRANSLATE_NOOP("Constant", "Novel Title Page"),
|
||||
"doc_h2": QT_TRANSLATE_NOOP("Constant", "Novel Chapter"),
|
||||
"doc_h3": QT_TRANSLATE_NOOP("Constant", "Novel Scene"),
|
||||
"doc_h4": QT_TRANSLATE_NOOP("Constant", "Novel Section"),
|
||||
"note": QT_TRANSLATE_NOOP("Constant", "Project Note"),
|
||||
}
|
||||
KEY_NAME = {
|
||||
@@ -204,7 +196,7 @@ class nwLabels():
|
||||
# END Class nwLabels
|
||||
|
||||
|
||||
class nwQuotes():
|
||||
class nwQuotes:
|
||||
"""Allowed quotation marks.
|
||||
Source: https://en.wikipedia.org/wiki/Quotation_mark
|
||||
"""
|
||||
|
||||
@@ -19,8 +19,9 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
from novelwriter.core.doctools import DocMerger, DocSplitter
|
||||
from novelwriter.core.document import NWDoc
|
||||
from novelwriter.core.index import NWIndex, countWords
|
||||
from novelwriter.core.index import countWords
|
||||
from novelwriter.core.project import NWProject
|
||||
from novelwriter.core.spellcheck import NWSpellEnchant
|
||||
from novelwriter.core.tohtml import ToHtml
|
||||
@@ -28,9 +29,10 @@ from novelwriter.core.toodt import ToOdt
|
||||
from novelwriter.core.tomd import ToMarkdown
|
||||
|
||||
__all__ = [
|
||||
"DocMerger",
|
||||
"DocSplitter",
|
||||
"countWords",
|
||||
"NWDoc",
|
||||
"NWIndex",
|
||||
"NWProject",
|
||||
"NWSpellEnchant",
|
||||
"ToHtml",
|
||||
|
||||
@@ -0,0 +1,240 @@
|
||||
"""
|
||||
novelWriter – Project Document Tools
|
||||
====================================
|
||||
A collection of tools to create and manipulate documents
|
||||
|
||||
File History:
|
||||
Created: 2022-10-02 [2.0b1] DocMerger
|
||||
Created: 2022-10-11 [2.0b1] DocSplitter
|
||||
|
||||
This file is a part of novelWriter
|
||||
Copyright 2018–2022, Veronica Berglyd Olsen
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from novelwriter.common import minmax
|
||||
from novelwriter.core.document import NWDoc
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class DocMerger:
|
||||
|
||||
def __init__(self, theProject):
|
||||
|
||||
self.theProject = theProject
|
||||
|
||||
self._error = ""
|
||||
self._targetDoc = None
|
||||
self._targetText = []
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
# Methods
|
||||
##
|
||||
|
||||
def getError(self):
|
||||
"""Return any collected errors.
|
||||
"""
|
||||
return self._error
|
||||
|
||||
def setTargetDoc(self, tHandle):
|
||||
"""Set the target document for the merging. Calling this
|
||||
function resets the class.
|
||||
"""
|
||||
self._targetDoc = tHandle
|
||||
self._targetText = []
|
||||
return
|
||||
|
||||
def newTargetDoc(self, srcHandle, docLabel):
|
||||
"""Create a barnd new target document based on a source handle
|
||||
and a new doc label. Calling this function resets the class.
|
||||
"""
|
||||
srcItem = self.theProject.tree[srcHandle]
|
||||
if srcItem is None:
|
||||
return None
|
||||
|
||||
newHandle = self.theProject.newFile(docLabel, srcItem.itemParent)
|
||||
newItem = self.theProject.tree[newHandle]
|
||||
newItem.setLayout(srcItem.itemLayout)
|
||||
newItem.setStatus(srcItem.itemStatus)
|
||||
newItem.setImport(srcItem.itemImport)
|
||||
|
||||
self._targetDoc = newHandle
|
||||
self._targetText = []
|
||||
|
||||
return newHandle
|
||||
|
||||
def appendText(self, srcHandle, addComment, cmtPrefix):
|
||||
"""Append text from an existing document to the text buffer.
|
||||
"""
|
||||
srcItem = self.theProject.tree[srcHandle]
|
||||
if srcItem is None:
|
||||
return False
|
||||
|
||||
inDoc = NWDoc(self.theProject, srcHandle)
|
||||
docText = (inDoc.readDocument() or "").rstrip("\n")
|
||||
|
||||
if addComment:
|
||||
docInfo = srcItem.describeMe()
|
||||
docSt, _ = srcItem.getImportStatus(incIcon=False)
|
||||
cmtLine = f"% {cmtPrefix} {docInfo}: {srcItem.itemName} [{docSt}]\n\n"
|
||||
docText = cmtLine + docText
|
||||
|
||||
self._targetText.append(docText)
|
||||
|
||||
return True
|
||||
|
||||
def writeTargetDoc(self):
|
||||
"""Write the accumulated text into the designated target
|
||||
document, appending any existing text.
|
||||
"""
|
||||
if self._targetDoc is None:
|
||||
return False
|
||||
|
||||
outDoc = NWDoc(self.theProject, self._targetDoc)
|
||||
docText = (outDoc.readDocument() or "").rstrip("\n")
|
||||
if docText:
|
||||
self._targetText.insert(0, docText)
|
||||
|
||||
status = outDoc.writeDocument("\n\n".join(self._targetText) + "\n\n")
|
||||
if not status:
|
||||
self._error = outDoc.getError()
|
||||
|
||||
return status
|
||||
|
||||
# END Class DocMerger
|
||||
|
||||
|
||||
class DocSplitter:
|
||||
|
||||
def __init__(self, theProject, sHandle):
|
||||
|
||||
self.theProject = theProject
|
||||
|
||||
self._error = ""
|
||||
self._parHandle = None
|
||||
self._srcHandle = None
|
||||
self._srcItem = None
|
||||
|
||||
self._inFolder = False
|
||||
self._rawData = []
|
||||
|
||||
srcItem = self.theProject.tree[sHandle]
|
||||
if srcItem is not None and srcItem.isFileType():
|
||||
self._srcHandle = sHandle
|
||||
self._srcItem = srcItem
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
# Methods
|
||||
##
|
||||
|
||||
def getError(self):
|
||||
"""Return any collected errors.
|
||||
"""
|
||||
return self._error
|
||||
|
||||
def setParentItem(self, pHandle):
|
||||
"""Set the item that will be the top level parent item for the
|
||||
new documents.
|
||||
"""
|
||||
self._parHandle = pHandle
|
||||
self._inFolder = False
|
||||
return
|
||||
|
||||
def newParentFolder(self, pHandle, folderLabel):
|
||||
"""Create a new folder that will be the top level parent item
|
||||
for the new documents.
|
||||
"""
|
||||
if self._srcItem is None:
|
||||
return None
|
||||
|
||||
newHandle = self.theProject.newFolder(folderLabel, pHandle)
|
||||
newItem = self.theProject.tree[newHandle]
|
||||
newItem.setStatus(self._srcItem.itemStatus)
|
||||
newItem.setImport(self._srcItem.itemImport)
|
||||
|
||||
self._parHandle = newHandle
|
||||
self._inFolder = True
|
||||
|
||||
return newHandle
|
||||
|
||||
def splitDocument(self, splitData, splitText):
|
||||
"""Loop through the split data record and perform the split job.
|
||||
"""
|
||||
self._rawData = []
|
||||
buffer = splitText.copy()
|
||||
for lineNo, hLevel, hLabel in reversed(splitData):
|
||||
chunk = buffer[lineNo:]
|
||||
buffer = buffer[:lineNo]
|
||||
self._rawData.insert(0, (chunk, hLevel, hLabel))
|
||||
|
||||
return True
|
||||
|
||||
def writeDocuments(self, docHierarchy):
|
||||
"""An iterator that will write each document in the buffer, and
|
||||
return its new handle, parent handle, and sibling handle.
|
||||
"""
|
||||
if self._srcHandle is None:
|
||||
return
|
||||
|
||||
pHandle = self._parHandle
|
||||
nHandle = self._parHandle if self._inFolder else self._srcHandle
|
||||
hHandle = [self._parHandle, None, None, None, None]
|
||||
|
||||
pLevel = 0
|
||||
for docText, hLevel, docLabel in self._rawData:
|
||||
|
||||
hLevel = minmax(hLevel, 1, 4)
|
||||
if pLevel == 0:
|
||||
pLevel = hLevel
|
||||
|
||||
if docHierarchy:
|
||||
if hLevel == 1:
|
||||
pHandle = self._parHandle
|
||||
elif hLevel == 2:
|
||||
pHandle = hHandle[1] or hHandle[0]
|
||||
elif hLevel == 3:
|
||||
pHandle = hHandle[2] or hHandle[1] or hHandle[0]
|
||||
elif hLevel == 4:
|
||||
pHandle = hHandle[3] or hHandle[2] or hHandle[1] or hHandle[0]
|
||||
|
||||
if hLevel < pLevel:
|
||||
nHandle = hHandle[hLevel] or hHandle[0]
|
||||
elif hLevel > pLevel:
|
||||
nHandle = pHandle
|
||||
|
||||
dHandle = self.theProject.newFile(docLabel, pHandle)
|
||||
hHandle[hLevel] = dHandle
|
||||
|
||||
outDoc = NWDoc(self.theProject, dHandle)
|
||||
status = outDoc.writeDocument("\n".join(docText))
|
||||
if not status:
|
||||
self._error = outDoc.getError()
|
||||
|
||||
yield status, dHandle, nHandle
|
||||
|
||||
hHandle[hLevel] = dHandle
|
||||
nHandle = dHandle
|
||||
pLevel = hLevel
|
||||
|
||||
return
|
||||
|
||||
# END Class DocSplitter
|
||||
@@ -33,7 +33,7 @@ from novelwriter.common import isHandle, sha256sum
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NWDoc():
|
||||
class NWDoc:
|
||||
|
||||
def __init__(self, theProject, theHandle):
|
||||
|
||||
@@ -52,7 +52,7 @@ class NWDoc():
|
||||
self._docHandle = theHandle
|
||||
|
||||
if self._docHandle is not None:
|
||||
self._theItem = self.theProject.projTree[theHandle]
|
||||
self._theItem = self.theProject.tree[theHandle]
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -29,14 +29,14 @@ from lxml import etree
|
||||
|
||||
from novelwriter.enum import nwItemType, nwItemClass, nwItemLayout
|
||||
from novelwriter.common import (
|
||||
checkInt, isHandle, isItemClass, isItemLayout, isItemType
|
||||
checkInt, isHandle, isItemClass, isItemLayout, isItemType, simplified
|
||||
)
|
||||
from novelwriter.constants import nwLabels, nwLists, trConst
|
||||
from novelwriter.constants import nwHeaders, nwLabels, trConst
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NWItem():
|
||||
class NWItem:
|
||||
|
||||
def __init__(self, theProject):
|
||||
|
||||
@@ -45,20 +45,23 @@ class NWItem():
|
||||
self._name = ""
|
||||
self._handle = None
|
||||
self._parent = None
|
||||
self._root = None
|
||||
self._order = 0
|
||||
self._type = nwItemType.NO_TYPE
|
||||
self._class = nwItemClass.NO_CLASS
|
||||
self._layout = nwItemLayout.NO_LAYOUT
|
||||
self._status = None
|
||||
self._import = None
|
||||
self._active = True
|
||||
self._expanded = False
|
||||
self._exported = True
|
||||
|
||||
# Document Meta Data
|
||||
self._charCount = 0 # Current character count
|
||||
self._wordCount = 0 # Current word count
|
||||
self._paraCount = 0 # Current paragraph count
|
||||
self._cursorPos = 0 # Last cursor position
|
||||
self._initCount = 0 # Initial word count
|
||||
self._heading = "H0" # The main heading
|
||||
self._charCount = 0 # Current character count
|
||||
self._wordCount = 0 # Current word count
|
||||
self._paraCount = 0 # Current paragraph count
|
||||
self._cursorPos = 0 # Last cursor position
|
||||
self._initCount = 0 # Initial word count
|
||||
|
||||
return
|
||||
|
||||
@@ -84,6 +87,10 @@ class NWItem():
|
||||
def itemParent(self):
|
||||
return self._parent
|
||||
|
||||
@property
|
||||
def itemRoot(self):
|
||||
return self._root
|
||||
|
||||
@property
|
||||
def itemOrder(self):
|
||||
return self._order
|
||||
@@ -104,13 +111,21 @@ class NWItem():
|
||||
def itemStatus(self):
|
||||
return self._status
|
||||
|
||||
@property
|
||||
def itemImport(self):
|
||||
return self._import
|
||||
|
||||
@property
|
||||
def isActive(self):
|
||||
return self._active
|
||||
|
||||
@property
|
||||
def isExpanded(self):
|
||||
return self._expanded
|
||||
|
||||
@property
|
||||
def isExported(self):
|
||||
return self._exported
|
||||
def mainHeading(self):
|
||||
return self._heading
|
||||
|
||||
@property
|
||||
def charCount(self):
|
||||
@@ -139,24 +154,34 @@ class NWItem():
|
||||
def packXML(self, xParent):
|
||||
"""Pack all the data in the class instance into an XML object.
|
||||
"""
|
||||
xPack = etree.SubElement(xParent, "item", attrib={
|
||||
"handle": str(self._handle),
|
||||
"order": str(self._order),
|
||||
"parent": str(self._parent),
|
||||
})
|
||||
self._subPack(xPack, "name", text=str(self._name))
|
||||
self._subPack(xPack, "type", text=str(self._type.name))
|
||||
self._subPack(xPack, "class", text=str(self._class.name))
|
||||
self._subPack(xPack, "status", text=str(self._status))
|
||||
itemAttrib = {}
|
||||
itemAttrib["handle"] = str(self._handle)
|
||||
itemAttrib["parent"] = str(self._parent)
|
||||
itemAttrib["root"] = str(self._root)
|
||||
itemAttrib["order"] = str(self._order)
|
||||
itemAttrib["type"] = str(self._type.name)
|
||||
itemAttrib["class"] = str(self._class.name)
|
||||
if self._type == nwItemType.FILE:
|
||||
self._subPack(xPack, "exported", text=str(self._exported))
|
||||
self._subPack(xPack, "layout", text=str(self._layout.name))
|
||||
self._subPack(xPack, "charCount", text=str(self._charCount), none=False)
|
||||
self._subPack(xPack, "wordCount", text=str(self._wordCount), none=False)
|
||||
self._subPack(xPack, "paraCount", text=str(self._paraCount), none=False)
|
||||
self._subPack(xPack, "cursorPos", text=str(self._cursorPos), none=False)
|
||||
else:
|
||||
self._subPack(xPack, "expanded", text=str(self._expanded))
|
||||
itemAttrib["layout"] = str(self._layout.name)
|
||||
|
||||
metaAttrib = {}
|
||||
metaAttrib["expanded"] = str(self._expanded)
|
||||
if self._type == nwItemType.FILE:
|
||||
metaAttrib["mainHeading"] = str(self._heading)
|
||||
metaAttrib["charCount"] = str(self._charCount)
|
||||
metaAttrib["wordCount"] = str(self._wordCount)
|
||||
metaAttrib["paraCount"] = str(self._paraCount)
|
||||
metaAttrib["cursorPos"] = str(self._cursorPos)
|
||||
|
||||
nameAttrib = {}
|
||||
nameAttrib["status"] = str(self._status)
|
||||
nameAttrib["import"] = str(self._import)
|
||||
if self._type == nwItemType.FILE:
|
||||
nameAttrib["active"] = str(self._active)
|
||||
|
||||
xPack = etree.SubElement(xParent, "item", attrib=itemAttrib)
|
||||
self._subPack(xPack, "meta", attrib=metaAttrib)
|
||||
self._subPack(xPack, "name", text=str(self._name), attrib=nameAttrib)
|
||||
|
||||
return
|
||||
|
||||
@@ -174,24 +199,43 @@ class NWItem():
|
||||
return False
|
||||
|
||||
self.setParent(xItem.attrib.get("parent", None))
|
||||
self.setRoot(xItem.attrib.get("root", None))
|
||||
self.setOrder(xItem.attrib.get("order", 0))
|
||||
self.setType(xItem.attrib.get("type", nwItemType.NO_TYPE))
|
||||
self.setClass(xItem.attrib.get("class", nwItemClass.NO_CLASS))
|
||||
self.setLayout(xItem.attrib.get("layout", nwItemLayout.NO_LAYOUT))
|
||||
|
||||
tmpStatus = ""
|
||||
for xValue in xItem:
|
||||
if xValue.tag == "name":
|
||||
if xValue.tag == "meta":
|
||||
self.setExpanded(xValue.attrib.get("expanded", False))
|
||||
self.setMainHeading(xValue.attrib.get("mainHeading", "H0"))
|
||||
self.setCharCount(xValue.attrib.get("charCount", 0))
|
||||
self.setWordCount(xValue.attrib.get("wordCount", 0))
|
||||
self.setParaCount(xValue.attrib.get("paraCount", 0))
|
||||
self.setCursorPos(xValue.attrib.get("cursorPos", 0))
|
||||
elif xValue.tag == "name":
|
||||
self.setName(xValue.text)
|
||||
self.setStatus(xValue.attrib.get("status", None))
|
||||
self.setImport(xValue.attrib.get("import", None))
|
||||
self.setActive(xValue.attrib.get("active", True))
|
||||
|
||||
# ToDo: Remove before 2.0 release. Only needed for 2.0 pre-releases.
|
||||
if "exported" in xValue.attrib:
|
||||
self.setActive(xValue.attrib.get("exported", True))
|
||||
|
||||
# Legacy Format (1.3 and earlier)
|
||||
elif xValue.tag == "status":
|
||||
self.setImportStatus(xValue.text)
|
||||
elif xValue.tag == "type":
|
||||
self.setType(xValue.text)
|
||||
elif xValue.tag == "class":
|
||||
self.setClass(xValue.text)
|
||||
elif xValue.tag == "layout":
|
||||
self.setLayout(xValue.text)
|
||||
elif xValue.tag == "status":
|
||||
tmpStatus = xValue.text
|
||||
elif xValue.tag == "expanded":
|
||||
self.setExpanded(xValue.text)
|
||||
elif xValue.tag == "exported":
|
||||
self.setExported(xValue.text)
|
||||
self.setActive(xValue.text)
|
||||
elif xValue.tag == "charCount":
|
||||
self.setCharCount(xValue.text)
|
||||
elif xValue.tag == "wordCount":
|
||||
@@ -206,8 +250,16 @@ class NWItem():
|
||||
# version of novelWriter that doesn't know the tag
|
||||
logger.error("Unknown tag '%s'", xValue.tag)
|
||||
|
||||
# Guarantees that <status> is parsed after <class>
|
||||
self.setStatus(tmpStatus)
|
||||
# Make some checks to ensure consistency
|
||||
if self._type == nwItemType.ROOT:
|
||||
self._root = self._handle # Root items are their own ancestor
|
||||
self._parent = None # Root items cannot have a parent
|
||||
|
||||
if self._type != nwItemType.FILE:
|
||||
self._charCount = 0 # Only set for files
|
||||
self._wordCount = 0 # Only set for files
|
||||
self._paraCount = 0 # Only set for files
|
||||
self._cursorPos = 0 # Only set for files
|
||||
|
||||
return True
|
||||
|
||||
@@ -225,10 +277,10 @@ class NWItem():
|
||||
return
|
||||
|
||||
##
|
||||
# Methods
|
||||
# Lookup Methods
|
||||
##
|
||||
|
||||
def describeMe(self, hLevel=None):
|
||||
def describeMe(self):
|
||||
"""Return a string description of the item.
|
||||
"""
|
||||
descKey = "none"
|
||||
@@ -238,12 +290,14 @@ class NWItem():
|
||||
descKey = "folder"
|
||||
elif self._type == nwItemType.FILE:
|
||||
if self._layout == nwItemLayout.DOCUMENT:
|
||||
if hLevel == "H1":
|
||||
if self._heading == "H1":
|
||||
descKey = "doc_h1"
|
||||
elif hLevel == "H2":
|
||||
elif self._heading == "H2":
|
||||
descKey = "doc_h2"
|
||||
elif hLevel == "H3":
|
||||
elif self._heading == "H3":
|
||||
descKey = "doc_h3"
|
||||
elif self._heading == "H4":
|
||||
descKey = "doc_h4"
|
||||
else:
|
||||
descKey = "document"
|
||||
elif self._layout == nwItemLayout.NOTE:
|
||||
@@ -251,142 +305,252 @@ class NWItem():
|
||||
|
||||
return trConst(nwLabels.ITEM_DESCRIPTION.get(descKey, ""))
|
||||
|
||||
def getImportStatus(self, incIcon=True):
|
||||
"""Return the relevant importance or status label and icon for
|
||||
the current item based on its class.
|
||||
"""
|
||||
if self.isNovelLike():
|
||||
stName = self.theProject.statusItems.name(self._status)
|
||||
stIcon = self.theProject.statusItems.icon(self._status) if incIcon else None
|
||||
else:
|
||||
stName = self.theProject.importItems.name(self._import)
|
||||
stIcon = self.theProject.importItems.icon(self._import) if incIcon else None
|
||||
return stName, stIcon
|
||||
|
||||
##
|
||||
# Checker Methods
|
||||
##
|
||||
|
||||
def isNovelLike(self):
|
||||
"""Returns true if the item is of a novel-like class.
|
||||
"""
|
||||
return self._class in (nwItemClass.NOVEL, nwItemClass.ARCHIVE)
|
||||
|
||||
def documentAllowed(self):
|
||||
"""Returns true if the item is allowed to be of document layout.
|
||||
"""
|
||||
return self._class in (nwItemClass.NOVEL, nwItemClass.ARCHIVE, nwItemClass.TRASH)
|
||||
|
||||
def isInactive(self):
|
||||
"""Returns true if the item is in an inactive class.
|
||||
"""
|
||||
return self._class in (nwItemClass.NO_CLASS, nwItemClass.ARCHIVE, nwItemClass.TRASH)
|
||||
|
||||
def isRootType(self):
|
||||
return self._type == nwItemType.ROOT
|
||||
|
||||
def isFolderType(self):
|
||||
return self._type == nwItemType.FOLDER
|
||||
|
||||
def isFileType(self):
|
||||
return self._type == nwItemType.FILE
|
||||
|
||||
def isNoteLayout(self):
|
||||
return self._layout == nwItemLayout.NOTE
|
||||
|
||||
def isDocumentLayout(self):
|
||||
return self._layout == nwItemLayout.DOCUMENT
|
||||
|
||||
##
|
||||
# Special Setters
|
||||
##
|
||||
|
||||
def setImportStatus(self, value):
|
||||
"""Update the importance or status value based on class. This is
|
||||
a wrapper setter for setStatus and setImport.
|
||||
"""
|
||||
if self.isNovelLike():
|
||||
self.setStatus(value)
|
||||
else:
|
||||
self.setImport(value)
|
||||
return
|
||||
|
||||
def setClassDefaults(self, itemClass):
|
||||
"""Set the default values based on the item's class and the
|
||||
project settings.
|
||||
"""
|
||||
if self._parent is not None:
|
||||
# Only update for child items
|
||||
self.setClass(itemClass)
|
||||
|
||||
if self._layout == nwItemLayout.NO_LAYOUT:
|
||||
# If no layout is set, pick one
|
||||
if self.isNovelLike():
|
||||
self._layout = nwItemLayout.DOCUMENT
|
||||
else:
|
||||
self._layout = nwItemLayout.NOTE
|
||||
elif not self.documentAllowed():
|
||||
# Change layout to note if it is not in an allowed folder
|
||||
self._layout = nwItemLayout.NOTE
|
||||
|
||||
if self._status is None:
|
||||
self.setStatus("New") # This forces a default value lookup
|
||||
|
||||
if self._import is None:
|
||||
self.setImport("New") # This forces a default value lookup
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
# Set Item Values
|
||||
##
|
||||
|
||||
def setName(self, theName):
|
||||
def setName(self, name):
|
||||
"""Set the item name.
|
||||
"""
|
||||
if isinstance(theName, str):
|
||||
self._name = theName.strip()
|
||||
if isinstance(name, str):
|
||||
self._name = simplified(name)
|
||||
else:
|
||||
self._name = ""
|
||||
return
|
||||
|
||||
def setHandle(self, theHandle):
|
||||
def setHandle(self, handle):
|
||||
"""Set the item handle, and ensure it is valid.
|
||||
"""
|
||||
if isHandle(theHandle):
|
||||
self._handle = theHandle
|
||||
if isHandle(handle):
|
||||
self._handle = handle
|
||||
else:
|
||||
self._handle = None
|
||||
return
|
||||
|
||||
def setParent(self, theParent):
|
||||
def setParent(self, handle):
|
||||
"""Set the parent handle, and ensure it is valid.
|
||||
"""
|
||||
if theParent is None:
|
||||
if handle is None:
|
||||
self._parent = None
|
||||
elif isHandle(theParent):
|
||||
self._parent = theParent
|
||||
elif isHandle(handle):
|
||||
self._parent = handle
|
||||
else:
|
||||
self._parent = None
|
||||
return
|
||||
|
||||
def setOrder(self, theOrder):
|
||||
def setRoot(self, handle):
|
||||
"""Set the root handle, and ensure it is valid.
|
||||
"""
|
||||
if handle is None:
|
||||
self._root = None
|
||||
elif isHandle(handle):
|
||||
self._root = handle
|
||||
else:
|
||||
self._root = None
|
||||
return
|
||||
|
||||
def setOrder(self, order):
|
||||
"""Set the item order, and ensure that it is valid. This value
|
||||
is purely a meta value, and not actually used by novelWriter at
|
||||
the moment.
|
||||
"""
|
||||
self._order = checkInt(theOrder, 0)
|
||||
self._order = checkInt(order, 0)
|
||||
return
|
||||
|
||||
def setType(self, theType):
|
||||
def setType(self, value):
|
||||
"""Set the item type from either a proper nwItemType, or set it
|
||||
from a string representing an nwItemType.
|
||||
"""
|
||||
if isinstance(theType, nwItemType):
|
||||
self._type = theType
|
||||
elif isItemType(theType):
|
||||
self._type = nwItemType[theType]
|
||||
if isinstance(value, nwItemType):
|
||||
self._type = value
|
||||
elif isItemType(value):
|
||||
self._type = nwItemType[value]
|
||||
elif value == "TRASH":
|
||||
self._type = nwItemType.ROOT
|
||||
else:
|
||||
logger.error("Unrecognised item type '%s'", theType)
|
||||
logger.error("Unrecognised item type '%s'", value)
|
||||
self._type = nwItemType.NO_TYPE
|
||||
return
|
||||
|
||||
def setClass(self, theClass):
|
||||
def setClass(self, value):
|
||||
"""Set the item class from either a proper nwItemClass, or set
|
||||
it from a string representing an nwItemClass.
|
||||
"""
|
||||
if isinstance(theClass, nwItemClass):
|
||||
self._class = theClass
|
||||
elif isItemClass(theClass):
|
||||
self._class = nwItemClass[theClass]
|
||||
if isinstance(value, nwItemClass):
|
||||
self._class = value
|
||||
elif isItemClass(value):
|
||||
self._class = nwItemClass[value]
|
||||
else:
|
||||
logger.error("Unrecognised item class '%s'", theClass)
|
||||
logger.error("Unrecognised item class '%s'", value)
|
||||
self._class = nwItemClass.NO_CLASS
|
||||
return
|
||||
|
||||
def setLayout(self, theLayout):
|
||||
def setLayout(self, value):
|
||||
"""Set the item layout from either a proper nwItemLayout, or set
|
||||
it from a string representing an nwItemLayout.
|
||||
"""
|
||||
if isinstance(theLayout, nwItemLayout):
|
||||
self._layout = theLayout
|
||||
elif isItemLayout(theLayout):
|
||||
self._layout = nwItemLayout[theLayout]
|
||||
elif theLayout in nwLists.DEP_LAYOUT:
|
||||
if isinstance(value, nwItemLayout):
|
||||
self._layout = value
|
||||
elif isItemLayout(value):
|
||||
self._layout = nwItemLayout[value]
|
||||
elif value in ("TITLE", "PAGE", "BOOK", "PARTITION", "UNNUMBERED", "CHAPTER", "SCENE"):
|
||||
self._layout = nwItemLayout.DOCUMENT
|
||||
else:
|
||||
logger.error("Unrecognised item layout '%s'", theLayout)
|
||||
logger.error("Unrecognised item layout '%s'", value)
|
||||
self._layout = nwItemLayout.NO_LAYOUT
|
||||
return
|
||||
|
||||
def setStatus(self, theStatus):
|
||||
def setStatus(self, value):
|
||||
"""Set the item status by looking it up in the valid status
|
||||
items of the current project.
|
||||
"""
|
||||
if self._class in nwLists.CLS_NOVEL:
|
||||
self._status = self.theProject.statusItems.checkEntry(theStatus)
|
||||
else:
|
||||
self._status = self.theProject.importItems.checkEntry(theStatus)
|
||||
self._status = self.theProject.statusItems.check(value)
|
||||
return
|
||||
|
||||
def setExpanded(self, expState):
|
||||
"""Set the expanded status of an item in the project tree.
|
||||
def setImport(self, value):
|
||||
"""Set the item importance by looking it up in the valid import
|
||||
items of the current project.
|
||||
"""
|
||||
if isinstance(expState, str):
|
||||
self._expanded = (expState == str(True))
|
||||
else:
|
||||
self._expanded = (expState is True)
|
||||
self._import = self.theProject.importItems.check(value)
|
||||
return
|
||||
|
||||
def setExported(self, expState):
|
||||
def setActive(self, state):
|
||||
"""Set the export flag.
|
||||
"""
|
||||
if isinstance(expState, str):
|
||||
self._exported = (expState == str(True))
|
||||
if isinstance(state, str):
|
||||
self._active = (state == str(True))
|
||||
else:
|
||||
self._exported = (expState is True)
|
||||
self._active = (state is True)
|
||||
return
|
||||
|
||||
def setExpanded(self, state):
|
||||
"""Set the expanded status of an item in the project tree.
|
||||
"""
|
||||
if isinstance(state, str):
|
||||
self._expanded = (state == str(True))
|
||||
else:
|
||||
self._expanded = (state is True)
|
||||
return
|
||||
|
||||
##
|
||||
# Set Document Meta Data
|
||||
##
|
||||
|
||||
def setCharCount(self, theCount):
|
||||
def setMainHeading(self, value):
|
||||
"""Set the main heading level.
|
||||
"""
|
||||
if value in nwHeaders.H_LEVEL:
|
||||
self._heading = value
|
||||
return
|
||||
|
||||
def setCharCount(self, count):
|
||||
"""Set the character count, and ensure that it is an integer.
|
||||
"""
|
||||
self._charCount = max(0, checkInt(theCount, 0))
|
||||
self._charCount = max(0, checkInt(count, 0))
|
||||
return
|
||||
|
||||
def setWordCount(self, theCount):
|
||||
def setWordCount(self, count):
|
||||
"""Set the word count, and ensure that it is an integer.
|
||||
"""
|
||||
self._wordCount = max(0, checkInt(theCount, 0))
|
||||
self._wordCount = max(0, checkInt(count, 0))
|
||||
return
|
||||
|
||||
def setParaCount(self, theCount):
|
||||
def setParaCount(self, count):
|
||||
"""Set the paragraph count, and ensure that it is an integer.
|
||||
"""
|
||||
self._paraCount = max(0, checkInt(theCount, 0))
|
||||
self._paraCount = max(0, checkInt(count, 0))
|
||||
return
|
||||
|
||||
def setCursorPos(self, thePosition):
|
||||
def setCursorPos(self, position):
|
||||
"""Set the cursor position, and ensure that it is an integer.
|
||||
"""
|
||||
self._cursorPos = max(0, checkInt(thePosition, 0))
|
||||
self._cursorPos = max(0, checkInt(position, 0))
|
||||
return
|
||||
|
||||
def saveInitialCount(self):
|
||||
|
||||
@@ -28,6 +28,8 @@ import os
|
||||
import json
|
||||
import logging
|
||||
|
||||
from enum import Enum
|
||||
|
||||
from novelwriter.error import logException
|
||||
from novelwriter.common import checkBool, checkFloat, checkInt, checkString
|
||||
from novelwriter.constants import nwFiles
|
||||
@@ -38,29 +40,30 @@ VALID_MAP = {
|
||||
"GuiWritingStats": {
|
||||
"winWidth", "winHeight", "widthCol0", "widthCol1", "widthCol2",
|
||||
"widthCol3", "sortCol", "sortOrder", "incNovel", "incNotes",
|
||||
"hideZeros", "hideNegative", "groupByDay", "showIdleTime", "histMax"
|
||||
"hideZeros", "hideNegative", "groupByDay", "showIdleTime", "histMax",
|
||||
},
|
||||
"GuiDocSplit": {"spLevel"},
|
||||
"GuiDocSplit": {"spLevel", "intoFolder", "docHierarchy"},
|
||||
"GuiBuildNovel": {
|
||||
"winWidth", "winHeight", "boxWidth", "docWidth", "hideScene",
|
||||
"hideSection", "addNovel", "addNotes", "ignoreFlag", "justifyText",
|
||||
"excludeBody", "textFont", "textSize", "lineHeight", "noStyling",
|
||||
"incSynopsis", "incComments", "incKeywords", "incBodyText",
|
||||
"replaceTabs", "replaceUCode"
|
||||
"replaceTabs", "replaceUCode", "rootFilter",
|
||||
},
|
||||
"GuiOutline": {"headerOrder", "columnWidth", "columnHidden"},
|
||||
"GuiProjectSettings": {
|
||||
"winWidth", "winHeight", "replaceColW", "statusColW", "importColW"
|
||||
"winWidth", "winHeight", "replaceColW", "statusColW", "importColW",
|
||||
},
|
||||
"GuiProjectDetails": {
|
||||
"winWidth", "winHeight", "widthCol0", "widthCol1", "widthCol2",
|
||||
"widthCol3", "widthCol4", "wordsPerPage", "countFrom", "clearDouble"
|
||||
"widthCol3", "widthCol4", "wordsPerPage", "countFrom", "clearDouble",
|
||||
},
|
||||
"GuiWordList": {"winWidth", "winHeight"}
|
||||
"GuiWordList": {"winWidth", "winHeight"},
|
||||
"GuiNovelView": {"lastCol"},
|
||||
}
|
||||
|
||||
|
||||
class OptionState():
|
||||
class OptionState:
|
||||
|
||||
def __init__(self, theProject):
|
||||
self.theProject = theProject
|
||||
@@ -137,7 +140,10 @@ class OptionState():
|
||||
if group not in self._theState:
|
||||
self._theState[group] = {}
|
||||
|
||||
self._theState[group][name] = value
|
||||
if isinstance(value, Enum):
|
||||
self._theState[group][name] = value.name
|
||||
else:
|
||||
self._theState[group][name] = value
|
||||
|
||||
return True
|
||||
|
||||
@@ -182,8 +188,19 @@ class OptionState():
|
||||
the default value.
|
||||
"""
|
||||
if group in self._theState:
|
||||
if name in self._theState[group]:
|
||||
return checkBool(self._theState[group].get(name, default), default)
|
||||
return checkBool(self._theState[group].get(name, default), default)
|
||||
return default
|
||||
|
||||
def getEnum(self, group, name, lookup, default):
|
||||
"""Return the value mapped to an enum. Otherwise return the
|
||||
default value
|
||||
"""
|
||||
if issubclass(lookup, Enum):
|
||||
if group in self._theState:
|
||||
if name in self._theState[group]:
|
||||
value = self._theState[group][name]
|
||||
if value in lookup.__members__:
|
||||
return lookup[value]
|
||||
return default
|
||||
|
||||
# END Class OptionState
|
||||
|
||||
@@ -33,7 +33,7 @@ from novelwriter.error import logException
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NWSpellEnchant():
|
||||
class NWSpellEnchant:
|
||||
|
||||
def __init__(self):
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@ novelWriter – Project Item Status Class
|
||||
Data class for the status/importance settings of a project item
|
||||
|
||||
File History:
|
||||
Created: 2019-05-19 [0.1.3]
|
||||
Created: 2019-05-19 [0.1.3]
|
||||
Rewritten: 2022-04-05 [1.7a0]
|
||||
|
||||
This file is a part of novelWriter
|
||||
Copyright 2018–2022, Veronica Berglyd Olsen
|
||||
@@ -23,165 +24,269 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import random
|
||||
import logging
|
||||
import novelwriter
|
||||
|
||||
from lxml import etree
|
||||
|
||||
from novelwriter.common import checkInt
|
||||
from PyQt5.QtGui import QIcon, QPixmap, QColor
|
||||
|
||||
from novelwriter.common import checkInt, minmax, simplified
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NWStatus():
|
||||
class NWStatus:
|
||||
|
||||
def __init__(self):
|
||||
STATUS = 1
|
||||
IMPORT = 2
|
||||
|
||||
self._theLabels = []
|
||||
self._theColours = []
|
||||
self._theCounts = []
|
||||
self._theMap = {}
|
||||
self._theLength = 0
|
||||
self._theIndex = 0
|
||||
def __init__(self, type):
|
||||
|
||||
self._type = type
|
||||
self._store = {}
|
||||
self._reverse = {}
|
||||
self._default = None
|
||||
|
||||
self._iconSize = novelwriter.CONFIG.pxInt(32)
|
||||
pixmap = QPixmap(self._iconSize, self._iconSize)
|
||||
pixmap.fill(QColor(100, 100, 100))
|
||||
self._defaultIcon = QIcon(pixmap)
|
||||
|
||||
if self._type == self.STATUS:
|
||||
self._prefix = "s"
|
||||
elif self._type == self.IMPORT:
|
||||
self._prefix = "i"
|
||||
else:
|
||||
raise Exception("This is a bug!")
|
||||
|
||||
return
|
||||
|
||||
def addEntry(self, theLabel, theColours):
|
||||
"""Add a status entry to the status object, but ensure it isn't
|
||||
a duplicate.
|
||||
def write(self, key, name, cols, count=None):
|
||||
"""Add or update a status entry. If the key is invalid, a new
|
||||
key is generated.
|
||||
"""
|
||||
theLabel = theLabel.strip()
|
||||
if self.lookupEntry(theLabel) is None:
|
||||
self._theLabels.append(theLabel)
|
||||
self._theColours.append(theColours)
|
||||
self._theCounts.append(0)
|
||||
self._theMap[theLabel] = self._theLength
|
||||
self._theLength += 1
|
||||
if not self._isKey(key):
|
||||
key = self._newKey()
|
||||
if not isinstance(cols, tuple):
|
||||
cols = (100, 100, 100)
|
||||
if len(cols) != 3:
|
||||
cols = (100, 100, 100)
|
||||
|
||||
pixmap = QPixmap(self._iconSize, self._iconSize)
|
||||
pixmap.fill(QColor(*cols))
|
||||
|
||||
name = simplified(name)
|
||||
if count is None:
|
||||
count = self._store[key]["count"] if key in self._store else 0
|
||||
|
||||
self._store[key] = {
|
||||
"name": name,
|
||||
"icon": QIcon(pixmap),
|
||||
"cols": cols,
|
||||
"count": count,
|
||||
}
|
||||
self._reverse[name] = key
|
||||
|
||||
if self._default is None:
|
||||
self._default = key
|
||||
|
||||
return key
|
||||
|
||||
def remove(self, key):
|
||||
"""Remove an entry in the list, but not if the count is larger
|
||||
than 0.
|
||||
"""
|
||||
if key not in self._store:
|
||||
return False
|
||||
if self._store[key]["count"] > 0:
|
||||
return False
|
||||
|
||||
del self._reverse[self._store[key]["name"]]
|
||||
del self._store[key]
|
||||
|
||||
keys = list(self._store.keys())
|
||||
if key == self._default:
|
||||
if len(keys) > 0:
|
||||
self._default = keys[0]
|
||||
else:
|
||||
self._default = None
|
||||
|
||||
return True
|
||||
|
||||
def lookupEntry(self, theLabel):
|
||||
"""Look up a status entry in the object lists, and return it if
|
||||
it exists.
|
||||
def check(self, value):
|
||||
"""Check the key against the stored status names.
|
||||
"""
|
||||
if theLabel is None:
|
||||
return None
|
||||
theLabel = theLabel.strip()
|
||||
if theLabel in self._theMap.keys():
|
||||
return self._theMap[theLabel]
|
||||
return None
|
||||
if self._isKey(value) and value in self._store:
|
||||
return value
|
||||
elif value in self._reverse:
|
||||
return self._reverse[value]
|
||||
elif self._default is not None:
|
||||
return self._default
|
||||
else:
|
||||
return ""
|
||||
|
||||
def checkEntry(self, theStatus):
|
||||
"""Check if a status value is valid, and returns the safe
|
||||
reference to be used internally.
|
||||
def name(self, key):
|
||||
"""Return the name associated with a given key.
|
||||
"""
|
||||
if isinstance(theStatus, str):
|
||||
theStatus = theStatus.strip()
|
||||
if self.lookupEntry(theStatus) is not None:
|
||||
return theStatus
|
||||
theStatus = checkInt(theStatus, 0, False)
|
||||
if theStatus >= 0 and theStatus < self._theLength:
|
||||
return self._theLabels[theStatus]
|
||||
return self._theLabels[0]
|
||||
if key in self._store:
|
||||
return self._store[key]["name"]
|
||||
elif self._default is not None:
|
||||
return self._store[self._default]["name"]
|
||||
else:
|
||||
return ""
|
||||
|
||||
def setNewEntries(self, newList):
|
||||
"""Update the list of entries after they have been modified by
|
||||
the GUI tool.
|
||||
def cols(self, key):
|
||||
"""Return the colours associated with a given key.
|
||||
"""
|
||||
replaceMap = {}
|
||||
if key in self._store:
|
||||
return self._store[key]["cols"]
|
||||
elif self._default is not None:
|
||||
return self._store[self._default]["cols"]
|
||||
else:
|
||||
return (100, 100, 100)
|
||||
|
||||
if newList is not None:
|
||||
self._theLabels = []
|
||||
self._theColours = []
|
||||
self._theCounts = []
|
||||
self._theMap = {}
|
||||
self._theLength = 0
|
||||
self._theIndex = 0
|
||||
def count(self, key):
|
||||
"""Return the count associated with a given key.
|
||||
"""
|
||||
if key in self._store:
|
||||
return self._store[key]["count"]
|
||||
elif self._default is not None:
|
||||
return self._store[self._default]["count"]
|
||||
else:
|
||||
return 0
|
||||
|
||||
for nName, nR, nG, nB, oName in newList:
|
||||
self.addEntry(nName, (nR, nG, nB))
|
||||
if nName != oName and oName is not None:
|
||||
replaceMap[oName] = nName
|
||||
def icon(self, key):
|
||||
"""Return the icon associated with a given key.
|
||||
"""
|
||||
if key in self._store:
|
||||
return self._store[key]["icon"]
|
||||
elif self._default is not None:
|
||||
return self._store[self._default]["icon"]
|
||||
else:
|
||||
return self._defaultIcon
|
||||
|
||||
return replaceMap
|
||||
def reorder(self, order):
|
||||
"""Reorder the items according to list.
|
||||
"""
|
||||
if len(order) != len(self._store):
|
||||
logger.error("Length mismatch between new and old order")
|
||||
return False
|
||||
|
||||
if order == list(self._store.keys()):
|
||||
return False
|
||||
|
||||
store = {}
|
||||
for key in order:
|
||||
if key in self._store:
|
||||
store[key] = self._store[key]
|
||||
else:
|
||||
logger.error("Unknown key '%s' in order", key)
|
||||
return False
|
||||
|
||||
self._store = store
|
||||
|
||||
return True
|
||||
|
||||
def resetCounts(self):
|
||||
"""Clear the counts of references to the status entries.
|
||||
"""
|
||||
self._theCounts = [0]*self._theLength
|
||||
for key in self._store:
|
||||
self._store[key]["count"] = 0
|
||||
return
|
||||
|
||||
def countEntry(self, theLabel):
|
||||
"""Increment the counter for a given label. This should be used
|
||||
together with resetCounts in a loop over project items.
|
||||
def increment(self, key):
|
||||
"""Increment the counter for a given entry.
|
||||
"""
|
||||
theIndex = self.lookupEntry(theLabel)
|
||||
if theIndex is not None:
|
||||
self._theCounts[theIndex] += 1
|
||||
if key in self._store:
|
||||
self._store[key]["count"] += 1
|
||||
return
|
||||
|
||||
def packXML(self, xParent):
|
||||
"""Pack the status entries into an XML object for saving to the
|
||||
main project file.
|
||||
"""
|
||||
for n in range(self._theLength):
|
||||
for key, data in self._store.items():
|
||||
xSub = etree.SubElement(xParent, "entry", attrib={
|
||||
"blue": str(self._theColours[n][2]),
|
||||
"green": str(self._theColours[n][1]),
|
||||
"red": str(self._theColours[n][0]),
|
||||
"key": key,
|
||||
"count": str(data["count"]),
|
||||
"red": str(data["cols"][0]),
|
||||
"green": str(data["cols"][1]),
|
||||
"blue": str(data["cols"][2]),
|
||||
})
|
||||
xSub.text = self._theLabels[n]
|
||||
xSub.text = data["name"]
|
||||
|
||||
return True
|
||||
|
||||
def unpackXML(self, xParent):
|
||||
"""Unpack an XML tree and set the class values.
|
||||
"""
|
||||
theLabels = []
|
||||
theColours = []
|
||||
self._store = {}
|
||||
self._reverse = {}
|
||||
self._default = None
|
||||
|
||||
for xChild in xParent:
|
||||
theLabels.append(xChild.text)
|
||||
cR = checkInt(xChild.attrib.get("red", 0), 0, False)
|
||||
cG = checkInt(xChild.attrib.get("green", 0), 0, False)
|
||||
cB = checkInt(xChild.attrib.get("blue", 0), 0, False)
|
||||
theColours.append((cR, cG, cB))
|
||||
key = xChild.attrib.get("key", None)
|
||||
name = xChild.text.strip()
|
||||
count = max(checkInt(xChild.attrib.get("count", 0), 0), 0)
|
||||
red = minmax(checkInt(xChild.attrib.get("red", 100), 100), 0, 255)
|
||||
green = minmax(checkInt(xChild.attrib.get("green", 100), 100), 0, 255)
|
||||
blue = minmax(checkInt(xChild.attrib.get("blue", 100), 100), 0, 255)
|
||||
self.write(key, name, (red, green, blue), count)
|
||||
|
||||
if len(theLabels) > 0:
|
||||
self._theLabels = []
|
||||
self._theColours = []
|
||||
self._theCounts = []
|
||||
self._theMap = {}
|
||||
self._theLength = 0
|
||||
self._theIndex = 0
|
||||
return True
|
||||
|
||||
for n in range(len(theLabels)):
|
||||
self.addEntry(theLabels[n], theColours[n])
|
||||
##
|
||||
# Internal Functions
|
||||
##
|
||||
|
||||
def _newKey(self):
|
||||
"""Generate a new key for a status flag. This method is
|
||||
recursive, but should only fail if there is an issue with the
|
||||
random number generator or the user has added a lot of status
|
||||
flags. The Python recursion limit is given the job to handle
|
||||
the extreme case and will cause an app crash.
|
||||
"""
|
||||
key = f"{self._prefix}{random.getrandbits(24):06x}"
|
||||
if key in self._store:
|
||||
key = self._newKey()
|
||||
return key
|
||||
|
||||
def _isKey(self, value):
|
||||
"""Check if a value is a key or not.
|
||||
"""
|
||||
if not isinstance(value, str):
|
||||
return False
|
||||
if len(value) != 7:
|
||||
return False
|
||||
if value[0] != self._prefix:
|
||||
return False
|
||||
for c in value[1:]:
|
||||
if c not in "0123456789abcdef":
|
||||
return False
|
||||
return True
|
||||
|
||||
##
|
||||
# Iterator Bits
|
||||
##
|
||||
|
||||
def __getitem__(self, n):
|
||||
"""Return an entry by its index.
|
||||
"""
|
||||
if n >= 0 and n < self._theLength:
|
||||
return self._theLabels[n], self._theColours[n], self._theCounts[n]
|
||||
return None, None, None
|
||||
def __len__(self):
|
||||
return len(self._store)
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self._store[key]
|
||||
|
||||
def __iter__(self):
|
||||
"""Initialise the iterator.
|
||||
"""
|
||||
self._theIndex = 0
|
||||
return self
|
||||
return iter(self._store)
|
||||
|
||||
def __next__(self):
|
||||
"""Return the next entry for the iterator.
|
||||
"""
|
||||
if self._theIndex < self._theLength:
|
||||
theLabel, theColour, theCount = self.__getitem__(self._theIndex)
|
||||
self._theIndex += 1
|
||||
return theLabel, theColour, theCount
|
||||
else:
|
||||
raise StopIteration
|
||||
def keys(self):
|
||||
return self._store.keys()
|
||||
|
||||
def items(self):
|
||||
return self._store.items()
|
||||
|
||||
def values(self):
|
||||
return self._store.values()
|
||||
|
||||
# END Class NWStatus
|
||||
|
||||
@@ -38,7 +38,7 @@ class ToHtml(Tokenizer):
|
||||
M_EBOOK = 2 # Tweak output for converting to epub
|
||||
|
||||
def __init__(self, theProject):
|
||||
Tokenizer.__init__(self, theProject)
|
||||
super().__init__(theProject)
|
||||
|
||||
self._genMode = self.M_EXPORT
|
||||
self._cssStyles = True
|
||||
@@ -107,7 +107,7 @@ class ToHtml(Tokenizer):
|
||||
"""Extend the auto-replace to also properly encode some unicode
|
||||
characters into their respective HTML entities.
|
||||
"""
|
||||
Tokenizer.doPreProcessing(self)
|
||||
super().doPreProcessing()
|
||||
self._theText = self._theText.translate(self._trMap)
|
||||
return
|
||||
|
||||
@@ -451,7 +451,7 @@ class ToHtml(Tokenizer):
|
||||
def _formatKeywords(self, tText):
|
||||
"""Apply HTML formatting to keywords.
|
||||
"""
|
||||
isValid, theBits, _ = self.theParent.theIndex.scanThis("@"+tText)
|
||||
isValid, theBits, _ = self.theProject.index.scanThis("@"+tText)
|
||||
if not isValid or not theBits:
|
||||
return ""
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
novelWriter – Text Tokenizer
|
||||
============================
|
||||
Splits a piece of novelWriter markdown text into its elements
|
||||
Split novelWriter plain text into its elements
|
||||
|
||||
File History:
|
||||
Created: 2019-05-05 [0.0.1]
|
||||
@@ -27,6 +27,7 @@ import re
|
||||
import logging
|
||||
import novelwriter
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from operator import itemgetter
|
||||
from functools import partial
|
||||
|
||||
@@ -40,7 +41,7 @@ from novelwriter.core.document import NWDoc
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Tokenizer():
|
||||
class Tokenizer(ABC):
|
||||
|
||||
# In-Text Format
|
||||
FMT_B_B = 1 # Begin bold
|
||||
@@ -81,7 +82,6 @@ class Tokenizer():
|
||||
def __init__(self, theProject):
|
||||
|
||||
self.theProject = theProject
|
||||
self.theParent = theProject.theParent
|
||||
self.mainConf = novelwriter.CONFIG
|
||||
|
||||
# Data Variables
|
||||
@@ -267,10 +267,14 @@ class Tokenizer():
|
||||
# Class Methods
|
||||
##
|
||||
|
||||
@abstractmethod
|
||||
def doConvert(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def addRootHeading(self, theHandle):
|
||||
"""Add a heading at the start of a new root folder.
|
||||
"""
|
||||
if not self.theProject.projTree.checkType(theHandle, nwItemType.ROOT):
|
||||
if not self.theProject.tree.checkType(theHandle, nwItemType.ROOT):
|
||||
return False
|
||||
|
||||
if self._isFirst:
|
||||
@@ -279,7 +283,7 @@ class Tokenizer():
|
||||
else:
|
||||
textAlign = self.A_PBB | self.A_CENTRE
|
||||
|
||||
theItem = self.theProject.projTree[theHandle]
|
||||
theItem = self.theProject.tree[theHandle]
|
||||
locNotes = self._localLookup("Notes")
|
||||
theTitle = f"{locNotes}: {theItem.itemName}"
|
||||
self._theTokens = []
|
||||
@@ -296,20 +300,14 @@ class Tokenizer():
|
||||
not set, load it from the file.
|
||||
"""
|
||||
self._theHandle = theHandle
|
||||
self._theItem = self.theProject.projTree[theHandle]
|
||||
self._theItem = self.theProject.tree[theHandle]
|
||||
if self._theItem is None:
|
||||
return False
|
||||
|
||||
self._theText = ""
|
||||
if theText is not None:
|
||||
# If the text is set, just use that
|
||||
self._theText = theText
|
||||
else:
|
||||
# Otherwise, load it from file
|
||||
theDoc = NWDoc(self.theProject, theHandle)
|
||||
theText = theDoc.readDocument()
|
||||
if theText:
|
||||
self._theText = theText
|
||||
if theText is None:
|
||||
theText = NWDoc(self.theProject, theHandle).readDocument() or ""
|
||||
|
||||
self._theText = theText
|
||||
|
||||
docSize = len(self._theText)
|
||||
if docSize > nwConst.MAX_DOCSIZE:
|
||||
|
||||
@@ -37,7 +37,7 @@ class ToMarkdown(Tokenizer):
|
||||
M_GH = 1 # GitHub Markdown
|
||||
|
||||
def __init__(self, theProject):
|
||||
Tokenizer.__init__(self, theProject)
|
||||
super().__init__(theProject)
|
||||
|
||||
self._genMode = self.M_STD
|
||||
self._fullMD = []
|
||||
@@ -193,7 +193,7 @@ class ToMarkdown(Tokenizer):
|
||||
def _formatKeywords(self, tText, tStyle):
|
||||
"""Apply Markdown formatting to keywords.
|
||||
"""
|
||||
isValid, theBits, _ = self.theParent.theIndex.scanThis("@"+tText)
|
||||
isValid, theBits, _ = self.theProject.index.scanThis("@"+tText)
|
||||
if not isValid or not theBits:
|
||||
return ""
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ M_DEL = ~X_DEL
|
||||
class ToOdt(Tokenizer):
|
||||
|
||||
def __init__(self, theProject, isFlat):
|
||||
Tokenizer.__init__(self, theProject)
|
||||
super().__init__(theProject)
|
||||
|
||||
self._isFlat = isFlat # Flat: .fodt, otherwise .odt
|
||||
|
||||
@@ -330,7 +330,7 @@ class ToOdt(Tokenizer):
|
||||
|
||||
# Meta Data
|
||||
xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "creation-date"))
|
||||
xMeta.text = datetime.now().strftime(r"%Y-%m-%dT%H:%M:%S")
|
||||
xMeta.text = datetime.now().isoformat(sep="T", timespec="seconds")
|
||||
|
||||
xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "generator"))
|
||||
xMeta.text = f"novelWriter/{novelwriter.__version__}"
|
||||
@@ -550,7 +550,7 @@ class ToOdt(Tokenizer):
|
||||
def _formatKeywords(self, tText):
|
||||
"""Apply formatting to keywords.
|
||||
"""
|
||||
isValid, theBits, _ = self.theParent.theIndex.scanThis("@"+tText)
|
||||
isValid, theBits, _ = self.theProject.index.scanThis("@"+tText)
|
||||
if not isValid or not theBits:
|
||||
return ""
|
||||
|
||||
@@ -994,7 +994,7 @@ class ToOdt(Tokenizer):
|
||||
# Auto-Style Classes
|
||||
# =============================================================================================== #
|
||||
|
||||
class ODTParagraphStyle():
|
||||
class ODTParagraphStyle:
|
||||
"""Wrapper class for the paragraph style setting used by the
|
||||
exporter. Only the used settings are exposed here to keep the class
|
||||
minimal and fast.
|
||||
@@ -1208,7 +1208,7 @@ class ODTParagraphStyle():
|
||||
# END Class ODTParagraphStyle
|
||||
|
||||
|
||||
class ODTTextStyle():
|
||||
class ODTTextStyle:
|
||||
"""Wrapper class for the text style setting used by the exporter.
|
||||
Only the used settings are exposed here to keep the class minimal
|
||||
and fast.
|
||||
@@ -1297,7 +1297,7 @@ X_SPAN_TEXT = 2
|
||||
X_SPAN_SING = 3
|
||||
|
||||
|
||||
class XMLParagraph():
|
||||
class XMLParagraph:
|
||||
"""This is a helper class to manage the text content of a single
|
||||
XML element using mixed content tags.
|
||||
|
||||
|
||||
@@ -24,22 +24,23 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import os
|
||||
import random
|
||||
import logging
|
||||
|
||||
from time import time
|
||||
from lxml import etree
|
||||
from hashlib import sha256
|
||||
|
||||
from novelwriter.enum import nwItemType, nwItemClass, nwItemLayout
|
||||
from novelwriter.enum import nwItemClass, nwItemLayout
|
||||
from novelwriter.error import logException
|
||||
from novelwriter.common import checkHandle
|
||||
from novelwriter.constants import nwConst, nwFiles
|
||||
from novelwriter.constants import nwFiles
|
||||
from novelwriter.core.item import NWItem
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NWTree():
|
||||
class NWTree:
|
||||
|
||||
MAX_DEPTH = 1000 # Cap of tree traversing for loops
|
||||
|
||||
def __init__(self, theProject):
|
||||
|
||||
@@ -47,15 +48,12 @@ class NWTree():
|
||||
|
||||
self._projTree = {} # Holds all the items of the project
|
||||
self._treeOrder = [] # The order of the tree items on the tree view
|
||||
self._treeRoots = [] # The root items of the tree
|
||||
self._treeRoots = {} # The root items of the tree
|
||||
self._trashRoot = None # The handle of the trash root folder
|
||||
self._archRoot = None # The handle of the archive root folder
|
||||
self._theIndex = 0 # The current iterator index
|
||||
self._treeChanged = False # True if tree structure has changed
|
||||
|
||||
self._handleSeed = None # Used for generating handles for testing
|
||||
self._handleCount = 0 # A counter that is added to the handle generator
|
||||
|
||||
return
|
||||
|
||||
##
|
||||
@@ -67,7 +65,7 @@ class NWTree():
|
||||
"""
|
||||
self._projTree = {}
|
||||
self._treeOrder = []
|
||||
self._treeRoots = []
|
||||
self._treeRoots = {}
|
||||
self._trashRoot = None
|
||||
self._archRoot = None
|
||||
self._theIndex = 0
|
||||
@@ -91,25 +89,24 @@ class NWTree():
|
||||
logger.warning("Duplicate handle '%s' detected, skipping", tHandle)
|
||||
return False
|
||||
|
||||
logger.verbose("Adding item '%s' with parent '%s'", str(tHandle), str(pHandle))
|
||||
logger.debug("Adding item '%s' with parent '%s'", str(tHandle), str(pHandle))
|
||||
|
||||
nwItem.setHandle(tHandle)
|
||||
nwItem.setParent(pHandle)
|
||||
|
||||
if nwItem.itemType == nwItemType.ROOT:
|
||||
logger.verbose("Item '%s' is a root item", str(tHandle))
|
||||
self._treeRoots.append(tHandle)
|
||||
if nwItem.isRootType():
|
||||
logger.debug("Item '%s' is a root item", str(tHandle))
|
||||
self._treeRoots[tHandle] = nwItem
|
||||
if nwItem.itemClass == nwItemClass.ARCHIVE:
|
||||
logger.verbose("Item '%s' is the archive folder", str(tHandle))
|
||||
logger.debug("Item '%s' is the archive folder", str(tHandle))
|
||||
self._archRoot = tHandle
|
||||
|
||||
if nwItem.itemType == nwItemType.TRASH:
|
||||
if self._trashRoot is None:
|
||||
logger.verbose("Item '%s' is the trash folder", str(tHandle))
|
||||
self._trashRoot = tHandle
|
||||
else:
|
||||
logger.error("Only one trash folder allowed")
|
||||
return False
|
||||
elif nwItem.itemClass == nwItemClass.TRASH:
|
||||
if self._trashRoot is None:
|
||||
logger.debug("Item '%s' is the trash folder", str(tHandle))
|
||||
self._trashRoot = tHandle
|
||||
else:
|
||||
logger.error("Only one trash folder allowed")
|
||||
return False
|
||||
|
||||
self._projTree[tHandle] = nwItem
|
||||
self._treeOrder.append(tHandle)
|
||||
@@ -207,9 +204,30 @@ class NWTree():
|
||||
return novelWords, noteWords
|
||||
|
||||
##
|
||||
# Tree Structure Methods
|
||||
# Tree Item Methods
|
||||
##
|
||||
|
||||
def updateItemData(self, tHandle):
|
||||
"""Update the root item handle of a given item. Returns True if
|
||||
a root was found and data updated, otherwise False.
|
||||
"""
|
||||
tItem = self.__getitem__(tHandle)
|
||||
if tItem is None:
|
||||
return False
|
||||
|
||||
iItem = tItem
|
||||
for _ in range(self.MAX_DEPTH):
|
||||
if iItem.itemParent is None:
|
||||
tItem.setRoot(iItem.itemHandle)
|
||||
tItem.setClassDefaults(iItem.itemClass)
|
||||
return True
|
||||
else:
|
||||
iItem = self.__getitem__(iItem.itemParent)
|
||||
if iItem is None:
|
||||
return False
|
||||
else:
|
||||
raise RecursionError("Critical internal error")
|
||||
|
||||
def checkType(self, tHandle, itemType):
|
||||
"""Return true of item exists and is of the specified item type.
|
||||
"""
|
||||
@@ -218,71 +236,6 @@ class NWTree():
|
||||
return False
|
||||
return tItem.itemType == itemType
|
||||
|
||||
def trashRoot(self):
|
||||
"""Returns the handle of the trash folder, or None if there
|
||||
isn't one.
|
||||
"""
|
||||
if self._trashRoot:
|
||||
return self._trashRoot
|
||||
return None
|
||||
|
||||
def isTrashRoot(self, tHandle):
|
||||
"""Check if a handle is the trash folder.
|
||||
"""
|
||||
if self._trashRoot is None:
|
||||
return False
|
||||
return tHandle == self._trashRoot
|
||||
|
||||
def archiveRoot(self):
|
||||
"""Returns the handle of the archive folder, or None if there
|
||||
isn't one.
|
||||
"""
|
||||
if self._archRoot:
|
||||
return self._archRoot
|
||||
return None
|
||||
|
||||
def findRoot(self, theClass):
|
||||
"""Find the root item for a given class.
|
||||
Note: This returns the first item for class CUSTOM.
|
||||
"""
|
||||
for aRoot in self._treeRoots:
|
||||
tItem = self.__getitem__(aRoot)
|
||||
if tItem is None:
|
||||
continue
|
||||
if theClass == tItem.itemClass:
|
||||
return tItem.itemHandle
|
||||
return None
|
||||
|
||||
def checkRootUnique(self, theClass):
|
||||
"""Checks if there already is a root entry of class 'theClass'
|
||||
in the root of the project tree. CUSTOM class is skipped as it
|
||||
is not required to be unique.
|
||||
"""
|
||||
if theClass == nwItemClass.CUSTOM:
|
||||
return True
|
||||
for aRoot in self._treeRoots:
|
||||
tItem = self.__getitem__(aRoot)
|
||||
if tItem is None:
|
||||
continue
|
||||
if theClass == tItem.itemClass:
|
||||
return False
|
||||
return True
|
||||
|
||||
def getRootItem(self, tHandle):
|
||||
"""Iterate upwards in the tree until we find the item with
|
||||
parent None, the root item. We do this with a for loop with a
|
||||
maximum depth to make infinite loops impossible.
|
||||
"""
|
||||
tItem = self.__getitem__(tHandle)
|
||||
if tItem is not None:
|
||||
for i in range(nwConst.MAX_DEPTH + 1):
|
||||
if tItem.itemParent is None:
|
||||
return tItem
|
||||
else:
|
||||
tHandle = tItem.itemParent
|
||||
tItem = self.__getitem__(tHandle)
|
||||
return None
|
||||
|
||||
def getItemPath(self, tHandle):
|
||||
"""Iterate upwards in the tree until we find the item with
|
||||
parent None, the root item, and return the list of handles.
|
||||
@@ -293,7 +246,7 @@ class NWTree():
|
||||
tItem = self.__getitem__(tHandle)
|
||||
if tItem is not None:
|
||||
tTree.append(tHandle)
|
||||
for _ in range(nwConst.MAX_DEPTH + 1):
|
||||
for _ in range(self.MAX_DEPTH):
|
||||
if tItem.itemParent is None:
|
||||
return tTree
|
||||
else:
|
||||
@@ -303,8 +256,74 @@ class NWTree():
|
||||
return tTree
|
||||
else:
|
||||
tTree.append(tHandle)
|
||||
else:
|
||||
raise RecursionError("Critical internal error")
|
||||
|
||||
return tTree
|
||||
|
||||
##
|
||||
# Tree Root Methods
|
||||
##
|
||||
|
||||
def rootClasses(self):
|
||||
"""Return a set of all root classes in use by the project.
|
||||
"""
|
||||
rootClasses = set()
|
||||
for nwItem in self._treeRoots.values():
|
||||
rootClasses.add(nwItem.itemClass)
|
||||
return rootClasses
|
||||
|
||||
def iterRoots(self, itemClass):
|
||||
"""Iterate over all root items of a given class in order.
|
||||
"""
|
||||
for tHandle in self._treeOrder:
|
||||
nwItem = self.__getitem__(tHandle)
|
||||
if nwItem is not None and nwItem.isRootType():
|
||||
if itemClass is None or nwItem.itemClass == itemClass:
|
||||
yield tHandle, nwItem
|
||||
return
|
||||
|
||||
def isRoot(self, tHandle):
|
||||
"""Check if a handle is a root item.
|
||||
"""
|
||||
return tHandle in self._treeRoots
|
||||
|
||||
def isTrash(self, tHandle):
|
||||
"""Check if an item is in or is the trash folder.
|
||||
"""
|
||||
tItem = self.__getitem__(tHandle)
|
||||
if tItem is None:
|
||||
return True
|
||||
if tItem.itemClass == nwItemClass.TRASH:
|
||||
return True
|
||||
if self._trashRoot is not None:
|
||||
if tHandle == self._trashRoot:
|
||||
return True
|
||||
elif tItem.itemParent == self._trashRoot:
|
||||
return True
|
||||
elif tItem.itemRoot == self._trashRoot:
|
||||
return True
|
||||
return False
|
||||
|
||||
def trashRoot(self):
|
||||
"""Returns the handle of the trash folder, or None if there
|
||||
isn't one.
|
||||
"""
|
||||
if self._trashRoot:
|
||||
return self._trashRoot
|
||||
return None
|
||||
|
||||
def findRoot(self, theClass):
|
||||
"""Find the first root item for a given class.
|
||||
"""
|
||||
for aRoot in self._treeRoots:
|
||||
tItem = self.__getitem__(aRoot)
|
||||
if tItem is None:
|
||||
continue
|
||||
if theClass == tItem.itemClass:
|
||||
return tItem.itemHandle
|
||||
return None
|
||||
|
||||
##
|
||||
# Setters
|
||||
##
|
||||
@@ -330,25 +349,17 @@ class NWTree():
|
||||
# Save the temp list
|
||||
self._treeOrder = tmpOrder
|
||||
self._setTreeChanged(True)
|
||||
logger.verbose("Project tree order updated")
|
||||
logger.debug("Project tree order updated")
|
||||
|
||||
return
|
||||
|
||||
def setSeed(self, theSeed):
|
||||
"""Used for debugging!
|
||||
Sets a seed for generating handles so that they always come out
|
||||
in a predictable order.
|
||||
"""
|
||||
self._handleSeed = theSeed
|
||||
return
|
||||
|
||||
def setFileItemLayout(self, tHandle, itemLayout):
|
||||
"""Set the nwItemLayout for a specific file.
|
||||
"""
|
||||
tItem = self.__getitem__(tHandle)
|
||||
if tItem is None:
|
||||
return False
|
||||
if tItem.itemType != nwItemType.FILE:
|
||||
if not tItem.isFileType():
|
||||
logger.error("Item '%s' is not a file", tHandle)
|
||||
return False
|
||||
if not isinstance(itemLayout, nwItemLayout):
|
||||
@@ -358,30 +369,6 @@ class NWTree():
|
||||
|
||||
return True
|
||||
|
||||
##
|
||||
# Getters
|
||||
##
|
||||
|
||||
def countTypes(self):
|
||||
"""Count the number of files, folders and roots in the project.
|
||||
"""
|
||||
nRoot = 0
|
||||
nFolder = 0
|
||||
nFile = 0
|
||||
|
||||
for tHandle in self._treeOrder:
|
||||
tItem = self.__getitem__(tHandle)
|
||||
if tItem is None:
|
||||
continue
|
||||
elif tItem.itemType == nwItemType.ROOT:
|
||||
nRoot += 1
|
||||
elif tItem.itemType == nwItemType.FOLDER:
|
||||
nFolder += 1
|
||||
elif tItem.itemType == nwItemType.FILE:
|
||||
nFile += 1
|
||||
|
||||
return nRoot, nFolder, nFile
|
||||
|
||||
##
|
||||
# Meta Methods
|
||||
##
|
||||
@@ -420,7 +407,7 @@ class NWTree():
|
||||
return
|
||||
|
||||
if tHandle in self._treeRoots:
|
||||
self._treeRoots.remove(tHandle)
|
||||
del self._treeRoots[tHandle]
|
||||
if tHandle == self._trashRoot:
|
||||
self._trashRoot = None
|
||||
if tHandle == self._archRoot:
|
||||
@@ -468,29 +455,16 @@ class NWTree():
|
||||
self.theProject.setProjectChanged(True)
|
||||
return
|
||||
|
||||
def _makeHandle(self, addSeed=""):
|
||||
def _makeHandle(self):
|
||||
"""Generate a unique item handle. In the event that the key
|
||||
already exists, salt the seed and generate a new handle.
|
||||
A key collision is very unlikely to be caused by the truncation
|
||||
of the sha256 hash to 13 characters. Assuming it is near-random,
|
||||
it will on average happen every 4.5^15 times. However, the clock
|
||||
seed is likely to occasionally generate a collision if the
|
||||
handle requests come faster than the clock resolution.
|
||||
already exists, generate a new one.
|
||||
"""
|
||||
if self._handleSeed is None:
|
||||
newSeed = "%s_%d_%s" % (str(time()), self._handleCount, addSeed)
|
||||
self._handleCount += 1
|
||||
else:
|
||||
# This is used for debugging
|
||||
newSeed = str(self._handleSeed)
|
||||
self._handleSeed += 1
|
||||
|
||||
logger.verbose("Generating handle with seed '%s'", newSeed)
|
||||
itemHandle = sha256(newSeed.encode()).hexdigest()[0:13]
|
||||
if itemHandle in self._projTree:
|
||||
logger.debug("Generating new handle")
|
||||
handle = f"{random.getrandbits(52):013x}"
|
||||
if handle in self._projTree:
|
||||
logger.warning("Duplicate handle encountered! Retrying ...")
|
||||
itemHandle = self._makeHandle(addSeed+"!")
|
||||
handle = self._makeHandle()
|
||||
|
||||
return itemHandle
|
||||
return handle
|
||||
|
||||
# END Class NWTree
|
||||
|
||||
@@ -202,7 +202,7 @@ class QConfigLayout(QGridLayout):
|
||||
class QHelpLabel(QLabel):
|
||||
|
||||
def __init__(self, theText, textCol, fontSize=0.9):
|
||||
QLabel.__init__(self, theText)
|
||||
super().__init__(theText)
|
||||
|
||||
if isinstance(textCol, QColor):
|
||||
qCol = textCol
|
||||
@@ -267,8 +267,8 @@ class QSwitch(QAbstractButton):
|
||||
return self._offset
|
||||
|
||||
@offset.setter
|
||||
def offset(self, theOffset):
|
||||
self._offset = theOffset
|
||||
def offset(self, offset):
|
||||
self._offset = offset
|
||||
self.update()
|
||||
return
|
||||
|
||||
@@ -276,11 +276,11 @@ class QSwitch(QAbstractButton):
|
||||
# Getters and Setters
|
||||
##
|
||||
|
||||
def setChecked(self, isChecked):
|
||||
def setChecked(self, checked):
|
||||
"""Overload setChecked to also alter the offset.
|
||||
"""
|
||||
super().setChecked(isChecked)
|
||||
if isChecked:
|
||||
super().setChecked(checked)
|
||||
if checked:
|
||||
self.offset = self._xW - self._xR
|
||||
else:
|
||||
self.offset = self._xR
|
||||
@@ -290,10 +290,10 @@ class QSwitch(QAbstractButton):
|
||||
# Events
|
||||
##
|
||||
|
||||
def resizeEvent(self, theEvent):
|
||||
def resizeEvent(self, event):
|
||||
"""Overload resize to ensure correct offset.
|
||||
"""
|
||||
super().resizeEvent(theEvent)
|
||||
super().resizeEvent(event)
|
||||
if self.isChecked():
|
||||
self.offset = self._xW - self._xR
|
||||
else:
|
||||
@@ -376,8 +376,8 @@ class QSwitch(QAbstractButton):
|
||||
|
||||
class PagedDialog(QDialog):
|
||||
|
||||
def __init__(self, theParent=None):
|
||||
QDialog.__init__(self, parent=theParent)
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent=parent)
|
||||
|
||||
self._tabBar = VerticalTabBar(self)
|
||||
self._tabBar.setExpanding(False)
|
||||
@@ -409,14 +409,14 @@ class PagedDialog(QDialog):
|
||||
|
||||
return
|
||||
|
||||
def addTab(self, tabWidget, tabLabel):
|
||||
"""Forwards the adding of tabs to the QTabWidget.
|
||||
def addTab(self, widget, label):
|
||||
"""Forward the adding of tabs to the QTabWidget.
|
||||
"""
|
||||
self._tabBox.addTab(tabWidget, tabLabel)
|
||||
self._tabBox.addTab(widget, label)
|
||||
return
|
||||
|
||||
def addControls(self, buttonBar):
|
||||
"""Adds a button bar to the dialog.
|
||||
"""Add a button bar to the dialog.
|
||||
"""
|
||||
self._buttonBox.addWidget(buttonBar)
|
||||
return
|
||||
@@ -426,20 +426,20 @@ class PagedDialog(QDialog):
|
||||
|
||||
class VerticalTabBar(QTabBar):
|
||||
|
||||
def __init__(self, theParent=None):
|
||||
QTabBar.__init__(self, parent=theParent)
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent=parent)
|
||||
self._mW = novelwriter.CONFIG.pxInt(150)
|
||||
return
|
||||
|
||||
def tabSizeHint(self, theIndex):
|
||||
"""Returns a transposed size hint for the rotated bar.
|
||||
def tabSizeHint(self, index):
|
||||
"""Return a transposed size hint for the rotated bar.
|
||||
"""
|
||||
tSize = QTabBar.tabSizeHint(self, theIndex)
|
||||
tSize = super().tabSizeHint(index)
|
||||
tSize.transpose()
|
||||
tSize.setWidth(min(tSize.width(), self._mW))
|
||||
return tSize
|
||||
|
||||
def paintEvent(self, theEvent):
|
||||
def paintEvent(self, event):
|
||||
"""Custom implementation of the label painter that rotates the
|
||||
label 90 degrees.
|
||||
"""
|
||||