Compare commits
120 Commits
ft.librem5
...
master
Author | SHA1 | Date |
---|---|---|
Manuel Genovés | 9bc8dcc19d | |
Manuel Genovés | dc028353fe | |
Manuel Genovés | 7a11f189c0 | |
Manuel Genovés | 1843bc9533 | |
Manuel Genovés | 8042e7d8b0 | |
Manuel Genovés | 57ac571160 | |
Manuel Genovés | 833e75b0ab | |
Manuel Genovés | 4ad1ec67d5 | |
Manuel Genovés | c1a134496f | |
Manuel Genovés | 8feca99cc2 | |
Manuel Genovés | bd741f2f64 | |
Manuel Genovés | 5877682ee8 | |
Manuel Genovés | 557faf66f2 | |
somas95 | dd2bc4a7dc | |
somas95 | db2d266f90 | |
somas95 | 74891c9192 | |
somas95 | 6f182dfaa0 | |
somas95 | 33eac1c16a | |
somas95 | 274c59f884 | |
somas95 | 490601728b | |
somas95 | 3f7c01c659 | |
somas95 | 9f020841c3 | |
somas95 | 564b609ee9 | |
somas95 | 4a62a1e03e | |
somas95 | f6d924769c | |
somas95 | cd51a53b2e | |
somas95 | 2a5e08b3e2 | |
somas95 | 7d0fe8d596 | |
somas95 | fb64e442dc | |
somas95 | 8c9c27919c | |
somas95 | ac0ebcebf2 | |
Manuel Genovés | 0123fc8630 | |
Manuel Genovés | 9bf34e5151 | |
somas95 | 775c0006e1 | |
Manuel Genovés | e70b6d52bc | |
Manuel Genovés | 29d2af97fa | |
Manuel Genovés | af2975d48a | |
Manuel Genovés | 30af9b2b20 | |
somas95 | e38520c35d | |
somas95 | 3cbd386cf4 | |
somas95 | c6dce3f2cb | |
somas95 | e6e8655c2a | |
Manuel Genovés | 5f3bbb9fd9 | |
Manuel Genovés | c9b4bdd110 | |
Manuel Genovés | 4a85f21d35 | |
Manuel Genoves | 7a8d3a8459 | |
Manuel Genovés | ef04a90fd7 | |
Manuel Genovés | b70416709c | |
Manuel Genovés | 5b1571293c | |
Manuel Genovés | a4d0d3038c | |
Manuel Genovés | 8358571c8e | |
Manuel Genovés | 48f32afa1b | |
Manuel Genoves | bdc2e6cda7 | |
Manuel Genovés | bcd08397f1 | |
Manuel Genovés | cab5306efa | |
Manuel Genovés | 45f4205939 | |
Manuel Genovés | 004c7544a0 | |
Manuel Genovés | 6ca2410432 | |
Manuel Genovés | a02c61ec7e | |
Manuel Genovés | bf1fe7f59c | |
Manuel Genovés | a6f7e85255 | |
Manuel Genovés | 77eb75c36b | |
Manuel Genovés | 81d5aab9e4 | |
Manuel Genovés | 28fc4e0a72 | |
Manuel Genovés | 2fabd9a500 | |
Manuel Genovés | d1640619f9 | |
Manuel Genovés | 8e45b8d3da | |
Manuel Genovés | c1cd347c49 | |
Manuel Genovés | 07378d0ca8 | |
Manuel Genovés | 9ece36b5ac | |
Manuel Genovés | a00298e0db | |
somas95 | b9f86d5c44 | |
Manuel Genovés | 68bcc1206b | |
Manuel Genovés | d7df0c68f7 | |
Manuel Genovés | 0647b41340 | |
Manuel Genovés | 41378d55e1 | |
somas95 | 66af5f8217 | |
Thomas Lavend'Homme | 01d124aea5 | |
Wolf Vollprecht | 0d1da19ce8 | |
Gurjus Bhasin | 33b2d70dfd | |
Manuel Genovés | 9d59118afd | |
Manuel Genovés | d59994f3c9 | |
somas95 | d246877a17 | |
Manuel Genovés | bde7c0ecb8 | |
somas95 | daa72b4779 | |
somas95 | 0af10a1b0f | |
Thomas Lavend'Homme | 5cae9eb68c | |
Thomas Lavend'Homme | e4b5952ec2 | |
Thomas Lavend'Homme | 7734e9410e | |
Thomas Lavend'Homme | 2abb2af472 | |
Manuel Genovés | 234eca06a7 | |
somas95 | cabbd8f7a3 | |
Manuel Genovés | 5615a4c3d7 | |
Manuel Genovés | a3a948e434 | |
Manuel Genovés | 2fec09999b | |
Manuel Genovés | 109e9efbcc | |
Manuel Genovés | d05d0c3bdc | |
Wolf Vollprecht | 0bcb2f3984 | |
Thomas Lavend'Homme | 6edf041169 | |
Thomas Lavend'Homme | 5f75998973 | |
Thomas Lavend'Homme | 0fce1bae77 | |
Manuel Genoves | 9216db1b80 | |
Manuel Genoves | d56623bfbd | |
Manuel Genoves | 5a78d75668 | |
somas95 | 2912baaa41 | |
Manuel Genovés | 97e809a576 | |
Manuel Genovés | 151809ae9b | |
Manuel Genovés | 48e48d95de | |
Thomas Lavend'Homme | bf73910483 | |
Thomas Lavend'Homme | 2caff3b389 | |
Thomas Lavend'Homme | 3062037eeb | |
Thomas Lavend'Homme | 11616c1621 | |
Manuel Genovés | 7606a55389 | |
Manuel Genovés | 17c20199f5 | |
Manuel Genovés | ff579b956f | |
Manuel Genovés | 87e3cc127b | |
Manuel Genovés | 567ae6bc42 | |
Manuel Genovés | 8ac8728e3b | |
Manuel Genovés | f766c3703d | |
Manuel Genovés | b5260e3906 |
|
@ -1,8 +1,11 @@
|
|||
*.pyc
|
||||
__pycache__/
|
||||
_build/*
|
||||
build/
|
||||
*.*~
|
||||
.vscode/
|
||||
.idea/
|
||||
builddir/*
|
||||
build-aux/*
|
||||
build-aux/flatpak/_build/*
|
||||
build-aux/flatpak/.flatpak-builder/*
|
||||
flatpak/*
|
||||
|
|
|
@ -1,12 +1,3 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[BUG]"
|
||||
labels: bug, triage
|
||||
assignees: somas95
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
|
@ -31,3 +22,6 @@ If applicable, add screenshots to help explain your problem.
|
|||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
/label ~bug ~triage
|
||||
/assign @somas
|
|
@ -1,12 +1,3 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[Feature Request]"
|
||||
labels: feature request
|
||||
assignees: somas95
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
|
@ -18,3 +9,6 @@ A clear and concise description of any alternative solutions or features you've
|
|||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
||||
/label ~"feature request"
|
||||
/assign @somas
|
7
AUTHORS
|
@ -1,2 +1,5 @@
|
|||
Copyright (C) 2019, Wolf Vollprecht <w.vollprecht@gmail.com>
|
||||
Copyright (C) 2019, Vova Kolobok <vovkkk@ya.ru>
|
||||
Wolf Vollprecht <w.vollprecht@gmail.com>
|
||||
Vova Kolobok <vovkkk@ya.ru>
|
||||
Manuel Genovés <manuel.genoves@gmail.com>
|
||||
Gonçalo Silva <goncalossilva@gmail.com>
|
||||
Thomas Lavend <lavendthomas@outlook.be>
|
8
PKGBUILD
|
@ -1,17 +1,17 @@
|
|||
pkgname=uberwriter
|
||||
_pkgname=uberwriter
|
||||
pkgname=apostrophe
|
||||
_pkgname=apostrophe
|
||||
pkgver=2.1.3
|
||||
pkgrel=1
|
||||
pkgdesc='A distraction free Markdown editor for GNU/Linux made with GTK+'
|
||||
arch=('any')
|
||||
url='http://uberwriter.github.io/uberwriter/'
|
||||
url='http://apostrophe.github.io/apostrophe/'
|
||||
license=('GPL3')
|
||||
depends=('gtk3' 'pandoc' 'gspell')
|
||||
makedepends=('python-setuptools')
|
||||
optdepends=('texlive-core' 'otf-fira-mono: Recommended font')
|
||||
provides=("$_pkgname")
|
||||
conflicts=("$_pkgname")
|
||||
source=('git+https://github.com/UberWriter/uberwriter.git#branch=refactoring')
|
||||
source=('git+https://github.com/Apostrophe/apostrophe.git#branch=refactoring')
|
||||
sha256sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
|
|
14
README.md
|
@ -1,16 +1,16 @@
|
|||
[![Please do not theme this app](https://stopthemingmy.app/badge.svg)](https://stopthemingmy.app)
|
||||
|
||||
# Uberwriter
|
||||
# Apostrophe
|
||||
|
||||
![](screenshots/main.png)
|
||||
|
||||
## About
|
||||
|
||||
Uberwriter is a GTK+ based distraction free Markdown editor, mainly developed by Wolf Vollprecht and Manuel Genovés. It uses pandoc as backend for markdown parsing and offers a very clean and sleek user interface.
|
||||
Apostrophe is a GTK+ based distraction free Markdown editor, mainly developed by Wolf Vollprecht and Manuel Genovés. It uses pandoc as backend for markdown parsing and offers a very clean and sleek user interface.
|
||||
|
||||
## Install
|
||||
|
||||
You can get UberWriter on Flathub!
|
||||
You can get Apostrophe on Flathub!
|
||||
[Get it now](https://flathub.org/apps/details/de.wolfvollprecht.UberWriter)
|
||||
|
||||
## Contributions and localization
|
||||
|
@ -21,13 +21,13 @@ Any help is appreciated!
|
|||
## Building from Git
|
||||
|
||||
```bash
|
||||
$ git clone https://github.com/UberWriter/uberwriter.git`
|
||||
$ cd uberwriter
|
||||
$ git clone https://github.com/Apostrophe/apostrophe.git
|
||||
$ cd apostrophe
|
||||
$ meson builddir --prefix=/usr
|
||||
# sudo ninja -C builddir install
|
||||
```
|
||||
|
||||
To use uberwriter, please make sure you have some dependencies installed:
|
||||
To use apostrophe, please make sure you have some dependencies installed:
|
||||
|
||||
- Pandoc, the program used to convert Markdown to basically anything else (the package name should be pandoc in most distributions)
|
||||
- Of course, gtk3 etc. needs to be installed as well since this is a gtk application
|
||||
|
@ -37,7 +37,7 @@ To use uberwriter, please make sure you have some dependencies installed:
|
|||
|
||||
### Running it without installing it
|
||||
|
||||
You can run UberWriter with `./uberwriter.in` without installing it in the system,
|
||||
You can run Apostrophe with `./apostrophe.in` without installing it in the system,
|
||||
but you'll need to install and compile the schemas before:
|
||||
|
||||
```bash
|
||||
|
|
|
@ -31,33 +31,33 @@ from gi.repository import Gio
|
|||
PROJECT_ROOT_DIRECTORY = os.path.abspath(
|
||||
os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0]))))
|
||||
|
||||
# Set the path if needed. This allows uberwriter to run without installing it :)
|
||||
# Set the path if needed. This allows apostrophe to run without installing it :)
|
||||
python_path = []
|
||||
|
||||
if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'uberwriter'))
|
||||
if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'apostrophe'))
|
||||
and PROJECT_ROOT_DIRECTORY not in sys.path):
|
||||
python_path.insert(0, PROJECT_ROOT_DIRECTORY)
|
||||
sys.path.insert(0, PROJECT_ROOT_DIRECTORY)
|
||||
if python_path:
|
||||
os.putenv('PYTHONPATH', "%s:%s" % (os.getenv('PYTHONPATH', ''), ':'.join(python_path))) # for subprocesses
|
||||
|
||||
import uberwriter
|
||||
import apostrophe
|
||||
|
||||
|
||||
localedir = '@LOCALE_DIR@'
|
||||
pkgdatadir = '@DATA_DIR@'
|
||||
|
||||
|
||||
#locale_dir = os.path.abspath(os.path.join(os.path.dirname(uberwriter.__file__),'../po/'))
|
||||
#locale_dir = os.path.abspath(os.path.join(os.path.dirname(apostrophe.__file__),'../po/'))
|
||||
|
||||
# L10n
|
||||
locale.textdomain('uberwriter')
|
||||
locale.bindtextdomain('uberwriter', localedir)
|
||||
gettext.textdomain('uberwriter')
|
||||
gettext.bindtextdomain('uberwriter', localedir)
|
||||
locale.textdomain('apostrophe')
|
||||
locale.bindtextdomain('apostrophe', localedir)
|
||||
gettext.textdomain('apostrophe')
|
||||
gettext.bindtextdomain('apostrophe', localedir)
|
||||
|
||||
resource = Gio.resource_load(os.path.join(pkgdatadir, 'uberwriter/uberwriter.gresource'))
|
||||
resource = Gio.resource_load(os.path.join(pkgdatadir, 'apostrophe/apostrophe.gresource'))
|
||||
Gio.Resource._register(resource)
|
||||
|
||||
|
||||
uberwriter.main()
|
||||
apostrophe.main()
|
|
@ -19,10 +19,10 @@ import gi
|
|||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
|
||||
from uberwriter import main_window
|
||||
from uberwriter import application
|
||||
from uberwriter.helpers import set_up_logging
|
||||
from uberwriter.config import get_version
|
||||
from apostrophe import main_window
|
||||
from apostrophe import application
|
||||
from apostrophe.helpers import set_up_logging
|
||||
from apostrophe.config import get_version
|
||||
|
||||
|
||||
def main():
|
|
@ -15,16 +15,16 @@ from gettext import gettext as _
|
|||
|
||||
import gi
|
||||
|
||||
from uberwriter.main_window import MainWindow
|
||||
from apostrophe.main_window import MainWindow
|
||||
|
||||
gi.require_version('Gtk', '3.0') # pylint: disable=wrong-import-position
|
||||
from gi.repository import GLib, Gio, Gtk, GdkPixbuf
|
||||
|
||||
from uberwriter import main_window
|
||||
from uberwriter.settings import Settings
|
||||
from uberwriter.helpers import set_up_logging
|
||||
from uberwriter.preferences_dialog import PreferencesDialog
|
||||
from uberwriter.helpers import get_media_path
|
||||
from apostrophe import main_window
|
||||
from apostrophe.settings import Settings
|
||||
from apostrophe.helpers import set_up_logging
|
||||
from apostrophe.preferences_dialog import PreferencesDialog
|
||||
from apostrophe.helpers import get_media_path
|
||||
|
||||
|
||||
class Application(Gtk.Application):
|
||||
|
@ -41,6 +41,7 @@ class Application(Gtk.Application):
|
|||
Gtk.Application.do_startup(self)
|
||||
|
||||
self.settings.connect("changed", self.on_settings_changed)
|
||||
self._set_dark_mode ()
|
||||
|
||||
# Header bar
|
||||
|
||||
|
@ -65,7 +66,6 @@ class Application(Gtk.Application):
|
|||
self.add_action(action)
|
||||
|
||||
# App Menu
|
||||
|
||||
action = Gio.SimpleAction.new_stateful(
|
||||
"focus_mode", None, GLib.Variant.new_boolean(False))
|
||||
action.connect("change-state", self.on_focus_mode)
|
||||
|
@ -90,7 +90,7 @@ class Application(Gtk.Application):
|
|||
action.connect("activate", self.on_save_as)
|
||||
self.add_action(action)
|
||||
|
||||
action = Gio.SimpleAction.new("export", None)
|
||||
action = Gio.SimpleAction.new("export", GLib.VariantType("s"))
|
||||
action.connect("activate", self.on_export)
|
||||
self.add_action(action)
|
||||
|
||||
|
@ -161,7 +161,7 @@ class Application(Gtk.Application):
|
|||
if not self.window:
|
||||
# Windows are associated with the application
|
||||
# when the last one is closed the application shuts down
|
||||
# self.window = Window(application=self, title="UberWriter")
|
||||
# self.window = Window(application=self, title="Apostrophe")
|
||||
self.window = MainWindow(self)
|
||||
if self.args:
|
||||
self.window.load_file(self.args[0])
|
||||
|
@ -173,7 +173,7 @@ class Application(Gtk.Application):
|
|||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"-v", "--verbose", action="count", dest="verbose",
|
||||
help=_("Show debug messages (-vv debugs uberwriter also)"))
|
||||
help=_("Show debug messages (-vv debugs apostrophe also)"))
|
||||
parser.add_argument(
|
||||
"-e", "--experimental-features", help=_("Use experimental features"),
|
||||
action='store_true')
|
||||
|
@ -184,13 +184,22 @@ class Application(Gtk.Application):
|
|||
self.activate()
|
||||
return 0
|
||||
|
||||
def _set_dark_mode (self):
|
||||
dark = self.settings.get_value("dark-mode")
|
||||
settings = Gtk.Settings.get_default()
|
||||
|
||||
settings.props.gtk_application_prefer_dark_theme = dark
|
||||
|
||||
if settings.props.gtk_theme_name == "HighContrast" and dark:
|
||||
settings.props.gtk_theme_name = "HighContrastInverse"
|
||||
elif settings.props.gtk_theme_name == "HighContrastInverse" and not dark:
|
||||
settings.props.gtk_theme_name = "HighContrast"
|
||||
|
||||
def on_settings_changed(self, settings, key):
|
||||
if key == "dark-mode-auto" or key == "dark-mode":
|
||||
self.window.apply_current_theme()
|
||||
if key == "dark-mode":
|
||||
self._set_dark_mode ()
|
||||
elif key == "spellcheck":
|
||||
self.window.toggle_spellcheck(settings.get_value(key))
|
||||
elif key == "gradient-overlay":
|
||||
self.window.toggle_gradient_overlay(settings.get_value(key))
|
||||
elif key == "input-format":
|
||||
self.window.reload_preview()
|
||||
elif key == "sync-scroll":
|
||||
|
@ -237,8 +246,8 @@ class Application(Gtk.Application):
|
|||
def on_save_as(self, _action, _value):
|
||||
self.window.save_document_as()
|
||||
|
||||
def on_export(self, _action, _value):
|
||||
self.window.open_advanced_export()
|
||||
def on_export(self, _action, value):
|
||||
self.window.open_advanced_export(value.get_string())
|
||||
|
||||
def on_copy_html(self, _action, _value):
|
||||
self.window.copy_html_to_clipboard()
|
||||
|
@ -254,7 +263,7 @@ class Application(Gtk.Application):
|
|||
builder.get_object("shortcuts").show()
|
||||
|
||||
def on_open_tutorial(self, _action, _value):
|
||||
self.window.open_uberwriter_markdown()
|
||||
self.window.open_apostrophe_markdown()
|
||||
|
||||
def on_about(self, _action, _param):
|
||||
builder = Gtk.Builder()
|
|
@ -1,7 +1,7 @@
|
|||
# UberwriterAutoCorrect
|
||||
# The Uberwriter Auto Correct is a auto correction
|
||||
# ApostropheAutoCorrect
|
||||
# The Apostrophe Auto Correct is a auto correction
|
||||
# mechanism to prevent stupid typos
|
||||
# import presage
|
||||
# CURRENTLY DISABLED
|
||||
|
||||
import os
|
||||
import pickle
|
||||
|
@ -13,16 +13,16 @@ from gi.repository import Gtk, Gdk
|
|||
|
||||
import enchant
|
||||
|
||||
from uberwriter import pressagio
|
||||
# import uberwriter.pressagio.predictor
|
||||
# import uberwriter.pressagio.tokenizer
|
||||
# import uberwriter.pressagio.dbconnector
|
||||
# import uberwriter.pressagio.context_tracker
|
||||
# import uberwriter.pressagio.callback
|
||||
from apostrophe import pressagio
|
||||
# import apostrophe.pressagio.predictor
|
||||
# import apostrophe.pressagio.tokenizer
|
||||
# import apostrophe.pressagio.dbconnector
|
||||
# import apostrophe.pressagio.context_tracker
|
||||
# import apostrophe.pressagio.callback
|
||||
|
||||
# from Levenshtein import distance
|
||||
|
||||
from uberwriter.helpers import get_media_path
|
||||
from apostrophe.helpers import get_media_path
|
||||
|
||||
# Define and create PresageCallback object
|
||||
class PressagioCallback(pressagio.callback.Callback):
|
|
@ -28,7 +28,7 @@ import gi
|
|||
gi.require_version('Gtk', '3.0') # pylint: disable=wrong-import-position
|
||||
from gi.repository import GObject, Gtk # pylint: disable=E0611
|
||||
|
||||
LOGGER = logging.getLogger('uberwriter')
|
||||
LOGGER = logging.getLogger('apostrophe')
|
||||
|
||||
# this module is big so uses some conventional prefixes and postfixes
|
||||
# *s list, except self.widgets is a dictionary
|
|
@ -24,7 +24,7 @@ __all__ = [
|
|||
|
||||
# Where your project will look for your data (for instance, images and ui
|
||||
# files). By default, this is ../data, relative your trunk layout
|
||||
__uberwriter_data_directory__ = '../data/'
|
||||
__apostrophe_data_directory__ = '../data/'
|
||||
__license__ = 'GPL-3'
|
||||
__version__ = 'VERSION'
|
||||
|
||||
|
@ -45,25 +45,25 @@ def get_data_file(*path_segments):
|
|||
|
||||
|
||||
def get_data_path():
|
||||
"""Retrieve uberwriter data path
|
||||
"""Retrieve apostrophe data path
|
||||
|
||||
This path is by default <uberwriter_path>/../data/ in trunk
|
||||
and /opt/uberwriter/data in an installed version but this path
|
||||
This path is by default <apostrophe_path>/../data/ in trunk
|
||||
and /opt/apostrophe/data in an installed version but this path
|
||||
is specified at installation time.
|
||||
"""
|
||||
|
||||
# Get pathname absolute or relative.
|
||||
if os.path.isfile("/.flatpak-info"):
|
||||
return '/app/share/uberwriter/'
|
||||
return '/app/share/apostrophe/'
|
||||
|
||||
path = os.path.join(
|
||||
os.path.dirname(__file__), __uberwriter_data_directory__)
|
||||
os.path.dirname(__file__), __apostrophe_data_directory__)
|
||||
|
||||
# We try first if the data exists in the local folder and then
|
||||
# in the system installation path
|
||||
abs_data_path = os.path.abspath(path)
|
||||
if not os.path.exists(abs_data_path):
|
||||
abs_data_path = '/usr/share/uberwriter/'
|
||||
abs_data_path = '/usr/share/apostrophe/'
|
||||
elif not os.path.exists(abs_data_path):
|
||||
raise ProjectPathNotFound
|
||||
|
|
@ -24,12 +24,12 @@ from gettext import gettext as _
|
|||
import gi
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gtk, GLib
|
||||
|
||||
from uberwriter import helpers
|
||||
from uberwriter.theme import Theme
|
||||
from apostrophe import helpers
|
||||
from apostrophe.theme import Theme
|
||||
|
||||
LOGGER = logging.getLogger('uberwriter')
|
||||
LOGGER = logging.getLogger('apostrophe')
|
||||
|
||||
|
||||
class Export:
|
||||
|
@ -121,7 +121,7 @@ class Export:
|
|||
"to": "texinfo"
|
||||
},
|
||||
{
|
||||
"name": "OpenOffice Text Document",
|
||||
"name": "LibreOffice Text Document",
|
||||
"ext": "odt",
|
||||
"to": "odt"
|
||||
},
|
||||
|
@ -147,41 +147,102 @@ class Export:
|
|||
}
|
||||
]
|
||||
|
||||
def __init__(self, filename):
|
||||
"""Set up the about dialog"""
|
||||
def __init__(self, filename, export_format, text):
|
||||
"""Set up the export dialog"""
|
||||
|
||||
self.export_menu = {
|
||||
"pdf":
|
||||
{
|
||||
"extension": "pdf",
|
||||
"name": "PDF",
|
||||
"mimetype": "application/pdf",
|
||||
"dialog": self.regular_export_dialog
|
||||
},
|
||||
"html":
|
||||
{
|
||||
"extension": "html",
|
||||
"name": "HTML",
|
||||
"mimetype": "text/html",
|
||||
"dialog": self.regular_export_dialog
|
||||
},
|
||||
"odt":
|
||||
{
|
||||
"extension": "odt",
|
||||
"name": "ODT",
|
||||
"mimetype": "application/vnd.oasis.opendocument.text",
|
||||
"dialog": self.regular_export_dialog
|
||||
},
|
||||
"advanced":
|
||||
{
|
||||
"extension": "",
|
||||
"name": "",
|
||||
"mimetype": "",
|
||||
"dialog": self.advanced_export_dialog
|
||||
}
|
||||
}
|
||||
|
||||
self.filename = filename or _("Untitled document.md")
|
||||
self.export_format = export_format
|
||||
|
||||
self.dialog = self.export_menu[export_format]["dialog"]()
|
||||
|
||||
response = self.dialog.run()
|
||||
|
||||
if response == Gtk.ResponseType.ACCEPT:
|
||||
try:
|
||||
self.export(export_format, text)
|
||||
except (NotADirectoryError, RuntimeError) as e:
|
||||
dialog = Gtk.MessageDialog(None,
|
||||
Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||
Gtk.MessageType.ERROR,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
_("An error happened while trying to export:\n\n{err_msg}")
|
||||
.format(err_msg= str(e).encode().decode("unicode-escape"))
|
||||
)
|
||||
dialog.run()
|
||||
dialog.destroy()
|
||||
|
||||
self.dialog.destroy()
|
||||
|
||||
def regular_export_dialog(self):
|
||||
texlive_installed = helpers.exist_executable("pdftex")
|
||||
|
||||
if (self.export_menu[self.export_format]["extension"] == "pdf" and
|
||||
not texlive_installed):
|
||||
dialog = Gtk.MessageDialog(None,
|
||||
Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||
Gtk.MessageType.INFO,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
_("Oh, no!")
|
||||
)
|
||||
|
||||
dialog.props.secondary_text = _("Seems that you don't have TexLive installed.\n" +
|
||||
disabled_text())
|
||||
else:
|
||||
dialog = Gtk.FileChooserNative.new(_("Export"),
|
||||
None,
|
||||
Gtk.FileChooserAction.SAVE,
|
||||
_("Export to %s") %
|
||||
self.export_menu[self.export_format]["extension"],
|
||||
_("Cancel"))
|
||||
dialog_filter = Gtk.FileFilter.new()
|
||||
dialog_filter.set_name(self.export_menu[self.export_format]["name"])
|
||||
dialog_filter.add_mime_type(self.export_menu[self.export_format]["mimetype"])
|
||||
dialog.add_filter(dialog_filter)
|
||||
dialog.set_do_overwrite_confirmation(True)
|
||||
dialog.set_current_folder(os.path.dirname(self.filename))
|
||||
dialog.set_current_name(os.path.basename(self.filename)[:-2] +
|
||||
self.export_menu[self.export_format]["extension"])
|
||||
|
||||
return dialog
|
||||
|
||||
def advanced_export_dialog(self):
|
||||
|
||||
self.builder = Gtk.Builder()
|
||||
self.builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Export.ui")
|
||||
self.dialog = self.builder.get_object("Export")
|
||||
self.stack = self.builder.get_object("export_stack")
|
||||
self.stack_switcher = self.builder.get_object("format_switcher")
|
||||
|
||||
stack_pdf_disabled = self.builder.get_object("pdf_disabled")
|
||||
filename = filename or _("Untitled document.md")
|
||||
|
||||
self.filechoosers = {export_format: self.stack.get_child_by_name(export_format)
|
||||
for export_format in ["pdf", "html", "advanced"]}
|
||||
for export_format, filechooser in self.filechoosers.items():
|
||||
filechooser.set_do_overwrite_confirmation(True)
|
||||
filechooser.set_current_folder(os.path.dirname(filename))
|
||||
if export_format == "advanced":
|
||||
self.adv_export_name = self.builder.get_object("advanced_export_name")
|
||||
self.adv_export_name.set_text(os.path.basename(filename)[:-3])
|
||||
else:
|
||||
filechooser.set_current_name(os.path.basename(filename)[:-2] + export_format)
|
||||
|
||||
# Disable pdf if Texlive not installed
|
||||
texlive_installed = helpers.exist_executable("pdftex")
|
||||
|
||||
if not texlive_installed:
|
||||
self.filechoosers["pdf"].set_visible(False)
|
||||
stack_pdf_disabled.set_visible(True)
|
||||
stack_pdf_disabled.set_text(disabled_text())
|
||||
stack_pdf_disabled.set_justify(Gtk.Justification.CENTER)
|
||||
self.stack.connect('notify', self.allow_export, 'visible_child_name')
|
||||
|
||||
self.builder.get_object("highlight_style").set_active(0)
|
||||
|
||||
self.builder.get_object("css_filechooser").set_uri(
|
||||
helpers.path_to_file(Theme.get_current().web_css_path))
|
||||
|
||||
|
@ -196,7 +257,15 @@ class Export:
|
|||
self.format_field.add_attribute(format_renderer, "text", 1)
|
||||
self.format_field.set_active(0)
|
||||
|
||||
def export(self, text=""):
|
||||
self.adv_export_folder = self.builder.get_object("advanced")
|
||||
|
||||
self.adv_export_name = self.builder.get_object("advanced_export_name")
|
||||
self.adv_export_name.set_text(os.path.basename(self.filename)[:-3])
|
||||
self.paper_size = self.builder.get_object("combobox_paper_size")
|
||||
|
||||
return self.builder.get_object("Export")
|
||||
|
||||
def export(self, export_type, text=""):
|
||||
"""Export the given text using the specified format.
|
||||
For advanced export, this includes special flags for the enabled options.
|
||||
|
||||
|
@ -204,11 +273,16 @@ class Export:
|
|||
text {str} -- Text to export (default: {""})
|
||||
"""
|
||||
|
||||
export_type = self.stack.get_visible_child_name()
|
||||
args = []
|
||||
if export_type == "advanced":
|
||||
filename = self.adv_export_name.get_text()
|
||||
output_dir = os.path.abspath(self.filechoosers["advanced"].get_current_folder())
|
||||
|
||||
# TODO: use walrust operator
|
||||
output_uri = self.adv_export_folder.get_uri()
|
||||
if output_uri:
|
||||
output_dir = GLib.filename_from_uri(output_uri)[0]
|
||||
else:
|
||||
raise NotADirectoryError(_("A folder must be selected before proceeding"))
|
||||
basename = os.path.basename(filename)
|
||||
|
||||
fmt = self.formats[self.format_field.get_active()]
|
||||
|
@ -220,10 +294,13 @@ class Export:
|
|||
if self.builder.get_object("smart").get_active():
|
||||
to += "+smart"
|
||||
|
||||
args.extend(self.get_advanced_arguments())
|
||||
args.extend(self.get_advanced_arguments(to, ext))
|
||||
|
||||
else:
|
||||
filename = self.filechoosers[export_type].get_filename()
|
||||
args = [
|
||||
"--variable=papersize:a4"
|
||||
]
|
||||
filename = self.dialog.get_filename()
|
||||
if filename.endswith("." + export_type):
|
||||
filename = filename[:-len(export_type)-1]
|
||||
output_dir = os.path.abspath(os.path.join(filename, os.path.pardir))
|
||||
|
@ -234,17 +311,18 @@ class Export:
|
|||
|
||||
if export_type == "html":
|
||||
to = "html5"
|
||||
args.append("--standalone")
|
||||
args.append("--self-contained")
|
||||
args.append("--css=%s" % Theme.get_current().web_css_path)
|
||||
args.append("--mathjax")
|
||||
args.append("--lua-filter=%s" % helpers.get_script_path('relative_to_absolute.lua'))
|
||||
args.append("--lua-filter=%s" % helpers.get_script_path('task-list.lua'))
|
||||
|
||||
|
||||
helpers.pandoc_convert(
|
||||
text, to=to, args=args,
|
||||
outputfile="%s/%s.%s" % (output_dir, basename, ext))
|
||||
|
||||
def get_advanced_arguments(self):
|
||||
def get_advanced_arguments(self, to_fmt, ext_fmt):
|
||||
"""Retrieve a list of the selected advanced arguments
|
||||
|
||||
For most of the advanced option checkboxes, returns a list
|
||||
|
@ -252,6 +330,8 @@ class Export:
|
|||
|
||||
Arguments:
|
||||
basename {str} -- the name of the file
|
||||
to_fmt {str} -- the format of the export
|
||||
ext_fmt {str} -- the extension of the export
|
||||
|
||||
Returns:
|
||||
list of {str} -- related pandoc flags
|
||||
|
@ -260,6 +340,16 @@ class Export:
|
|||
highlight_style = self.builder.get_object("highlight_style").get_active_text()
|
||||
|
||||
conditions = [
|
||||
{
|
||||
"condition": to_fmt == "pdf",
|
||||
"yes": "--variable=papersize:" + self.get_paper_size(),
|
||||
"no": None
|
||||
},
|
||||
{
|
||||
"condition": (self.get_paper_size() == "a4" and (to_fmt in ("odt", "docx"))),
|
||||
"yes": "--reference-doc=" + helpers.get_reference_files_path('reference-a4.' + to_fmt),
|
||||
"no": None
|
||||
},
|
||||
{
|
||||
"condition": self.builder.get_object("toc").get_active(),
|
||||
"yes": "--toc",
|
||||
|
@ -317,18 +407,15 @@ class Export:
|
|||
|
||||
return args
|
||||
|
||||
def allow_export(self, widget, data, signal):
|
||||
"""Disable export button if the visible child is "pdf_disabled"
|
||||
"""
|
||||
def get_paper_size(self):
|
||||
paper_size = self.paper_size.get_active_text()
|
||||
|
||||
del widget, data, signal
|
||||
paper_formats = {
|
||||
"A4": "a4",
|
||||
"US Letter": "letter"
|
||||
}
|
||||
|
||||
export_btn = self.builder.get_object("export_btn")
|
||||
|
||||
if self.stack.get_visible_child_name() == "pdf_disabled":
|
||||
export_btn.set_sensitive(False)
|
||||
else:
|
||||
export_btn.set_sensitive(True)
|
||||
return paper_formats[paper_size]
|
||||
|
||||
def disabled_text():
|
||||
"""Return the TexLive installation instructions
|
|
@ -4,7 +4,7 @@ gi.require_version('Gtk', '3.0')
|
|||
from gi.repository import Gtk
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger('uberwriter')
|
||||
logger = logging.getLogger('apostrophe')
|
||||
|
||||
class FixTable():
|
||||
|
|
@ -0,0 +1,306 @@
|
|||
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
|
||||
# BEGIN LICENSE
|
||||
# Copyright (C) 2019, Wolf Vollprecht <w.vollprecht@gmail.com>
|
||||
# This program is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 3, as published
|
||||
# by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranties of
|
||||
# MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
|
||||
# END LICENSE
|
||||
"""Manage all the headerbars related stuff
|
||||
"""
|
||||
|
||||
import gi
|
||||
|
||||
from gettext import gettext as _
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, GLib
|
||||
from apostrophe.helpers import get_descendant
|
||||
from apostrophe.settings import Settings
|
||||
|
||||
|
||||
class BaseHeaderbar:
|
||||
"""Base class for all headerbars
|
||||
"""
|
||||
# preview modes
|
||||
FULL_WIDTH = 0
|
||||
HALF_WIDTH = 1
|
||||
HALF_HEIGHT = 2
|
||||
WINDOWED = 3
|
||||
|
||||
def __init__(self, app):
|
||||
|
||||
self.settings = Settings.new()
|
||||
|
||||
self.builder = Gtk.Builder()
|
||||
self.builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Headerbar.ui")
|
||||
self.builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/ExportPopover.ui")
|
||||
|
||||
self.hb = self.builder.get_object(
|
||||
"Headerbar")
|
||||
self.hb_revealer = self.builder.get_object(
|
||||
"titlebar_revealer")
|
||||
|
||||
self.preview_toggle_revealer = self.builder.get_object(
|
||||
"preview_switch_revealer")
|
||||
self.preview_switcher_icon = self.builder.get_object(
|
||||
"preview_switch_toggle_icon")
|
||||
|
||||
self.__populate_layout_switcher_menu()
|
||||
self.update_preview_layout_icon()
|
||||
|
||||
self.sync_scroll_switch = self.builder.get_object("sync_scroll_switch")
|
||||
self.sync_scroll_switch.set_active(self.settings.get_value("sync-scroll"))
|
||||
self.sync_scroll_switch.connect("state-set", self.__on_sync_scroll)
|
||||
|
||||
self.menu_button = self.builder.get_object("menu_button")
|
||||
self.recents_button = self.builder.get_object("recents_button")
|
||||
self.export_button = self.builder.get_object("export_button")
|
||||
export_popover = self.builder.get_object("export_menu")
|
||||
self.preview_switch_button = self.builder.get_object("preview_switch_button")
|
||||
|
||||
self.export_button.set_popover(export_popover)
|
||||
|
||||
add_menus(self, app)
|
||||
|
||||
settings = Gtk.Settings.get_default()
|
||||
# TODO: use walrust operator whenever Python3.8 lands on SDK
|
||||
# if global_dark:= settings.props.gtk_theme_name.endswith("-dark"):
|
||||
global_dark = settings.props.gtk_theme_name.endswith("-dark")
|
||||
if global_dark:
|
||||
self.light_button.set_sensitive(False)
|
||||
self.light_button.set_tooltip_text(_(
|
||||
"Light mode isn't available while using a dark global theme"))
|
||||
|
||||
self.dark_button.set_active(self.settings.get_boolean("dark-mode") or global_dark)
|
||||
|
||||
self.light_button.connect("toggled", self.__on_dark_mode)
|
||||
|
||||
self.select_preview_layout_row()
|
||||
|
||||
def update_preview_layout_icon(self):
|
||||
mode = self.settings.get_enum("preview-mode")
|
||||
self.preview_switcher_icon.set_from_icon_name(
|
||||
self.__get_icon_for_preview_mode(mode), 4)
|
||||
|
||||
def select_preview_layout_row(self):
|
||||
mode = self.settings.get_enum("preview-mode")
|
||||
row = self.preview_menu.get_row_at_index(mode)
|
||||
self.preview_menu.select_row(row)
|
||||
|
||||
def __populate_layout_switcher_menu(self):
|
||||
self.preview_menu = self.builder.get_object("preview_switch_options")
|
||||
modes = self.settings.props.settings_schema.get_key("preview-mode").get_range()[1]
|
||||
|
||||
for i, mode in enumerate(modes):
|
||||
item_builder = Gtk.Builder()
|
||||
item_builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/PreviewLayoutSwitcherItem.ui")
|
||||
menu_item = item_builder.get_object("switcherItem")
|
||||
|
||||
menu_item.label = item_builder.get_object("label")
|
||||
menu_item.label.set_text(self.__get_text_for_preview_mode(i))
|
||||
|
||||
menu_item.icon = item_builder.get_object("icon")
|
||||
menu_item.icon.set_from_icon_name(self.__get_icon_for_preview_mode(i), 16)
|
||||
|
||||
menu_item.set_action_name("app.preview_mode")
|
||||
menu_item.set_action_target_value(GLib.Variant.new_string(mode))
|
||||
|
||||
menu_item.show_all()
|
||||
self.preview_menu.insert(menu_item, -1)
|
||||
|
||||
def __get_text_for_preview_mode(self, mode):
|
||||
if mode == self.FULL_WIDTH:
|
||||
return _("Full-Width")
|
||||
elif mode == self.HALF_WIDTH:
|
||||
return _("Half-Width")
|
||||
elif mode == self.HALF_HEIGHT:
|
||||
return _("Half-Height")
|
||||
elif mode == self.WINDOWED:
|
||||
return _("Windowed")
|
||||
else:
|
||||
raise ValueError("Unknown preview mode {}".format(mode))
|
||||
|
||||
def __get_icon_for_preview_mode(self, mode):
|
||||
if mode == self.FULL_WIDTH:
|
||||
return "preview-layout-full-width-symbolic"
|
||||
elif mode == self.HALF_WIDTH:
|
||||
return "preview-layout-half-width-symbolic"
|
||||
elif mode == self.HALF_HEIGHT:
|
||||
return "preview-layout-half-height-symbolic"
|
||||
elif mode == self.WINDOWED:
|
||||
return "preview-layout-windowed-symbolic"
|
||||
else:
|
||||
raise ValueError("Unknown preview mode {}".format(mode))
|
||||
|
||||
def __on_sync_scroll(self, _, state):
|
||||
self.settings.set_boolean("sync-scroll", state)
|
||||
return False
|
||||
|
||||
def __on_dark_mode(self, _):
|
||||
self.settings.set_boolean("dark-mode", self.dark_button.get_active())
|
||||
|
||||
class MainHeaderbar(BaseHeaderbar): # pylint: disable=too-few-public-methods
|
||||
"""Sets up the main application headerbar
|
||||
"""
|
||||
|
||||
def __init__(self, app):
|
||||
|
||||
BaseHeaderbar.__init__(self, app)
|
||||
|
||||
self.hb.set_show_close_button(True)
|
||||
|
||||
self.hb_revealer.props.transition_duration = 0
|
||||
|
||||
|
||||
class FullscreenHeaderbar(BaseHeaderbar):
|
||||
"""Sets up and manages the fullscreen headerbar and his events
|
||||
"""
|
||||
|
||||
def __init__(self, fs_builder, app):
|
||||
|
||||
BaseHeaderbar.__init__(self, app)
|
||||
|
||||
self.hb.set_show_close_button(False)
|
||||
|
||||
self.exit_fs_button = self.builder.get_object("exit_fs_button")
|
||||
self.exit_fs_button.set_visible(True)
|
||||
|
||||
self.events = fs_builder.get_object("FullscreenEventbox")
|
||||
self.events.add(self.hb_revealer)
|
||||
|
||||
# this is a little tricky
|
||||
# we show hb when the cursor enters an area of 1px at the top
|
||||
# as the hb is shown the height of the eventbox grows to accomodate it
|
||||
self.events.connect('enter_notify_event', self.show_fs_hb)
|
||||
self.events.connect('leave_notify_event', self.hide_fs_hb)
|
||||
self.menu_button.get_popover().connect('closed', self.hide_fs_hb)
|
||||
self.recents_button.get_popover().connect('closed', self.hide_fs_hb)
|
||||
self.export_button.get_popover().connect('closed', self.hide_fs_hb)
|
||||
self.preview_switch_button.get_popover().connect('closed', self.hide_fs_hb)
|
||||
|
||||
def show_fs_hb(self, _widget=None, _data=None):
|
||||
"""show headerbar of the fullscreen mode
|
||||
"""
|
||||
self.hb_revealer.set_reveal_child(True)
|
||||
|
||||
def hide_fs_hb(self, _widget=None, _data=None):
|
||||
"""hide headerbar of the fullscreen mode
|
||||
"""
|
||||
if (self.menu_button.get_active() or
|
||||
self.recents_button.get_active() or
|
||||
self.export_button.get_active() or
|
||||
self.preview_switch_button.get_active()):
|
||||
pass
|
||||
else:
|
||||
self.hb_revealer.set_reveal_child(False)
|
||||
|
||||
|
||||
class DummyHeaderbar(BaseHeaderbar):
|
||||
"""Sets up and manages the dummy headerbar wich fades away when entering
|
||||
the free-distracting mode
|
||||
"""
|
||||
|
||||
def __init__(self, app):
|
||||
|
||||
BaseHeaderbar.__init__(self, app)
|
||||
|
||||
self.hb.set_show_close_button(True)
|
||||
self.hb_revealer.set_transition_type(
|
||||
Gtk.RevealerTransitionType.CROSSFADE)
|
||||
self.hb_revealer.set_reveal_child(False)
|
||||
self.hb_revealer.hide()
|
||||
|
||||
self.menu_button.set_sensitive(True)
|
||||
self.recents_button.set_sensitive(True)
|
||||
|
||||
def show_dm_hb(self):
|
||||
"""show dummy headerbar:
|
||||
It appears instantly to inmediatly fade away
|
||||
"""
|
||||
self.hb_revealer.show()
|
||||
self.hb_revealer.set_transition_duration(0)
|
||||
self.hb_revealer.set_reveal_child(True)
|
||||
self.hb_revealer.set_transition_duration(600)
|
||||
self.hb_revealer.set_reveal_child(False)
|
||||
|
||||
def hide_dm_hb(self):
|
||||
"""hide dummy headerbar
|
||||
It appears slowly to inmediatly dissapear
|
||||
"""
|
||||
self.hb_revealer.set_transition_duration(400)
|
||||
self.hb_revealer.set_reveal_child(True)
|
||||
GLib.timeout_add(400, self.hide_dm_hb_with_wait)
|
||||
|
||||
def hide_dm_hb_with_wait(self):
|
||||
self.hb_revealer.set_transition_duration(0)
|
||||
self.hb_revealer.set_reveal_child(False)
|
||||
self.hb_revealer.hide()
|
||||
return False
|
||||
|
||||
|
||||
class PreviewHeaderbar:
|
||||
"""Sets up the preview headerbar
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.hb = Gtk.HeaderBar().new()
|
||||
self.hb.props.show_close_button = True
|
||||
self.hb.get_style_context().add_class("titlebar")
|
||||
|
||||
self.hb_revealer = Gtk.Revealer(name="titlebar-revealer-pv")
|
||||
self.hb_revealer.add(self.hb)
|
||||
self.hb_revealer.props.transition_duration = 750
|
||||
self.hb_revealer.set_transition_type(
|
||||
Gtk.RevealerTransitionType.CROSSFADE)
|
||||
self.hb_revealer.show()
|
||||
self.hb_revealer.set_reveal_child(True)
|
||||
|
||||
self.hb_container = Gtk.Frame(name="titlebar-container")
|
||||
self.hb_container.set_shadow_type(Gtk.ShadowType.NONE)
|
||||
self.hb_container.add(self.hb_revealer)
|
||||
self.hb_container.show()
|
||||
|
||||
self.hb.show_all()
|
||||
|
||||
|
||||
def add_menus(headerbar, app):
|
||||
""" Add menu models to hb buttons
|
||||
"""
|
||||
|
||||
# Add menu model to the menu button
|
||||
|
||||
builder_window_menu = Gtk.Builder()
|
||||
builder_window_menu.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Menu.ui")
|
||||
model = builder_window_menu.get_object("Menu")
|
||||
headerbar.light_button = builder_window_menu.get_object("light_mode_button")
|
||||
headerbar.dark_button = builder_window_menu.get_object("dark_mode_button")
|
||||
|
||||
headerbar.menu_button.set_popover(model)
|
||||
|
||||
# Add recents menu to the open recents button
|
||||
|
||||
recents_builder = Gtk.Builder()
|
||||
recents_builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Recents.ui")
|
||||
recents = recents_builder.get_object("recent_md_popover")
|
||||
|
||||
recents_treeview = get_descendant(recents, "recent_view", level=0)
|
||||
recents_treeview.set_activate_on_single_click(True)
|
||||
|
||||
recents_wd = recents_builder.get_object("recent_md_widget")
|
||||
recents_wd.connect('item-activated', app.on_open_recent)
|
||||
|
||||
headerbar.recents_button.set_popover(recents)
|
||||
headerbar.recents_button.set_sensitive(True)
|
|
@ -26,13 +26,13 @@ import gi
|
|||
import pypandoc
|
||||
from gi.overrides.Pango import Pango
|
||||
|
||||
from uberwriter.settings import Settings
|
||||
from apostrophe.settings import Settings
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk # pylint: disable=E0611
|
||||
|
||||
from uberwriter.config import get_data_file
|
||||
from uberwriter.builder import Builder
|
||||
from apostrophe.config import get_data_file
|
||||
from apostrophe.builder import Builder
|
||||
|
||||
|
||||
|
||||
|
@ -85,6 +85,15 @@ def get_script_path(script_file_name):
|
|||
return script_path
|
||||
|
||||
|
||||
def get_reference_files_path(reference_file_name):
|
||||
"""Return the full path of a given filename under the reference_files dir
|
||||
"""
|
||||
refs_path = get_data_file('reference_files', '%s' % (reference_file_name,))
|
||||
if not os.path.exists(refs_path):
|
||||
refs_path = ""
|
||||
return refs_path
|
||||
|
||||
|
||||
class NullHandler(logging.Handler):
|
||||
def emit(self, record):
|
||||
pass
|
||||
|
@ -99,12 +108,12 @@ def set_up_logging(opts):
|
|||
formatter = logging.Formatter(
|
||||
"%(levelname)s:%(name)s: %(funcName)s() '%(message)s'")
|
||||
|
||||
logger = logging.getLogger('uberwriter')
|
||||
logger = logging.getLogger('apostrophe')
|
||||
logger_sh = logging.StreamHandler()
|
||||
logger_sh.setFormatter(formatter)
|
||||
logger.addHandler(logger_sh)
|
||||
|
||||
lib_logger = logging.getLogger('uberwriter')
|
||||
lib_logger = logging.getLogger('apostrophe')
|
||||
lib_logger_sh = logging.StreamHandler()
|
||||
lib_logger_sh.setFormatter(formatter)
|
||||
lib_logger.addHandler(lib_logger_sh)
|
||||
|
@ -124,7 +133,7 @@ def get_help_uri(page=None):
|
|||
|
||||
if not os.path.exists(help_uri):
|
||||
# installed so use gnome help tree - user's language
|
||||
help_uri = 'uberwriter'
|
||||
help_uri = 'apostrophe'
|
||||
|
||||
# unspecified page is the index.page
|
||||
if page is not None:
|
|
@ -15,6 +15,7 @@
|
|||
# END LICENSE
|
||||
|
||||
import re
|
||||
import os
|
||||
import telnetlib
|
||||
from gettext import gettext as _
|
||||
from urllib.parse import unquote
|
||||
|
@ -25,8 +26,8 @@ gi.require_version("Gtk", "3.0")
|
|||
gi.require_version("WebKit2", "4.0")
|
||||
from gi.repository import Gtk, Gdk, GdkPixbuf, GLib
|
||||
from gi.repository import WebKit2
|
||||
from uberwriter import latex_to_PNG, markup_regex
|
||||
from uberwriter.settings import Settings
|
||||
from apostrophe import latex_to_PNG, markup_regex
|
||||
from apostrophe.settings import Settings
|
||||
|
||||
|
||||
class DictAccessor:
|
||||
|
@ -151,6 +152,8 @@ class InlinePreview:
|
|||
HEIGHT = 300
|
||||
|
||||
def __init__(self, text_view):
|
||||
self.settings = Settings.new()
|
||||
|
||||
self.text_view = text_view
|
||||
self.text_view.connect("button-press-event", self.on_button_press_event)
|
||||
self.text_buffer = text_view.get_buffer()
|
||||
|
@ -158,7 +161,7 @@ class InlinePreview:
|
|||
"click", self.text_buffer.get_iter_at_mark(self.text_buffer.get_insert()))
|
||||
|
||||
self.latex_converter = latex_to_PNG.LatexToPNG()
|
||||
self.characters_per_line = Settings.new().get_int("characters-per-line")
|
||||
self.characters_per_line = self.settings.get_int("characters-per-line")
|
||||
|
||||
self.popover = Gtk.Popover.new(self.text_view)
|
||||
self.popover.get_style_context().add_class("quick-preview-popup")
|
||||
|
@ -191,10 +194,15 @@ class InlinePreview:
|
|||
|
||||
def get_view_for_image(self, match):
|
||||
path = match.group("url")
|
||||
if not path.startswith(("file://", "/")):
|
||||
|
||||
if path.startswith(("https://", "http://", "www.")):
|
||||
return self.get_view_for_link(match)
|
||||
elif path.startswith("file://"):
|
||||
if path.startswith(("file://")):
|
||||
path = path[7:]
|
||||
if not path.startswith(("/", "file://")):
|
||||
path = os.path.join(self.settings.get_string("open-file-path"), path)
|
||||
path = unquote(path)
|
||||
|
||||
return Gtk.Image.new_from_pixbuf(
|
||||
GdkPixbuf.Pixbuf.new_from_file_at_size(path, self.WIDTH, self.HEIGHT))
|
||||
|
|
@ -14,6 +14,24 @@ AUTHOR
|
|||
COPYING
|
||||
Copyright (C) 2010 Stuart Rackham. Free use of this software is
|
||||
granted under the terms of the MIT License.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
"""
|
||||
|
||||
import os
|
|
@ -14,7 +14,7 @@
|
|||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# END LICENSE
|
||||
|
||||
import codecs
|
||||
import io
|
||||
import locale
|
||||
import logging
|
||||
import os
|
||||
|
@ -23,23 +23,22 @@ from gettext import gettext as _
|
|||
|
||||
import gi
|
||||
|
||||
from uberwriter.export_dialog import Export
|
||||
from uberwriter.preview_handler import PreviewHandler
|
||||
from uberwriter.stats_handler import StatsHandler
|
||||
from uberwriter.styled_window import StyledWindow
|
||||
from uberwriter.text_view import TextView
|
||||
from apostrophe.export_dialog import Export
|
||||
from apostrophe.preview_handler import PreviewHandler
|
||||
from apostrophe.stats_handler import StatsHandler
|
||||
from apostrophe.styled_window import StyledWindow
|
||||
from apostrophe.text_view import TextView
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, Gdk, GObject, GLib, Gio
|
||||
|
||||
import cairo
|
||||
|
||||
from uberwriter import helpers
|
||||
from uberwriter.theme import Theme
|
||||
from apostrophe import helpers
|
||||
|
||||
from uberwriter.sidebar import Sidebar
|
||||
from uberwriter.search_and_replace import SearchAndReplace
|
||||
from uberwriter.settings import Settings
|
||||
from apostrophe.sidebar import Sidebar
|
||||
from apostrophe.search_and_replace import SearchAndReplace
|
||||
from apostrophe.settings import Settings
|
||||
|
||||
from . import headerbars
|
||||
|
||||
|
@ -47,9 +46,9 @@ from . import headerbars
|
|||
# TODO move them somewhere for better
|
||||
# accesibility from other files
|
||||
|
||||
LOGGER = logging.getLogger('uberwriter')
|
||||
LOGGER = logging.getLogger('apostrophe')
|
||||
|
||||
CONFIG_PATH = os.path.expanduser("~/.config/uberwriter/")
|
||||
CONFIG_PATH = os.path.expanduser("~/.config/apostrophe/")
|
||||
|
||||
|
||||
class MainWindow(StyledWindow):
|
||||
|
@ -66,15 +65,15 @@ class MainWindow(StyledWindow):
|
|||
def __init__(self, app):
|
||||
"""Set up the main window"""
|
||||
|
||||
super().__init__(application=Gio.Application.get_default(), title="Uberwriter")
|
||||
super().__init__(application=Gio.Application.get_default(), title="Apostrophe")
|
||||
|
||||
self.get_style_context().add_class('uberwriter-window')
|
||||
self.get_style_context().add_class('apostrophe-window')
|
||||
|
||||
# Set UI
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Window.ui")
|
||||
root = builder.get_object("FullscreenOverlay")
|
||||
root = builder.get_object("AppOverlay")
|
||||
self.connect("delete-event", self.on_delete_called)
|
||||
self.add(root)
|
||||
|
||||
|
@ -84,17 +83,34 @@ class MainWindow(StyledWindow):
|
|||
self.settings = Settings.new()
|
||||
|
||||
# Headerbars
|
||||
self.last_height = 0
|
||||
self.headerbar = headerbars.MainHeaderbar(app)
|
||||
self.set_titlebar(self.headerbar.hb_container)
|
||||
self.headerbar.hb_revealer.connect(
|
||||
"size_allocate", self.header_size_allocate)
|
||||
self.set_titlebar(self.headerbar.hb_revealer)
|
||||
|
||||
self.fs_headerbar = headerbars.FullscreenHeaderbar(builder, app)
|
||||
|
||||
self.title_end = " – UberWriter"
|
||||
self.set_headerbar_title("New File" + self.title_end)
|
||||
# Bind properties between normal and fs headerbar
|
||||
self.headerbar.light_button.bind_property(
|
||||
"active", self.fs_headerbar.light_button, "active",
|
||||
GObject.BindingFlags.BIDIRECTIONAL
|
||||
| GObject.BindingFlags.SYNC_CREATE)
|
||||
|
||||
self.timestamp_last_mouse_motion = 0
|
||||
if self.settings.get_value("poll-motion"):
|
||||
self.connect("motion-notify-event", self.on_motion_notify)
|
||||
GObject.timeout_add(3000, self.poll_for_motion)
|
||||
self.headerbar.dark_button.bind_property(
|
||||
"active", self.fs_headerbar.dark_button, "active",
|
||||
GObject.BindingFlags.BIDIRECTIONAL
|
||||
| GObject.BindingFlags.SYNC_CREATE)
|
||||
|
||||
# The dummy headerbar is a cosmetic hack to be able to
|
||||
# crossfade the hb on top of the window
|
||||
self.dm_headerbar = headerbars.DummyHeaderbar(app)
|
||||
root.add_overlay(self.dm_headerbar.hb_revealer)
|
||||
root.reorder_overlay(self.dm_headerbar.hb_revealer, 0)
|
||||
root.set_overlay_pass_through(self.dm_headerbar.hb_revealer, True)
|
||||
|
||||
self.title_end = " – Apostrophe"
|
||||
self.set_headerbar_title("New File" + self.title_end)
|
||||
|
||||
self.accel_group = Gtk.AccelGroup()
|
||||
self.add_accel_group(self.accel_group)
|
||||
|
@ -103,6 +119,7 @@ class MainWindow(StyledWindow):
|
|||
|
||||
# Setup text editor
|
||||
self.text_view = TextView(self.settings.get_int("characters-per-line"))
|
||||
self.text_view.set_top_margin(80)
|
||||
self.text_view.connect('focus-out-event', self.focus_out)
|
||||
self.text_view.get_buffer().connect('changed', self.on_text_changed)
|
||||
self.text_view.show()
|
||||
|
@ -119,16 +136,11 @@ class MainWindow(StyledWindow):
|
|||
editor = builder.get_object('editor')
|
||||
self.preview_handler = PreviewHandler(self, content, editor, self.text_view)
|
||||
|
||||
# Setup header/stats bar hide after 3 seconds
|
||||
self.top_bottom_bars_visible = True
|
||||
self.was_motion = True
|
||||
# Setup header/stats bar
|
||||
self.headerbar_visible = True
|
||||
self.bottombar_visible = True
|
||||
self.buffer_modified_for_status_bar = False
|
||||
|
||||
# some people seems to have performance problems with the overlay.
|
||||
# Let them disable it
|
||||
self.overlay_id = None
|
||||
self.toggle_gradient_overlay(self.settings.get_value("gradient-overlay"))
|
||||
|
||||
# Init file name with None
|
||||
self.set_filename()
|
||||
|
||||
|
@ -151,6 +163,32 @@ class MainWindow(StyledWindow):
|
|||
###
|
||||
self.searchreplace = SearchAndReplace(self, self.text_view, builder)
|
||||
|
||||
# EventBoxes
|
||||
|
||||
self.headerbar_eventbox = builder.get_object("HeaderbarEventbox")
|
||||
self.headerbar_eventbox.connect('enter_notify_event',
|
||||
self.reveal_headerbar_bottombar)
|
||||
|
||||
self.stats_revealer.connect('enter_notify_event', self.reveal_bottombar)
|
||||
|
||||
def header_size_allocate(self, widget, allocation):
|
||||
""" When the main hb starts to shrink its size, add that size
|
||||
to the textview margin, so it stays in place
|
||||
"""
|
||||
|
||||
# prevent 1px jumps
|
||||
if allocation.height == 1 and not widget.get_child_revealed():
|
||||
allocation.height = 0
|
||||
|
||||
height = self.headerbar.hb.get_allocated_height() - allocation.height
|
||||
if height == self.last_height:
|
||||
return
|
||||
|
||||
self.last_height = height
|
||||
|
||||
self.text_view.update_vertical_margin(height)
|
||||
self.text_view.queue_draw()
|
||||
|
||||
def on_text_changed(self, *_args):
|
||||
"""called when the text changes, sets the self.did_change to true and
|
||||
updates the title and the counters to reflect that
|
||||
|
@ -162,6 +200,8 @@ class MainWindow(StyledWindow):
|
|||
self.set_headerbar_title("* " + title)
|
||||
|
||||
self.buffer_modified_for_status_bar = True
|
||||
if self.settings.get_value("autohide-headerbar"):
|
||||
self.hide_headerbar_bottombar()
|
||||
|
||||
def set_fullscreen(self, state):
|
||||
"""Puts the application in fullscreen mode and show/hides
|
||||
|
@ -174,16 +214,19 @@ class MainWindow(StyledWindow):
|
|||
if state.get_boolean():
|
||||
self.fullscreen()
|
||||
self.fs_headerbar.events.show()
|
||||
self.fs_headerbar.hide_fs_hb()
|
||||
self.headerbar_eventbox.hide()
|
||||
else:
|
||||
self.unfullscreen()
|
||||
self.fs_headerbar.events.hide()
|
||||
self.headerbar_eventbox.show()
|
||||
self.text_view.grab_focus()
|
||||
|
||||
def set_focus_mode(self, state):
|
||||
"""toggle focusmode
|
||||
"""
|
||||
|
||||
self.text_view.set_focus_mode(state.get_boolean())
|
||||
self.text_view.set_focus_mode(state.get_boolean(), self.headerbar.hb.get_allocated_height())
|
||||
self.text_view.grab_focus()
|
||||
|
||||
def set_hemingway_mode(self, state):
|
||||
|
@ -203,9 +246,15 @@ class MainWindow(StyledWindow):
|
|||
if state.get_boolean():
|
||||
self.text_view.grab_focus()
|
||||
self.preview_handler.show()
|
||||
self.headerbar.preview_toggle_revealer.set_reveal_child(True)
|
||||
self.fs_headerbar.preview_toggle_revealer.set_reveal_child(True)
|
||||
self.dm_headerbar.preview_toggle_revealer.set_reveal_child(True)
|
||||
else:
|
||||
self.preview_handler.hide()
|
||||
self.text_view.grab_focus()
|
||||
self.headerbar.preview_toggle_revealer.set_reveal_child(False)
|
||||
self.fs_headerbar.preview_toggle_revealer.set_reveal_child(False)
|
||||
self.dm_headerbar.preview_toggle_revealer.set_reveal_child(False)
|
||||
|
||||
return True
|
||||
|
||||
|
@ -218,7 +267,7 @@ class MainWindow(StyledWindow):
|
|||
if self.filename:
|
||||
LOGGER.info("saving")
|
||||
filename = self.filename
|
||||
file_to_save = codecs.open(filename, encoding="utf-8", mode='w')
|
||||
file_to_save = io.open(filename, encoding="utf-8", mode='w')
|
||||
file_to_save.write(self.text_view.get_text())
|
||||
file_to_save.close()
|
||||
if self.did_change:
|
||||
|
@ -252,7 +301,7 @@ class MainWindow(StyledWindow):
|
|||
except:
|
||||
pass
|
||||
|
||||
file_to_save = codecs.open(filename, encoding="utf-8", mode='w')
|
||||
file_to_save = io.open(filename, encoding="utf-8", mode='w')
|
||||
file_to_save.write(self.text_view.get_text())
|
||||
file_to_save.close()
|
||||
|
||||
|
@ -293,7 +342,7 @@ class MainWindow(StyledWindow):
|
|||
except:
|
||||
pass
|
||||
|
||||
file_to_save = codecs.open(filename, encoding="utf-8", mode='w')
|
||||
file_to_save = io.open(filename, encoding="utf-8", mode='w')
|
||||
file_to_save.write(self.text_view.get_text())
|
||||
file_to_save.close()
|
||||
|
||||
|
@ -360,16 +409,27 @@ class MainWindow(StyledWindow):
|
|||
"""Show dialog to prevent loss of unsaved changes
|
||||
"""
|
||||
|
||||
if self.filename:
|
||||
title = os.path.basename(self.filename)
|
||||
else:
|
||||
title = _("New File")
|
||||
|
||||
if self.did_change and self.text_view.get_text():
|
||||
dialog = Gtk.MessageDialog(self,
|
||||
Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||
Gtk.MessageType.WARNING,
|
||||
Gtk.ButtonsType.NONE,
|
||||
_("You have not saved your changes.")
|
||||
_("Save changes to document “%s” before closing?") %
|
||||
title
|
||||
)
|
||||
dialog.add_button(_("Close without saving"), Gtk.ResponseType.NO)
|
||||
|
||||
dialog.props.secondary_text = _("If you don’t save, " +
|
||||
"all your changes will be permanently lost.")
|
||||
close_button = dialog.add_button(_("Close without saving"), Gtk.ResponseType.NO)
|
||||
dialog.add_button(_("Cancel"), Gtk.ResponseType.CANCEL)
|
||||
dialog.add_button(_("Save now"), Gtk.ResponseType.YES)
|
||||
|
||||
close_button.get_style_context().add_class("destructive-action")
|
||||
# dialog.set_default_size(200, 60)
|
||||
dialog.set_default_response(Gtk.ResponseType.YES)
|
||||
response = dialog.run()
|
||||
|
@ -405,6 +465,10 @@ class MainWindow(StyledWindow):
|
|||
|
||||
def update_preview_mode(self):
|
||||
self.preview_handler.update_preview_mode()
|
||||
self.headerbar.update_preview_layout_icon()
|
||||
self.headerbar.select_preview_layout_row()
|
||||
self.fs_headerbar.update_preview_layout_icon()
|
||||
self.fs_headerbar.select_preview_layout_row()
|
||||
|
||||
def menu_toggle_sidebar(self, _widget=None):
|
||||
"""WIP
|
||||
|
@ -420,23 +484,12 @@ class MainWindow(StyledWindow):
|
|||
|
||||
self.text_view.set_spellcheck(state.get_boolean())
|
||||
|
||||
def toggle_gradient_overlay(self, state):
|
||||
"""Toggle the gradient overlay
|
||||
|
||||
Arguments:
|
||||
state {gtk bool} -- Desired state of the gradient overlay (enabled/disabled)
|
||||
"""
|
||||
|
||||
if state.get_boolean():
|
||||
self.overlay_id = self.scrolled_window.connect_after("draw", self.draw_gradient)
|
||||
elif self.overlay_id:
|
||||
self.scrolled_window.disconnect(self.overlay_id)
|
||||
|
||||
def reload_preview(self, reshow=False):
|
||||
self.preview_handler.reload(reshow=reshow)
|
||||
|
||||
def load_file(self, filename=None):
|
||||
"""Open File from command line or open / open recent etc."""
|
||||
LOGGER.info("trying to open " + filename)
|
||||
if self.check_change() == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
|
||||
|
@ -447,7 +500,7 @@ class MainWindow(StyledWindow):
|
|||
self.text_view.clear()
|
||||
try:
|
||||
if os.path.exists(filename):
|
||||
with codecs.open(filename, encoding="utf-8", mode='r') as current_file:
|
||||
with io.open(filename, encoding="utf-8", mode='r') as current_file:
|
||||
self.text_view.set_text(current_file.read())
|
||||
else:
|
||||
dialog = Gtk.MessageDialog(self,
|
||||
|
@ -478,13 +531,13 @@ class MainWindow(StyledWindow):
|
|||
else:
|
||||
LOGGER.warning("No File arg")
|
||||
|
||||
def open_uberwriter_markdown(self, _widget=None, _data=None):
|
||||
def open_apostrophe_markdown(self, _widget=None, _data=None):
|
||||
"""open a markdown mini tutorial
|
||||
"""
|
||||
if self.check_change() == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
|
||||
self.load_file(helpers.get_media_file('uberwriter_markdown.md'))
|
||||
self.load_file(helpers.get_media_file('apostrophe_markdown.md'))
|
||||
|
||||
def open_search(self, replace=False):
|
||||
"""toggle the search box
|
||||
|
@ -492,113 +545,68 @@ class MainWindow(StyledWindow):
|
|||
|
||||
self.searchreplace.toggle_search(replace=replace)
|
||||
|
||||
def open_advanced_export(self, _widget=None, _data=None):
|
||||
def open_advanced_export(self, export_format):
|
||||
"""open the export and advanced export dialog
|
||||
"""
|
||||
text = bytes(self.text_view.get_text(), "utf-8")
|
||||
|
||||
self.export = Export(self.filename)
|
||||
self.export.dialog.set_transient_for(self)
|
||||
|
||||
response = self.export.dialog.run()
|
||||
if response == 1:
|
||||
try:
|
||||
self.export.export(bytes(self.text_view.get_text(), "utf-8"))
|
||||
except Exception as e:
|
||||
dialog = Gtk.MessageDialog(self,
|
||||
Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||
Gtk.MessageType.ERROR,
|
||||
Gtk.ButtonsType.CLOSE,
|
||||
_("An error happened while trying to export:\n\n{err_msg}")
|
||||
.format(err_msg= str(e).encode().decode("unicode-escape"))
|
||||
)
|
||||
dialog.run()
|
||||
dialog.destroy()
|
||||
|
||||
self.export.dialog.destroy()
|
||||
self.export = Export(self.filename, export_format, text)
|
||||
|
||||
def open_recent(self, _widget, data=None):
|
||||
"""open the given recent document
|
||||
"""
|
||||
print("open")
|
||||
|
||||
if data:
|
||||
if self.check_change() == Gtk.ResponseType.CANCEL:
|
||||
return
|
||||
self.load_file(data)
|
||||
|
||||
def poll_for_motion(self):
|
||||
"""check if the user has moved the cursor to show the headerbar
|
||||
|
||||
Returns:
|
||||
True -- Gtk things
|
||||
"""
|
||||
|
||||
if (not self.was_motion
|
||||
and self.buffer_modified_for_status_bar
|
||||
and self.text_view.props.has_focus):
|
||||
self.reveal_top_bottom_bars(False)
|
||||
|
||||
self.was_motion = False
|
||||
return True
|
||||
|
||||
def on_motion_notify(self, _widget, event, _data=None):
|
||||
"""check the motion of the mouse to fade in the headerbar
|
||||
"""
|
||||
now = event.get_time()
|
||||
if now - self.timestamp_last_mouse_motion > 150:
|
||||
# filter out accidental motions
|
||||
self.timestamp_last_mouse_motion = now
|
||||
return
|
||||
if now - self.timestamp_last_mouse_motion < 100:
|
||||
# filter out accidental motion
|
||||
return
|
||||
if now - self.timestamp_last_mouse_motion > 100:
|
||||
# react on motion by fading in headerbar and statusbar
|
||||
self.reveal_top_bottom_bars(True)
|
||||
self.was_motion = True
|
||||
|
||||
def focus_out(self, _widget, _data=None):
|
||||
"""events called when the window losses focus
|
||||
"""
|
||||
self.reveal_top_bottom_bars(True)
|
||||
self.reveal_headerbar_bottombar()
|
||||
|
||||
def reveal_top_bottom_bars(self, reveal):
|
||||
if self.top_bottom_bars_visible != reveal:
|
||||
self.headerbar.hb_revealer.set_reveal_child(reveal)
|
||||
self.stats_revealer.set_reveal_child(reveal)
|
||||
for revealer in self.preview_handler.get_top_bottom_bar_revealers():
|
||||
revealer.set_reveal_child(reveal)
|
||||
self.top_bottom_bars_visible = reveal
|
||||
self.buffer_modified_for_status_bar = reveal
|
||||
def reveal_headerbar_bottombar(self, _widget=None, _data=None):
|
||||
|
||||
def draw_gradient(self, _widget, cr):
|
||||
"""draw fading gradient over the top and the bottom of the
|
||||
TextWindow
|
||||
"""
|
||||
bg_color = self.get_style_context().get_background_color(Gtk.StateFlags.ACTIVE)
|
||||
def __reveal_hb():
|
||||
self.headerbar_eventbox.hide()
|
||||
self.headerbar.hb_revealer.set_reveal_child(True)
|
||||
self.get_style_context().remove_class("focus")
|
||||
return False
|
||||
|
||||
lg_top = cairo.LinearGradient(0, 0, 0, 32) # pylint: disable=no-member
|
||||
lg_top.add_color_stop_rgba(
|
||||
0, bg_color.red, bg_color.green, bg_color.blue, 1)
|
||||
lg_top.add_color_stop_rgba(
|
||||
1, bg_color.red, bg_color.green, bg_color.blue, 0)
|
||||
self.reveal_bottombar()
|
||||
|
||||
width = self.scrolled_window.get_allocation().width
|
||||
height = self.scrolled_window.get_allocation().height
|
||||
if not self.headerbar_visible:
|
||||
self.dm_headerbar.hide_dm_hb()
|
||||
GLib.timeout_add(400, __reveal_hb)
|
||||
|
||||
cr.rectangle(0, 0, width, 32)
|
||||
cr.set_source(lg_top)
|
||||
cr.fill()
|
||||
cr.rectangle(0, height - 32, width, height)
|
||||
self.headerbar_visible = True
|
||||
|
||||
lg_btm = cairo.LinearGradient(0, height - 32, 0, height) # pylint: disable=no-member
|
||||
lg_btm.add_color_stop_rgba(
|
||||
1, bg_color.red, bg_color.green, bg_color.blue, 1)
|
||||
lg_btm.add_color_stop_rgba(
|
||||
0, bg_color.red, bg_color.green, bg_color.blue, 0)
|
||||
def reveal_bottombar(self, _widget=None, _data=None):
|
||||
|
||||
cr.set_source(lg_btm)
|
||||
cr.fill()
|
||||
if not self.bottombar_visible:
|
||||
self.stats_revealer.set_reveal_child(True)
|
||||
|
||||
self.bottombar_visible = True
|
||||
|
||||
self.buffer_modified_for_status_bar = True
|
||||
|
||||
def hide_headerbar_bottombar(self):
|
||||
|
||||
if self.headerbar_visible:
|
||||
self.headerbar.hb_revealer.set_reveal_child(False)
|
||||
self.dm_headerbar.show_dm_hb()
|
||||
self.get_style_context().add_class("focus")
|
||||
|
||||
self.headerbar_visible = False
|
||||
|
||||
if self.bottombar_visible:
|
||||
self.stats_revealer.set_reveal_child(False)
|
||||
|
||||
self.bottombar_visible = False
|
||||
|
||||
self.headerbar_eventbox.show()
|
||||
self.buffer_modified_for_status_bar = False
|
||||
|
||||
def on_delete_called(self, _widget, _data=None):
|
||||
"""Called when the TexteditorWindow is closed.
|
||||
|
@ -617,13 +625,18 @@ class MainWindow(StyledWindow):
|
|||
self.destroy()
|
||||
return
|
||||
|
||||
def set_headerbar_title(self, title, subtitle=""):
|
||||
def set_headerbar_title(self, title, subtitle=None):
|
||||
"""set the desired headerbar title
|
||||
"""
|
||||
self.headerbar.hb.props.title = title
|
||||
self.dm_headerbar.hb.props.title = title
|
||||
self.fs_headerbar.hb.props.title = title
|
||||
if subtitle:
|
||||
self.headerbar.hb.props.subtitle = subtitle
|
||||
self.dm_headerbar.hb.props.subtitle = subtitle
|
||||
self.fs_headerbar.hb.props.subtitle = subtitle
|
||||
self.headerbar.hb.set_tooltip_text(subtitle)
|
||||
self.fs_headerbar.hb.set_tooltip_text(subtitle)
|
||||
self.set_title(title)
|
||||
|
||||
def set_filename(self, filename=None):
|
||||
|
@ -632,6 +645,7 @@ class MainWindow(StyledWindow):
|
|||
if filename:
|
||||
self.filename = filename
|
||||
base_path = os.path.dirname(self.filename)
|
||||
os.chdir(base_path)
|
||||
else:
|
||||
self.filename = None
|
||||
base_path = "/"
|
|
@ -1,11 +1,13 @@
|
|||
import re
|
||||
|
||||
ITALIC = re.compile(
|
||||
r"(\*|_)(?P<text>.*?\S.*?)\1")
|
||||
ITALIC_ASTERISK = re.compile(
|
||||
r"(?<!\\)\*[^\s\*](?P<text>.*?\S?.*?)(?<!\\)\*")
|
||||
ITALIC_UNDERSCORE = re.compile(
|
||||
r"(?<!(\\|\S))_[^\s_](?P<text>.*?\S?.*?)(?<!\\)_(?=\s)")
|
||||
BOLD = re.compile(
|
||||
r"(\*\*|__)(?P<text>.*?\S.*?)\1")
|
||||
r"(\*\*|__)[^\s*](?P<text>.*?\S.*?)\1")
|
||||
BOLD_ITALIC = re.compile(
|
||||
r"((\*\*|__)([*_])|([*_])(\*\*|__))(?P<text>.*?\S.*?)(?:\5\4|\3\2)")
|
||||
r"((\*\*|__)([*_])|([*_])(\*\*|__))[^\s*](?P<text>.*?\S.*?)(?:\5\4|\3\2)")
|
||||
STRIKETHROUGH = re.compile(
|
||||
r"~~(?P<text>.*?\S.*?)~~")
|
||||
CODE = re.compile(
|
||||
|
@ -17,7 +19,7 @@ LINK_ALT = re.compile(
|
|||
IMAGE = re.compile(
|
||||
r"!\[(?P<text>.*)\]\((?P<url>.+?)(?: \"(?P<title>.+)\")?\)")
|
||||
HORIZONTAL_RULE = re.compile(
|
||||
r"(?:^|\n)(?P<symbols> {0,3}[*\-_]{3,} *)(?:\n+|$)")
|
||||
r"(?:^|\n{2,})(?P<symbols> {0,3}[*\-_]{3,} *)(?:\n{2,}|$)")
|
||||
LIST = re.compile(
|
||||
r"(?:^|\n)(?P<content>(?P<indent>(?:\t| {4})*)[\-*+]( +)(?P<text>.+(?:\n+ \2.+)*))")
|
||||
ORDERED_LIST = re.compile(
|
|
@ -0,0 +1,503 @@
|
|||
### GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
### Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom
|
||||
to share and change it. By contrast, the GNU General Public Licenses
|
||||
are intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations
|
||||
below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that there
|
||||
is no warranty for the free library. Also, if the library is modified
|
||||
by someone else and passed on, the recipients should know that what
|
||||
they have is not the original version, so that the original author's
|
||||
reputation will not be affected by problems that might be introduced
|
||||
by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using a
|
||||
shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it
|
||||
becomes a de-facto standard. To achieve this, non-free programs must
|
||||
be allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
**0.** This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License"). Each
|
||||
licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control
|
||||
compilation and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does and
|
||||
what the program that uses the Library does.
|
||||
|
||||
**1.** You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
**2.** You may modify your copy or copies of the Library or any
|
||||
portion of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
- **a)** The modified work must itself be a software library.
|
||||
- **b)** You must cause the files modified to carry prominent
|
||||
notices stating that you changed the files and the date of
|
||||
any change.
|
||||
- **c)** You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
- **d)** If a facility in the modified Library refers to a function
|
||||
or a table of data to be supplied by an application program that
|
||||
uses the facility, other than as an argument passed when the
|
||||
facility is invoked, then you must make a good faith effort to
|
||||
ensure that, in the event an application does not supply such
|
||||
function or table, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of
|
||||
the application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
**3.** You may opt to apply the terms of the ordinary GNU General
|
||||
Public License instead of this License to a given copy of the Library.
|
||||
To do this, you must alter all the notices that refer to this License,
|
||||
so that they refer to the ordinary GNU General Public License, version
|
||||
2, instead of to this License. (If a newer version than version 2 of
|
||||
the ordinary GNU General Public License has appeared, then you can
|
||||
specify that version instead if you wish.) Do not make any other
|
||||
change in these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for that
|
||||
copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of the
|
||||
Library into a program that is not a library.
|
||||
|
||||
**4.** You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy from
|
||||
a designated place, then offering equivalent access to copy the source
|
||||
code from the same place satisfies the requirement to distribute the
|
||||
source code, even though third parties are not compelled to copy the
|
||||
source along with the object code.
|
||||
|
||||
**5.** A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a work,
|
||||
in isolation, is not a derivative work of the Library, and therefore
|
||||
falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License. Section
|
||||
6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data structure
|
||||
layouts and accessors, and small macros and small inline functions
|
||||
(ten lines or less in length), then the use of the object file is
|
||||
unrestricted, regardless of whether it is legally a derivative work.
|
||||
(Executables containing this object code plus portions of the Library
|
||||
will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
**6.** As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a work
|
||||
containing portions of the Library, and distribute that work under
|
||||
terms of your choice, provided that the terms permit modification of
|
||||
the work for the customer's own use and reverse engineering for
|
||||
debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
- **a)** Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood that
|
||||
the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
- **b)** Use a suitable shared library mechanism for linking with
|
||||
the Library. A suitable mechanism is one that (1) uses at run time
|
||||
a copy of the library already present on the user's computer
|
||||
system, rather than copying library functions into the executable,
|
||||
and (2) will operate properly with a modified version of the
|
||||
library, if the user installs one, as long as the modified version
|
||||
is interface-compatible with the version that the work was
|
||||
made with.
|
||||
- **c)** Accompany the work with a written offer, valid for at least
|
||||
three years, to give the same user the materials specified in
|
||||
Subsection 6a, above, for a charge no more than the cost of
|
||||
performing this distribution.
|
||||
- **d)** If distribution of the work is made by offering access to
|
||||
copy from a designated place, offer equivalent access to copy the
|
||||
above specified materials from the same place.
|
||||
- **e)** Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
**7.** You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
- **a)** Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other
|
||||
library facilities. This must be distributed under the terms of
|
||||
the Sections above.
|
||||
- **b)** Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
**8.** You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
**9.** You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
**10.** Each time you redistribute the Library (or any work based on
|
||||
the Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
**11.** If, as a consequence of a court judgment or allegation of
|
||||
patent infringement or for any other reason (not limited to patent
|
||||
issues), conditions are imposed on you (whether by court order,
|
||||
agreement or otherwise) that contradict the conditions of this
|
||||
License, they do not excuse you from the conditions of this License.
|
||||
If you cannot distribute so as to satisfy simultaneously your
|
||||
obligations under this License and any other pertinent obligations,
|
||||
then as a consequence you may not distribute the Library at all. For
|
||||
example, if a patent license would not permit royalty-free
|
||||
redistribution of the Library by all those who receive copies directly
|
||||
or indirectly through you, then the only way you could satisfy both it
|
||||
and this License would be to refrain entirely from distribution of the
|
||||
Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply, and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
**12.** If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
**13.** The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time. Such
|
||||
new versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
**14.** If you wish to incorporate parts of the Library into other
|
||||
free programs whose distribution conditions are incompatible with
|
||||
these, write to the author to ask for permission. For software which
|
||||
is copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
**NO WARRANTY**
|
||||
|
||||
**15.** BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
**16.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
### END OF TERMS AND CONDITIONS
|
||||
|
||||
### How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms
|
||||
of the ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It
|
||||
is safest to attach them to the start of each source file to most
|
||||
effectively convey the exclusion of warranty; and each file should
|
||||
have at least the "copyright" line and a pointer to where the full
|
||||
notice is found.
|
||||
|
||||
one line to give the library's name and an idea of what it does.
|
||||
Copyright (C) year name of author
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper
|
||||
mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or
|
||||
your school, if any, to sign a "copyright disclaimer" for the library,
|
||||
if necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in
|
||||
the library `Frob' (a library for tweaking knobs) written
|
||||
by James Random Hacker.
|
||||
|
||||
signature of Ty Coon, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -6,7 +6,7 @@ from . import fuzzywuzzy
|
|||
from .gi_composites import GtkTemplate
|
||||
|
||||
|
||||
@GtkTemplate(ui='/home/wolfv/Programs/uberwriter/uberwriter/plugins/bibtex/bibtex_item.glade')
|
||||
@GtkTemplate(ui='/home/wolfv/Programs/apostrophe/apostrophe/plugins/bibtex/bibtex_item.glade')
|
||||
class BibTexItem(Gtk.Box):
|
||||
|
||||
__gtype_name__ = 'BibTexItem'
|
||||
|
@ -68,7 +68,7 @@ class BibTex(object):
|
|||
self.bib_db = bibtexparser.load(f)
|
||||
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_file('/home/wolfv/Programs/uberwriter/uberwriter/plugins/bibtex/bibtex.glade')
|
||||
builder.add_from_file('/home/wolfv/Programs/apostrophe/apostrophe/plugins/bibtex/bibtex.glade')
|
||||
self.window = builder.get_object('bibtex_window')
|
||||
self.window.set_transient_for(self.app)
|
||||
self.window.set_modal(True)
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 223 B |
|
@ -25,7 +25,7 @@ import gi
|
|||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, Pango, GLib # pylint: disable=E0611
|
||||
import logging
|
||||
logger = logging.getLogger('uberwriter')
|
||||
logger = logging.getLogger('apostrophe')
|
||||
|
||||
|
||||
|
||||
|
@ -67,26 +67,14 @@ class PreferencesDialog:
|
|||
self.builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Preferences.ui")
|
||||
|
||||
self.dark_mode_auto_switch = self.builder.get_object("dark_mode_auto_switch")
|
||||
self.dark_mode_auto_switch.set_active(self.settings.get_value("dark-mode-auto"))
|
||||
self.dark_mode_auto_switch.connect("state-set", self.on_dark_mode_auto)
|
||||
|
||||
self.dark_mode_switch = self.builder.get_object("dark_mode_switch")
|
||||
self.dark_mode_switch.set_active(self.settings.get_value("dark-mode"))
|
||||
self.dark_mode_switch.connect("state-set", self.on_dark_mode)
|
||||
self.autohide_headerbar_switch = self.builder.get_object("autohide_headerbar_switch")
|
||||
self.autohide_headerbar_switch.set_active(self.settings.get_value("autohide-headerbar"))
|
||||
self.autohide_headerbar_switch.connect("state-set", self.on_autohide_headerbar)
|
||||
|
||||
self.spellcheck_switch = self.builder.get_object("spellcheck_switch")
|
||||
self.spellcheck_switch.set_active(self.settings.get_value("spellcheck"))
|
||||
self.spellcheck_switch.connect("state-set", self.on_spellcheck)
|
||||
|
||||
self.gradient_overlay_switch = self.builder.get_object("gradient_overlay_switch")
|
||||
self.gradient_overlay_switch.set_active(self.settings.get_value("gradient-overlay"))
|
||||
self.gradient_overlay_switch.connect("state-set", self.on_gradient_overlay)
|
||||
|
||||
self.sync_scroll_switch = self.builder.get_object("sync_scroll_switch")
|
||||
self.sync_scroll_switch.set_active(self.settings.get_value("sync-scroll"))
|
||||
self.sync_scroll_switch.connect("state-set", self.on_sync_scroll)
|
||||
|
||||
input_format_store = Gtk.ListStore(int, str)
|
||||
input_format = self.settings.get_string("input-format")
|
||||
input_format_active = 0
|
||||
|
@ -111,30 +99,14 @@ class PreferencesDialog:
|
|||
preferences_window.set_transient_for(window)
|
||||
preferences_window.show()
|
||||
|
||||
def on_dark_mode_auto(self, _, state):
|
||||
self.settings.set_boolean("dark-mode-auto", state)
|
||||
if state and self.dark_mode_switch.get_active():
|
||||
self.dark_mode_switch.set_active(GLib.Variant.new_boolean(False))
|
||||
return False
|
||||
|
||||
def on_dark_mode(self, _, state):
|
||||
self.settings.set_boolean("dark-mode", state)
|
||||
if state and self.dark_mode_auto_switch.get_active():
|
||||
self.dark_mode_auto_switch.set_active(GLib.Variant.new_boolean(False))
|
||||
def on_autohide_headerbar(self, _, state):
|
||||
self.settings.set_boolean("autohide-headerbar", state)
|
||||
return False
|
||||
|
||||
def on_spellcheck(self, _, state):
|
||||
self.settings.set_boolean("spellcheck", state)
|
||||
return False
|
||||
|
||||
def on_gradient_overlay(self, _, state):
|
||||
self.settings.set_boolean("gradient-overlay", state)
|
||||
return False
|
||||
|
||||
def on_sync_scroll(self, _, state):
|
||||
self.settings.set_boolean("sync-scroll", state)
|
||||
return False
|
||||
|
||||
def on_input_format(self, combobox):
|
||||
fmt = self.formats[combobox.get_active()]
|
||||
self.settings.set_string("input-format", fmt["format"])
|
|
@ -4,8 +4,8 @@ import os
|
|||
|
||||
from gi.repository import GLib
|
||||
|
||||
from uberwriter import helpers
|
||||
from uberwriter.theme import Theme
|
||||
from apostrophe import helpers
|
||||
from apostrophe.theme import Theme
|
||||
|
||||
|
||||
class PreviewConverter:
|
|
@ -4,14 +4,14 @@ from enum import auto, IntEnum
|
|||
|
||||
import gi
|
||||
|
||||
from uberwriter.preview_renderer import PreviewRenderer
|
||||
from uberwriter.settings import Settings
|
||||
from apostrophe.preview_renderer import PreviewRenderer
|
||||
from apostrophe.settings import Settings
|
||||
|
||||
gi.require_version('WebKit2', '4.0')
|
||||
from gi.repository import WebKit2, GLib, Gtk
|
||||
|
||||
from uberwriter.preview_converter import PreviewConverter
|
||||
from uberwriter.preview_web_view import PreviewWebView
|
||||
from apostrophe.preview_converter import PreviewConverter
|
||||
from apostrophe.preview_web_view import PreviewWebView
|
||||
|
||||
|
||||
class Step(IntEnum):
|
||||
|
@ -32,16 +32,9 @@ class PreviewHandler:
|
|||
self.web_view = None
|
||||
self.web_view_pending_html = None
|
||||
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_resource(
|
||||
"/de/wolfvollprecht/UberWriter/ui/Preview.ui")
|
||||
preview = builder.get_object("preview")
|
||||
mode_button = builder.get_object("preview_mode_button")
|
||||
self.mode_revealer = builder.get_object("preview_mode_revealer")
|
||||
|
||||
self.preview_converter = PreviewConverter()
|
||||
self.preview_renderer = PreviewRenderer(
|
||||
window, content, editor, text_view, preview, self.mode_revealer, mode_button)
|
||||
window, content, editor, text_view)
|
||||
|
||||
window.connect("style-updated", self.reload)
|
||||
|
||||
|
@ -135,12 +128,6 @@ class PreviewHandler:
|
|||
def update_preview_mode(self):
|
||||
self.preview_renderer.update_mode(self.web_view)
|
||||
|
||||
def get_top_bottom_bar_revealers(self):
|
||||
if self.shown and not self.preview_renderer.window:
|
||||
return [self.mode_revealer]
|
||||
else:
|
||||
return []
|
||||
|
||||
def on_load_changed(self, _web_view, event):
|
||||
if event == WebKit2.LoadEvent.FINISHED:
|
||||
self.loading = False
|
|
@ -2,9 +2,9 @@ from gettext import gettext as _
|
|||
|
||||
from gi.repository import Gtk, Gio, GLib
|
||||
|
||||
from uberwriter import headerbars
|
||||
from uberwriter.settings import Settings
|
||||
from uberwriter.styled_window import StyledWindow
|
||||
from apostrophe import headerbars
|
||||
from apostrophe.settings import Settings
|
||||
from apostrophe.styled_window import StyledWindow
|
||||
|
||||
|
||||
class PreviewRenderer:
|
||||
|
@ -17,16 +17,12 @@ class PreviewRenderer:
|
|||
WINDOWED = 3
|
||||
|
||||
def __init__(
|
||||
self, main_window, content, editor, text_view, preview, mode_revealer, mode_button):
|
||||
self, main_window, content, editor, text_view):
|
||||
self.main_window = main_window
|
||||
self.main_window.connect("delete-event", self.on_window_closed)
|
||||
self.content = content
|
||||
self.editor = editor
|
||||
self.text_view = text_view
|
||||
self.preview = preview
|
||||
self.mode_revealer = mode_revealer
|
||||
self.mode_button = mode_button
|
||||
self.mode_button.connect("clicked", self.show_mode_popover)
|
||||
|
||||
self.settings = Settings.new()
|
||||
self.popover = None
|
||||
|
@ -49,9 +45,6 @@ class PreviewRenderer:
|
|||
headerbar = headerbars.PreviewHeaderbar()
|
||||
self.headerbar = headerbar.hb
|
||||
self.headerbar.set_title(_("Preview"))
|
||||
self.mode_button.get_style_context().remove_class("inline-button")
|
||||
self.mode_revealer.remove(self.mode_button)
|
||||
self.headerbar.pack_end(self.mode_button)
|
||||
self.window.set_titlebar(headerbar.hb_container)
|
||||
|
||||
# Position it next to the main window.
|
||||
|
@ -67,8 +60,7 @@ class PreviewRenderer:
|
|||
self.window.show()
|
||||
|
||||
else:
|
||||
self.preview.pack_start(web_view, True, True, 0)
|
||||
self.content.add(self.preview)
|
||||
self.content.pack_start(web_view, True, True, 0)
|
||||
|
||||
# Full-width preview: swap editor with preview.
|
||||
if self.mode == self.FULL_WIDTH:
|
||||
|
@ -97,17 +89,13 @@ class PreviewRenderer:
|
|||
# Windowed preview: remove preview and destroy window.
|
||||
if self.mode == self.WINDOWED:
|
||||
self.main_window.present()
|
||||
self.headerbar.remove(self.mode_button)
|
||||
self.mode_button.get_style_context().add_class("inline-button")
|
||||
self.mode_revealer.add(self.mode_button)
|
||||
self.headerbar = None
|
||||
self.window.remove(web_view)
|
||||
self.window.destroy()
|
||||
self.window = None
|
||||
|
||||
else:
|
||||
self.preview.remove(web_view)
|
||||
self.content.remove(self.preview)
|
||||
self.content.remove(web_view)
|
||||
|
||||
# Full-width preview: swap preview with editor.
|
||||
if self.mode == self.FULL_WIDTH:
|
||||
|
@ -130,32 +118,6 @@ class PreviewRenderer:
|
|||
self.show(web_view)
|
||||
else:
|
||||
self.mode = mode
|
||||
if self.mode_button:
|
||||
text = self.get_text_for_preview_mode(self.mode)
|
||||
self.mode_button.set_label(text)
|
||||
if self.popover:
|
||||
self.popover.popdown()
|
||||
|
||||
def show_mode_popover(self, button):
|
||||
"""Show preview mode popover."""
|
||||
|
||||
self.mode_button.set_state_flags(Gtk.StateFlags.CHECKED, False)
|
||||
|
||||
menu = Gio.Menu()
|
||||
modes = self.settings.props.settings_schema.get_key("preview-mode").get_range()[1]
|
||||
for i, mode in enumerate(modes):
|
||||
menu_item = Gio.MenuItem.new(self.get_text_for_preview_mode(i), None)
|
||||
menu_item.set_action_and_target_value("app.preview_mode", GLib.Variant.new_string(mode))
|
||||
menu.append_item(menu_item)
|
||||
self.popover = Gtk.Popover.new_from_model(button, menu)
|
||||
self.popover.connect('closed', self.on_popover_closed)
|
||||
self.popover.popup()
|
||||
|
||||
def on_popover_closed(self, _popover):
|
||||
self.mode_button.unset_state_flags(Gtk.StateFlags.CHECKED)
|
||||
|
||||
self.popover = None
|
||||
self.text_view.grab_focus()
|
||||
|
||||
def on_window_closed(self, window, _event):
|
||||
preview_action = window.get_application().lookup_action("preview")
|
|
@ -62,6 +62,8 @@ if (canScroll && isRendered) {{
|
|||
self.connect("load-failed", self.on_load_failed)
|
||||
self.connect("destroy", self.on_destroy)
|
||||
|
||||
self.props.expand = True
|
||||
|
||||
self.scroll_scale = -1
|
||||
|
||||
self.state_loaded = False
|
||||
|
@ -90,6 +92,7 @@ if (canScroll && isRendered) {{
|
|||
if decision_type == WebKit2.PolicyDecisionType.NAVIGATION_ACTION and \
|
||||
decision.get_navigation_action().is_user_gesture():
|
||||
webbrowser.open(decision.get_request().get_uri())
|
||||
decision.ignore() # Do not follow the link in the WebView
|
||||
return True
|
||||
return False
|
||||
|
|
@ -19,20 +19,20 @@ import re
|
|||
|
||||
import gi
|
||||
|
||||
from uberwriter.helpers import user_action
|
||||
from apostrophe.helpers import user_action
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gdk
|
||||
|
||||
# from plugins import plugins
|
||||
|
||||
LOGGER = logging.getLogger('uberwriter')
|
||||
LOGGER = logging.getLogger('apostrophe')
|
||||
|
||||
|
||||
class SearchAndReplace:
|
||||
"""
|
||||
Adds (regex) search and replace functionality to
|
||||
uberwriter
|
||||
apostrophe
|
||||
"""
|
||||
|
||||
def __init__(self, parentwindow, textview, builder):
|
||||
|
@ -152,8 +152,15 @@ class SearchAndReplace:
|
|||
self.active = index % len(self.matches)
|
||||
|
||||
match = self.matches[self.active]
|
||||
|
||||
start_iter = self.textbuffer.get_iter_at_offset(match[0])
|
||||
end_iter = self.textbuffer.get_iter_at_offset(match[1])
|
||||
|
||||
# create a mark at the start of the coincidence to scroll to it
|
||||
mark = self.textbuffer.create_mark(None, start_iter, False)
|
||||
self.textview.scroller.scroll_to_mark(mark, center=True)
|
||||
|
||||
# select coincidence
|
||||
self.textbuffer.select_range(start_iter, end_iter)
|
||||
|
||||
def hide(self):
|
|
@ -18,7 +18,7 @@ from gi.repository import Gio
|
|||
class Settings(Gio.Settings):
|
||||
|
||||
"""
|
||||
UberWriter Settings
|
||||
Apostrophe Settings
|
||||
"""
|
||||
|
||||
def __init__(self):
|
|
@ -23,7 +23,7 @@ from gi.repository import Gtk, Gdk
|
|||
# from plugins import plugins
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger('uberwriter')
|
||||
logger = logging.getLogger('apostrophe')
|
||||
|
||||
class Shelve():
|
||||
"""
|
|
@ -3,7 +3,7 @@ from multiprocessing import Process, Pipe
|
|||
|
||||
from gi.repository import GLib
|
||||
|
||||
from uberwriter.markup_regex import ITALIC, BOLD_ITALIC, BOLD, STRIKETHROUGH, IMAGE, LINK, LINK_ALT,\
|
||||
from apostrophe.markup_regex import ITALIC_ASTERISK, ITALIC_UNDERSCORE, BOLD_ITALIC, BOLD, STRIKETHROUGH, IMAGE, LINK, LINK_ALT,\
|
||||
HORIZONTAL_RULE, LIST, MATH, TABLE, CODE_BLOCK, HEADER_UNDER, HEADER, BLOCK_QUOTE, ORDERED_LIST, \
|
||||
FOOTNOTE_ID, FOOTNOTE
|
||||
|
||||
|
@ -27,7 +27,7 @@ class StatsCounter:
|
|||
|
||||
# List of regexp whose matches should be replaced by their "text" group. Order is important.
|
||||
MARKUP_REGEXP_REPLACE = (
|
||||
BOLD_ITALIC, ITALIC, BOLD, STRIKETHROUGH, IMAGE, LINK, LINK_ALT, LIST, ORDERED_LIST,
|
||||
BOLD_ITALIC, ITALIC_ASTERISK, ITALIC_UNDERSCORE, BOLD, STRIKETHROUGH, IMAGE, LINK, LINK_ALT, LIST, ORDERED_LIST,
|
||||
BLOCK_QUOTE, HEADER, HEADER_UNDER, CODE_BLOCK, TABLE, MATH, FOOTNOTE_ID, FOOTNOTE
|
||||
)
|
||||
|
|
@ -2,8 +2,8 @@ from gettext import gettext as _
|
|||
|
||||
from gi.repository import GLib, Gio, Gtk
|
||||
|
||||
from uberwriter.settings import Settings
|
||||
from uberwriter.stats_counter import StatsCounter
|
||||
from apostrophe.settings import Settings
|
||||
from apostrophe.stats_counter import StatsCounter
|
||||
|
||||
|
||||
class StatsHandler:
|
|
@ -0,0 +1,22 @@
|
|||
import gi
|
||||
|
||||
from apostrophe import helpers
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, GLib, Gio
|
||||
|
||||
|
||||
class StyledWindow(Gtk.ApplicationWindow):
|
||||
"""A window that will redraw itself upon theme changes."""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Set theme css
|
||||
css_provider_file = Gio.File.new_for_uri(
|
||||
"resource:///de/wolfvollprecht/UberWriter/media/css/gtk/base.css")
|
||||
style_provider = Gtk.CssProvider()
|
||||
style_provider.load_from_file(css_provider_file)
|
||||
Gtk.StyleContext.add_provider_for_screen(
|
||||
self.get_screen(), style_provider,
|
||||
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
|
|
@ -1,12 +1,12 @@
|
|||
import gi
|
||||
|
||||
from uberwriter.helpers import user_action
|
||||
from uberwriter.inline_preview import InlinePreview
|
||||
from uberwriter.text_view_drag_drop_handler import DragDropHandler, TARGET_URI, TARGET_TEXT
|
||||
from uberwriter.text_view_format_inserter import FormatInserter
|
||||
from uberwriter.text_view_markup_handler import MarkupHandler
|
||||
from uberwriter.text_view_scroller import TextViewScroller
|
||||
from uberwriter.text_view_undo_redo_handler import UndoRedoHandler
|
||||
from apostrophe.helpers import user_action
|
||||
from apostrophe.inline_preview import InlinePreview
|
||||
from apostrophe.text_view_drag_drop_handler import DragDropHandler, TARGET_URI, TARGET_TEXT
|
||||
from apostrophe.text_view_format_inserter import FormatInserter
|
||||
from apostrophe.text_view_markup_handler import MarkupHandler
|
||||
from apostrophe.text_view_scroller import TextViewScroller
|
||||
from apostrophe.text_view_undo_redo_handler import UndoRedoHandler
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
gi.require_version('Gspell', '1')
|
||||
|
@ -14,11 +14,11 @@ from gi.repository import Gtk, Gdk, GObject, GLib, Gspell
|
|||
|
||||
import logging
|
||||
|
||||
LOGGER = logging.getLogger('uberwriter')
|
||||
LOGGER = logging.getLogger('apostrophe')
|
||||
|
||||
|
||||
class TextView(Gtk.TextView):
|
||||
"""UberwriterTextView encapsulates all the features around the editor.
|
||||
"""ApostropheTextView encapsulates all the features around the editor.
|
||||
|
||||
It combines the following:
|
||||
- Undo / redo (via TextBufferUndoRedoHandler)
|
||||
|
@ -27,7 +27,7 @@ class TextView(Gtk.TextView):
|
|||
- Preview popover (via TextBufferMarkupHandler)
|
||||
- Drag and drop (via TextViewDragDropHandler)
|
||||
- Scrolling (via TextViewScroller)
|
||||
- The various modes supported by UberWriter (eg. Focus Mode, Hemingway Mode)
|
||||
- The various modes supported by Apostrophe (eg. Focus Mode, Hemingway Mode)
|
||||
"""
|
||||
|
||||
__gsignals__ = {
|
||||
|
@ -52,7 +52,10 @@ class TextView(Gtk.TextView):
|
|||
self.set_pixels_above_lines(4)
|
||||
self.set_pixels_below_lines(4)
|
||||
self.set_pixels_inside_wrap(8)
|
||||
self.get_style_context().add_class('uberwriter-editor')
|
||||
self.get_style_context().add_class('apostrophe-editor')
|
||||
|
||||
self.set_margin_left(8)
|
||||
self.set_margin_right(8)
|
||||
|
||||
# Text sizing
|
||||
self.props.halign = Gtk.Align.FILL
|
||||
|
@ -110,7 +113,7 @@ class TextView(Gtk.TextView):
|
|||
|
||||
# Hemingway mode
|
||||
self.hemingway_mode = False
|
||||
self.connect('key-press-event', self.on_key_press_event)
|
||||
self.connect('key-press-event', self._on_key_press_event)
|
||||
|
||||
# While resizing the TextView, there is unwanted scroll upwards if a top margin is present.
|
||||
# When a size allocation is detected, this variable will hold the scroll to re-set until the
|
||||
|
@ -144,7 +147,6 @@ class TextView(Gtk.TextView):
|
|||
|
||||
def on_size_allocate(self, *_):
|
||||
self.update_horizontal_margin()
|
||||
self.update_vertical_margin()
|
||||
self.markup.update_margins_indents()
|
||||
self.queue_draw()
|
||||
|
||||
|
@ -192,14 +194,14 @@ class TextView(Gtk.TextView):
|
|||
self.frozen_scroll_scale = None
|
||||
self.queue_draw()
|
||||
|
||||
def set_focus_mode(self, focus_mode):
|
||||
def set_focus_mode(self, focus_mode, hb_height):
|
||||
"""Toggle focus mode.
|
||||
|
||||
When in focus mode, the cursor sits in the middle of the text view,
|
||||
and the surrounding text is greyed out."""
|
||||
|
||||
self.focus_mode = focus_mode
|
||||
self.update_vertical_margin()
|
||||
self.update_vertical_margin(hb_size=hb_height)
|
||||
self.markup.apply()
|
||||
self.smooth_scroll_to()
|
||||
self.set_spellcheck(self.spellcheck)
|
||||
|
@ -227,13 +229,14 @@ class TextView(Gtk.TextView):
|
|||
self.props.left_margin = horizontal_margin
|
||||
self.props.right_margin = horizontal_margin
|
||||
|
||||
def update_vertical_margin(self):
|
||||
def update_vertical_margin(self, top_margin=0, hb_size=0):
|
||||
if self.focus_mode:
|
||||
height = self.get_allocation().height
|
||||
self.props.top_margin = height / 2
|
||||
self.props.bottom_margin = height / 2
|
||||
height = self.get_allocation().height + top_margin + hb_size
|
||||
|
||||
self.props.top_margin = height / 2 + top_margin
|
||||
self.props.bottom_margin = height / 2 - top_margin
|
||||
else:
|
||||
self.props.top_margin = 80
|
||||
self.props.top_margin = 80 + top_margin
|
||||
self.props.bottom_margin = 64
|
||||
|
||||
def set_hemingway_mode(self, hemingway_mode):
|
||||
|
@ -243,12 +246,6 @@ class TextView(Gtk.TextView):
|
|||
|
||||
self.hemingway_mode = hemingway_mode
|
||||
|
||||
def on_key_press_event(self, _widget, event):
|
||||
if self.hemingway_mode:
|
||||
return event.keyval == Gdk.KEY_BackSpace or event.keyval == Gdk.KEY_Delete
|
||||
else:
|
||||
return False
|
||||
|
||||
def clear(self):
|
||||
"""Clear text and undo history"""
|
||||
|
||||
|
@ -285,3 +282,23 @@ class TextView(Gtk.TextView):
|
|||
"""Returns the font width for a given size. Note: specific to Fira Mono!"""
|
||||
|
||||
return font_size * 1 / 1.6
|
||||
|
||||
def _on_key_press_event(self, _widget, event):
|
||||
if self.hemingway_mode:
|
||||
return event.keyval == Gdk.KEY_BackSpace or event.keyval == Gdk.KEY_Delete
|
||||
|
||||
if event.state & Gdk.ModifierType.SHIFT_MASK == Gdk.ModifierType.SHIFT_MASK \
|
||||
and event.keyval == Gdk.KEY_ISO_Left_Tab: # Capure Shift-Tab
|
||||
self._on_shift_tab()
|
||||
return True
|
||||
|
||||
def _on_shift_tab(self):
|
||||
"""Delete last character if it is a tab"""
|
||||
text_buffer = self.get_buffer()
|
||||
pen_iter = text_buffer.get_end_iter()
|
||||
pen_iter.backward_char()
|
||||
end_iter = text_buffer.get_end_iter()
|
||||
|
||||
if pen_iter.get_char() == "\t":
|
||||
with user_action(text_buffer):
|
||||
text_buffer.delete(pen_iter, end_iter)
|
|
@ -0,0 +1,92 @@
|
|||
import mimetypes
|
||||
import urllib
|
||||
from gettext import gettext as _
|
||||
from os.path import basename
|
||||
from apostrophe.settings import Settings
|
||||
|
||||
from gi.repository import Gtk
|
||||
|
||||
(TARGET_URI, TARGET_TEXT) = range(2)
|
||||
|
||||
|
||||
class DragDropHandler:
|
||||
TARGET_URI = None
|
||||
|
||||
def __init__(self, text_view, *targets):
|
||||
super().__init__()
|
||||
|
||||
self.settings = Settings.new()
|
||||
|
||||
self.target_list = Gtk.TargetList.new([])
|
||||
if TARGET_URI in targets:
|
||||
self.target_list.add_uri_targets(TARGET_URI)
|
||||
if TARGET_TEXT in targets:
|
||||
self.target_list.add_text_targets(TARGET_TEXT)
|
||||
|
||||
text_view.drag_dest_set_target_list(self.target_list)
|
||||
text_view.connect_after('drag-data-received', self.on_drag_data_received)
|
||||
|
||||
def on_drag_data_received(self, text_view, drag_context, _x, _y, data, info, time):
|
||||
"""Handle drag and drop events"""
|
||||
|
||||
text_buffer = text_view.get_buffer()
|
||||
|
||||
if info == TARGET_URI:
|
||||
uris = data.get_uris()
|
||||
for uri in uris:
|
||||
name = basename(urllib.parse.unquote_plus(uri))
|
||||
mime = mimetypes.guess_type(uri)
|
||||
|
||||
if mime[0] is not None and mime[0].startswith('image/'):
|
||||
basepath = self.settings.get_string("open-file-path")
|
||||
basepath = urllib.parse.quote(basepath)
|
||||
|
||||
if uri.startswith("file://"):
|
||||
uri = uri[7:]
|
||||
|
||||
# for handling local URIs we need to substract the basepath
|
||||
# except when it is "/" (document not saved)
|
||||
if uri.startswith(basepath) and basepath != "/":
|
||||
uri = uri[len(basepath)+1:]
|
||||
|
||||
text = "![{}]({})".format(name, uri)
|
||||
limit_left = 2
|
||||
limit_right = len(name)
|
||||
else:
|
||||
text = "[{}]({})".format(name, uri)
|
||||
limit_left = 1
|
||||
limit_right = len(name)
|
||||
|
||||
elif info == TARGET_TEXT:
|
||||
text = data.get_text()
|
||||
|
||||
# delete automatically added DnD text
|
||||
insert_mark = text_buffer.get_insert()
|
||||
cursor_iter_r = text_buffer.get_iter_at_mark(insert_mark)
|
||||
cursor_iter_l = cursor_iter_r.copy()
|
||||
cursor_iter_l.backward_chars(len(data.get_text()))
|
||||
|
||||
text_buffer.delete(cursor_iter_l, cursor_iter_r)
|
||||
|
||||
if text.startswith(("http://", "https://", "www.")):
|
||||
text = "[{}]({})".format(_("web page"), text)
|
||||
limit_left = 1
|
||||
limit_right = len(_("web page"))
|
||||
else:
|
||||
limit_left = 0
|
||||
limit_right = 0
|
||||
|
||||
text_buffer.place_cursor(text_buffer.get_iter_at_mark(
|
||||
text_buffer.get_mark('gtk_drag_target')))
|
||||
text_buffer.insert_at_cursor(text)
|
||||
insert_mark = text_buffer.get_insert()
|
||||
selection_bound = text_buffer.get_selection_bound()
|
||||
cursor_iter = text_buffer.get_iter_at_mark(insert_mark)
|
||||
cursor_iter.backward_chars(len(text) - limit_left)
|
||||
text_buffer.move_mark(insert_mark, cursor_iter)
|
||||
cursor_iter.forward_chars(limit_right)
|
||||
text_buffer.move_mark(selection_bound, cursor_iter)
|
||||
|
||||
Gtk.drag_finish(drag_context, True, True, time)
|
||||
text_view.get_toplevel().present_with_time(time)
|
||||
return False
|
|
@ -1,6 +1,6 @@
|
|||
from gettext import gettext as _
|
||||
|
||||
from uberwriter.helpers import user_action
|
||||
from apostrophe.helpers import user_action
|
||||
|
||||
|
||||
class FormatInserter:
|
|
@ -19,8 +19,8 @@ from multiprocessing import Pipe, Process
|
|||
|
||||
import gi
|
||||
|
||||
from uberwriter import helpers, markup_regex
|
||||
from uberwriter.markup_regex import STRIKETHROUGH, BOLD_ITALIC, BOLD, ITALIC, IMAGE, LINK,\
|
||||
from apostrophe import helpers, markup_regex
|
||||
from apostrophe.markup_regex import STRIKETHROUGH, BOLD_ITALIC, BOLD, ITALIC_ASTERISK, ITALIC_UNDERSCORE, IMAGE, LINK,\
|
||||
LINK_ALT, HORIZONTAL_RULE, LIST, ORDERED_LIST, BLOCK_QUOTE, HEADER, HEADER_UNDER, TABLE, MATH, \
|
||||
CODE
|
||||
|
||||
|
@ -186,7 +186,8 @@ class MarkupHandler:
|
|||
# - "$math$" (colorize)
|
||||
# - "---" table (wrap/pixels)
|
||||
regexps = (
|
||||
(ITALIC, self.TAG_NAME_ITALIC),
|
||||
(ITALIC_ASTERISK, self.TAG_NAME_ITALIC),
|
||||
(ITALIC_UNDERSCORE, self.TAG_NAME_ITALIC),
|
||||
(BOLD, self.TAG_NAME_BOLD),
|
||||
(BOLD_ITALIC, self.TAG_NAME_BOLD_ITALIC),
|
||||
(STRIKETHROUGH, self.TAG_NAME_STRIKETHROUGH),
|
|
@ -1,6 +1,6 @@
|
|||
import logging
|
||||
|
||||
LOGGER = logging.getLogger('uberwriter')
|
||||
LOGGER = logging.getLogger('apostrophe')
|
||||
|
||||
|
||||
class UndoableInsert:
|
|
@ -1,7 +1,7 @@
|
|||
from gi.repository import Gtk
|
||||
|
||||
from uberwriter.settings import Settings
|
||||
from uberwriter.helpers import get_css_path
|
||||
from apostrophe.settings import Settings
|
||||
from apostrophe.helpers import get_css_path
|
||||
|
||||
|
||||
class Theme:
|
||||
|
@ -31,10 +31,9 @@ class Theme:
|
|||
@classmethod
|
||||
def get_current_changed(cls):
|
||||
theme_name = Gtk.Settings.get_default().get_property('gtk-theme-name')
|
||||
dark_mode_auto = cls.settings.get_boolean('dark-mode-auto')
|
||||
dark_mode = cls.settings.get_boolean('dark-mode')
|
||||
current_theme = cls.get_for_name(theme_name)
|
||||
if not dark_mode_auto and dark_mode != current_theme.is_dark and current_theme.inverse_name:
|
||||
if dark_mode != current_theme.is_dark and current_theme.inverse_name:
|
||||
current_theme = cls.get_for_name(current_theme.inverse_name, current_theme.name)
|
||||
changed = current_theme != cls.previous
|
||||
cls.previous = current_theme
|
||||
|
@ -56,11 +55,11 @@ class Theme:
|
|||
defaultThemes = [
|
||||
# https://gitlab.gnome.org/GNOME/gtk/tree/master/gtk/theme/Adwaita
|
||||
Theme('Adwaita', get_css_path('web/adwaita.css'), False, 'Adwaita-dark'),
|
||||
Theme('Adwaita-dark', get_css_path('web/adwaita_dark.css'), True, 'Adwaita'),
|
||||
Theme('Adwaita-dark', get_css_path('web/adwaita.css'), True, 'Adwaita'),
|
||||
# https://github.com/NicoHood/arc-theme/tree/master/common/gtk-3.0/3.20/sass
|
||||
Theme('Arc', get_css_path('web/arc.css'), False, 'Arc-Dark'),
|
||||
Theme('Arc-Darker', get_css_path('web/arc_darker.css'), False, 'Arc-Dark'),
|
||||
Theme('Arc-Dark', get_css_path('web/arc_dark.css'), True, 'Arc'),
|
||||
Theme('Arc-Darker', get_css_path('web/arc.css'), False, 'Arc-Dark'),
|
||||
Theme('Arc-Dark', get_css_path('web/arc.css'), True, 'Arc'),
|
||||
# https://gitlab.gnome.org/GNOME/gtk/tree/master/gtk/theme/HighContrast
|
||||
Theme('HighContrast', get_css_path('web/highcontrast.css'), False, 'HighContrastInverse'),
|
||||
Theme('HighContrastInverse', get_css_path('web/highcontrast_inverse.css'), True, 'HighContrast')
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"app-id": "de.wolfvollprecht.UberWriter",
|
||||
"runtime": "org.gnome.Platform",
|
||||
"runtime-version": "3.34",
|
||||
"runtime-version": "3.36",
|
||||
"sdk": "org.gnome.Sdk",
|
||||
"command": "uberwriter",
|
||||
"finish-args": [
|
||||
|
@ -26,8 +26,8 @@
|
|||
"name":"gspell",
|
||||
"sources":[{
|
||||
"type":"archive",
|
||||
"url":"https://download.gnome.org/sources/gspell/1.8/gspell-1.8.1.tar.xz",
|
||||
"sha256":"819a1d23c7603000e73f5e738bdd284342e0cd345fb0c7650999c31ec741bbe5"
|
||||
"url":"https://download.gnome.org/sources/gspell/1.8/gspell-1.8.3.tar.xz",
|
||||
"sha256":"5ae514dd0216be069176accf6d0049d6a01cfa6a50df4bc06be85f7080b62de8"
|
||||
}]
|
||||
},
|
||||
{
|
||||
|
@ -42,8 +42,8 @@
|
|||
],
|
||||
"sources": [{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/jgm/pandoc/releases/download/2.2/pandoc-2.2-linux.tar.gz",
|
||||
"sha256": "06ecd882e42ef9b7390b1c82e1e71b3ea48679181289b9b810a8797825bed8ed"
|
||||
"url": "https://github.com/jgm/pandoc/releases/download/2.9.2/pandoc-2.9.2-linux-amd64.tar.gz",
|
||||
"sha256": "039f155b6166c1e268479bcb06af2dba99eb7795cbff7b3c13b4875388195d08"
|
||||
}]
|
||||
},
|
||||
{
|
||||
|
@ -54,13 +54,13 @@
|
|||
],
|
||||
"sources": [{
|
||||
"type": "file",
|
||||
"url": "https://files.pythonhosted.org/packages/5d/c1/45947333669b31bc6b4933308dd07c2aa2fedcec0a95b14eedae993bd449/wheel-0.31.0.tar.gz",
|
||||
"sha256": "1ae8153bed701cb062913b72429bcf854ba824f973735427681882a688cb55ce"
|
||||
"url": "https://files.pythonhosted.org/packages/75/28/521c6dc7fef23a68368efefdcd682f5b3d1d58c2b90b06dc1d0b805b51ae/wheel-0.34.2.tar.gz",
|
||||
"sha256": "8788e9155fe14f54164c1b9eb0a319d98ef02c160725587ad60f14ddc57b6f96"
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"url": "https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz",
|
||||
"sha256": "f2bd08e0cd1b06e10218feaf6fef299f473ba706582eb3bd9d52203fdbd7ee68"
|
||||
"url": "https://files.pythonhosted.org/packages/8e/76/66066b7bc71817238924c7e4b448abdb17eb0c92d645769c223f9ace478f/pip-20.0.2.tar.gz",
|
||||
"sha256": "7db0c8ea4c7ea51c8049640e8e6e7fde949de672bfa4949920675563a5a6967f"
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
|
@ -69,13 +69,13 @@
|
|||
},
|
||||
{
|
||||
"type": "file",
|
||||
"url": "https://files.pythonhosted.org/packages/a2/51/c39562cfed3272592c60cfd229e5464d715b78537e332eac2b695422dc49/regex-2018.02.21.tar.gz",
|
||||
"sha256": "b44624a38d07d3c954c84ad302c29f7930f4bf01443beef5589e9157b14e2a29"
|
||||
"url": "https://files.pythonhosted.org/packages/e8/76/8ac7f467617b9cfbafcef3c76df6f22b15de654a62bea719792b00a83195/regex-2020.2.20.tar.gz",
|
||||
"sha256": "9e9624440d754733eddbcd4614378c18713d2d9d0dc647cf9c72f64e39671be5"
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"url": "https://files.pythonhosted.org/packages/9e/54/04d88a59efa33fefb88133ceb638cdf754319030c28aadc5a379d82140ed/pyenchant-2.0.0.tar.gz",
|
||||
"sha256": "fc31cda72ace001da8fe5d42f11c26e514a91fa8c70468739216ddd8de64e2a0"
|
||||
"url": "https://files.pythonhosted.org/packages/14/4b/6f7a3f2bb1e2fa4d3007126578cae0b9910ff46c4957bef5bd4b92733011/pyenchant-3.0.1.tar.gz",
|
||||
"sha256": "1bd26a644abf80196a9de3f2d820ebafb7e7f78385e392ce77cb1552f164d559"
|
||||
}]
|
||||
},
|
||||
{
|
||||
|
@ -94,6 +94,9 @@
|
|||
{
|
||||
"name": "uberwriter",
|
||||
"buildsystem": "meson",
|
||||
"config-opts" : [
|
||||
"-Dprofile=development"
|
||||
],
|
||||
"sources": [{
|
||||
"type" : "dir",
|
||||
"path" : "../../"
|
||||
|
|
|
@ -1,121 +0,0 @@
|
|||
{
|
||||
"id": "de.wolfvollprecht.UberWriter.Plugin.WebPhoto",
|
||||
"runtime": "de.wolfvollprecht.UberWriter",
|
||||
"branch": "stable",
|
||||
"sdk": "org.gnome.Sdk//3.32",
|
||||
"build-extension": true,
|
||||
"separate-locales": false,
|
||||
"appstream-compose": false,
|
||||
"finish-args": [
|
||||
],
|
||||
"build-options" : {
|
||||
"prefix": "/app/extensions/WebPhoto",
|
||||
"env": {
|
||||
"PATH": "/app/extensions/TexLive/bin:/app/extensions/TexLive/2018/bin/x86_64-linux:/app/bin:/usr/bin"
|
||||
}
|
||||
},
|
||||
"cleanup": [],
|
||||
"modules": [
|
||||
{
|
||||
"name": "Glib2",
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "http://ftp.gnome.org/pub/gnome/sources/glib/2.56/glib-2.56.1.tar.xz",
|
||||
"sha256": "40ef3f44f2c651c7a31aedee44259809b6f03d3d20be44545cd7d177221c0b8d"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "LibIDL",
|
||||
"buildsystem": "autotools",
|
||||
"sources": [
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/GNOME/libIDL/",
|
||||
"tag": "LIBIDL_0_8_14",
|
||||
"commit": "666fcbf086fb859738b67417c99a9895bb3d8ce5"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ORBit2",
|
||||
"rm-configure": true,
|
||||
"config-opts": ["--prefix=/app/extensions/WebPhoto"],
|
||||
"build-options": {
|
||||
"env":{
|
||||
"PKG_CONFIG_PATH": "/app/extensions/WebPhoto/lib/pkgconfig",
|
||||
"GNOME2_DIR": "/app/extensions/WebPhoto",
|
||||
"LD_LIBRARY_PATH": "/app/extensions/WebPhoto/lib",
|
||||
"PATH": "/app/extensions/WebPhoto/bin:/usr/bin"
|
||||
}
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "http://ftp.gnome.org/pub/gnome/sources/ORBit2/2.14/ORBit2-2.14.19.tar.bz2",
|
||||
"sha256": "55c900a905482992730f575f3eef34d50bda717c197c97c08fa5a6eafd857550"
|
||||
},
|
||||
{
|
||||
"type": "patch",
|
||||
"path": "ORBit2.patch"
|
||||
},
|
||||
{
|
||||
"type": "script",
|
||||
"dest-filename": "autogen.sh",
|
||||
"commands": [
|
||||
"autoreconf -fi"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gconf",
|
||||
"buildsystem": "autotools",
|
||||
"config-opts": ["--prefix=/app/extensions/WebPhoto"],
|
||||
"build-options": {
|
||||
"env":{
|
||||
"PKG_CONFIG_PATH": "/app/extensions/WebPhoto/lib/pkgconfig",
|
||||
"GNOME2_DIR": "/app/extensions/WebPhoto",
|
||||
"LD_LIBRARY_PATH": "/app/extensions/WebPhoto/lib",
|
||||
"PATH": "/app/extensions/WebPhoto/bin:/usr/bin"
|
||||
}
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "http://ftp.gnome.org/pub/GNOME/sources/GConf/3.2/GConf-3.2.6.tar.xz",
|
||||
"sha256": "1912b91803ab09a5eed34d364bf09fe3a2a9c96751fde03a4e0cfa51a04d784c"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gnome-web-photo",
|
||||
"buildsystem": "autotools",
|
||||
"config-opts": [
|
||||
"--with-gtk=3.0",
|
||||
"--prefix=/app/extensions/WebPhoto"
|
||||
],
|
||||
"build-options": {
|
||||
"env":{
|
||||
"LD_LIBRARY_PATH": "/app/extensions/WebPhoto/lib",
|
||||
"PATH": "/app/bin:/app/extensions/WebPhoto/bin:/usr/bin",
|
||||
"ACLOCAL_PATH": "/app/extensions/WebPhoto/share/aclocal"
|
||||
}
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/GNOME/gnome-web-photo/",
|
||||
"tag": "0.10.6",
|
||||
"commit": "827d6b98c120b4dd8d689a1faf52450685ca6d46"
|
||||
},
|
||||
{
|
||||
"type": "patch",
|
||||
"path": "GnomeWebPhoto.patch"
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,15 +1,20 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="/de/wolfvollprecht/UberWriter/">
|
||||
<file compressed="true" alias="icons/scalable/status/preview-layout-full-width-symbolic.svg">media/icons/preview-layout-full-width-symbolic.svg</file>
|
||||
<file compressed="true" alias="icons/scalable/status/preview-layout-half-width-symbolic.svg">media/icons/preview-layout-half-width-symbolic.svg</file>
|
||||
<file compressed="true" alias="icons/scalable/status/preview-layout-windowed-symbolic.svg">media/icons/preview-layout-windowed-symbolic.svg</file>
|
||||
<file compressed="true" alias="icons/scalable/status/preview-layout-half-height-symbolic.svg">media/icons/preview-layout-half-height-symbolic.svg</file>
|
||||
<file compressed="true">media/css/gtk/base.css</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Export.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/ExportPopover.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Menu.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Preferences.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Preview.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Recents.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Shortcuts.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Window.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/Headerbar.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">ui/PreviewLayoutSwitcherItem.ui</file>
|
||||
<file compressed="true" preprocess="xml-stripblanks">About.ui</file>
|
||||
</gresource>
|
||||
</gresources>
|
|
@ -2,36 +2,56 @@
|
|||
<component type="desktop-application">
|
||||
<id>@app-id@</id>
|
||||
<launchable type="desktop-id">@app-id@.desktop</launchable>
|
||||
<name>UberWriter</name>
|
||||
<summary>An elegant, free distraction GTK+ markdown editor</summary>
|
||||
<name>Apostrophe</name>
|
||||
<summary>An elegant, distraction-free GTK markdown editor</summary>
|
||||
<description>
|
||||
<p>Uberwriter is a GTK+ based distraction free Markdown editor, mainly developed by Wolf Vollprecht and Manuel Genovés. It uses pandoc as backend for markdown parsing and offers a very clean and sleek user interface.</p>
|
||||
<p>Apostrophe is a GTK based distraction free Markdown editor, originally created by Wolf Vollprecht and maintained by Manuel Genovés. It uses pandoc as backend for markdown parsing and offers a very clean and sleek user interface.</p>
|
||||
<p>You can install the recommended TexLive extension with the command:</p>
|
||||
<p>flatpak install flathub de.wolfvollprecht.UberWriter.Plugin.TexLive</p>
|
||||
<p>or from Gnome-Software</p>
|
||||
</description>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/uberwriter/master/screenshots/main.png</image>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/apostrophe/master/screenshots/main.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/uberwriter/master/screenshots/main-dark.png</image>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/apostrophe/master/screenshots/main-dark.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/uberwriter/master/screenshots/formula.png</image>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/apostrophe/master/screenshots/formula.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/uberwriter/master/screenshots/preview.png</image>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/apostrophe/master/screenshots/preview.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/uberwriter/master/screenshots/focus.png</image>
|
||||
<image type="source">https://raw.githubusercontent.com/UberWriter/apostrophe/master/screenshots/focus.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release date="2019-04-17" version="2.2.0-beta1">
|
||||
<release date="2020-03-19" version="2.2.0">
|
||||
<description>
|
||||
<p>UI/UX/Functionality</p>
|
||||
<ul>
|
||||
<li>...</li>
|
||||
<li>New headerbar design</li>
|
||||
<li>New preview modes, with the option to sync them to the edit view</li>
|
||||
<li>New preview mode selector</li>
|
||||
<li>New theme selector</li>
|
||||
<li>Rework the autohiding mechanism; now the headerbar fades away when typing, only to reappear when the cursor moves to the top portion of the window</li>
|
||||
<li>Now the content of the texview goes visually bellow the headerbar</li>
|
||||
<li>Overall better styling</li>
|
||||
<li>Added Hemingway mode, which disables the backspace key</li>
|
||||
<li>Added Github Flavoured Markdow, MultiMarkdown, Pandoc's Markdown and Commonmark support, being CommonMark the default from now on</li>
|
||||
<li>New stats counter, with the option to show count of characters/words/sentences/paragrafs/reading time</li>
|
||||
<li>Better handling of DnD events</li>
|
||||
<li>Export to A4 by default</li>
|
||||
</ul>
|
||||
<p>Technical improvements</p>
|
||||
<ul>
|
||||
<li>Port of the buildsystem to Meson. Now you can hit the "build" button on Builder and everything works as expected</li>
|
||||
<li>Port to gspell</li>
|
||||
<li>Partial port to gresources</li>
|
||||
<li>Overall refactorization of the codebase</li>
|
||||
<li>General bugfixes and improvements</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
|
@ -39,7 +59,7 @@
|
|||
<description>
|
||||
<ul>
|
||||
<li>Added italian language</li>
|
||||
<li>Initial themes support: now uberwriter adapts his colors to the current GTK theme</li>
|
||||
<li>Initial themes support: now apostrophe adapts his colors to the current GTK theme</li>
|
||||
<li>Disabled scroll gradient, can be enabled in the preferences dialog</li>
|
||||
<li>Allow to disable headerbar autohidding in Dconf</li>
|
||||
<li>Now a single click is enough to open files in the recent files popover</li>
|
||||
|
@ -61,7 +81,7 @@
|
|||
</release>
|
||||
<release date="2018-07-27" version="2.1.2">
|
||||
<description>
|
||||
<p>This release provides a fix to a bug that caused Uberwriter to not mark properly **bold**, *cursive*, and ***bold and cursive*** words.</p>
|
||||
<p>This release provides a fix to a bug that caused Apostrophe to not mark properly **bold**, *cursive*, and ***bold and cursive*** words.</p>
|
||||
</description>
|
||||
</release>
|
||||
<release date="2018-07-26" version="2.1.1">
|
||||
|
@ -115,12 +135,12 @@
|
|||
</releases>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0+</project_license>
|
||||
<url type="homepage">http://uberwriter.github.io/uberwriter</url>
|
||||
<url type="homepage">http://apostrophe.github.io/apostrophe</url>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<developer_name>Wolf V., Manuel G.</developer_name>
|
||||
<url type="bugtracker">https://github.com/UberWriter/uberwriter/issues</url>
|
||||
<url type="donation">https://liberapay.com/UberWriter/donate</url>
|
||||
<url type="help">http://uberwriter.github.io/uberwriter</url>
|
||||
<url type="bugtracker">https://github.com/Apostrophe/apostrophe/issues</url>
|
||||
<url type="donation">https://liberapay.com/Apostrophe/donate</url>
|
||||
<url type="help">http://apostrophe.github.io/apostrophe</url>
|
||||
<url type="translate">https://poeditor.com/join/project/gxVzFyXb2x</url>
|
||||
<update_contact>manuel.genoves_at_gmail.com</update_contact>
|
||||
<translation type="gettext">@gettext-package@</translation>
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
[Desktop Entry]
|
||||
Name=UberWriter
|
||||
Comment=UberWriter, a simple and distraction free Markdown Editor
|
||||
Name=Apostrophe
|
||||
# Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
|
||||
Keywords=uberwriter;UberWriter;apostrophe;markdown;editor;
|
||||
Comment=Apostrophe, a simple and distraction free Markdown Editor
|
||||
Categories=GNOME;GTK;Office;
|
||||
Exec=uberwriter %U
|
||||
Exec=apostrophe %U
|
||||
Icon=@icon@
|
||||
Terminal=false
|
||||
Type=Application
|
||||
|
|
|
@ -18,17 +18,9 @@
|
|||
</enum>
|
||||
|
||||
<schema path="/de/wolfvollprecht/UberWriter/" id="de.wolfvollprecht.UberWriter">
|
||||
|
||||
<key name='dark-mode-auto' type='b'>
|
||||
<default>true</default>
|
||||
<summary>Set dark mode automatically</summary>
|
||||
<description>
|
||||
Whether dark mode depends on the system theme, or is set to what the user specifies.
|
||||
</description>
|
||||
</key>
|
||||
<key name='dark-mode' type='b'>
|
||||
<default>false</default>
|
||||
<summary>Force dark mode</summary>
|
||||
<summary>Use dark mode</summary>
|
||||
<description>
|
||||
Enable or disable the dark mode.
|
||||
</description>
|
||||
|
@ -40,14 +32,6 @@
|
|||
Enable or disable spellchecking.
|
||||
</description>
|
||||
</key>
|
||||
<key name='gradient-overlay' type='b'>
|
||||
<default>false</default>
|
||||
<summary>Draw scroll gradient</summary>
|
||||
<description>
|
||||
Show a gradient overlay over the text at the top anf bottom of the window.
|
||||
It can cause performance problems to some users.
|
||||
</description>
|
||||
</key>
|
||||
<key name='sync-scroll' type='b'>
|
||||
<default>true</default>
|
||||
<summary>Synchronize editor/preview scrolling</summary>
|
||||
|
@ -62,11 +46,11 @@
|
|||
Input format to use when previewing and exporting using Pandoc.
|
||||
</description>
|
||||
</key>
|
||||
<key name='poll-motion' type='b'>
|
||||
<key name='autohide-headerbar' type='b'>
|
||||
<default>true</default>
|
||||
<summary>Allow Uberwriter to poll cursor motion</summary>
|
||||
<summary>Autohide Headerbar</summary>
|
||||
<description>
|
||||
Hide the header and status bars if the cursor is not moving.
|
||||
Hide the header and status bars when typing.
|
||||
</description>
|
||||
</key>
|
||||
<key name='open-file-path' type='s'>
|
||||
|
|
|
@ -0,0 +1,211 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128px" height="128px" viewBox="0 0 128 128" version="1.1">
|
||||
<defs>
|
||||
<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="11.999994" y1="254" x2="116" y2="254" gradientTransform="matrix(1.076923,0,0,1.066667,-4.428073,-187.428352)">
|
||||
<stop offset="0" style="stop-color:rgb(60.392159%,60.000002%,58.823532%);stop-opacity:1;"/>
|
||||
<stop offset="0.0384616" style="stop-color:rgb(75.294119%,74.901962%,73.725492%);stop-opacity:1;"/>
|
||||
<stop offset="0.0769231" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
<stop offset="0.923077" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
<stop offset="0.961538" style="stop-color:rgb(75.294119%,74.901962%,73.725492%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(60.392159%,60.000002%,58.823532%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear1" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,233.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear2" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,309.495007,64.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear3" gradientUnits="userSpaceOnUse" x1="17" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,257.495007,64.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(68.235296%,67.843139%,67.058825%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(80.784315%,80.000001%,78.431374%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear4" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,253.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear5" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,273.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear6" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,293.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear7" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,313.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear8" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,243.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear9" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,263.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear10" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,283.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear11" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,313.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(90.196079%,38.039216%,0%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(100%,47.058824%,0%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear12" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,237.495007,64.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear13" gradientUnits="userSpaceOnUse" x1="11.999994" y1="254" x2="116" y2="254" gradientTransform="matrix(1.076923,0,0,1.066667,-4.428073,-187.428352)">
|
||||
<stop offset="0" style="stop-color:rgb(60.392159%,60.000002%,58.823532%);stop-opacity:1;"/>
|
||||
<stop offset="0.0384616" style="stop-color:rgb(75.294119%,74.901962%,73.725492%);stop-opacity:1;"/>
|
||||
<stop offset="0.0769231" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
<stop offset="0.923077" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
<stop offset="0.961538" style="stop-color:rgb(75.294119%,74.901962%,73.725492%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(60.392159%,60.000002%,58.823532%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear14" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,233.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear15" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,309.495007,64.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear16" gradientUnits="userSpaceOnUse" x1="17" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,257.495007,64.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(68.235296%,67.843139%,67.058825%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(80.784315%,80.000001%,78.431374%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear17" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,253.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear18" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,273.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear19" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,293.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear20" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,313.495007,20.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear21" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,243.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear22" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,263.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear23" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,283.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear24" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,313.495007,42.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(90.196079%,38.039216%,0%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(100%,47.058824%,0%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear25" gradientUnits="userSpaceOnUse" x1="19" y1="209" x2="31" y2="209" gradientTransform="matrix(0.000000000000000061,1,-1,0.000000000000000061,237.495007,64.504974)">
|
||||
<stop offset="0" style="stop-color:rgb(36.862746%,36.078432%,39.215687%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(46.666667%,46.27451%,48.235294%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip2">
|
||||
<rect x="0" y="0" width="128" height="128"/>
|
||||
</clipPath>
|
||||
<g id="surface50195" clip-path="url(#clip2)">
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear13);" d="M 16.496094 51.503906 L 112.496094 51.503906 C 116.914062 51.503906 120.496094 55.085938 120.496094 59.503906 L 120.496094 107.503906 C 120.496094 111.921875 116.914062 115.503906 112.496094 115.503906 L 16.496094 115.503906 C 12.078125 115.503906 8.496094 111.921875 8.496094 107.503906 L 8.496094 59.503906 C 8.496094 55.085938 12.078125 51.503906 16.496094 51.503906 Z M 16.496094 51.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 16.496094 27.503906 L 112.496094 27.503906 C 116.914062 27.503906 120.496094 31.464844 120.496094 36.347656 L 120.496094 102.664062 C 120.496094 107.546875 116.914062 111.503906 112.496094 111.503906 L 16.496094 111.503906 C 12.078125 111.503906 8.496094 107.546875 8.496094 102.664062 L 8.496094 36.347656 C 8.496094 31.464844 12.078125 27.503906 16.496094 27.503906 Z M 16.496094 27.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 21.496094 39.503906 L 27.496094 39.503906 C 29.710938 39.503906 31.273438 41.300781 31.496094 43.503906 L 32.496094 53.503906 C 32.714844 55.710938 30.710938 57.503906 28.496094 57.503906 L 20.496094 57.503906 C 18.277344 57.503906 16.273438 55.710938 16.496094 53.503906 L 17.496094 43.503906 C 17.714844 41.300781 19.277344 39.503906 21.496094 39.503906 Z M 21.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear14);" d="M 31.496094 43.503906 L 31.496094 47.503906 C 31.496094 49.722656 29.710938 51.503906 27.496094 51.503906 L 21.496094 51.503906 C 19.277344 51.503906 17.496094 49.722656 17.496094 47.503906 L 17.496094 43.503906 C 17.496094 41.289062 19.277344 39.503906 21.496094 39.503906 L 27.496094 39.503906 C 29.710938 39.503906 31.496094 41.289062 31.496094 43.503906 Z M 31.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 41.496094 39.503906 L 47.496094 39.503906 C 49.710938 39.503906 51.273438 41.300781 51.496094 43.503906 L 52.496094 53.503906 C 52.714844 55.710938 50.710938 57.503906 48.496094 57.503906 L 40.496094 57.503906 C 38.277344 57.503906 36.273438 55.710938 36.496094 53.503906 L 37.496094 43.503906 C 37.714844 41.300781 39.277344 39.503906 41.496094 39.503906 Z M 41.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 61.496094 39.503906 L 67.496094 39.503906 C 69.710938 39.503906 71.273438 41.300781 71.496094 43.503906 L 72.496094 53.503906 C 72.714844 55.710938 70.710938 57.503906 68.496094 57.503906 L 60.496094 57.503906 C 58.277344 57.503906 56.273438 55.710938 56.496094 53.503906 L 57.496094 43.503906 C 57.714844 41.300781 59.277344 39.503906 61.496094 39.503906 Z M 61.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 81.496094 39.503906 L 87.496094 39.503906 C 89.710938 39.503906 91.273438 41.300781 91.496094 43.503906 L 92.496094 53.503906 C 92.714844 55.710938 90.710938 57.503906 88.496094 57.503906 L 80.496094 57.503906 C 78.277344 57.503906 76.273438 55.710938 76.496094 53.503906 L 77.496094 43.503906 C 77.714844 41.300781 79.277344 39.503906 81.496094 39.503906 Z M 81.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 101.496094 39.503906 L 107.496094 39.503906 C 109.710938 39.503906 111.273438 41.300781 111.496094 43.503906 L 112.496094 53.503906 C 112.714844 55.710938 110.710938 57.503906 108.496094 57.503906 L 100.496094 57.503906 C 98.277344 57.503906 96.273438 55.710938 96.496094 53.503906 L 97.496094 43.503906 C 97.714844 41.300781 99.277344 39.503906 101.496094 39.503906 Z M 101.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 31.496094 61.503906 L 37.496094 61.503906 C 39.710938 61.503906 41.273438 63.300781 41.496094 65.503906 L 42.496094 75.503906 C 42.714844 77.710938 40.710938 79.503906 38.496094 79.503906 L 30.496094 79.503906 C 28.277344 79.503906 26.273438 77.710938 26.496094 75.503906 L 27.496094 65.503906 C 27.714844 63.300781 29.277344 61.503906 31.496094 61.503906 Z M 31.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 51.496094 61.503906 L 57.496094 61.503906 C 59.710938 61.503906 61.273438 63.300781 61.496094 65.503906 L 62.496094 75.503906 C 62.714844 77.710938 60.710938 79.503906 58.496094 79.503906 L 50.496094 79.503906 C 48.277344 79.503906 46.273438 77.710938 46.496094 75.503906 L 47.496094 65.503906 C 47.714844 63.300781 49.277344 61.503906 51.496094 61.503906 Z M 51.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 71.496094 61.503906 L 77.496094 61.503906 C 79.710938 61.503906 81.273438 63.300781 81.496094 65.503906 L 82.496094 75.503906 C 82.714844 77.710938 80.710938 79.503906 78.496094 79.503906 L 70.496094 79.503906 C 68.277344 79.503906 66.273438 77.710938 66.496094 75.503906 L 67.496094 65.503906 C 67.714844 63.300781 69.277344 61.503906 71.496094 61.503906 Z M 71.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(77.64706%,27.450982%,0%);fill-opacity:1;" d="M 91.496094 61.503906 L 98.496094 61.503906 C 100.710938 61.503906 102.273438 63.300781 102.496094 65.503906 L 103.496094 75.503906 C 103.714844 77.710938 101.710938 79.503906 99.496094 79.503906 L 90.496094 79.503906 C 88.277344 79.503906 86.273438 77.710938 86.496094 75.503906 L 87.496094 65.503906 C 87.714844 63.300781 89.277344 61.503906 91.496094 61.503906 Z M 91.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 25.496094 83.503906 L 31.496094 83.503906 C 33.710938 83.503906 35.273438 85.300781 35.496094 87.503906 L 36.496094 97.503906 C 36.714844 99.710938 34.710938 101.503906 32.496094 101.503906 L 24.496094 101.503906 C 22.277344 101.503906 20.273438 99.710938 20.496094 97.503906 L 21.496094 87.503906 C 21.714844 85.300781 23.277344 83.503906 25.496094 83.503906 Z M 25.496094 83.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 97.496094 83.503906 L 103.496094 83.503906 C 105.710938 83.503906 107.273438 85.300781 107.496094 87.503906 L 108.496094 97.503906 C 108.714844 99.710938 106.710938 101.503906 104.496094 101.503906 L 96.496094 101.503906 C 94.277344 101.503906 92.273438 99.710938 92.496094 97.503906 L 93.496094 87.503906 C 93.714844 85.300781 95.277344 83.503906 97.496094 83.503906 Z M 97.496094 83.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear15);" d="M 107.496094 87.503906 L 107.496094 91.503906 C 107.496094 93.722656 105.710938 95.503906 103.496094 95.503906 L 97.496094 95.503906 C 95.277344 95.503906 93.496094 93.722656 93.496094 91.503906 L 93.496094 87.503906 C 93.496094 85.289062 95.277344 83.503906 97.496094 83.503906 L 103.496094 83.503906 C 105.710938 83.503906 107.496094 85.289062 107.496094 87.503906 Z M 107.496094 87.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(50.980395%,50.588238%,52.549022%);fill-opacity:1;" d="M 45.496094 83.503906 L 83.496094 83.503906 C 85.710938 83.503906 87.273438 85.300781 87.496094 87.503906 L 88.496094 97.503906 C 88.714844 99.710938 86.710938 101.503906 84.496094 101.503906 L 44.496094 101.503906 C 42.277344 101.503906 40.273438 99.710938 40.496094 97.503906 L 41.496094 87.503906 C 41.714844 85.300781 43.277344 83.503906 45.496094 83.503906 Z M 45.496094 83.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear16);" d="M 87.496094 87.503906 L 87.496094 91.503906 C 87.496094 93.722656 85.710938 95.503906 83.496094 95.503906 L 45.496094 95.503906 C 43.277344 95.503906 41.496094 93.722656 41.496094 91.503906 L 41.496094 87.503906 C 41.496094 85.289062 43.277344 83.503906 45.496094 83.503906 L 83.496094 83.503906 C 85.710938 83.503906 87.496094 85.289062 87.496094 87.503906 Z M 87.496094 87.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear17);" d="M 51.496094 43.503906 L 51.496094 47.503906 C 51.496094 49.722656 49.710938 51.503906 47.496094 51.503906 L 41.496094 51.503906 C 39.277344 51.503906 37.496094 49.722656 37.496094 47.503906 L 37.496094 43.503906 C 37.496094 41.289062 39.277344 39.503906 41.496094 39.503906 L 47.496094 39.503906 C 49.710938 39.503906 51.496094 41.289062 51.496094 43.503906 Z M 51.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear18);" d="M 71.496094 43.503906 L 71.496094 47.503906 C 71.496094 49.722656 69.710938 51.503906 67.496094 51.503906 L 61.496094 51.503906 C 59.277344 51.503906 57.496094 49.722656 57.496094 47.503906 L 57.496094 43.503906 C 57.496094 41.289062 59.277344 39.503906 61.496094 39.503906 L 67.496094 39.503906 C 69.710938 39.503906 71.496094 41.289062 71.496094 43.503906 Z M 71.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear19);" d="M 91.496094 43.503906 L 91.496094 47.503906 C 91.496094 49.722656 89.710938 51.503906 87.496094 51.503906 L 81.496094 51.503906 C 79.277344 51.503906 77.496094 49.722656 77.496094 47.503906 L 77.496094 43.503906 C 77.496094 41.289062 79.277344 39.503906 81.496094 39.503906 L 87.496094 39.503906 C 89.710938 39.503906 91.496094 41.289062 91.496094 43.503906 Z M 91.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear20);" d="M 111.496094 43.503906 L 111.496094 47.503906 C 111.496094 49.722656 109.710938 51.503906 107.496094 51.503906 L 101.496094 51.503906 C 99.277344 51.503906 97.496094 49.722656 97.496094 47.503906 L 97.496094 43.503906 C 97.496094 41.289062 99.277344 39.503906 101.496094 39.503906 L 107.496094 39.503906 C 109.710938 39.503906 111.496094 41.289062 111.496094 43.503906 Z M 111.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear21);" d="M 41.496094 65.503906 L 41.496094 69.503906 C 41.496094 71.722656 39.710938 73.503906 37.496094 73.503906 L 31.496094 73.503906 C 29.277344 73.503906 27.496094 71.722656 27.496094 69.503906 L 27.496094 65.503906 C 27.496094 63.289062 29.277344 61.503906 31.496094 61.503906 L 37.496094 61.503906 C 39.710938 61.503906 41.496094 63.289062 41.496094 65.503906 Z M 41.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear22);" d="M 61.496094 65.503906 L 61.496094 69.503906 C 61.496094 71.722656 59.710938 73.503906 57.496094 73.503906 L 51.496094 73.503906 C 49.277344 73.503906 47.496094 71.722656 47.496094 69.503906 L 47.496094 65.503906 C 47.496094 63.289062 49.277344 61.503906 51.496094 61.503906 L 57.496094 61.503906 C 59.710938 61.503906 61.496094 63.289062 61.496094 65.503906 Z M 61.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear23);" d="M 81.496094 65.503906 L 81.496094 69.503906 C 81.496094 71.722656 79.710938 73.503906 77.496094 73.503906 L 71.496094 73.503906 C 69.277344 73.503906 67.496094 71.722656 67.496094 69.503906 L 67.496094 65.503906 C 67.496094 63.289062 69.277344 61.503906 71.496094 61.503906 L 77.496094 61.503906 C 79.710938 61.503906 81.496094 63.289062 81.496094 65.503906 Z M 81.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear24);" d="M 102.496094 65.503906 L 102.496094 69.503906 C 102.496094 71.722656 100.710938 73.503906 98.496094 73.503906 L 91.496094 73.503906 C 89.277344 73.503906 87.496094 71.722656 87.496094 69.503906 L 87.496094 65.503906 C 87.496094 63.289062 89.277344 61.503906 91.496094 61.503906 L 98.496094 61.503906 C 100.710938 61.503906 102.496094 63.289062 102.496094 65.503906 Z M 102.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear25);" d="M 35.496094 87.503906 L 35.496094 91.503906 C 35.496094 93.722656 33.710938 95.503906 31.496094 95.503906 L 25.496094 95.503906 C 23.277344 95.503906 21.496094 93.722656 21.496094 91.503906 L 21.496094 87.503906 C 21.496094 85.289062 23.277344 83.503906 25.496094 83.503906 L 31.496094 83.503906 C 33.710938 83.503906 35.496094 85.289062 35.496094 87.503906 Z M 35.496094 87.503906 "/>
|
||||
</g>
|
||||
<clipPath id="clip1">
|
||||
<rect x="0" y="0" width="128" height="128"/>
|
||||
</clipPath>
|
||||
<filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
|
||||
<feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<g id="surface50198" clip-path="url(#clip1)" filter="url(#alpha)">
|
||||
<use xlink:href="#surface50195"/>
|
||||
</g>
|
||||
<mask id="mask0">
|
||||
<use xlink:href="#surface50198"/>
|
||||
</mask>
|
||||
<mask id="mask1">
|
||||
<g filter="url(#alpha)">
|
||||
<rect x="0" y="0" width="128" height="128" style="fill:rgb(0%,0%,0%);fill-opacity:0.8;stroke:none;"/>
|
||||
</g>
|
||||
</mask>
|
||||
<linearGradient id="linear26" gradientUnits="userSpaceOnUse" x1="300" y1="235" x2="428" y2="235" gradientTransform="matrix(0.000000000000000023,0.37,-0.98462,0.00000000000000006,295.38501,-30.360001)">
|
||||
<stop offset="0" style="stop-color:rgb(97.647059%,94.117647%,41.960785%);stop-opacity:1;"/>
|
||||
<stop offset="1" style="stop-color:rgb(96.078432%,76.078433%,6.666667%);stop-opacity:1;"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip4">
|
||||
<rect x="0" y="0" width="128" height="128"/>
|
||||
</clipPath>
|
||||
<g id="surface50192" clip-path="url(#clip4)">
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear26);" d="M 128 80.640625 L 128 128 L 0 128 L 0 80.640625 Z M 128 80.640625 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 13.308594 80.640625 L 60.664062 128 L 81.878906 128 L 34.519531 80.640625 Z M 55.730469 80.640625 L 103.09375 128 L 124.308594 128 L 76.945312 80.640625 Z M 98.160156 80.640625 L 128 110.480469 L 128 89.269531 L 119.371094 80.640625 Z M 0 88.546875 L 0 109.761719 L 18.238281 128 L 39.453125 128 Z M 0 88.546875 "/>
|
||||
</g>
|
||||
<clipPath id="clip3">
|
||||
<rect x="0" y="0" width="128" height="128"/>
|
||||
</clipPath>
|
||||
<g id="surface50197" clip-path="url(#clip3)">
|
||||
<use xlink:href="#surface50192" mask="url(#mask1)"/>
|
||||
</g>
|
||||
</defs>
|
||||
<g id="surface50185">
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear0);" d="M 16.496094 51.503906 L 112.496094 51.503906 C 116.914062 51.503906 120.496094 55.085938 120.496094 59.503906 L 120.496094 107.503906 C 120.496094 111.921875 116.914062 115.503906 112.496094 115.503906 L 16.496094 115.503906 C 12.078125 115.503906 8.496094 111.921875 8.496094 107.503906 L 8.496094 59.503906 C 8.496094 55.085938 12.078125 51.503906 16.496094 51.503906 Z M 16.496094 51.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(96.470588%,96.078432%,95.686275%);fill-opacity:1;" d="M 16.496094 27.503906 L 112.496094 27.503906 C 116.914062 27.503906 120.496094 31.464844 120.496094 36.347656 L 120.496094 102.664062 C 120.496094 107.546875 116.914062 111.503906 112.496094 111.503906 L 16.496094 111.503906 C 12.078125 111.503906 8.496094 107.546875 8.496094 102.664062 L 8.496094 36.347656 C 8.496094 31.464844 12.078125 27.503906 16.496094 27.503906 Z M 16.496094 27.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 21.496094 39.503906 L 27.496094 39.503906 C 29.710938 39.503906 31.273438 41.300781 31.496094 43.503906 L 32.496094 53.503906 C 32.714844 55.710938 30.710938 57.503906 28.496094 57.503906 L 20.496094 57.503906 C 18.277344 57.503906 16.273438 55.710938 16.496094 53.503906 L 17.496094 43.503906 C 17.714844 41.300781 19.277344 39.503906 21.496094 39.503906 Z M 21.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear1);" d="M 31.496094 43.503906 L 31.496094 47.503906 C 31.496094 49.722656 29.710938 51.503906 27.496094 51.503906 L 21.496094 51.503906 C 19.277344 51.503906 17.496094 49.722656 17.496094 47.503906 L 17.496094 43.503906 C 17.496094 41.289062 19.277344 39.503906 21.496094 39.503906 L 27.496094 39.503906 C 29.710938 39.503906 31.496094 41.289062 31.496094 43.503906 Z M 31.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 41.496094 39.503906 L 47.496094 39.503906 C 49.710938 39.503906 51.273438 41.300781 51.496094 43.503906 L 52.496094 53.503906 C 52.714844 55.710938 50.710938 57.503906 48.496094 57.503906 L 40.496094 57.503906 C 38.277344 57.503906 36.273438 55.710938 36.496094 53.503906 L 37.496094 43.503906 C 37.714844 41.300781 39.277344 39.503906 41.496094 39.503906 Z M 41.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 61.496094 39.503906 L 67.496094 39.503906 C 69.710938 39.503906 71.273438 41.300781 71.496094 43.503906 L 72.496094 53.503906 C 72.714844 55.710938 70.710938 57.503906 68.496094 57.503906 L 60.496094 57.503906 C 58.277344 57.503906 56.273438 55.710938 56.496094 53.503906 L 57.496094 43.503906 C 57.714844 41.300781 59.277344 39.503906 61.496094 39.503906 Z M 61.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 81.496094 39.503906 L 87.496094 39.503906 C 89.710938 39.503906 91.273438 41.300781 91.496094 43.503906 L 92.496094 53.503906 C 92.714844 55.710938 90.710938 57.503906 88.496094 57.503906 L 80.496094 57.503906 C 78.277344 57.503906 76.273438 55.710938 76.496094 53.503906 L 77.496094 43.503906 C 77.714844 41.300781 79.277344 39.503906 81.496094 39.503906 Z M 81.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 101.496094 39.503906 L 107.496094 39.503906 C 109.710938 39.503906 111.273438 41.300781 111.496094 43.503906 L 112.496094 53.503906 C 112.714844 55.710938 110.710938 57.503906 108.496094 57.503906 L 100.496094 57.503906 C 98.277344 57.503906 96.273438 55.710938 96.496094 53.503906 L 97.496094 43.503906 C 97.714844 41.300781 99.277344 39.503906 101.496094 39.503906 Z M 101.496094 39.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 31.496094 61.503906 L 37.496094 61.503906 C 39.710938 61.503906 41.273438 63.300781 41.496094 65.503906 L 42.496094 75.503906 C 42.714844 77.710938 40.710938 79.503906 38.496094 79.503906 L 30.496094 79.503906 C 28.277344 79.503906 26.273438 77.710938 26.496094 75.503906 L 27.496094 65.503906 C 27.714844 63.300781 29.277344 61.503906 31.496094 61.503906 Z M 31.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 51.496094 61.503906 L 57.496094 61.503906 C 59.710938 61.503906 61.273438 63.300781 61.496094 65.503906 L 62.496094 75.503906 C 62.714844 77.710938 60.710938 79.503906 58.496094 79.503906 L 50.496094 79.503906 C 48.277344 79.503906 46.273438 77.710938 46.496094 75.503906 L 47.496094 65.503906 C 47.714844 63.300781 49.277344 61.503906 51.496094 61.503906 Z M 51.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 71.496094 61.503906 L 77.496094 61.503906 C 79.710938 61.503906 81.273438 63.300781 81.496094 65.503906 L 82.496094 75.503906 C 82.714844 77.710938 80.710938 79.503906 78.496094 79.503906 L 70.496094 79.503906 C 68.277344 79.503906 66.273438 77.710938 66.496094 75.503906 L 67.496094 65.503906 C 67.714844 63.300781 69.277344 61.503906 71.496094 61.503906 Z M 71.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(77.64706%,27.450982%,0%);fill-opacity:1;" d="M 91.496094 61.503906 L 98.496094 61.503906 C 100.710938 61.503906 102.273438 63.300781 102.496094 65.503906 L 103.496094 75.503906 C 103.714844 77.710938 101.710938 79.503906 99.496094 79.503906 L 90.496094 79.503906 C 88.277344 79.503906 86.273438 77.710938 86.496094 75.503906 L 87.496094 65.503906 C 87.714844 63.300781 89.277344 61.503906 91.496094 61.503906 Z M 91.496094 61.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 25.496094 83.503906 L 31.496094 83.503906 C 33.710938 83.503906 35.273438 85.300781 35.496094 87.503906 L 36.496094 97.503906 C 36.714844 99.710938 34.710938 101.503906 32.496094 101.503906 L 24.496094 101.503906 C 22.277344 101.503906 20.273438 99.710938 20.496094 97.503906 L 21.496094 87.503906 C 21.714844 85.300781 23.277344 83.503906 25.496094 83.503906 Z M 25.496094 83.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(23.921569%,21.960784%,27.450982%);fill-opacity:1;" d="M 97.496094 83.503906 L 103.496094 83.503906 C 105.710938 83.503906 107.273438 85.300781 107.496094 87.503906 L 108.496094 97.503906 C 108.714844 99.710938 106.710938 101.503906 104.496094 101.503906 L 96.496094 101.503906 C 94.277344 101.503906 92.273438 99.710938 92.496094 97.503906 L 93.496094 87.503906 C 93.714844 85.300781 95.277344 83.503906 97.496094 83.503906 Z M 97.496094 83.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear2);" d="M 107.496094 87.503906 L 107.496094 91.503906 C 107.496094 93.722656 105.710938 95.503906 103.496094 95.503906 L 97.496094 95.503906 C 95.277344 95.503906 93.496094 93.722656 93.496094 91.503906 L 93.496094 87.503906 C 93.496094 85.289062 95.277344 83.503906 97.496094 83.503906 L 103.496094 83.503906 C 105.710938 83.503906 107.496094 85.289062 107.496094 87.503906 Z M 107.496094 87.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(50.980395%,50.588238%,52.549022%);fill-opacity:1;" d="M 45.496094 83.503906 L 83.496094 83.503906 C 85.710938 83.503906 87.273438 85.300781 87.496094 87.503906 L 88.496094 97.503906 C 88.714844 99.710938 86.710938 101.503906 84.496094 101.503906 L 44.496094 101.503906 C 42.277344 101.503906 40.273438 99.710938 40.496094 97.503906 L 41.496094 87.503906 C 41.714844 85.300781 43.277344 83.503906 45.496094 83.503906 Z M 45.496094 83.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear3);" d="M 87.496094 87.503906 L 87.496094 91.503906 C 87.496094 93.722656 85.710938 95.503906 83.496094 95.503906 L 45.496094 95.503906 C 43.277344 95.503906 41.496094 93.722656 41.496094 91.503906 L 41.496094 87.503906 C 41.496094 85.289062 43.277344 83.503906 45.496094 83.503906 L 83.496094 83.503906 C 85.710938 83.503906 87.496094 85.289062 87.496094 87.503906 Z M 87.496094 87.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear4);" d="M 51.496094 43.503906 L 51.496094 47.503906 C 51.496094 49.722656 49.710938 51.503906 47.496094 51.503906 L 41.496094 51.503906 C 39.277344 51.503906 37.496094 49.722656 37.496094 47.503906 L 37.496094 43.503906 C 37.496094 41.289062 39.277344 39.503906 41.496094 39.503906 L 47.496094 39.503906 C 49.710938 39.503906 51.496094 41.289062 51.496094 43.503906 Z M 51.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear5);" d="M 71.496094 43.503906 L 71.496094 47.503906 C 71.496094 49.722656 69.710938 51.503906 67.496094 51.503906 L 61.496094 51.503906 C 59.277344 51.503906 57.496094 49.722656 57.496094 47.503906 L 57.496094 43.503906 C 57.496094 41.289062 59.277344 39.503906 61.496094 39.503906 L 67.496094 39.503906 C 69.710938 39.503906 71.496094 41.289062 71.496094 43.503906 Z M 71.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear6);" d="M 91.496094 43.503906 L 91.496094 47.503906 C 91.496094 49.722656 89.710938 51.503906 87.496094 51.503906 L 81.496094 51.503906 C 79.277344 51.503906 77.496094 49.722656 77.496094 47.503906 L 77.496094 43.503906 C 77.496094 41.289062 79.277344 39.503906 81.496094 39.503906 L 87.496094 39.503906 C 89.710938 39.503906 91.496094 41.289062 91.496094 43.503906 Z M 91.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear7);" d="M 111.496094 43.503906 L 111.496094 47.503906 C 111.496094 49.722656 109.710938 51.503906 107.496094 51.503906 L 101.496094 51.503906 C 99.277344 51.503906 97.496094 49.722656 97.496094 47.503906 L 97.496094 43.503906 C 97.496094 41.289062 99.277344 39.503906 101.496094 39.503906 L 107.496094 39.503906 C 109.710938 39.503906 111.496094 41.289062 111.496094 43.503906 Z M 111.496094 43.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear8);" d="M 41.496094 65.503906 L 41.496094 69.503906 C 41.496094 71.722656 39.710938 73.503906 37.496094 73.503906 L 31.496094 73.503906 C 29.277344 73.503906 27.496094 71.722656 27.496094 69.503906 L 27.496094 65.503906 C 27.496094 63.289062 29.277344 61.503906 31.496094 61.503906 L 37.496094 61.503906 C 39.710938 61.503906 41.496094 63.289062 41.496094 65.503906 Z M 41.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear9);" d="M 61.496094 65.503906 L 61.496094 69.503906 C 61.496094 71.722656 59.710938 73.503906 57.496094 73.503906 L 51.496094 73.503906 C 49.277344 73.503906 47.496094 71.722656 47.496094 69.503906 L 47.496094 65.503906 C 47.496094 63.289062 49.277344 61.503906 51.496094 61.503906 L 57.496094 61.503906 C 59.710938 61.503906 61.496094 63.289062 61.496094 65.503906 Z M 61.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear10);" d="M 81.496094 65.503906 L 81.496094 69.503906 C 81.496094 71.722656 79.710938 73.503906 77.496094 73.503906 L 71.496094 73.503906 C 69.277344 73.503906 67.496094 71.722656 67.496094 69.503906 L 67.496094 65.503906 C 67.496094 63.289062 69.277344 61.503906 71.496094 61.503906 L 77.496094 61.503906 C 79.710938 61.503906 81.496094 63.289062 81.496094 65.503906 Z M 81.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear11);" d="M 102.496094 65.503906 L 102.496094 69.503906 C 102.496094 71.722656 100.710938 73.503906 98.496094 73.503906 L 91.496094 73.503906 C 89.277344 73.503906 87.496094 71.722656 87.496094 69.503906 L 87.496094 65.503906 C 87.496094 63.289062 89.277344 61.503906 91.496094 61.503906 L 98.496094 61.503906 C 100.710938 61.503906 102.496094 63.289062 102.496094 65.503906 Z M 102.496094 65.503906 "/>
|
||||
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear12);" d="M 35.496094 87.503906 L 35.496094 91.503906 C 35.496094 93.722656 33.710938 95.503906 31.496094 95.503906 L 25.496094 95.503906 C 23.277344 95.503906 21.496094 93.722656 21.496094 91.503906 L 21.496094 87.503906 C 21.496094 85.289062 23.277344 83.503906 25.496094 83.503906 L 31.496094 83.503906 C 33.710938 83.503906 35.496094 85.289062 35.496094 87.503906 Z M 35.496094 87.503906 "/>
|
||||
<use xlink:href="#surface50197" mask="url(#mask0)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 137 KiB |
|
@ -1,7 +1,6 @@
|
|||
install_data(
|
||||
'de.wolfvollprecht.UberWriter.svg',
|
||||
install_dir: datadir / 'icons' / 'hicolor' / 'scalable' / 'apps',
|
||||
rename: '@0@.svg'.format(application_id)
|
||||
'@0@.svg'.format(application_id),
|
||||
install_dir: datadir / 'icons' / 'hicolor' / 'scalable' / 'apps'
|
||||
)
|
||||
|
||||
install_data(
|
||||
|
|
|
@ -6,7 +6,7 @@ function fix_path (path)
|
|||
if string.starts(path, "/") then
|
||||
return path
|
||||
else
|
||||
return (os.getenv('PANDOC_PREFIX') or '') .. path
|
||||
return (pandoc.system.get_working_directory() or '') .. "/" .. path
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Markdown Tutorial for UberWriter
|
||||
Markdown Tutorial for Apostrophe
|
||||
================================
|
||||
|
||||
I will try to give a short impressions on how I use markdown/pandocs capabilities to greatly reduce the time spent on formatting anything -- from websites to PDF Documents.
|
|
@ -21,12 +21,25 @@
|
|||
|
||||
/* Main window and text colors */
|
||||
|
||||
.uberwriter-window {
|
||||
.apostrophe-window {
|
||||
background: @theme_base_color;
|
||||
color: @theme_fg_color;
|
||||
caret-color: @theme_fg_color;
|
||||
}
|
||||
|
||||
.apostrophe-window.focus:not(.tiled):not(.tiled-top):not(.tiled-bottom):not(.tiled-left):not(.tiled-right):not(.maximized):not(.fullscreen) {
|
||||
border-top-left-radius: 8px;
|
||||
border-top-right-radius: 8px;
|
||||
}
|
||||
|
||||
.apostrophe-window.focus:not(.tiled):not(.tiled-top):not(.tiled-bottom):not(.tiled-left):not(.tiled-right):not(.maximized):not(.fullscreen):dir(ltr) scrollbar {
|
||||
border-top-right-radius: 8px;
|
||||
}
|
||||
|
||||
.apostrophe-window.focus:not(.tiled):not(.tiled-top):not(.tiled-bottom):not(.tiled-left):not(.tiled-right):not(.maximized):not(.fullscreen):dir(rtl) scrollbar {
|
||||
border-top-left-radius: 8px;
|
||||
}
|
||||
|
||||
#titlebar-revealer {
|
||||
padding: 0;
|
||||
}
|
||||
|
@ -40,7 +53,7 @@
|
|||
background: @theme_base_color;
|
||||
}
|
||||
|
||||
.uberwriter-editor {
|
||||
.apostrophe-editor {
|
||||
-gtk-key-bindings: editor-bindings;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
|
@ -49,44 +62,44 @@
|
|||
font-size: 16px;
|
||||
}
|
||||
|
||||
.uberwriter-editor.size14 {
|
||||
.apostrophe-editor.size14 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.uberwriter-editor.size15 {
|
||||
.apostrophe-editor.size15 {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.uberwriter-editor.size16 {
|
||||
.apostrophe-editor.size16 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.uberwriter-editor.size17 {
|
||||
.apostrophe-editor.size17 {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.uberwriter-editor.size18 {
|
||||
.apostrophe-editor.size18 {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.uberwriter-editor text {
|
||||
.apostrophe-editor text {
|
||||
background-color: @theme_base_color;
|
||||
color: @theme_fg_color;
|
||||
caret-color: @theme_fg_color;
|
||||
}
|
||||
|
||||
.uberwriter-editor text selection {
|
||||
.apostrophe-editor text selection {
|
||||
background-color: @theme_selected_bg_color;
|
||||
color: @theme_selected_fg_color;
|
||||
}
|
||||
|
||||
.uberwriter-editor button {
|
||||
.apostrophe-editor button {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
/*background: #CCC;*/
|
||||
}
|
||||
|
||||
.uberwriter-editor toolbar {
|
||||
.apostrophe-editor toolbar {
|
||||
/*background: transparent;*/
|
||||
border: none;
|
||||
padding: 0;
|
||||
|
@ -94,6 +107,7 @@
|
|||
|
||||
.inline-button {
|
||||
color: alpha(@theme_fg_color, 0.6);
|
||||
background-color: alpha(@theme_base_color, 0.9);
|
||||
text-shadow: inherit;
|
||||
box-shadow: initial;
|
||||
background-clip: initial;
|
||||
|
@ -117,7 +131,7 @@
|
|||
background-color: mix(@theme_base_color, @theme_bg_color, 0.5);
|
||||
}
|
||||
|
||||
.uberwriter-window treeview {
|
||||
.apostrophe-window treeview {
|
||||
padding: 4px 4px 4px 4px;
|
||||
}
|
||||
|
||||
|
@ -159,3 +173,46 @@
|
|||
.quick-preview-popup label {
|
||||
color: @theme_fg_color;
|
||||
}
|
||||
|
||||
.plain-listview {
|
||||
background-color: @fg-color;
|
||||
}
|
||||
|
||||
/* theme selector */
|
||||
|
||||
.color-button {
|
||||
padding: 12px;
|
||||
border-radius: 999px;
|
||||
-gtk-outline-radius: 999px;
|
||||
outline-offset: 1px;
|
||||
border: none;
|
||||
-gtk-icon-shadow: none;
|
||||
min-width: 0px;
|
||||
min-height: 0px;
|
||||
color: transparent;
|
||||
transition: all 200ms ease-out;
|
||||
}
|
||||
|
||||
.color-light {
|
||||
background: #ffffff;
|
||||
box-shadow: inset 0 0 0 1px #2e3436;
|
||||
}
|
||||
|
||||
.color-light:checked {
|
||||
color: #2e3436;
|
||||
box-shadow: inset 0 0 0 2px @theme_selected_bg_color;
|
||||
}
|
||||
|
||||
.color-dark {
|
||||
background: #2d2d2d;
|
||||
box-shadow: inset 0 0 0 1px alpha(black, .35);
|
||||
}
|
||||
.color-dark:checked {
|
||||
color: #eeeeec;
|
||||
box-shadow: inset 0 0 0 2px @theme_selected_bg_color;
|
||||
}
|
||||
|
||||
.color-button:disabled {
|
||||
background: #929292;
|
||||
box-shadow: inset 0 0 0 1px #2e3436;
|
||||
}
|
|
@ -15,5 +15,23 @@
|
|||
--kbd-background-color: #f1f1f1;
|
||||
--kbd-border-color: #bdc1c6;
|
||||
--kbd-shadow-color: #8c939a;
|
||||
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--text-color: #eeeeec;
|
||||
--background-color: #353535;
|
||||
--alt-background-color: #3a3a3a;
|
||||
--link-color: #b5daff;
|
||||
--blockquote-text-color: #a8a8a6;
|
||||
--blockquote-border-color: #525252;
|
||||
--header-border-color: #474747;
|
||||
--hr-background-color: #505050;
|
||||
--table-tr-border-color: #696969;
|
||||
--table-td-border-color: #525252;
|
||||
--kbd-text-color: #cececc;
|
||||
--kbd-background-color: #3c3c3c;
|
||||
--kbd-border-color: #696969;
|
||||
--kbd-shadow-color: #979797;
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
@import url("base.css");
|
||||
|
||||
:root {
|
||||
--text-color: #eeeeec;
|
||||
--background-color: #353535;
|
||||
--alt-background-color: #3a3a3a;
|
||||
--link-color: #b5daff;
|
||||
--blockquote-text-color: #a8a8a6;
|
||||
--blockquote-border-color: #525252;
|
||||
--header-border-color: #474747;
|
||||
--hr-background-color: #505050;
|
||||
--table-tr-border-color: #696969;
|
||||
--table-td-border-color: #525252;
|
||||
--kbd-text-color: #cececc;
|
||||
--kbd-background-color: #3c3c3c;
|
||||
--kbd-border-color: #696969;
|
||||
--kbd-shadow-color: #979797;
|
||||
}
|
|
@ -16,3 +16,22 @@
|
|||
--kbd-border-color: #bcc2c9;
|
||||
--kbd-shadow-color: #8b949d;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--text-color: #d3dae3;
|
||||
--background-color: #383c4a;
|
||||
--alt-background-color: #3d414f;
|
||||
--link-color: #9ac6ff;
|
||||
--blockquote-text-color: #8d949d;
|
||||
--blockquote-border-color: #555967;
|
||||
--header-border-color: #4a4e5c;
|
||||
--hr-background-color: #535765;
|
||||
--table-tr-border-color: #6c707e;
|
||||
--table-td-border-color: #555967;
|
||||
--kbd-text-color: #b3bac3;
|
||||
--kbd-background-color: #3f4351;
|
||||
--kbd-border-color: #6c707e;
|
||||
--kbd-shadow-color: #9a9eac;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
@import url("base.css");
|
||||
|
||||
:root {
|
||||
--text-color: #d3dae3;
|
||||
--background-color: #383c4a;
|
||||
--alt-background-color: #3d414f;
|
||||
--link-color: #9ac6ff;
|
||||
--blockquote-text-color: #8d949d;
|
||||
--blockquote-border-color: #555967;
|
||||
--header-border-color: #4a4e5c;
|
||||
--hr-background-color: #535765;
|
||||
--table-tr-border-color: #6c707e;
|
||||
--table-td-border-color: #555967;
|
||||
--kbd-text-color: #b3bac3;
|
||||
--kbd-background-color: #3f4351;
|
||||
--kbd-border-color: #6c707e;
|
||||
--kbd-shadow-color: #9a9eac;
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
@import url("arc.css");
|
Before Width: | Height: | Size: 603 B |
Before Width: | Height: | Size: 511 B |
Before Width: | Height: | Size: 377 B |
Before Width: | Height: | Size: 322 B |
Before Width: | Height: | Size: 522 B |
|
@ -0,0 +1,71 @@
|
|||
<?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"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="preview-layout-full-width-symbolic.svg"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<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 />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1053"
|
||||
id="namedview10"
|
||||
showgrid="true"
|
||||
inkscape:zoom="32"
|
||||
inkscape:cx="7.7624248"
|
||||
inkscape:cy="7.9170424"
|
||||
inkscape:window-x="1280"
|
||||
inkscape:window-y="484"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4526" />
|
||||
</sodipodi:namedview>
|
||||
<g
|
||||
id="g873">
|
||||
<rect
|
||||
y="6"
|
||||
x="2"
|
||||
height="5.5"
|
||||
width="11.5"
|
||||
id="rect869"
|
||||
style="opacity:0.5;fill:#474747;fill-opacity:1;stroke:none;stroke-width:1.2544198;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssssssssccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4659-5"
|
||||
d="M 15,6 C 15,5.057191 13.942809,4 13,4 H 2 C 1.057191,4 0,5.057191 0,6 v 5 c 0,0.942809 1.057191,2 2,2 h 11 c 0.942809,0 2,-1.057191 2,-2 z m -2,0 v 5 H 2 V 6 Z"
|
||||
style="fill:#474747;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:label="path4659-5" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,72 @@
|
|||
<?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"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="preview-layout-half-height-symbolic.svg"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<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 />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1053"
|
||||
id="namedview10"
|
||||
showgrid="true"
|
||||
inkscape:zoom="22.627417"
|
||||
inkscape:cx="-3.659756"
|
||||
inkscape:cy="3.0846355"
|
||||
inkscape:window-x="1280"
|
||||
inkscape:window-y="484"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g873"
|
||||
inkscape:snap-smooth-nodes="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4526" />
|
||||
</sodipodi:namedview>
|
||||
<g
|
||||
id="g873"
|
||||
transform="matrix(0,1,1,0,-1,0)">
|
||||
<rect
|
||||
y="3.46875"
|
||||
x="8"
|
||||
height="9.53125"
|
||||
width="4"
|
||||
id="rect869"
|
||||
style="opacity:0.5;fill:#474747;fill-opacity:1;stroke:none;stroke-width:1.2544198;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="ssssssssscccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4659-5"
|
||||
d="M 13,4 C 13,3.057191 11.942809,2 11,2 H 4 C 3.057191,2 2,3.057191 2,4 v 9 c 0,0.942809 1.057191,2 2,2 h 7 c 0.942809,0 2,-1.057191 2,-2 z m -2,0 v 9 H 8 V 4 Z M 7,4 v 9 H 4 V 4 Z"
|
||||
style="fill:#474747;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,70 @@
|
|||
<?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"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="ds-touchscreen-right.svg"
|
||||
inkscape:version="0.92.2 2405546, 2018-03-11">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<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="defs12" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1376"
|
||||
id="namedview10"
|
||||
showgrid="true"
|
||||
inkscape:zoom="64"
|
||||
inkscape:cx="3.6767386"
|
||||
inkscape:cy="8.1664307"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4526" />
|
||||
</sodipodi:namedview>
|
||||
<g
|
||||
id="g873">
|
||||
<rect
|
||||
y="5.5"
|
||||
x="7.5"
|
||||
height="6"
|
||||
width="6"
|
||||
id="rect869"
|
||||
style="opacity:0.5;fill:#474747;fill-opacity:1;stroke:none;stroke-width:1.2544198;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="ssssssssscccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4659-5"
|
||||
d="M 15,6 C 15,5.057191 13.942809,4 13,4 H 2 C 1.057191,4 0,5.057191 0,6 v 5 c 0,0.942809 1.057191,2 2,2 h 11 c 0.942809,0 2,-1.057191 2,-2 z m -2,0 v 5 H 8 V 6 Z M 7,6 v 5 H 2 V 6 Z"
|
||||
style="fill:#474747;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,66 @@
|
|||
<?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"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="screen-layout-quick-switch-symbolic.svg"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<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 />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
id="namedview10"
|
||||
showgrid="true"
|
||||
inkscape:zoom="32"
|
||||
inkscape:cx="8.3953872"
|
||||
inkscape:cy="9.5898251"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4526" />
|
||||
</sodipodi:namedview>
|
||||
<path
|
||||
style="opacity:0.5;fill:#474747;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 9,1 c 0.942809,0 1.999979,1.057191 2,2 V 4 H 9 V 3 H 3 v 6 h 1 v 2 H 3 C 2.057191,11 1.000021,9.942809 1,9 V 3 C 0.999979,2.057191 2.057191,1 3,1 Z"
|
||||
id="path872"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sccccccccsccss" />
|
||||
<path
|
||||
sodipodi:nodetypes="sccssccssccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path817"
|
||||
d="m 13,5 c 0.942809,0 1.999979,1.057191 2,2 v 6 c 2.1e-5,0.942809 -1.057191,2 -2,2 H 7 C 6.057191,15 5.000021,13.942809 5,13 V 7 C 4.999979,6.057191 6.057191,5 7,5 Z m 0,2 H 7 v 6 h 6 z"
|
||||
style="fill:#474747;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -61,7 +61,7 @@
|
|||
sodipodi:ry="42.445595"
|
||||
d="m 209.95411,89.756706 a 42.445595,42.445595 0 1 1 -84.89119,0 42.445595,42.445595 0 1 1 84.89119,0 z"
|
||||
transform="matrix(0.1557609,0,0,0.15394422,115.30017,191.85093)"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/crh.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/crh.png"
|
||||
inkscape:export-xdpi="82.699997"
|
||||
inkscape:export-ydpi="82.699997" />
|
||||
<path
|
||||
|
@ -69,7 +69,7 @@
|
|||
d="m 141.39145,199.33354 0,12.97357"
|
||||
id="path3755"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/crh.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/crh.png"
|
||||
inkscape:export-xdpi="82.699997"
|
||||
inkscape:export-ydpi="82.699997" />
|
||||
<path
|
||||
|
@ -77,7 +77,7 @@
|
|||
d="m 135.02567,205.66846 12.95106,0"
|
||||
id="path3757"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/crh.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/crh.png"
|
||||
inkscape:export-xdpi="82.699997"
|
||||
inkscape:export-ydpi="82.699997" />
|
||||
<rect
|
||||
|
@ -89,7 +89,7 @@
|
|||
y="202.56609"
|
||||
rx="0.26064596"
|
||||
ry="0.2316401"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/crh.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/crh.png"
|
||||
inkscape:export-xdpi="82.699997"
|
||||
inkscape:export-ydpi="82.699997" />
|
||||
<path
|
||||
|
@ -102,7 +102,7 @@
|
|||
sodipodi:ry="42.445595"
|
||||
d="m 209.95411,89.756706 a 42.445595,42.445595 0 1 1 -84.89119,0 42.445595,42.445595 0 1 1 84.89119,0 z"
|
||||
transform="matrix(0.15576089,0,0,0.15394424,208.14569,194.21576)"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/chr_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/chr_a.png"
|
||||
inkscape:export-xdpi="83.678238"
|
||||
inkscape:export-ydpi="83.678238" />
|
||||
<path
|
||||
|
@ -110,7 +110,7 @@
|
|||
d="m 234.23697,201.69837 0,12.97357"
|
||||
id="path3755-9"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/chr_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/chr_a.png"
|
||||
inkscape:export-xdpi="83.678238"
|
||||
inkscape:export-ydpi="83.678238" />
|
||||
<path
|
||||
|
@ -118,7 +118,7 @@
|
|||
d="m 227.87119,208.03329 12.95106,0"
|
||||
id="path3757-2"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/chr_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/chr_a.png"
|
||||
inkscape:export-xdpi="83.678238"
|
||||
inkscape:export-ydpi="83.678238" />
|
||||
<rect
|
||||
|
@ -130,7 +130,7 @@
|
|||
y="234.54805"
|
||||
rx="0.17244641"
|
||||
ry="0"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs.png"
|
||||
inkscape:export-xdpi="85.970146"
|
||||
inkscape:export-ydpi="85.970146" />
|
||||
<path
|
||||
|
@ -139,7 +139,7 @@
|
|||
id="path3810"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs.png"
|
||||
inkscape:export-xdpi="85.970146"
|
||||
inkscape:export-ydpi="85.970146" />
|
||||
<rect
|
||||
|
@ -172,7 +172,7 @@
|
|||
id="path5190"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs.png"
|
||||
inkscape:export-xdpi="85.970146"
|
||||
inkscape:export-ydpi="85.970146" />
|
||||
<path
|
||||
|
@ -181,7 +181,7 @@
|
|||
id="path5190-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs.png"
|
||||
inkscape:export-xdpi="85.970146"
|
||||
inkscape:export-ydpi="85.970146" />
|
||||
<rect
|
||||
|
@ -193,7 +193,7 @@
|
|||
y="237.6228"
|
||||
rx="0.097152509"
|
||||
ry="0"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs_a.png"
|
||||
inkscape:export-xdpi="90.311836"
|
||||
inkscape:export-ydpi="90.311836" />
|
||||
<path
|
||||
|
@ -207,7 +207,7 @@
|
|||
id="path5190-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs_a.png"
|
||||
inkscape:export-xdpi="90.311836"
|
||||
inkscape:export-ydpi="90.311836" />
|
||||
<path
|
||||
|
@ -216,7 +216,7 @@
|
|||
id="path5190-2-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs_a.png"
|
||||
inkscape:export-xdpi="90.311836"
|
||||
inkscape:export-ydpi="90.311836" />
|
||||
<path
|
||||
|
@ -225,7 +225,7 @@
|
|||
id="path5190-5-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs_a.png"
|
||||
inkscape:export-xdpi="90.311836"
|
||||
inkscape:export-ydpi="90.311836" />
|
||||
<path
|
||||
|
@ -234,7 +234,7 @@
|
|||
id="path5190-5-7-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:export-filename="/home/wolf/Programme/uberwriter/data/media/fs_a.png"
|
||||
inkscape:export-filename="/home/wolf/Programme/apostrophe/data/media/fs_a.png"
|
||||
inkscape:export-xdpi="90.311836"
|
||||
inkscape:export-ydpi="90.311836" />
|
||||
</g>
|
||||
|
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
|
@ -62,7 +62,7 @@ install_data(
|
|||
ui_config = configuration_data()
|
||||
ui_config.set('app-id', application_id)
|
||||
ui_config.set('version', meson.project_version() + version_suffix)
|
||||
ui_config.set('package_url', 'http://uberwriter.github.io/uberwriter/')
|
||||
ui_config.set('package_url', 'http://apostrophe.github.io/apostrophe/')
|
||||
ui_preconfigured_files = files(
|
||||
'ui/About.ui.in'
|
||||
)
|
||||
|
@ -99,3 +99,7 @@ install_subdir(
|
|||
'ui',
|
||||
install_dir: pkgdatadir
|
||||
)
|
||||
install_subdir(
|
||||
'reference_files',
|
||||
install_dir: pkgdatadir
|
||||
)
|
||||
|
|