Prva verzija
|
@ -0,0 +1,26 @@
|
|||
# Syncthing
|
||||
#.stfolder
|
||||
#.stignore
|
||||
.stversions
|
||||
|
||||
# Linux
|
||||
*~
|
||||
*.swp
|
||||
|
||||
# Windows
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
|
||||
# Mac OS X
|
||||
.DS_Store
|
||||
._*
|
||||
|
||||
# Composer
|
||||
/composer.phar
|
||||
/vendor
|
||||
|
||||
|
||||
|
||||
/._sync_*
|
||||
/.owncloudsync.log
|
||||
/.sync-exclude.lst
|
|
@ -0,0 +1,650 @@
|
|||
Pico Changelog
|
||||
==============
|
||||
|
||||
**Note:** This changelog only provides technical information about the changes
|
||||
introduced with a particular Pico version, and is meant to supplement
|
||||
the actual code changes. The information in this changelog are often
|
||||
insufficient to understand the implications of larger changes. Please
|
||||
refer to both the UPGRADE and NEWS sections of the docs for more
|
||||
details.
|
||||
|
||||
**Note:** Changes breaking backwards compatibility (BC) are marked with an `!`
|
||||
(exclamation mark). This doesn't include changes for which BC is
|
||||
preserved by Pico's official `PicoDeprecated` plugin. If a previously
|
||||
deprecated feature is later removed in `PicoDeprecated`, this change
|
||||
is going to be marked as BC-breaking change in both Pico's and
|
||||
`PicoDeprecated`'s changelog. Please note that BC-breaking changes
|
||||
are only possible with a new major version.
|
||||
|
||||
### Version 2.1.4
|
||||
Released: 2020-08-29
|
||||
|
||||
```
|
||||
* [Changed] Silence PHP errors in Parsedown
|
||||
* [Fixed] #560: Improve charset guessing for formatted date strings using
|
||||
`strftime()` (Pico always uses UTF-8, but `strftime()` might not)
|
||||
```
|
||||
|
||||
### Version 2.1.3
|
||||
Released: 2020-07-10
|
||||
|
||||
```
|
||||
* [New] Add `locale` option to `config/config.yml`
|
||||
* [Changed] Improve Pico docs
|
||||
```
|
||||
|
||||
### Version 2.1.2
|
||||
Released: 2020-04-10
|
||||
|
||||
```
|
||||
* [Fixed] Fix DummyPlugin declaring API version 3
|
||||
```
|
||||
|
||||
### Version 2.1.1
|
||||
Released: 2019-12-31
|
||||
|
||||
```
|
||||
* [Fixed] Require Parsedown 1.8.0-beta-7 and Parsedown Extra 0.8.0-beta-1 due
|
||||
to changes in Parsedown and Parsedown Extra breaking BC beyond repair
|
||||
* [Changed] #523: Check for hidden pages based on page ID instead of full paths
|
||||
* [Changed] Improve Pico docs
|
||||
```
|
||||
|
||||
### Version 2.1.0
|
||||
Released: 2019-11-24
|
||||
|
||||
```
|
||||
* [Changed] Add Pico's official logo and tagline to `content-sample/_meta.md`
|
||||
* [Changed] Improve `content-sample/theme.md` to show Pico's official logo and
|
||||
the usage of the new image utility classes of Pico's default theme
|
||||
* [Changed] Improve Pico docs and PHPDoc class docs
|
||||
```
|
||||
|
||||
### Version 2.1.0-beta.1
|
||||
Released: 2019-11-03
|
||||
|
||||
```
|
||||
* [New] Introduce API version 3
|
||||
* [New] Add `assets_dir`, `assets_url` and `plugins_url` config params
|
||||
* [New] Add `%config.*%` Markdown placeholders for scalar config params and the
|
||||
`%assets_url%`, `%themes_url%` and `%plugins_url%` placeholders
|
||||
* [New] Add `content-sample/theme.md` for theme testing purposes
|
||||
* [New] Introduce API versioning for themes and support theme-specific configs
|
||||
using the new `pico-theme.yml` in a theme's directory; `pico-theme.yml`
|
||||
allows a theme to influence Pico's Twig config, to register known meta
|
||||
headers and to provide defaults for theme config params
|
||||
* [New] Add `assets_url`, `themes_url` and `plugins_url` Twig variables
|
||||
* [New] Add `pages` Twig function to deal with Pico's page tree; this function
|
||||
replaces the raw usage of Pico's `pages` array in themes
|
||||
* [New] Add `url` Twig filter to replace URL placeholders (e.g. `%base_url%`)
|
||||
in strings using the new `Pico::substituteUrl()` method
|
||||
* [New] Add `onThemeLoading` and `onThemeLoaded` events
|
||||
* [New] Add `debug` config param and the `Pico::isDebugModeEnabled()` method,
|
||||
checking the `PICO_DEBUG` environment variable, to enable debugging
|
||||
* [New] Add new `Pico::getNormalizedPath()` method to normalize a path; this
|
||||
method should be used to prevent content dir breakouts when dealing
|
||||
with paths provided by user input
|
||||
* [New] Add new `Pico::getUrlFromPath()` method to guess a URL from a file path
|
||||
* [New] Add new `Pico::getAbsoluteUrl()` method to make a relative URL absolute
|
||||
* [New] #505: Create pre-built `.zip` release archives
|
||||
* [Fixed] #461: Proberly handle content files with a UTF-8 BOM
|
||||
* [Changed] Rename `theme_url` config param to `themes_url`; the `theme_url`
|
||||
Twig variable and Markdown placeholder are kept unchanged
|
||||
* [Changed] Update to Parsedown Extra 0.8 and Parsedown 1.8 (both still beta)
|
||||
* [Changed] Enable Twig's `autoescape` feature by default; outputting a
|
||||
variable now causes Twig to escape HTML markup; Pico's `content`
|
||||
variable is a notable exception, as it is marked as being HTML safe
|
||||
* [Changed] Rename `prev_page` Twig variable to `previous_page`
|
||||
* [Changed] Mark `markdown` and `content` Twig filters as well as the `content`
|
||||
variable as being HTML safe
|
||||
* [Changed] Add `$singleLine` param to `markdown` Twig filter as well as the
|
||||
`Pico::parseFileContent()` method to parse just a single line of
|
||||
Markdown input
|
||||
* [Changed] Add `AbstractPicoPlugin::configEnabled()` method to check whether
|
||||
a plugin should be enabled or disabled based on Pico's config
|
||||
* [Changed] Deprecate the use of `AbstractPicoPlugin::__call()`, use
|
||||
`PicoPluginInterface::getPico()` instead
|
||||
* [Changed] Update to Twig 1.36 as last version supporting PHP 5.3, use a
|
||||
Composer-based installation to use a newer Twig version
|
||||
* [Changed] Add `$basePath` and `$endSlash` params to `Pico::getAbsolutePath()`
|
||||
* [Changed] Deprecate `Pico::getBaseThemeUrl()`
|
||||
* [Changed] Replace various `file_exists` calls with proper `is_file` calls
|
||||
* [Changed] Refactor release & build system
|
||||
* [Changed] Improve Pico docs and PHPDoc class docs
|
||||
* [Changed] Various small improvements
|
||||
* [Removed] Remove superfluous `base_dir` and `theme_dir` Twig variables
|
||||
* [Removed] Remove `PicoPluginInterface::__construct()`
|
||||
```
|
||||
|
||||
### Version 2.0.5-beta.1
|
||||
Released: 2019-01-03
|
||||
|
||||
```
|
||||
* [New] Add PHP 7.3 tests
|
||||
* [New] Add `2.0.x-dev` alias for master branch to `composer.json`
|
||||
* [Changed] Update to Parsedown Extra 0.8 and Parsedown 1.8 (both still beta)
|
||||
* [Changed] Improve release & build process
|
||||
```
|
||||
|
||||
### Version 2.0.4
|
||||
Released: 2018-12-17
|
||||
|
||||
```
|
||||
* [Fixed] Proberly handle hostnames with ports in `Pico::getBaseUrl()`
|
||||
* [Changed] Improve documentation
|
||||
```
|
||||
|
||||
### Version 2.0.3
|
||||
Released: 2018-12-03
|
||||
|
||||
```
|
||||
* [Fixed] Support alternative server ports in `Pico::getBaseUrl()`
|
||||
* [Changed] Don't require server environment variables to be configured
|
||||
* [Changed] Improve release & build process
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Improve PHP class docs
|
||||
* [Changed] Various small improvements
|
||||
```
|
||||
|
||||
### Version 2.0.2
|
||||
Released: 2018-08-12
|
||||
|
||||
```
|
||||
* [Fixed] Support Windows paths (`\` instead of `/`) in `Pico::evaluateRequestUrl()`
|
||||
```
|
||||
|
||||
### Version 2.0.1
|
||||
Released: 2018-07-29
|
||||
|
||||
```
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Add missing "Formatted Date", "Time" and "Hidden" meta headers; use
|
||||
the "Hidden" meta header to manually hide a page in the pages list
|
||||
```
|
||||
|
||||
### Version 2.0.0
|
||||
Released: 2018-07-01
|
||||
|
||||
```
|
||||
* [New] Add Bountysource
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Improve release & build process
|
||||
* [Changed] Add `Pico::setConfig()` example to `index.php.dist`
|
||||
* [Fixed] Don't load `config/config.yml` multiple times
|
||||
```
|
||||
|
||||
### Version 2.0.0-beta.3
|
||||
Released: 2018-04-07
|
||||
|
||||
```
|
||||
* [Changed] Add `README.md`, `CONTRIBUTING.md` and `CHANGELOG.md` of main repo
|
||||
to pre-bundled releases, keep `.gitignore`
|
||||
* [Changed] Deny access to a possibly existing `composer.phar` in `.htaccess`
|
||||
* [Changed] Disallow the use of the `callback` filter for the `url_param` and
|
||||
`form_param` Twig functions
|
||||
* [Changed] Improve documentation
|
||||
* [Fixed] Fix page tree when sorting pages by arbitrary values
|
||||
* [Fixed] Fix sorting of `Pico::$nativePlugins`
|
||||
```
|
||||
|
||||
### Version 2.0.0-beta.2
|
||||
Released: 2018-01-21
|
||||
|
||||
```
|
||||
* [New] Improve release & build process and move most build tools to the new
|
||||
`picocms/ci-tools` repo, allowing them to be used by other projects
|
||||
* [New] Add page tree; refer to the `Pico::buildPageTree()` method for more
|
||||
details; also see the `onPageTreeBuilt` event
|
||||
* [Changed] Update dependencies: Twig 1.35
|
||||
* [Changed] ! Improve `.htaccess` and deny access to all dot files by default
|
||||
* [Changed] ! Throw a `RuntimeException` when non-native plugins are loaded,
|
||||
but Pico's `PicoDeprecated` plugin is not loaded
|
||||
* [Changed] ! Change `AbstractPicoPlugin::$enabled`'s behavior: setting it to
|
||||
TRUE now leads to throwing a `RuntimeException` when the plugin's
|
||||
dependencies aren't fulfilled; use NULL to maintain old behavior
|
||||
* [Changed] ! Force themes to use `.twig` as file extension for Twig templates
|
||||
* [Changed] Improve PHP class docs
|
||||
* [Changed] Various small improvements
|
||||
```
|
||||
|
||||
### Version 2.0.0-beta.1
|
||||
Released: 2017-11-05
|
||||
|
||||
```
|
||||
* [New] Pico is on its way to its second major release!
|
||||
* [New] Improve Pico's release & build process
|
||||
* [New] Add "Developer Certificate of Origin" to `CONTRIBUTING.md`
|
||||
* [New] Add license & copyright header to all relevant files
|
||||
* [New] Add Pico version constants (`Pico::VERSION` and `Pico::VERSION_ID`),
|
||||
and add a `version` Twig variable and `%version%` Markdown placeholder
|
||||
* [New] Add Pico API versioning for plugins (see `Pico::API_VERSION` constant);
|
||||
Pico now triggers events on plugins using the latest API version only
|
||||
("native" plugins), `PicoDeprecated` takes care of all other plugins;
|
||||
as a result, old plugin's always depend on `PicoDeprecated` now
|
||||
* [New] Add a theme and plugin installer for composer; Pico now additionally
|
||||
uses the new `vendor/pico-plugin.php` file to discover plugins
|
||||
installed by composer and loads them using composer's autoloader;
|
||||
see the `picocms/composer-installer` repo for more details; Pico
|
||||
loads plugins installed by composer first and ignores conflicting
|
||||
plugins in Pico's `plugins/` dir
|
||||
* [New] Add `$enableLocalPlugins` parameter to `Pico::__construct()` to allow
|
||||
website developers to disable local plugin discovery by scanning the
|
||||
`plugins/` dir (i.e. load plugins from `vendor/pico-plugin.php` only)
|
||||
* [New] Add public `AbstractPicoPlugin::getPluginConfig()` method
|
||||
* [New] Add public `Pico::loadPlugin()` method and the corresponding
|
||||
`onPluginManuallyLoaded` event
|
||||
* [New] Add public `Pico::resolveFilePath()` method (replaces the protected
|
||||
`Pico::discoverRequestFile()` method)
|
||||
* [New] Add public `Pico::is404Content()` method
|
||||
* [New] Add public `Pico::getYamlParser()` method and the corresponding
|
||||
`onYamlParserRegistered` event
|
||||
* [New] Add public `Pico::substituteFileContent()` method
|
||||
* [New] Add public `Pico::getPageId()` method
|
||||
* [New] Add public `Pico::getFilesGlob()` method
|
||||
* [New] Add public `Pico::getVendorDir()` method, returning Pico's installation
|
||||
directory (i.e. `/var/www/pico/vendor/picocms/pico`); don't confuse
|
||||
this with composer's `vendor/` dir!
|
||||
* [New] Add `$default` parameter to `Pico::getConfig()` method
|
||||
* [New] Add empty `assets/` and `content/` dirs
|
||||
* [New] #305: Add `url_param` and `form_param` Twig functions, and the public
|
||||
`Pico::getUrlParameter()` and `Pico::getFormParameter()` methods,
|
||||
allowing theme developers to access URL GET and HTTP POST parameters
|
||||
* [New] Add `$meta` parameter to `markdown` Twig filter
|
||||
* [New] Add `remove` fallback to `sort_by` Twig filter
|
||||
* [New] Add `theme_url` config parameter
|
||||
* [New] Add public `Pico::getBaseThemeUrl()` method
|
||||
* [New] Add `REQUEST_URI` routing method, allowing one to simply rewrite all
|
||||
requests to `index.php` (e.g. use `FallbackResource` or `mod_rewrite`
|
||||
in your `.htaccess` for Apache, or use `try_files` for nginx)
|
||||
* [New] #299: Add built-in 404 page as fallback when no `404.md` is found
|
||||
* [New] Allow sorting pages by arbitrary meta values
|
||||
* [New] Add `onSinglePageLoading` event, allowing one to skip a page
|
||||
* [New] Add `onSinglePageContent` event
|
||||
* [New] Add some config parameters to change Parsedown's behavior
|
||||
* [Changed] ! Disallow running the same Pico instance multiple times by
|
||||
throwing a `RuntimeException` when calling `Pico::run()`
|
||||
* [Changed] ! #203: Load plugins from `plugins/<plugin name>/<plugin name>.php`
|
||||
and `plugins/<plugin name>.php` only (directory and file name must
|
||||
match case-sensitive), and throw a `RuntimeException` when Pico is
|
||||
unable to load a plugin; also throw a `RuntimeException` when
|
||||
superfluous files or directories in `plugins/` are found; use a
|
||||
scope-isolated `require()` to include plugin files
|
||||
* [Changed] ! Use a plugin dependency topology to sort `Pico::$plugins`,
|
||||
changing the execution order of plugins so that plugins, on which
|
||||
other plugins depend, are always executed before their dependants
|
||||
* [Changed] ! Don't pass `$plugins` parameter to `onPluginsLoaded` event by
|
||||
reference anymore; use `Pico::loadPlugin()` instead
|
||||
* [Changed] ! Leave `Pico::$pages` unsorted when a unknown sort method was
|
||||
configured; this usually means that a plugin wants to sort it
|
||||
* [Changed] Overhaul page discovery events: add `onPagesDiscovered` event which
|
||||
is triggered right before `Pico::$pages` is sorted and move the
|
||||
`$currentPage`, `$previousPage` and `$nextPage` parameters of the
|
||||
`onPagesLoaded` event to the new `onCurrentPageDiscovered` event
|
||||
* [Changed] Move the `$twig` parameter of the `onPageRendering` event to the
|
||||
`onTwigRegistered` event, replacing the `onTwigRegistration` event
|
||||
* [Changed] Unify the `onParsedownRegistration` event by renaming it to
|
||||
`onParsedownRegistered` and add the `$parsedown` parameter
|
||||
* [Changed] #330: Replace `config/config.php` by a modular YAML-based approach;
|
||||
you can now use a arbitrary number of `config/*.yml` files to
|
||||
configure Pico
|
||||
* [Changed] ! When trying to auto-detect Pico's `content` dir, Pico no longer
|
||||
searches just for a (possibly empty) directory, but rather checks
|
||||
whether a `index.md` exists in this directory
|
||||
* [Changed] ! Use the relative path between `index.php` and `Pico::$themesDir`
|
||||
for Pico's theme URL (also refer to the new `theme_url` config and
|
||||
the public `Pico::getBaseThemeUrl()` method for more details)
|
||||
* [Changed] #347: Drop the superfluous trailing "/index" from Pico's URLs
|
||||
* [Changed] Flip registered meta headers array, so that the array key is used
|
||||
to search for a meta value and the array value is used to store the
|
||||
found meta value (previously it was the other way round)
|
||||
* [Changed] ! Add lazy loading for `Pico::$yamlParser`, `Pico::$parsedown` and
|
||||
`Pico::$twig`; the corresponding events are no longer part of
|
||||
Pico's event flow and are triggered on demand
|
||||
* [Changed] ! Trigger the `onMetaHeaders` event just once; the event is no
|
||||
longer part of Pico's event flow and is triggered on demand
|
||||
* [Changed] Don't lower meta headers on the first level of a page's meta data
|
||||
(i.e. `SomeKey: value` is accessible using `$meta['SomeKey']`)
|
||||
* [Changed] Don't compare registered meta headers case-insensitive, require
|
||||
matching case
|
||||
* [Changed] Allow users to explicitly set values for the `date_formatted` and
|
||||
`time` meta headers in a page's YAML front matter
|
||||
* [Changed] Add page siblings for all pages
|
||||
* [Changed] ! Treat pages or directories that are prefixed by `_` as hidden;
|
||||
when requesting a hidden page, Pico responds with a 404 page;
|
||||
hidden pages are still in `Pico::$pages`, but are moved to the end
|
||||
of the pages array when sorted alphabetically or by date
|
||||
* [Changed] ! Don't treat explicit requests to a 404 page as successful request
|
||||
* [Changed] Change method visibility of `Pico::getFiles()` to public
|
||||
* [Changed] Change method visibility of `Pico::triggerEvent()` to public;
|
||||
at first glance this method triggers events on native plugins only,
|
||||
however, `PicoDeprecated` takes care of triggering events for other
|
||||
plugins, thus you can use this method to trigger (custom) events on
|
||||
all plugins; never use it to trigger Pico core events!
|
||||
* [Changed] Move Pico's default theme to the new `picocms/pico-theme` repo; the
|
||||
theme was completely rewritten from scratch and is a much better
|
||||
starting point for creating your own theme; refer to the theme's
|
||||
`CHANGELOG.md` for more details
|
||||
* [Changed] Move `PicoDeprecated` plugin to the new `picocms/pico-deprecated`
|
||||
repo; refer to the plugin's `CHANGELOG.md` for more details
|
||||
* [Changed] Update dependencies: Twig 1.34, Symfony YAML 2.8, Parsedown 1.6
|
||||
* [Changed] Improve Pico docs and PHP class docs
|
||||
* [Changed] A vast number of small improvements and changes...
|
||||
* [Removed] ! Remove `PicoParsePagesContent` plugin
|
||||
* [Removed] ! Remove `PicoExcerpt` plugin
|
||||
* [Removed] Remove `rewrite_url` and `is_front_page` Twig variables
|
||||
* [Removed] Remove superfluous parameters of various events to reduce Pico's
|
||||
error-proneness (plugins hopefully interfere with each other less)
|
||||
```
|
||||
|
||||
### Version 1.0.6
|
||||
Released: 2017-07-25
|
||||
|
||||
```
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Improve handling of Pico's Twig config (`$config['twig_config']`)
|
||||
* [Changed] Improve PHP platform requirement checks
|
||||
```
|
||||
|
||||
### Version 1.0.5
|
||||
Released: 2017-05-02
|
||||
|
||||
```
|
||||
* [Changed] Improve documentation
|
||||
* [Fixed] Improve hostname detection with proxies
|
||||
* [Fixed] Fix detection of Windows-based server environments
|
||||
* [Removed] Remove Twitter links
|
||||
```
|
||||
|
||||
### Version 1.0.4
|
||||
Released: 2016-10-04
|
||||
|
||||
```
|
||||
* [New] Add Pico's social icons to default theme
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Add CSS flexbox rules to default theme
|
||||
* [Fixed] Fix handling of non-YAML 1-line front matters
|
||||
* [Fixed] Fix responsiveness in default theme
|
||||
```
|
||||
|
||||
### Version 1.0.3
|
||||
Released: 2016-05-11
|
||||
|
||||
```
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Heavily extend nginx configuration docs
|
||||
* [Changed] Add CSS rules for definition lists to default theme
|
||||
* [Changed] Always use `on404Content...` execution path when serving a `404.md`
|
||||
* [Changed] Deny access to `.git` directory, `CHANGELOG.md`, `composer.json`
|
||||
and `composer.lock` (`.htaccess` file)
|
||||
* [Changed] Use Pico's `404.md` to deny access to `.git`, `config`, `content`,
|
||||
* `content-sample`, `lib` and `vendor` dirs (`.htaccess` file)
|
||||
* [Fixed] #342: Fix responsiveness in default theme
|
||||
* [Fixed] #344: Improve HTTPS detection with proxies
|
||||
* [Fixed] #346: Force HTTPS to load Google Fonts in default theme
|
||||
```
|
||||
|
||||
### Version 1.0.2
|
||||
Released: 2016-03-16
|
||||
|
||||
```
|
||||
* [Changed] Various small improvements and changes...
|
||||
* [Fixed] Check dependencies when a plugin is enabled by default
|
||||
* [Fixed] Allow `Pico::$requestFile` to point to somewhere outside `content_dir`
|
||||
* [Fixed] #336: Fix `Date` meta header parsing with ISO-8601 datetime strings
|
||||
```
|
||||
|
||||
### Version 1.0.1
|
||||
Released: 2016-02-27
|
||||
|
||||
```
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Replace `version_compare()` with `PHP_VERSION_ID` in
|
||||
`index.php.dist` (available since PHP 5.2.7)
|
||||
* [Fixed] Suppress PHP warning when using `date_default_timezone_get()`
|
||||
* [Fixed] #329: Force Apache's `MultiViews` feature to be disabled
|
||||
```
|
||||
|
||||
### Version 1.0.0
|
||||
Released: 2015-12-24
|
||||
|
||||
```
|
||||
* [New] On Christmas Eve, we are happy to announce Pico's first stable release!
|
||||
The Pico Community wants to thank all contributors and users who made
|
||||
this possible. Merry Christmas and a Happy New Year 2016!
|
||||
* [New] Adding `$queryData` parameter to `Pico::getPageUrl()` method
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Moving `LICENSE` to `LICENSE.md`
|
||||
* [Changed] Throw `LogicException` instead of `RuntimeException` when calling
|
||||
`Pico::setConfig()` after processing has started
|
||||
* [Changed] Default theme now highlights the current page and shows pages with
|
||||
a title in the navigation only
|
||||
* [Changed] #292: Ignore YAML parse errors (meta data) in `Pico::readPages()`
|
||||
* [Changed] Various small improvements and changes...
|
||||
* [Fixed] Support empty meta header
|
||||
* [Fixed] #307: Fix path handling on Windows
|
||||
```
|
||||
|
||||
### Version 1.0.0-beta.2
|
||||
Released: 2015-11-30
|
||||
|
||||
```
|
||||
* [New] Introducing the `PicoTwigExtension` Twig extension
|
||||
* [New] New `markdown` filter for Twig to parse markdown strings; Note: If you
|
||||
want to parse the contents of a page, use the `content` filter instead
|
||||
* [New] New `sort_by` filter to sort an array by a specified key or key path
|
||||
* [New] New `map` filter to get the values of the given key or key path
|
||||
* [New] Introducing `index.php.dist` (used for pre-bundled releases)
|
||||
* [New] Use PHP_CodeSniffer to auto-check source code (see `.phpcs.xml`)
|
||||
* [New] Use Travis CI to generate phpDocs class docs automatically
|
||||
* [Changed] Improve documentation
|
||||
* [Changed] Improve table styling in default theme
|
||||
* [Changed] Update composer version constraints; almost all dependencies will
|
||||
have pending updates, run `composer update`
|
||||
* [Changed] Throw a RuntimeException when the `content` dir isn't accessible
|
||||
* [Changed] Reuse `ParsedownExtra` object; new `onParsedownRegistration` event
|
||||
* [Changed] `$config['rewrite_url']` is now always available
|
||||
* [Changed] `DummyPlugin` class is now final
|
||||
* [Changed] Remove `.git` dirs from `vendor/` when deploying
|
||||
* [Changed] Various small improvements and changes...
|
||||
* [Fixed] `PicoDeprecated`: Sanitize `content_dir` and `base_url` options when
|
||||
reading `config.php` in Picos root dir
|
||||
* [Fixed] Replace `urldecode()` (deprecated RFC 1738) with `rawurldecode()`
|
||||
(RFC 3986) in `Page::evaluateRequestUrl()`
|
||||
* [Fixed] #272: Encode URLs using `rawurlencode()` in `Pico::getPageUrl()`
|
||||
* [Fixed] #274: Prevent double slashes in `base_url`
|
||||
* [Fixed] #285: Make `index.php` work when installed as a composer dependency
|
||||
* [Fixed] #291: Force `Pico::$requestUrl` to have no leading/trailing slash
|
||||
```
|
||||
|
||||
### Version 1.0.0-beta.1
|
||||
Released: 2015-11-06
|
||||
|
||||
```
|
||||
* [Security] (9e2604a) Prevent content_dir breakouts using malicious URLs
|
||||
* [New] Pico is on its way to its first stable release!
|
||||
* [New] Provide pre-bundled releases
|
||||
* [New] Heavily expanded documentation (inline code docs, user docs, dev docs)
|
||||
* [New] New routing system using the QUERY_STRING method; Pico now works
|
||||
out-of-the-box with any webserver and without URL rewriting; use
|
||||
`%base_url%?sub/page` in markdown files and `{{ "sub/page"|link }}`
|
||||
in Twig templates to declare internal links
|
||||
* [New] Brand new plugin system with dependencies (see `PicoPluginInterface`
|
||||
and `AbstractPicoPlugin`); if you're plugin dev, you really should
|
||||
take a look at the UPGRADE section of the docs!
|
||||
* [New] Introducing the `PicoDeprecated` plugin to maintain full backward
|
||||
compatibility with Pico 0.9 and Pico 0.8
|
||||
* [New] Support YAML-style meta header comments (`---`)
|
||||
* [New] Various new placeholders to use in content files (e.g. `%site_title%`)
|
||||
* [New] Provide access to all meta headers in content files (`%meta.*%`)
|
||||
* [New] Provide access to meta headers in `$page` arrays (`$page['meta']`)
|
||||
* [New] The file extension of content files is now configurable
|
||||
* [New] Add `Pico::setConfig()` method to predefine config variables
|
||||
* [New] Supporting per-directory `404.md` files
|
||||
* [New] #103: Providing access to `sub.md` even when the `sub` directory
|
||||
exists, provided that there is no `sub/index.md`
|
||||
* [New] #249: Support the `.twig` file extension for templates
|
||||
* [New] #268, 269: Now using Travis CI; performing basic code tests and
|
||||
implementing an automatic release process
|
||||
* [Changed] Complete code refactoring
|
||||
* [Changed] Source code now follows PSR code styling
|
||||
* [Changed] Replacing constants (e.g. `ROOT_DIR`) with constructor parameters
|
||||
* [Changed] Paths (e.g. `content_dir`) are now relative to Pico's root dir
|
||||
* [Changed] Adding `Pico::run()` method that performs Pico's processing and
|
||||
returns the rendered contents
|
||||
* [Changed] Renaming all plugin events; adding some new events
|
||||
* [Changed] `Pico_Plugin` is now the fully documented `DummyPlugin`
|
||||
* [Changed] Meta data must start on the first line of the file now
|
||||
* [Changed] Dropping the need to register meta headers for the convenience of
|
||||
users and pure (!) theme devs; plugin devs are still REQUIRED to
|
||||
register their meta headers during `onMetaHeaders`
|
||||
* [Changed] Exclude inaccessible files from pages list
|
||||
* [Changed] With alphabetical order, index files (e.g. `sub/index.md`) are
|
||||
now always placed before their sub pages (e.g. `sub/foo.md`)
|
||||
* [Changed] Pico requires PHP >= 5.3.6 (due to `erusev/parsedown-extra`)
|
||||
* [Changed] Pico now implicitly uses a existing `content` directory without
|
||||
the need to configure this in the `config/config.php` explicitly
|
||||
* [Changed] Composer: Require a v0.7 release of `erusev/parsedown-extra`
|
||||
* [Changed] Moving `license.txt` to `LICENSE`
|
||||
* [Changed] Moving and reformatting `changelog.txt` to `CHANGELOG.md`
|
||||
* [Changed] #116: Parse meta headers using the Symfony YAML component
|
||||
* [Changed] #244: Replace opendir() with scandir()
|
||||
* [Changed] #246: Move `config.php` to `config/` directory
|
||||
* [Changed] #253: Assume HTTPS if page is requested through port 443
|
||||
* [Changed] A vast number of small improvements and changes...
|
||||
* [Fixed] Sorting by date now uses timestamps and works as expected
|
||||
* [Fixed] Fixing `$currentPage`, `$nextPage` and `$previousPage`
|
||||
* [Fixed] #99: Support content filenames with spaces
|
||||
* [Fixed] #140, #241: Use file paths as page identifiers rather than titles
|
||||
* [Fixed] #248: Always set a timezone; adding `$config['timezone']` option
|
||||
* [Fixed] A vast number of small bugs...
|
||||
* [Removed] Removing the default Twig cache dir
|
||||
* [Removed] Removing various empty `index.html` files
|
||||
* [Removed] Removing `$pageData['excerpt']`; recoverable with `PicoExcerpt`
|
||||
* [Removed] #93, #158: Pico doesn't parse all content files anymore; moved to
|
||||
`PicoParsePagesContent`; i.e. `$pageData['content']` doesn't exist
|
||||
anymore, use `$pageData['raw_content']` when possible; otherwise
|
||||
use Twigs new `content` filter (e.g. `{{ "sub/page"|content }}`)
|
||||
```
|
||||
|
||||
### Version 0.9
|
||||
Released: 2015-04-28
|
||||
|
||||
```
|
||||
* [New] Default theme is now mobile-friendly
|
||||
* [New] Description meta now available in content areas
|
||||
* [New] Add description to composer.json
|
||||
* [Changed] content folder is now content-sample
|
||||
* [Changed] config.php moved to config.php.template
|
||||
* [Changed] Updated documentation & wiki
|
||||
* [Changed] Removed Composer, Twig files in /vendor, you must run composer
|
||||
install now
|
||||
* [Changed] Localized date format; strftime() instead of date()
|
||||
* [Changed] Added ignore for tmp file extensions in the get_files() method
|
||||
* [Changed] michelf/php-markdown is replaced with erusev/parsedown-extra
|
||||
* [Changed] $config is no global variable anymore
|
||||
* [Fixed] Pico now only removes the 1st comment block in .md files
|
||||
* [Fixed] Issue wherein the alphabetical sorting of pages did not happen
|
||||
```
|
||||
|
||||
### Version 0.8
|
||||
Released: 2013-10-23
|
||||
|
||||
```
|
||||
* [New] Added ability to set template in content meta
|
||||
* [New] Added before_parse_content and after_parse_content hooks
|
||||
* [Changed] content_parsed hook is now deprecated
|
||||
* [Changed] Moved loading the config to nearer the beginning of the class
|
||||
* [Changed] Only append ellipsis in limit_words() when word count exceeds max
|
||||
* [Changed] Made private methods protected for better inheritance
|
||||
* [Fixed] Fixed get_protocol() method to work in more situations
|
||||
```
|
||||
|
||||
### Version 0.7
|
||||
Released: 2013-09-04
|
||||
|
||||
```
|
||||
* [New] Added before_read_file_meta and get_page_data plugin hooks to customize
|
||||
page meta data
|
||||
* [Changed] Make get_files() ignore dotfiles
|
||||
* [Changed] Make get_pages() ignore Emacs and temp files
|
||||
* [Changed] Use composer version of Markdown
|
||||
* [Changed] Other small tweaks
|
||||
* [Fixed] Date warnings and other small bugs
|
||||
```
|
||||
|
||||
### Version 0.6.2
|
||||
Released: 2013-05-07
|
||||
|
||||
```
|
||||
* [Changed] Replaced glob_recursive with get_files
|
||||
```
|
||||
|
||||
### Version 0.6.1
|
||||
Released: 2013-05-07
|
||||
|
||||
```
|
||||
* [New] Added "content" and "excerpt" fields to pages
|
||||
* [New] Added excerpt_length config setting
|
||||
```
|
||||
|
||||
### Version 0.6
|
||||
Released: 2013-05-06
|
||||
|
||||
```
|
||||
* [New] Added plugin functionality
|
||||
* [Changed] Other small cleanup
|
||||
```
|
||||
|
||||
### Version 0.5
|
||||
Released: 2013-05-03
|
||||
|
||||
```
|
||||
* [New] Added ability to order pages by "alpha" or "date" (asc or desc)
|
||||
* [New] Added prev_page, current_page, next_page and is_front_page template vars
|
||||
* [New] Added "Author" and "Date" title meta fields
|
||||
* [Changed] Added "twig_config" to settings
|
||||
* [Changed] Updated documentation
|
||||
* [Fixed] Query string 404 bug
|
||||
```
|
||||
|
||||
### Version 0.4.1
|
||||
Released: 2013-05-01
|
||||
|
||||
```
|
||||
* [New] Added CONTENT_EXT global
|
||||
* [Changed] Use .md files instead of .txt
|
||||
```
|
||||
|
||||
### Version 0.4
|
||||
Released: 2013-05-01
|
||||
|
||||
```
|
||||
* [New] Add get_pages() function for listing content
|
||||
* [New] Added changelog.txt
|
||||
* [Changed] Updated default theme
|
||||
* [Changed] Updated documentation
|
||||
```
|
||||
|
||||
### Version 0.3
|
||||
Released: 2013-04-27
|
||||
|
||||
```
|
||||
* [Fixed] get_config() function
|
||||
```
|
||||
|
||||
### Version 0.2
|
||||
Released: 2013-04-26
|
||||
|
||||
```
|
||||
* [Changed] Updated Twig
|
||||
* [Changed] Better checking for HTTPS
|
||||
* [Fixed] Add 404 header to 404 page
|
||||
* [Fixed] Case sensitive folder bug
|
||||
```
|
||||
|
||||
### Version 0.1
|
||||
Released: 2012-04-04
|
||||
|
||||
```
|
||||
* Initial release
|
||||
```
|
|
@ -0,0 +1,209 @@
|
|||
Contributing to Pico
|
||||
====================
|
||||
|
||||
Pico aims to be a high quality Content Management System (CMS) but at the same time wants to give contributors freedom when submitting fixes or improvements.
|
||||
|
||||
By contributing to Pico, you accept and agree to the *Developer Certificate of Origin* for your present and future contributions submitted to Pico. Please refer to the *Developer Certificate of Origin* section below.
|
||||
|
||||
Aside from this, we want to *encourage*, but not obligate you, the contributor, to follow the following guidelines. The only exception to this are the guidelines elucidated in the *Prevent `merge-hell`* section. Having said that: we really appreciate it when you apply the guidelines in part or wholly as that will save us time which, in turn, we can spend on bugfixes and new features.
|
||||
|
||||
Issues
|
||||
------
|
||||
|
||||
If you want to report an *issue* with Pico's core, please create a new [Issue](https://github.com/picocms/Pico/issues) on GitHub. Concerning problems with plugins or themes, please refer to the website of the developer of this plugin or theme.
|
||||
|
||||
Before creating a [new Issue on GitHub](https://github.com/picocms/Pico/issues/new), please make sure the problem wasn't reported yet using [GitHubs search engine](https://github.com/picocms/Pico/search?type=Issues).
|
||||
|
||||
Please describe your issue as clear as possible and always include the *Pico version* you're using. Provided that you're using *plugins*, include a list of them too. We need information about the *actual and expected behavior*, the *steps to reproduce* the problem, and what steps you have taken to resolve the problem by yourself (i.e. *your own troubleshooting*).
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Once you decide you want to contribute to *Pico's core* (which we really appreciate!) you can fork the project from https://github.com/picocms/Pico. If you're interested in developing a *plugin* or *theme* for Pico, please refer to the [development section](http://picocms.org/development/) of our website.
|
||||
|
||||
### Developer Certificate of Origin
|
||||
|
||||
By contributing to Pico, you accept and agree to the following terms and conditions for your present and future contributions submitted to Pico. Except for the license granted herein to Pico and recipients of software distributed by Pico, you reserve all right, title, and interest in and to your contributions. All contributions are subject to the following DCO + license terms.
|
||||
|
||||
```
|
||||
Developer Certificate of Origin
|
||||
Version 1.1
|
||||
|
||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||
1 Letterman Drive
|
||||
Suite D4700
|
||||
San Francisco, CA, 94129
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
|
||||
Developer's Certificate of Origin 1.1
|
||||
|
||||
By making a contribution to this project, I certify that:
|
||||
|
||||
(a) The contribution was created in whole or in part by me and I
|
||||
have the right to submit it under the open source license
|
||||
indicated in the file; or
|
||||
|
||||
(b) The contribution is based upon previous work that, to the best
|
||||
of my knowledge, is covered under an appropriate open source
|
||||
license and I have the right under that license to submit that
|
||||
work with modifications, whether created in whole or in part
|
||||
by me, under the same open source license (unless I am
|
||||
permitted to submit under a different license), as indicated
|
||||
in the file; or
|
||||
|
||||
(c) The contribution was provided directly to me by some other
|
||||
person who certified (a), (b) or (c) and I have not modified
|
||||
it.
|
||||
|
||||
(d) I understand and agree that this project and the contribution
|
||||
are public and that a record of the contribution (including all
|
||||
personal information I submit with it, including my sign-off) is
|
||||
maintained indefinitely and may be redistributed consistent with
|
||||
this project or the open source license(s) involved.
|
||||
```
|
||||
|
||||
All contributions to this project are licensed under the following MIT License:
|
||||
|
||||
```
|
||||
Copyright (c) <YEAR> <COPYRIGHT HOLDER>
|
||||
|
||||
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.
|
||||
```
|
||||
|
||||
Please note that developing a *plugin* or *theme* for Pico is *not* assumed to be a contribution to Pico itself. By developing a plugin or theme you rather create a 3rd-party project that just uses Pico. Following the spirit of open source, we want to *encourage* you to release your plugin or theme under the terms of a [OSI-approved open source license](https://opensource.org/licenses). After all, Pico is open source, too!
|
||||
|
||||
### Prevent `merge-hell`
|
||||
|
||||
Please do *not* develop your contribution on the `master` branch of your fork, but create a separate feature branch, that is based off the `master` branch, for each feature that you want to contribute.
|
||||
|
||||
> Not doing so means that if you decide to work on two separate features and place a pull request for one of them, that the changes of the other issue that you are working on is also submitted. Even if it is not completely finished.
|
||||
|
||||
To get more information about the usage of Git, please refer to the [Pro Git book](https://git-scm.com/book) written by Scott Chacon and/or [this help page of GitHub](https://help.github.com/articles/using-pull-requests).
|
||||
|
||||
### Pull Requests
|
||||
|
||||
Please keep in mind that pull requests should be small (i.e. one feature per request), stick to existing coding conventions and documentation should be updated if required. It's encouraged to make commits of logical units and check for unnecessary whitespace before committing (try `git diff --check`). Please reference issue numbers in your commit messages where appropriate.
|
||||
|
||||
### Coding Standards
|
||||
|
||||
Pico uses the [PSR-2 Coding Standard](http://www.php-fig.org/psr/psr-2/) as defined by the [PHP Framework Interoperability Group (PHP-FIG)](http://www.php-fig.org/).
|
||||
|
||||
For historical reasons we don't use formal namespaces. Markdown files in the `content-sample` folder (the inline documentation) must follow a hard limit of 80 characters line length.
|
||||
|
||||
It is recommended to check your code using [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) using Pico's `.phpcs.xml` standard. Use the following command:
|
||||
|
||||
$ ./vendor/bin/phpcs --standard=.phpcs.xml [file]...
|
||||
|
||||
With this command you can specify a file or folder to limit which files it will check or omit that argument altogether, in which case the current working directory is checked.
|
||||
|
||||
### Keep documentation in sync
|
||||
|
||||
Pico accepts the problems of having redundant documentation on different places (concretely Pico's inline user docs, the `README.md` and the website) for the sake of a better user experience. When updating the docs, please make sure to keep them in sync.
|
||||
|
||||
If you update the [`README.md`](https://github.com/picocms/Pico/blob/master/README.md) or [`content-sample/index.md`](https://github.com/picocms/Pico/blob/master/content-sample/index.md), please make sure to update the corresponding files in the [`_docs`](https://github.com/picocms/picocms.github.io/tree/master/_docs/) folder of the `picocms.github.io` repo (i.e. [Pico's website](http://picocms.org/docs/)) and vice versa. Unfortunately this involves three (!) different markdown parsers. If you're experiencing problems, use Pico's [`erusev/parsedown-extra`](https://github.com/erusev/parsedown-extra) as a reference. You can try to make the contents compatible to [Kramdown](http://kramdown.gettalong.org/) (Pico's website) and [CommonMarker](https://github.com/gjtorikian/commonmarker) (`README.md`) by yourself, otherwise please address the issues in your pull request message and we'll take care of it.
|
||||
|
||||
Versioning
|
||||
----------
|
||||
|
||||
Pico follows [Semantic Versioning 2.0](http://semver.org) and uses version numbers like `MAJOR`.`MINOR`.`PATCH`. We will increment the:
|
||||
|
||||
- `MAJOR` version when we make incompatible API changes,
|
||||
- `MINOR` version when we add functionality in a backwards-compatible manner, and
|
||||
- `PATCH` version when we make backwards-compatible bug fixes.
|
||||
|
||||
For more information please refer to the http://semver.org website.
|
||||
|
||||
Branching
|
||||
---------
|
||||
|
||||
The `master` branch contains the current development version of Pico. It is likely *unstable* and *not ready for production use*.
|
||||
|
||||
However, the `master` branch always consists of a deployable (but not necessarily deployed) version of Pico. As soon as development of a new `MAJOR` or `MINOR` release starts, a separate branch (e.g. `pico-1.1`) is created and a [pull request](https://github.com/picocms/Pico/pulls) is opened to receive the desired feedback.
|
||||
|
||||
Pico's actual development happens in separate development branches. Development branches are prefixed by:
|
||||
|
||||
- `feature/` for bigger features,
|
||||
- `enhancement/` for smaller improvements, and
|
||||
- `bugfix/` for non-trivial bug fixes.
|
||||
|
||||
As soon as development reaches a point where feedback is appreciated, a pull request is opened. After some time (very soon for bug fixes, and other improvements should have a reasonable feedback phase) the pull request is merged and the development branch will be deleted. Trivial bug fixes that will be part of the next `PATCH` version will be merged directly into `master`.
|
||||
|
||||
Build & Release process
|
||||
-----------------------
|
||||
|
||||
We're using [Travis CI](https://travis-ci.com) to automate the build & release process of Pico. It generates and deploys a [PHP class documentation](http://picocms.org/phpDoc/) (powered by [phpDoc](http://phpdoc.org)) for new releases and on every commit to the `master` branch. Travis also prepares new releases by generating Pico's pre-built release packages, a version badge, code statistics (powered by [cloc](https://github.com/AlDanial/cloc)) and updates our website (the [`picocms.github.io` repo](https://github.com/picocms/picocms.github.io)). Please refer to our [`.travis.yml`](https://github.com/picocms/Pico/blob/master/.travis.yml), the [`picocms/ci-tools` repo](https://github.com/picocms/ci-tools) and the [`.build` directory](https://github.com/picocms/Pico/tree/master/.build) for details.
|
||||
|
||||
As insinuated above, it is important that each commit to `master` is deployable. Once development of a new Pico release is finished, trigger Pico's build & release process by pushing a new Git tag. This tag should reference a (usually empty) commit on `master`, which message should adhere to the following template:
|
||||
|
||||
```
|
||||
Version 1.0.0
|
||||
|
||||
* [Security] ...
|
||||
* [New] ...
|
||||
* [Changed] ...
|
||||
* [Fixed] ...
|
||||
* [Removed] ...
|
||||
```
|
||||
|
||||
Before pushing a new Git tag, make sure to update the `Pico::VERSION` and `Pico::VERSION_ID` constants. The versions of Pico's official [default theme](https://github.com/picocms/pico-theme) and the [`PicoDeprecated` plugin](https://github.com/picocms/pico-deprecated) both strictly follow Pico's version. Since Pico's pre-built release package contains them, you must always create a new release of them (even though nothing has changed) before creating a new Pico release.
|
||||
|
||||
If you're pushing a new major or minor release of Pico, you should also update Pico's `composer.json` to require the latest minor releases of Pico's dependencies. Besides, don't forget to update the `@version` tags in the PHP class docs.
|
||||
|
||||
Travis CI will draft the new [release on GitHub](https://github.com/picocms/Pico/releases) automatically, but will require you to manually amend the descriptions formatting. The latest Pico version is always available at https://github.com/picocms/Pico/releases/latest, so please make sure to publish this URL rather than version-specific URLs. [Packagist](http://packagist.org/packages/picocms/pico) will be updated automatically.
|
||||
|
||||
Labeling of Issues & Pull Requests
|
||||
----------------------------------
|
||||
|
||||
Pico makes use of GitHub's label and milestone features, to aide developers in quickly identifying and prioritizing which issues need to be worked on. The starting point for labeling issues and pull requests is the `type` label, which is explained in greater detail below. The `type` label might get combined with a `pri` label, describing the issue's priority, and a `status` label, describing the current status of the issue.
|
||||
|
||||
Issues and pull requests labeled with `info: Feedback Needed` indicate that feedback from others is highly appreciated. We always appreciate feedback at any time and from anyone, but when this label is present, we explicitly *ask* you to give feedback. It would be great if you leave a comment!
|
||||
|
||||
- The `type: Bug` label is assigned to issues or pull requests, which have been identified as bugs or security issues in Pico's core. It might get combined with the `pri: High` label, when the problem was identified as security issue, or as a so-called "show stopper" bug. In contrast, uncritical problems might get labeled with `pri: Low`. `type: Bug` issues and pull requests are usually labeled with one of the following `status` labels when being closed:
|
||||
- `status: Resolved` is used when the issue has been resolved.
|
||||
- `status: Conflict` indicates a conflict with another issue or behavior of Pico, making it impossible to resolve the problem at the moment.
|
||||
- `status: Won't Fix` means, that there is indeed a problem, but for some reason we made the decision that resolving it isn't reasonable, making it intended behavior.
|
||||
- `status: Rejected` is used when the issue was rejected for another reason.
|
||||
|
||||
- The `type: Enhancement` and `type: Feature` labels are used to tag pull requests, which introduce either a comparatively small enhancement, or a "big" new feature. As with the `type: Bug` label, they might get combined with the `pri: High` or `pri: Low` labels to indicate the pull request's priority. If a pull request isn't mergeable at the moment, it is labeled with `status: Work In Progress` until development of the pull request is finished. After merging or closing the pull request, it is labeled with one of the `status` labels as described above for the `type: Bug` label.
|
||||
|
||||
- The `type: Idea` label is similar to the `type: Enhancement` and `type: Feature` labels, but is used for issues or incomplete and abandoned pull requests. It is otherwise used in the exact same way as `type: Enhancement` and `type: Feature`.
|
||||
|
||||
- The `type: Release` label is used in the exact same way as `type: Feature` and indicates the primary pull request of a new Pico release (please refer to the *Branching* and *Build & Release process* sections above).
|
||||
|
||||
- The `type: Notice`, `type: Question` and `type: Discussion` labels are used to indicate "fyi" issues, issues opened by users or developers asking questions, and issues with disucssions about arbitrary topics related to Pico. They are neither combined with `pri` labels, nor with `status` labels.
|
||||
|
||||
- The `type: Duplicate` label is used when there is already another issue or pull request related to this problem or feature request. Issues labeled with `type: Duplicate` are immediately closed.
|
||||
|
||||
- The `type: Invalid` label is used for everything else, e.g. issues or pull requests not related to Pico, or invalid bug reports. This includes supposed bug reports that concern actually intended behavior.
|
||||
|
||||
The `status: Deferred` label might get added to any open issue or pull request to indicate that it is still unresolved and will be resolved later. This is also true for the `info: Pinned` label: It indicates a important issue or pull request that remains open on purpose.
|
||||
|
||||
After resolving a issue, we usually keep it open for about a week to give users some more time for feedback and further questions. This is especially true for issues with the `type: Notice`, `type: Question`, `type: Discussion` and `type: Invalid` labels. After 7 days with no interaction, [Probot](https://probot.github.io/)'s [Stale](https://github.com/apps/stale) bot adds the `info: Stale` label to the issue to ask the participants whether the issue has been resolved. If no more activity occurs, the issue will be automatically closed by Stale bot 2 days later.
|
||||
|
||||
Issues and pull requests labeled with `info: Information Needed` indicate that we have asked one of the participants for further information and didn't receive any feedback yet. It is usually added after Stale bot adds the `info: Stale` label to give the participants some more days to give the necessary information.
|
||||
|
||||
Issues and pull requests, which are rather related to upstream projects (i.e. projects Pico depends on, like Twig), are additionally labeled with `info: Upstream`.
|
||||
|
||||
When a issue or pull request isn't directly related to Pico's core, but the project as a whole, it is labeled with `info: Meta`. Issues labeled with `info: Website` are related to [Pico's website](http://picocms.org), however, in this case it is usually expedient to move the issue to the [`picocms.github.io` repo](https://github.com/picocms/picocms.github.io) instead. The same applies to the `info: Pico CMS for Nextcloud` label; these issues are related to [Pico CMS for Nextcloud](https://apps.nextcloud.com/apps/cms_pico).
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2012 The Pico Community
|
||||
|
||||
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.
|
|
@ -0,0 +1,38 @@
|
|||
## Link do sajta:
|
||||
<https://zapatista.kompot.si>
|
||||
*[Pico CMS (dokumentacija, plugins, themes)](https://picocms.org/)*
|
||||
|
||||
#### Markdown Guide
|
||||
[Basic Syntax](https://www.markdownguide.org/basic-syntax/) | [Extended Syntax](https://www.markdownguide.org/extended-syntax/) | [Hitra referenca - "plonklistek"](https://www.markdownguide.org/cheat-sheet/)
|
||||
|
||||
#### Katerikoli video embed
|
||||
|
||||
Deluje povsod v vsebini, razen v stranski vrstici, kjer je še vedno potrebno kopirat posamezne embede, ki so navedeni nižje.
|
||||
|
||||
```
|
||||
[video *LINK*]
|
||||
```
|
||||
|
||||
Primeri:
|
||||
```
|
||||
[video https://kolektiva.media/videos/embed/a5c6b8e1-6e9e-4a89-ace4-03b6cf97ce07]
|
||||
[video https://kolektiva.media/w/mtiCL28GP9gzLC2FPKjs6v]
|
||||
[video https://tube.mfraters.net/videos/watch/9a2b78db-ef05-4770-9196-8a1fcd243f43]
|
||||
[video https://vimeo.com/566821117]
|
||||
[video https://player.vimeo.com/video/566821117]
|
||||
[video https://youtu.be/NkdUs2Dxv4s]
|
||||
[video https://www.youtube.com/watch?v=NkdUs2Dxv4s]
|
||||
[video https://www.youtube.com/embed/NkdUs2Dxv4s]
|
||||
```
|
||||
|
||||
#### PeerTube Video embed
|
||||
Primer <https://kino.kompot.si> video. Pod videom klikneš na gumb "Share" in izbereš zavihek "Embed", ki ti generira kodo z za embedanje, ki jo potem vstaviš v pejđev markdown. če rabiš več kostumizacije je v "Embed" zavihku spodaj možnost "More customization". <https://docs.joinpeertube.org/use-watch-video?id=sharing-a-video> <https://thinkmoult.com/embed-peertube-video-on-your-website.html>
|
||||
**Lepši embed čez vso širino elementa** dobiš če iframe oviješ z `<div class="video">` ter `</div>` in pa ifram-u NE določiš "width" ter "height".
|
||||
primer: `<div class="video"><iframe sandbox="allow-same-origin allow-scripts allow-popups" src="https://video.anartist.org/videos/embed/470f5abd-55e4-4708-a685-5715063387ea?warningTitle=0" frameborder="0" allowfullscreen></iframe></div>`
|
||||
#### YouTube Video embed
|
||||
navodila: <https://support.google.com/youtube/answer/171780?hl=en>
|
||||
**Lepši embed čez vso širino elementa:** *na enak način kot v zgornjem primeru za PeerTube*
|
||||
|
||||
#### Vimeo Video embed
|
||||
<div class="video"><iframe src="https://player.vimeo.com/video/*ŠTEVILKA_VIDEA*" allowfullscreen></iframe></div>
|
||||
**Primer:** <div class="video"><iframe src="https://player.vimeo.com/video/565345244" allowfullscreen></iframe></div>
|
|
@ -0,0 +1,257 @@
|
|||
Pico
|
||||
====
|
||||
|
||||
[![License](https://picocms.github.io/badges/pico-license.svg)](https://github.com/picocms/Pico/blob/master/LICENSE.md)
|
||||
[![Version](https://picocms.github.io/badges/pico-version.svg)](https://github.com/picocms/Pico/releases/latest)
|
||||
[![Build Status](https://api.travis-ci.org/picocms/Pico.svg?branch=master)](https://travis-ci.org/picocms/Pico)
|
||||
[![Freenode IRC Webchat](https://picocms.github.io/badges/pico-chat.svg)](https://webchat.freenode.net/?channels=%23picocms)
|
||||
[![Open Bounties on Bountysource](https://www.bountysource.com/badge/team?team_id=198139&style=bounties_received)](https://www.bountysource.com/teams/picocms)
|
||||
|
||||
Pico is a stupidly simple, blazing fast, flat file CMS.
|
||||
|
||||
Visit us at http://picocms.org/ and see http://picocms.org/about/ for more info.
|
||||
|
||||
Screenshot
|
||||
----------
|
||||
|
||||
![Pico Screenshot](https://picocms.github.io/screenshots/pico-21.png)
|
||||
|
||||
Install
|
||||
-------
|
||||
|
||||
Installing Pico is dead simple - and done in seconds! If you have access to a shell on your server (i.e. SSH access), we recommend using [Composer][]. If not, use a pre-bundled release. If you don't know what "SSH access" is, head over to the pre-bundled release. 😇
|
||||
|
||||
Pico requires PHP 5.3.6+ and the PHP extensions `dom` and `mbstring` to be enabled.
|
||||
|
||||
### I want to use Composer
|
||||
|
||||
Starting with Pico 2.0 we recommend installing Pico using Composer whenever possible. Trust us, you won't regret it when it comes to upgrading Pico! Anyway, if you don't want to use Composer, or if you simply can't use Composer because you don't have access to a shell on your server, don't despair, installing Pico using a pre-bundled release is still easier than everything you know!
|
||||
|
||||
###### Step 1
|
||||
|
||||
Open a shell and navigate to the `httpdocs` directory (e.g. `/var/www/html`) of your server. Download Composer and run it with the `create-project` option to install it to the desired directory (e.g. `/var/www/html/pico`):
|
||||
|
||||
```shell
|
||||
$ curl -sSL https://getcomposer.org/installer | php
|
||||
$ php composer.phar create-project picocms/pico-composer pico
|
||||
```
|
||||
|
||||
###### Step 2
|
||||
|
||||
What second step? There's no second step. That's it! Open your favorite web browser and navigate to your brand new, stupidly simple, blazing fast, flat file CMS! Pico's sample contents will explain how to create your own contents. 😊
|
||||
|
||||
### I want to use a pre-bundled release
|
||||
|
||||
Do you know the feeling: You want to install a new website, so you upload all files of your favorite CMS and run the setup script - just to find out that you forgot about creating the SQL database first? Later the setup script tells you that the file permissions are wrong. Heck, what does this even mean? Forget about it, Pico is different!
|
||||
|
||||
###### Step 1
|
||||
|
||||
[Download the latest Pico release][LatestRelease] and upload all files to the desired install directory of Pico within the `httpdocs` directory (e.g. `/var/www/html/pico`) of your server.
|
||||
|
||||
###### Step 2
|
||||
|
||||
Okay, here's the catch: There's no catch. That's it! Open your favorite web browser and navigate to your brand new, stupidly simple, blazing fast, flat file CMS! Pico's sample contents will explain how to create your own contents. 😊
|
||||
|
||||
### I want to manage my website using a Git repository
|
||||
|
||||
Git is a very powerful distributed version-control system - and it can be used to establish a nice workflow around your Pico website. Using a Git repository for your website aids content creation and deployment, including collaborative editing and version control. If you want to manage your website in a Git repository, you use a Composer-based installation.
|
||||
|
||||
1. Fork [Pico's Composer starter project][PicoComposerGit] using [GitHub's fork button][HelpFork]. If you don't want to use GitHub you aren't required to, you can choose whatever Git server you want. Forking manually just requires some extra steps: First clone the Git repository locally, add your Git server as a remote and push the repository to this new remote.
|
||||
|
||||
2. Clone your fork locally and add your contents and assets. You can edit Pico's `composer.json` to include 3rd-party plugins and themes, or simply add your own plugins and themes to Pico's `plugins` resp. `themes` directories. Don't forget to commit your changes and push them to your Git server.
|
||||
|
||||
3. Open a shell on your webserver and navigate to the `httpdocs` directory (e.g. `/var/www/html`). Download Composer, clone your Git repository to the desired directory (e.g. `/var/www/html/pico`) and install Pico's dependencies using Composer's `install` option:
|
||||
|
||||
```shell
|
||||
$ curl -sSL https://getcomposer.org/installer | php
|
||||
$ git clone https://github.com/<YOUR_USERNAME>/<YOUR_REPOSITORY> pico
|
||||
$ php composer.phar --working-dir=pico install
|
||||
```
|
||||
|
||||
4. If you update your website's contents, simply commit your changes and push them to your Git server. Open a shell on your webserver and navigate to Pico's install directory within the `httpdocs` directory (e.g. `/var/www/html/pico`) of your server. Pull all changes from your Git server and update Pico's dependencies using Composer's `update` option:
|
||||
|
||||
```shell
|
||||
$ git pull
|
||||
$ php composer.phar update
|
||||
```
|
||||
|
||||
### I'm a developer
|
||||
|
||||
So, you're one of these amazing people making all of this possible? We love you folks! As a developer we recommend you to clone [Pico's Git repository][PicoGit] as well as the Git repositories of [Pico's default theme][PicoThemeGit] and the [`PicoDeprecated` plugin][PicoDeprecatedGit]. You can set up your workspace using [Pico's Composer starter project][PicoComposerGit] and include all of Pico's components using local packages.
|
||||
|
||||
Using Pico's Git repositories is different from using one of the installation methods elucidated above. It gives you the current development version of Pico, what is likely *unstable* and *not ready for production use*!
|
||||
|
||||
1. Open a shell and navigate to the desired directory of Pico's development workspace within the `httpdocs` directory (e.g. `/var/www/html/pico`) of your server. Download and extract Pico's Composer starter project into the `workspace` directory:
|
||||
|
||||
```shell
|
||||
$ curl -sSL https://github.com/picocms/pico-composer/archive/master.tar.gz | tar xz
|
||||
$ mv pico-composer-master workspace
|
||||
```
|
||||
|
||||
2. Clone the Git repositories of all Pico components (Pico's core, Pico's default theme and the `PicoDeprecated` plugin) into the `components` directory:
|
||||
|
||||
```shell
|
||||
$ mkdir components
|
||||
$ git clone https://github.com/picocms/Pico.git components/pico
|
||||
$ git clone https://github.com/picocms/pico-theme.git components/pico-theme
|
||||
$ git clone https://github.com/picocms/pico-deprecated.git components/pico-deprecated
|
||||
```
|
||||
|
||||
3. Instruct Composer to use the local Git repositories as replacement for the `picocms/pico` (Pico's core), `picocms/pico-theme` (Pico's default theme) and `picocms/pico-deprecated` (the `PicoDeprecated` plugin) packages. Update the `composer.json` of your development workspace (i.e. `workspace/composer.json`) accordingly:
|
||||
|
||||
```json
|
||||
{
|
||||
"repositories": [
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../components/pico",
|
||||
"options": { "symlink": true }
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../components/pico-theme",
|
||||
"options": { "symlink": true }
|
||||
},
|
||||
{
|
||||
"type": "path",
|
||||
"url": "../components/pico-deprecated",
|
||||
"options": { "symlink": true }
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"picocms/pico": "dev-master",
|
||||
"picocms/pico-theme": "dev-master",
|
||||
"picocms/pico-deprecated": "dev-master",
|
||||
"picocms/composer-installer": "^1.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
4. Download Composer and run it with the `install` option:
|
||||
|
||||
```shell
|
||||
$ curl -sSL https://getcomposer.org/installer | php
|
||||
$ php composer.phar --working-dir=workspace install
|
||||
```
|
||||
|
||||
You can now open your web browser and navigate to Pico's development workspace. All changes you make to Pico's components will automatically be reflected in the development workspace.
|
||||
|
||||
By the way, you can also find all of Pico's components on [Packagist.org][Packagist]: [Pico's core][PicoPackagist], [Pico's default theme][PicoThemePackagist], the [`PicoDeprecated` plugin][PicoDeprecatedPackagist] and [Pico's Composer starter project][PicoComposerPackagist].
|
||||
|
||||
Upgrade
|
||||
-------
|
||||
|
||||
Do you remember when you installed Pico? It was ingeniously simple, wasn't it? Upgrading Pico is no difference! The upgrade process differs depending on whether you used [Composer][] or a pre-bundled release to install Pico. Please note that you should *always* create a backup of your Pico installation before upgrading!
|
||||
|
||||
Pico follows [Semantic Versioning 2.0][SemVer] and uses version numbers like `MAJOR`.`MINOR`.`PATCH`. When we update the `PATCH` version (e.g. `2.0.0` to `2.0.1`), we made backwards-compatible bug fixes. If we change the `MINOR` version (e.g. `2.0` to `2.1`), we added functionality in a backwards-compatible manner. Upgrading Pico is dead simple in both cases. Simply head over to the appropiate Upgrade sections below.
|
||||
|
||||
But wait, we forgot to mention what happens when we update the `MAJOR` version (e.g. `2.0` to `3.0`). In this case we made incompatible API changes. We will then provide a appropriate upgrade tutorial, so please head over to the ["Upgrade" page on our website][HelpUpgrade].
|
||||
|
||||
### I've used Composer to install Pico
|
||||
|
||||
Upgrading Pico is dead simple if you've used Composer to install Pico. Simply open a shell and navigate to Pico's install directory within the `httpdocs` directory (e.g. `/var/www/html/pico`) of your server. You can now upgrade Pico using just a single command:
|
||||
|
||||
```shell
|
||||
$ php composer.phar update
|
||||
```
|
||||
|
||||
That's it! Composer will automatically update Pico and all plugins and themes you've installed using Composer. Please make sure to manually update all plugins and themes you've installed manually.
|
||||
|
||||
### I've used a pre-bundled release to install Pico
|
||||
|
||||
Okay, installing Pico was easy, but upgrading Pico is going to be hard, isn't it? I'm afraid I have to disappoint you. It's just as simple as installing Pico!
|
||||
|
||||
First you'll have to delete the `vendor` directory of your Pico installation (e.g. if you've installed Pico to `/var/www/html/pico`, delete `/var/www/html/pico/vendor`). Then [download the latest Pico release][LatestRelease] and upload all files to your existing Pico installation directory. You will be prompted whether you want to overwrite files like `index.php`, `.htaccess`, ... - simply hit "Yes".
|
||||
|
||||
That's it! Now that Pico is up-to-date, you need to update all plugins and themes you've installed.
|
||||
|
||||
### I'm a developer
|
||||
|
||||
As a developer you should know how to stay up-to-date... 😉 For the sake of completeness, if you want to upgrade Pico, simply open a shell and navigate to Pico's development workspace (e.g. `/var/www/html/pico`). Then pull the latest commits from the Git repositories of [Pico's core][PicoGit], [Pico's default theme][PicoThemeGit] and the [`PicoDeprecated` plugin][PicoDeprecatedGit]. Let Composer update your dependencies and you're ready to go.
|
||||
|
||||
```shell
|
||||
$ git -C components/pico pull
|
||||
$ git -C components/pico-theme pull
|
||||
$ git -C components/pico-deprecated pull
|
||||
$ php composer.phar --working-dir=workspace update
|
||||
```
|
||||
|
||||
Getting Help
|
||||
------------
|
||||
|
||||
#### Getting Help as a user
|
||||
|
||||
If you want to get started using Pico, please refer to our [user docs][HelpUserDocs]. Please read the [upgrade notes][HelpUpgrade] if you want to upgrade from Pico 1.0 to Pico 2.0. You can find officially supported [plugins][OfficialPlugins] and [themes][OfficialThemes] on our website. A greater choice of third-party plugins and themes can be found in our [Wiki][] on the [plugins][WikiPlugins] or [themes][WikiThemes] pages respectively. If you want to create your own plugin or theme, please refer to the "Getting Help as a developer" section below.
|
||||
|
||||
#### Getting Help as a developer
|
||||
|
||||
If you're a developer, please refer to the "Contributing" section below and our [contribution guidelines][ContributionGuidelines]. To get you started with creating a plugin or theme, please read the [developer docs on our website][HelpDevDocs].
|
||||
|
||||
#### You still need help or experience a problem with Pico?
|
||||
|
||||
When the docs can't answer your question, you can get help by joining us on [#picocms on Freenode IRC][Freenode] ([logs][FreenodeLogs]). When you're experiencing problems with Pico, please don't hesitate to create a new [Issue][Issues] on GitHub. Concerning problems with plugins or themes, please refer to the website of the developer of this plugin or theme.
|
||||
|
||||
**Before creating a new Issue,** please make sure the problem wasn't reported yet using [GitHubs search engine][IssuesSearch]. Please describe your issue as clear as possible and always include the *Pico version* you're using. Provided that you're using *plugins*, include a list of them too. We need information about the *actual and expected behavior*, the *steps to reproduce* the problem, and what steps you have taken to resolve the problem by yourself (i.e. *your own troubleshooting*).
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
You want to contribute to Pico? We really appreciate that! You can help make Pico better by [contributing code][PullRequests] or [reporting issues][Issues], but please take note of our [contribution guidelines][ContributionGuidelines]. In general you can contribute in three different areas:
|
||||
|
||||
1. Plugins & Themes: You're a plugin developer or theme designer? We love you folks! You can find tons of information about how to develop plugins and themes at http://picocms.org/development/. If you have created a plugin or theme, please add it to our [Wiki][], either on the [plugins][WikiPlugins] or [themes][WikiThemes] page. You may also [Submit][] it to our website, where it'll be displayed on the official [plugin][OfficialPlugins] or [theme][OfficialThemes] pages!
|
||||
|
||||
2. Documentation: We always appreciate people improving our documentation. You can either improve the [inline user docs][EditInlineDocs] or the more extensive [user docs on our website][EditUserDocs]. You can also improve the [docs for plugin and theme developers][EditDevDocs]. Simply fork our website's Git repository from https://github.com/picocms/picocms.github.io, change the Markdown files and open a [pull request][PullRequestsWebsite].
|
||||
|
||||
3. Pico's Core: The supreme discipline is to work on Pico's Core. Your contribution should help *every* Pico user to have a better experience with Pico. If this is the case, fork Pico from https://github.com/picocms/Pico and open a [pull request][PullRequests]. We look forward to your contribution!
|
||||
|
||||
By contributing to Pico, you accept and agree to the *Developer Certificate of Origin* for your present and future contributions submitted to Pico. Please refer to the ["Developer Certificate of Origin" section in our `CONTRIBUTING.md`][ContributionGuidelinesDCO].
|
||||
|
||||
You don't have time to contribute code to Pico, but still want to "stand a coffee" for the ones who do? You can contribute monetary to Pico using [Bountysource][], a crowd funding website that focuses on individual issues and feature requests. Just refer to the "Bounties and Fundraisers" section below for more info.
|
||||
|
||||
Bounties and Fundraisers
|
||||
------------------------
|
||||
|
||||
Pico uses [Bountysource][] to allow monetary contributions to the project. Bountysource is a crowd funding website that focuses on individual issues and feature requests in Open Source projects using micropayment. Users, or "Backers", can pledge money for fixing a specific issue, implementing new features, or developing a new plugin or theme. Open source software developers, or "Bounty Hunters", can then pick up and solve these tasks to earn the money.
|
||||
|
||||
Obviously this won't allow a developer to replace a full time job, it's rather aiming to "stand a coffee". However, it helps bringing users and developers closer together, and shows developers what users want and how much they care about certain things. Nevertheless you can still donate money to the project itself, as an easy way to say "Thank You" and to support Pico.
|
||||
|
||||
If you want to encourage developers to [fix a specific issue][Issues] or implement a feature, simply [pledge a new bounty][Bountysource] or back an existing one.
|
||||
|
||||
As a developer you can pick up a bounty by simply contributing to Pico (please refer to the "Contributing" section above). You don't have to be a official Pico Contributor! Pico is a Open Source project, anyone can open [pull requests][PullRequests] and claim bounties.
|
||||
|
||||
Official Pico Contributors won't claim bounties on their own behalf, Pico will never take any money out of Bountysource. All money collected by Pico is used to pledge new bounties or to support projects Pico depends on.
|
||||
|
||||
[Composer]: https://getcomposer.org/
|
||||
[LatestRelease]: https://github.com/picocms/Pico/releases/latest
|
||||
[PicoGit]: https://github.com/picocms/Pico
|
||||
[PicoThemeGit]: https://github.com/picocms/pico-theme
|
||||
[PicoDeprecatedGit]: https://github.com/picocms/pico-deprecated
|
||||
[PicoComposerGit]: https://github.com/picocms/pico-composer
|
||||
[Packagist]: https://packagist.org/
|
||||
[PicoPackagist]: https://packagist.org/packages/picocms/pico
|
||||
[PicoThemePackagist]: https://packagist.org/packages/picocms/pico-theme
|
||||
[PicoDeprecatedPackagist]: https://packagist.org/packages/picocms/pico-deprecated
|
||||
[PicoComposerPackagist]: https://packagist.org/packages/picocms/pico-composer
|
||||
[SemVer]: http://semver.org
|
||||
[HelpFork]: https://help.github.com/en/github/getting-started-with-github/fork-a-repo
|
||||
[HelpUpgrade]: http://picocms.org/in-depth/upgrade/
|
||||
[HelpUserDocs]: http://picocms.org/docs/
|
||||
[HelpDevDocs]: http://picocms.org/development/
|
||||
[Submit]: http://picocms.org/in-depth/submission_guidelines
|
||||
[OfficialPlugins]: http://picocms.org/plugins/
|
||||
[OfficialThemes]: http://picocms.org/themes/
|
||||
[Wiki]: https://github.com/picocms/Pico/wiki
|
||||
[WikiPlugins]: https://github.com/picocms/Pico/wiki/Pico-Plugins
|
||||
[WikiThemes]: https://github.com/picocms/Pico/wiki/Pico-Themes
|
||||
[Issues]: https://github.com/picocms/Pico/issues
|
||||
[IssuesSearch]: https://github.com/picocms/Pico/search?type=Issues
|
||||
[Freenode]: https://webchat.freenode.net/?channels=%23picocms
|
||||
[FreenodeLogs]: http://picocms.org/irc-logs
|
||||
[PullRequests]: https://github.com/picocms/Pico/pulls
|
||||
[PullRequestsWebsite]: https://github.com/picocms/picocms.github.io/pulls
|
||||
[ContributionGuidelines]: https://github.com/picocms/Pico/blob/master/CONTRIBUTING.md
|
||||
[ContributionGuidelinesDCO]: https://github.com/picocms/Pico/blob/master/CONTRIBUTING.md#developer-certificate-of-origin
|
||||
[EditInlineDocs]: https://github.com/picocms/Pico/edit/master/content-sample/index.md
|
||||
[EditUserDocs]: https://github.com/picocms/picocms.github.io/tree/master/_docs
|
||||
[EditDevDocs]: https://github.com/picocms/picocms.github.io/tree/master/_development
|
||||
[Bountysource]: https://www.bountysource.com/teams/picocms
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"name": "picocms/pico-composer",
|
||||
"type": "project",
|
||||
"description": "Pico is a flat file CMS, this means there is no administration backend and database to deal with. You simply create .md files in the \"content\" folder and that becomes a page.",
|
||||
"keywords": [ "pico", "picocms", "pico-cms", "simple", "flat-file", "cms", "content-management", "website", "markdown-to-html", "php", "markdown", "yaml", "twig", "composer-project" ],
|
||||
"homepage": "http://picocms.org/",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/pico-composer/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"docs": "http://picocms.org/docs",
|
||||
"issues": "https://github.com/picocms/Pico/issues",
|
||||
"source": "https://github.com/picocms/Pico"
|
||||
},
|
||||
"require": {
|
||||
"picocms/pico": "^2.1",
|
||||
"picocms/pico-theme": "^2.1",
|
||||
"picocms/pico-deprecated": "^2.1",
|
||||
"picocms/composer-installer": "^1.0"
|
||||
},
|
||||
"minimum-stability": "beta",
|
||||
"prefer-stable": true,
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"picocms/composer-installer": true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,617 @@
|
|||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "c572de982113b017edeaa4b6ec598816",
|
||||
"packages": [
|
||||
{
|
||||
"name": "erusev/parsedown",
|
||||
"version": "1.8.0-beta-7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/erusev/parsedown.git",
|
||||
"reference": "fe7a50eceb4a3c867cc9fa9c0aa906b1067d1955"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/erusev/parsedown/zipball/fe7a50eceb4a3c867cc9fa9c0aa906b1067d1955",
|
||||
"reference": "fe7a50eceb4a3c867cc9fa9c0aa906b1067d1955",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-mbstring": "*",
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Parsedown": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Emanuil Rusev",
|
||||
"email": "hello@erusev.com",
|
||||
"homepage": "http://erusev.com"
|
||||
}
|
||||
],
|
||||
"description": "Parser for Markdown.",
|
||||
"homepage": "http://parsedown.org",
|
||||
"keywords": [
|
||||
"markdown",
|
||||
"parser"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/erusev/parsedown/issues",
|
||||
"source": "https://github.com/erusev/parsedown/tree/1.8.0-beta-7"
|
||||
},
|
||||
"time": "2019-03-17T18:47:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "erusev/parsedown-extra",
|
||||
"version": "0.8.0-beta-1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/erusev/parsedown-extra.git",
|
||||
"reference": "e756b1bf8642ab1091403e902b0503f1cec7527d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/e756b1bf8642ab1091403e902b0503f1cec7527d",
|
||||
"reference": "e756b1bf8642ab1091403e902b0503f1cec7527d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"erusev/parsedown": "^1.8.0|^1.8.0-beta-4",
|
||||
"ext-dom": "*",
|
||||
"ext-mbstring": "*",
|
||||
"php": ">=5.3.6"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"ParsedownExtra": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Emanuil Rusev",
|
||||
"email": "hello@erusev.com",
|
||||
"homepage": "http://erusev.com"
|
||||
}
|
||||
],
|
||||
"description": "An extension of Parsedown that adds support for Markdown Extra.",
|
||||
"homepage": "https://github.com/erusev/parsedown-extra",
|
||||
"keywords": [
|
||||
"markdown",
|
||||
"markdown extra",
|
||||
"parsedown",
|
||||
"parser"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/erusev/parsedown-extra/issues",
|
||||
"source": "https://github.com/erusev/parsedown-extra/tree/master"
|
||||
},
|
||||
"time": "2018-05-08T21:54:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "picocms/composer-installer",
|
||||
"version": "v1.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/picocms/composer-installer.git",
|
||||
"reference": "6b5036c83aa091ed76e2a76ed9335885f95a7db7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/picocms/composer-installer/zipball/6b5036c83aa091ed76e2a76ed9335885f95a7db7",
|
||||
"reference": "6b5036c83aa091ed76e2a76ed9335885f95a7db7",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "composer-installer",
|
||||
"extra": {
|
||||
"class": "Pico\\Composer\\Installer\\PluginInstaller"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Pico\\Composer\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/composer-installer/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"description": "A composer plugin responsible for installing plugins and themes for Pico, a stupidly simple, blazing fast, flat file CMS.",
|
||||
"homepage": "http://picocms.org/",
|
||||
"keywords": [
|
||||
"composer",
|
||||
"composer-installer",
|
||||
"composer-plugin",
|
||||
"pico",
|
||||
"pico-cms",
|
||||
"picocms",
|
||||
"picocms-installer",
|
||||
"picocms-plugin",
|
||||
"picocms-theme"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/picocms/composer-installer/issues",
|
||||
"source": "https://github.com/picocms/composer-installer"
|
||||
},
|
||||
"time": "2019-11-24T22:50:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "picocms/pico",
|
||||
"version": "v2.1.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/picocms/Pico.git",
|
||||
"reference": "7228129cade3f812f22904b503c939b04a75c9dd"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/picocms/Pico/zipball/7228129cade3f812f22904b503c939b04a75c9dd",
|
||||
"reference": "7228129cade3f812f22904b503c939b04a75c9dd",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"erusev/parsedown": "1.8.0-beta-7",
|
||||
"erusev/parsedown-extra": "0.8.0-beta-1",
|
||||
"ext-mbstring": "*",
|
||||
"php": ">=5.3.6",
|
||||
"symfony/yaml": "^2.8",
|
||||
"twig/twig": "^1.36"
|
||||
},
|
||||
"suggest": {
|
||||
"picocms/composer-installer": "This Composer plugin is responsible for installing Pico plugins and themes using the Composer package manager.",
|
||||
"picocms/pico-deprecated": "PicoDeprecated's purpose is to maintain backward compatibility to older versions of Pico.",
|
||||
"picocms/pico-theme": "Pico requires a theme to actually display the contents of your website. This is Pico's official default theme."
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.1.x-dev",
|
||||
"dev-pico-3.0": "3.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Pico": "lib/",
|
||||
"AbstractPicoPlugin": "lib/",
|
||||
"PicoPluginInterface": "lib/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Gilbert Pellegrom",
|
||||
"email": "gilbert@pellegrom.me",
|
||||
"role": "Project Founder"
|
||||
},
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/Pico/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Pico is a flat file CMS, this means there is no administration backend and database to deal with. You simply create .md files in the \"content\" folder and that becomes a page.",
|
||||
"homepage": "http://picocms.org/",
|
||||
"keywords": [
|
||||
"Simple",
|
||||
"cms",
|
||||
"content-management",
|
||||
"flat-file",
|
||||
"markdown",
|
||||
"markdown-to-html",
|
||||
"php",
|
||||
"pico",
|
||||
"pico-cms",
|
||||
"picocms",
|
||||
"twig",
|
||||
"website",
|
||||
"yaml"
|
||||
],
|
||||
"support": {
|
||||
"docs": "http://picocms.org/docs",
|
||||
"issues": "https://github.com/picocms/Pico/issues",
|
||||
"source": "https://github.com/picocms/Pico"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://www.bountysource.com/teams/picocms",
|
||||
"type": "custom"
|
||||
}
|
||||
],
|
||||
"time": "2020-08-29T14:15:52+00:00"
|
||||
},
|
||||
{
|
||||
"name": "picocms/pico-deprecated",
|
||||
"version": "v2.1.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/picocms/pico-deprecated.git",
|
||||
"reference": "8d1a4056ecc71cc2857e91d50bcb38db91d424e0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/picocms/pico-deprecated/zipball/8d1a4056ecc71cc2857e91d50bcb38db91d424e0",
|
||||
"reference": "8d1a4056ecc71cc2857e91d50bcb38db91d424e0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0",
|
||||
"picocms/pico": "self.version"
|
||||
},
|
||||
"type": "pico-plugin",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.1.x-dev",
|
||||
"dev-pico-3.0": "3.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"PicoDeprecated.php",
|
||||
"lib/",
|
||||
"plugins/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/pico-deprecated/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"description": "This is Pico's official PicoDeprecated plugin. Pico is a stupidly simple, blazing fast, flat file CMS.",
|
||||
"homepage": "http://picocms.org/",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"deprecation",
|
||||
"pico",
|
||||
"pico-deprecated",
|
||||
"picocms",
|
||||
"picocms-plugin"
|
||||
],
|
||||
"support": {
|
||||
"docs": "http://picocms.org/plugins/deprecated/",
|
||||
"issues": "https://github.com/picocms/pico-deprecated/issues",
|
||||
"source": "https://github.com/picocms/pico-deprecated"
|
||||
},
|
||||
"time": "2020-08-29T15:11:07+00:00"
|
||||
},
|
||||
{
|
||||
"name": "picocms/pico-theme",
|
||||
"version": "v2.1.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/picocms/pico-theme.git",
|
||||
"reference": "d4ec8df28356f1e034a97d37327b9aecb3129eed"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/picocms/pico-theme/zipball/d4ec8df28356f1e034a97d37327b9aecb3129eed",
|
||||
"reference": "d4ec8df28356f1e034a97d37327b9aecb3129eed",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"picocms/pico": "self.version"
|
||||
},
|
||||
"type": "pico-theme",
|
||||
"extra": {
|
||||
"installer-name": "default",
|
||||
"branch-alias": {
|
||||
"dev-master": "2.1.x-dev",
|
||||
"dev-pico-3.0": "3.0.x-dev"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/pico-theme/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"description": "This is Pico's official default theme. Pico is a stupidly simple, blazing fast, flat file CMS.",
|
||||
"homepage": "http://picocms.org/",
|
||||
"keywords": [
|
||||
"default-theme",
|
||||
"pico",
|
||||
"pico-theme",
|
||||
"picocms",
|
||||
"picocms-theme"
|
||||
],
|
||||
"support": {
|
||||
"docs": "http://picocms.org/themes/default/",
|
||||
"issues": "https://github.com/picocms/pico-theme/issues",
|
||||
"source": "https://github.com/picocms/pico-theme"
|
||||
},
|
||||
"time": "2020-08-29T15:11:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-ctype",
|
||||
"version": "v1.29.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
|
||||
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"provide": {
|
||||
"ext-ctype": "*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-ctype": "For best performance"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"thanks": {
|
||||
"name": "symfony/polyfill",
|
||||
"url": "https://github.com/symfony/polyfill"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Ctype\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Gert de Pagter",
|
||||
"email": "BackEndTea@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony polyfill for ctype functions",
|
||||
"homepage": "https://symfony.com",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"ctype",
|
||||
"polyfill",
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-01-29T20:11:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/yaml",
|
||||
"version": "v2.8.52",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/yaml.git",
|
||||
"reference": "02c1859112aa779d9ab394ae4f3381911d84052b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/02c1859112aa779d9ab394ae4f3381911d84052b",
|
||||
"reference": "02c1859112aa779d9ab394ae4f3381911d84052b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.9",
|
||||
"symfony/polyfill-ctype": "~1.8"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.8-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Component\\Yaml\\": ""
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"/Tests/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
"email": "fabien@symfony.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony Yaml Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/yaml/tree/v2.8.52"
|
||||
},
|
||||
"time": "2018-11-11T11:18:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "twig/twig",
|
||||
"version": "v1.44.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/twigphp/Twig.git",
|
||||
"reference": "0887422319889e442458e48e2f3d9add1a172ad5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/0887422319889e442458e48e2f3d9add1a172ad5",
|
||||
"reference": "0887422319889e442458e48e2f3d9add1a172ad5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.2.5",
|
||||
"symfony/polyfill-ctype": "^1.8"
|
||||
},
|
||||
"require-dev": {
|
||||
"psr/container": "^1.0",
|
||||
"symfony/phpunit-bridge": "^4.4.9|^5.0.9"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.44-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Twig_": "lib/"
|
||||
},
|
||||
"psr-4": {
|
||||
"Twig\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
"email": "fabien@symfony.com",
|
||||
"homepage": "http://fabien.potencier.org",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "Twig Team",
|
||||
"role": "Contributors"
|
||||
},
|
||||
{
|
||||
"name": "Armin Ronacher",
|
||||
"email": "armin.ronacher@active-4.com",
|
||||
"role": "Project Founder"
|
||||
}
|
||||
],
|
||||
"description": "Twig, the flexible, fast, and secure template language for PHP",
|
||||
"homepage": "https://twig.symfony.com",
|
||||
"keywords": [
|
||||
"templating"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/twigphp/Twig/issues",
|
||||
"source": "https://github.com/twigphp/Twig/tree/v1.44.7"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/twig/twig",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-09-28T08:38:36+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "beta",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": true,
|
||||
"prefer-lowest": false,
|
||||
"platform": [],
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.6.0"
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
##
|
||||
# Basic
|
||||
#
|
||||
site_title: Proti militarizmu # The title of your website
|
||||
site_subtitle: Za svet brez vojne
|
||||
base_url: ~ # Pico will try to guess its base URL, if this fails, override it here;
|
||||
# Example: https://example.com/pico/
|
||||
rewrite_url: ~ # A boolean (true or false) indicating whether URL rewriting is forced
|
||||
debug: ~ # Set this to true to enable Pico's debug mode
|
||||
timezone: ~ # Your PHP installation might require you to manually specify a timezone
|
||||
locale: ~ # Your PHP installation might require you to manually specify a locale to use
|
||||
|
||||
##
|
||||
# Theme
|
||||
#
|
||||
theme: Travelify-tr00_popravljena # The name of your custom theme
|
||||
themes_url: ~ # Pico will try to guess the URL to the themes dir of your installation;
|
||||
# If this fails, override it here. Example: https://example.com/pico/themes/
|
||||
theme_config: # Additional theme-specific config
|
||||
widescreen: false # Default theme: Use more horizontal space (i.e. make the site container wider)
|
||||
twig_config: # Twig template engine config
|
||||
autoescape: html # Let Twig escape variables by default
|
||||
strict_variables: false # If set to true, Twig will bail out when unset variables are being used
|
||||
charset: utf-8 # The charset used by Twig templates
|
||||
debug: ~ # Enable Twig's debug mode
|
||||
cache: .cache # Enable Twig template caching by specifying a path to a writable directory
|
||||
auto_reload: true # Recompile Twig templates whenever the source code changes
|
||||
|
||||
##
|
||||
# Content
|
||||
#
|
||||
date_format: %d. %m. %Y # Pico's default date format;
|
||||
# See https://php.net/manual/en/function.strftime.php for more info
|
||||
pages_order_by_meta: author # Sort pages by meta value "author" (set "pages_order_by" to "meta")
|
||||
pages_order_by: date # Change how Pico sorts pages ("alpha" for alphabetical order, "date", or "meta")
|
||||
pages_order: desc # Sort pages in ascending ("asc") or descending ("desc") order
|
||||
content_dir: ~ # The path to Pico's content directory
|
||||
content_ext: .md # The file extension of your Markdown files
|
||||
content_config: # Parsedown Markdown parser config
|
||||
extra: true # Use the Parsedown Extra parser to support extended markup;
|
||||
# See https://michelf.ca/projects/php-markdown/extra/ for more info
|
||||
breaks: true # A boolean indicating whether breaks in the markup should be reflected in the
|
||||
# parsed contents of the page
|
||||
escape: false # Escape HTML markup in your content files; don't confuse this with some sort of
|
||||
# safe mode, enabling this doesn't allow you to process untrusted user input!
|
||||
auto_urls: true # Automatically link URLs found in your markup
|
||||
assets_dir: assets/ # The path to Pico's assets directory
|
||||
assets_url: ~ # Pico will try to guess the URL to the assets dir of your installation;
|
||||
# If this fails, override it here. Example: https://example.com/pico/assets/
|
||||
|
||||
##
|
||||
# Plugins
|
||||
#
|
||||
plugins_url: ~ # Pico will try to guess the URL to the plugins dir of your installation;
|
||||
# If this fails, override it here. Example: https://example.com/pico/plugins/
|
||||
DummyPlugin.enabled: false # Force the plugin "DummyPlugin" to be disabled
|
||||
|
||||
##
|
||||
# Custom
|
||||
#
|
||||
#my_custom_setting: Hello World! # You can access custom settings in themes using {{ config.my_custom_setting }}
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
Title: Error 404
|
||||
Robots: noindex,nofollow
|
||||
---
|
||||
|
||||
Error 404
|
||||
=========
|
||||
|
||||
Woops. Looks like this page doesn't exist.
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
Logo: %theme_url%/img/pico-white.svg
|
||||
Tagline: Pico CMS for Nextcloud in action.
|
||||
Social:
|
||||
- title: Visit us on GitHub
|
||||
url: https://github.com/picocms/Pico
|
||||
icon: octocat
|
||||
- title: Join us on Freenode IRC Webchat
|
||||
url: https://webchat.freenode.net/?channels=%23picocms
|
||||
icon: chat
|
||||
- title: Help us by creating/collecting bounties and pledging to fundraisers
|
||||
url: https://www.bountysource.com/teams/picocms
|
||||
icon: dollar
|
||||
---
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
Title: Pobuda proti militarizmu
|
||||
Description: Pobuda proti militarizmu
|
||||
Template: index-novice
|
||||
---
|
||||
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
Title: Materiali
|
||||
Description: Plakati, nalepke in drugi materiali za boj proti militarizmu
|
||||
---
|
||||
|
||||
**PLAKATI**
|
||||
|
||||
|
||||
![Ivo Boskarol](https://protimilitarizmu.kompot.si/assets/IVO-plakat1.png)
|
||||
<hr>
|
||||
|
||||
|
||||
![Marko Pelhan](https://protimilitarizmu.kompot.si/assets/MARKO-plakat.png)
|
||||
<hr>
|
||||
|
||||
![Tim Castagne](https://protimilitarizmu.kompot.si/assets/TIM-plakat.png)
|
||||
<hr>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: Navigation bar
|
||||
---
|
||||
|
||||
- [Domov](%base_url%)
|
||||
- [O pobudi?](%base_url%?pobuda)
|
||||
- [Materiali](%base_url%?materiali)
|
|
@ -0,0 +1,40 @@
|
|||
---
|
||||
Title: Vojna je tu
|
||||
Description: Izjava in poziv za podporo protimilitarističnemu protestu 4. novembra 2023 v Tržiču/Monfalconeju.
|
||||
Date: 2023-11-01
|
||||
Teaser: krt.jpg
|
||||
---
|
||||
*Izjava in poziv za podporo protimilitarističnemu protestu 4. novembra 2023 v Tržiču/Monfalconeju*
|
||||
|
||||
## Vojna je tu!
|
||||
|
||||
Vojne ta hip potekajo v številnih delih sveta. Omenimo zgolj Sirijo, Južni Sudan, Etiopijo, Mjanmar in seveda še vedno Ukrajino ter Palestino/Izrael. Na smrtonosni seznam praktično vsakih nekaj mesecev dodajamo imena novih geografij. Ne glede na vse poskuse normalizacije, nobena od teh vojn ni naravna katastrofa, ki se pač zgodi in na katero nimamo nobenega vpliva. Vojna nikoli zgolj ne izbruhne, temveč se morajo tisti, ki imajo od nje korist, pogosto precej potruditi, da vzpostavijo pogoje, v katerih postane možna. Velik del vzpostavljanja teh pogojev poteka daleč stran od bojišč, v centrih moči, med drugim v strukturah Evropske unije in zveze NATO. S članstvom v teh interesnih združenjih smo potisnjeni v to, da si priznamo, da je vojna še kako tudi naša stvar.
|
||||
|
||||
Pripadniki in pripadnice slovenske vojske so trenutno na vojaških misijah na večih delih sveta, pretežno na, kot pravijo, danes strateško pomembnem t.i. Zahodnem Balkanu oziroma na področju nekdanje Jugoslavije. V preteklosti so bili v vlogi okupacijskih enot v Iraku in Afganistanu. Bili so v navidez opazovalni vlogi v Libanonu, Siriji, v nejasni vlogi v Maliju in verjetno še kje. Danes so po uradnih virih prisotni na Kosovu, v Bosni in Herecegovini, v Srbiji in v Severni Makedoniji. Prisotnost ima različne značaje, od opazovalnega, obveščevalnega, a vsaj na Kosovu predvideva tudi možnost neposrednega sodelovanja v oboroženih spopadih. Dodatno je slovenska vojska kot del članstva v zvezi NATO razporejena na teritorijih Slovaške in Latvije kot del "NATO vzhodnega boka". Z orožjem je pomagala iraškim in afganistanskim oblastem v službi okupacijskih sil, nazadnje izdatno tudi Ukrajini z obilno pošiljko težkega orožja. Slovenija je v vojni.
|
||||
|
||||
Investicije v vojsko, torej nakupovanje orožja, so redno na sporedu vsake slovenske vlade, ne glede na politične stranke na oblasti. Če je prejšnja vlada pod vodstvom Janeza Janše za obdobje od leta 2021 do 2026 namenila 780 milijonov evrov, jo je aktualna vlada pod vodstvom Roberta Goloba celo prekosila in potrdila nove investicije v obdobju do leta 2026 v višini več kot milijarde evrov. Floskule o zagotavljanju varnosti prikrivajo, da gre v resnici tudi pri nas v prvi vrsti za posel. Čeprav nas poskušajo s pomočjo različnih propagandnih prijemov prepričati v nujnost obstoja vojske, je njen smisel predvsem v vojni industriji, v nekro kapitalu, torej, kot se za kapitalizem spodobi, v obračanju in kopičenju denarja pri elitah, v tem primeru dobesedno preko trupel.
|
||||
|
||||
Tudi v Sloveniji je na tem področju kar nekaj nadebudnih oportunistov, saj se je letos spomladi na javni razpis Ministrstva za obrambo (MORS) odzvalo več kot 40 slovenskih podjetij, ki so pripravljena sodelovati pri proizvodnji streliva. Informacija o tem, katera podjetja so to in ali so bili nato kakšni posli dejansko sklenjeni, je bilo zaenkrat javnosti zamolčano. Orožarski biznis je, kot pravi sam MORS, v domeni tajnosti, gradiva imajo pogosto oznako “interno”, še posebej, ko se javni denar pretaka v žepe zasebnih vojnih dobičkarjev. Po podatkih, ki so javno vendarle dostopni, je eden od njh podjetje Arex defense, katerega direktor Tim Castagne se ponosno hvali, da je bilo leto 2022, torej leto vojne v Ukrajini, za njegovo podjetje "najboljše leto v [naši] zgodovini1". Posli očitno cvetijo tudi drugim lokalnim proizvajalcem in prekupčevalcem, o čemer priča eno od redkih sporočil za javnost Ministrstva za obrambo2, ki tu in tam vendarle odstrejo tančice s tajnih poslov. V letu 2022 je pod postavko “Izvoz in prenos vojaškega orožja in opreme” evidentiran znesekveč kot 36 in pol milijonov evrov, kar predstavlja več kot dvakratno povečanje v primerjavi z letom 2020, ko je ta znašal malo več kot 17 milijonov evrov. V letu 2022 so slovenska podjetja orožje ali dele za njegovo izdelovanje izvažala tudi v Izrael. Vojna je tudi tu, vojni dobičkarji pa tudi.
|
||||
|
||||
Kljub lastnim piarovskim naporom in oblastni podpori militarizmu se Slovenska vojska še vedno spopada z dvomi o upravičenosti njenega obstoja. Ljudje, ki si z delom dnevno skušajo zagotoviti materialne pogoje za preživetje, ne vidijo ugodnosti vojnega razdejanja, katerega prvi glasnik je vojska. Tudi zaradi tega postajata vojna in vojaška propaganda vse bolj agresivna: vojaški sejmi, novačenje v srednjih šolah in na fakultetah, promocijske kampanje, nenazadnje je tudi uporabo vojske na meji v obdobju od 2015 dalje potrebno razumeti v smislu normalizacije vojaške prisotnosti. Nič čudnega ni, da se v zadnjem času toliko govori tudi o razpisu za vojaški resničnostni šov. Ta je nazoren del široke piarovske kampanje, s katero se z javnim denarjem gradi privlačnost vojne za mlade. Veliki oglasni panoji, video spoti, aplikacije, zasedanje javnih prostorov so le posamični izrazi normalizacije ideje militaristične družbe, ki vsepovsod vse bolj agresivno vstopa v vse sfere življenja. Vojna je tudi pri nas, za vojno nas ves čas pripravljajo.
|
||||
|
||||
Vojna je torej vsakdanja realnost za milijone ljudi po svetu in v njej polno sodeluje tudi Slovenija z vso svojo politično, vojaško in orožarsko močjo. Ta je morda v absolutnem merilu minorna, toda vseeno obstaja in vpliva na ostale vidike družbe. Vsaka investicija v vojno namreč pomeni, da sredstva ne gredo v izobraževanje ali socialne transferje, vsaka misija v tujini pomeni dodatna sredstva, ki jih ni v zdravstveni blagajni, praktično vsaka “humanitarna misija” pomeni le uveljavljanje neke interesne sfere, vsaka politična podpora genocidu pomeni normalizacijo sveta, v katerem je ta legitimen, in vsaka kriminalizacija organiziranja proti vojni pomeni korak globlje v avtoritarno družbo.
|
||||
|
||||
Teror okupacijskih oboroženih sil izraelske države nad prebivalci in prebivalkami Palestine je vojno v vseh svojih grozljivih razsežnostih po vsega nekaj tednih relativnega premora ponovno vrnil na naslovnice. Potem ko smo bili priče “preselitvi” armenskega prebivalstva z enega državnega teritorija na drugega (o tem trenutno na naslovnicah ni ne duha ne sluha), zgroženi spremljamo novo in še bolj krvavo epizodo desetletja trajajočega kolonialnega pohoda izraelske države, ki ima vse značilnosti genocida nad palestinskim ljudstvom. Toda množična morija, ki se dogaja na drugi obali tudi našega Sredozemlja, ni zgolj stvar tistih, ki v njej umirajo ali pritiskajo na tipke oziroma sprožilce: vanjo so globoko vpletene ne samo ZDA, temveč tudi Evropska unija in tudi Slovenija pod taktirko predsednika vlade Roberta Goloba in ministrice za zunanje zadeve Tanje Fajon. Vojna, okupacija, etnično čiščenje in genocid v Palestini so tako tudi naša stvar – do nje se je treba opredeliti in pokazati, katere strukture v naših lokalnih okoljih tvorijo pogoje vojne povsod po svetu.
|
||||
|
||||
Širom t.i. zahodnega sveta se vrstijo protesti, obsodbe, javne intervencije, ki od oblasti zahtevajo prekinitev podpore kolonialnemu projektu v Palestini in prekinitev ognja. Toda protesti za prekinitev napadov, za mir in pravico za vse, ki živijo v Palestini/Izraelu, so marsikje prepovedani, mediji in socialna omrežja cenzurirani. Vrstijo se primeri ljudi, ki izgubijo službe zgolj zato, ker izrazijo nekaj tako univerzalnega, kot je podpora premirju ali žalovanje za vsemi žrtvami. Pod krinko boja proti antisemitizmu so tarče napadov tisti, ki svoja imena in telesa javno zastavijo proti nadaljevanju apartheida, okupacije in genocida. Pred tem niso varni niti Judje, ki se povsod po t.i. zahodnem svetu množično oglašajo in zavračajo zločine, ki se vsakodnevno izvajajo v njihovem imenu. Tudi oni so aretirani, kaznovani, utišani, diskreditirani. Država Nemčija, ki je tako obremenjena zaradi svoje zgodovinske odgovornosti za holokavst, si denimo ponovno drzne judovskim organizacijam odvzemati pravico do javnega delovanja, določati, kaj Judje lahko in česa ne smejo. Tokrat ne smejo pozivati k miru in enakem spoštovanju življenj Palestincev in Palestink. Hkrati pa ljudi, ki iz Ruske federacije bežijo pred vojaško obveznostjo, vračamo nazaj, čeprav je njihov beg neposreden izraz nesodelovanja v vojni, v tem primeru proti Ukrajini in posredno proti NATO. To je le še en dokaz več, da v interesu elit ni končanje vojne in ukinitev njenih pogojev, pač nadaljevanje uničevanja in nasilja.
|
||||
|
||||
Tudi v Sloveniji glasove odpora zoper podporo Slovenije vojni tako zaslišuje Sova, Ministrstvo za notranje zadeve ob očitni podpori vlade prebivalstvo tragikomično ustrahuje z domnevno nevarnostjo terorističnega napada in po vzoru Italije ponovno vpostavlja policijski nadzor na mejah. Nikoli zares zaključena psihoza in vojna proti terorizmu se je tako na velika vrata vrnila kot duh iz preteklosti, s katerim želijo elite svoje družbe ponovno podvreči izrednim razmeram. Tudi v Sloveniji smo priča krčevitim naporom za proizvodnjo podob teroristične grožnje. Ti bi bili smešni, če ne bi enkrat več zlovešče pričali o tem, kako zelo se elite požvižgajo na dejstva, ko je potrebno zadostiti svojim interesom. Ministrstvo za notranje zadeve in Ministrstvo za obrambo oz. policija in vojska tu delujeta složno. V kontekstu “zavezniške solidarnosti” slovenska vojska v NATO paktu prispeva svoj košček v mozaik smrtonosne vojne proti migrantom in migrantkam na Sredozemskem morju, slovenska policija pa na mejah države. Hkrati pa oblasti zlorabljajo »novo krizno situacijo« za vzpostavitev novih-starih avtoritarnih regulativ. Vojna je prav zares tudi tu.
|
||||
|
||||
Vojna, orožje, genocid, represija, vse to niso neizogibne stvari. Tako kot kapitalizem ni neizogiben in samoumeven. Oba sta v nasprotju z interesi večine svetovnega prebivalstva in peljeta svet v pogubo. Zato ne želimo biti zgolj nemi opazovalci genocidov, ki se izvajajo na očeh celega sveta. Nasprotujemo porabi javnega denarja za oboroževanje, za vojno, za vojsko in policijo ter njuno infrastrukturo. Mir na svetu bom dosegli šele, ko bomo enkrat za vselej ukinili pogoje, ki vojno omogočajo. Ne želimo pa si kapitalističnega miru, ki za številne med nami prav tako pomeni življenje v pomanjkanju, vsakodnevno nasilje in izkoriščanje, hkrati pa marsikje pomeni tudi pripravo na novo vojno.
|
||||
|
||||
Terjati mir danes konkretno pomeni terjati razgradnjo režima apartheida in okupacije v Palestini/Izraelu, prekinitev vseh vojaških intervencij v Ukrajini, razgradnjo vojaške industrije in razpustitev vojaških organizacij vseh vrst. Na lokalni ravni to med drugim pomeni odsotnost vojne propagande in nenehen boj zoper nacionalizem, patriarhat in vse ostale izraze ideje, da imamo ljudje različne stopnje pravic.
|
||||
|
||||
Zato se 4. novembra 2023 pridružujemo antimilitarističnemu protestu v Tržiču. V regiji, ki jo je pred dobrimi stotimi leti zaznamovala vojna, ki naj bi končala vse vojne. Kjer še danes nekateri opevajo zmago in gradijo diskurz, da je vsaka vojna v zgodovini bila neizbežna in logična. Kjer še danes živijo nacionalizmi. Mi pa stojimo na strani drugačnih idej: smo na strani ukinitve meja, na strani sobivanja in sodelovanja, na strani vizije pokrajine, kjer se bodo v prihodnje lahko govorili številni jeziki, tudi tisti, ki prihajajo na novo, in gradnje skupnosti, ki ne bo temeljila na izkoriščevalskih odnosih.
|
||||
|
||||
STOP MILITARIZACIJI!
|
||||
PROTI OROŽARSKI INDUSTRIJI!
|
||||
NE VOJNE, MIR NAM DAJTE!
|
||||
STOP GENOCIDU V GAZI!
|
||||
|
||||
Pobuda proti militarizmu
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
Title: O pobudi
|
||||
Description: mi smo
|
||||
---
|
||||
Pobuda proti militarizmu je raziskovalno-akcijska platforma. Prvenstveno je posvečena celostnemu razumevanju sistema militarizma, delovanju njegovih lovk v lokalnem okolju in identifikaciji oseb, ki igrajo v njem pomembne vloge. Vse to z namenom njegove odprave.
|
||||
|
||||
Za svet brez vojne, militarizma, za svet mnogoterih svetov.
|
||||
|
||||
Kontakt: pobudaprotimilitarizmu afna riseup.net
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: Povezave
|
||||
---
|
||||
|
||||
|
||||
* [RŠ FAQ](https://static.radiostudent.si/faq/)
|
||||
* [Reci NE NATO](http://aktiviraj-se.net/recinenato/) <br><br>
|
|
@ -0,0 +1,154 @@
|
|||
---
|
||||
title: Theme Styling Test
|
||||
hidden: true
|
||||
---
|
||||
|
||||
Theme Styling Test
|
||||
==================
|
||||
|
||||
This is `theme.md` in Pico's content directory. This page doesn't show up in the website's menu due to `hidden: true` in the page's YAML header. The purpose of this page is to aid theme development - below you'll find basically every format that is possible with Markdown. If you develop a theme, you should make sure that all examples below show decent.
|
||||
|
||||
Text
|
||||
----
|
||||
|
||||
**Lorem ipsum dolor sit amet,** consectetur adipisici elit, *sed eiusmod tempor* incidunt ut labore et dolore magna aliqua.[^1] ~~Ut enim ad minim veniam,~~ quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat.[^2] [Quis aute iure reprehenderit][Link] in voluptate velit esse cillum dolore eu fugiat nulla pariatur. `Excepteur` sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
Headings
|
||||
--------
|
||||
|
||||
# h1
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
## h2
|
||||
|
||||
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
|
||||
### h3
|
||||
|
||||
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
|
||||
|
||||
#### h4
|
||||
|
||||
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
|
||||
|
||||
##### h5
|
||||
|
||||
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
|
||||
|
||||
###### h6
|
||||
|
||||
At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
|
||||
|
||||
Horizontal line
|
||||
---------------
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
---
|
||||
|
||||
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
|
||||
List
|
||||
----
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
* Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
|
||||
1. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
2. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
|
||||
3. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
|
||||
* Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.
|
||||
- Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
- Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
|
||||
1. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
|
||||
2. At vero eos et accusam et justo duo dolores et ea rebum.
|
||||
1. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet
|
||||
2. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
|
||||
3. At vero eos et accusam et justo duo dolores et ea rebum.
|
||||
|
||||
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.
|
||||
|
||||
Definition list
|
||||
---------------
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
Duis autem
|
||||
: Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
|
||||
|
||||
Lorem ipsum dolor sit amet
|
||||
: Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
|
||||
Ut wisi enim ad minim veniam
|
||||
: Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
|
||||
: Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
|
||||
|
||||
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
|
||||
|
||||
Blockquote
|
||||
----------
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
> Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse
|
||||
> molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero
|
||||
> eros et accumsan et iusto odio dignissim qui blandit praesent luptatum
|
||||
> zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum
|
||||
> dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod
|
||||
> tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
>
|
||||
> > Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit
|
||||
> > lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure
|
||||
> > dolor in hendrerit in vulputate velit esse molestie consequat, vel illum
|
||||
> > dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
|
||||
> > dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te
|
||||
> > feugait nulla facilisi.
|
||||
>
|
||||
> Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet
|
||||
> doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet,
|
||||
> consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
|
||||
> laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam,
|
||||
> quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex
|
||||
> ea commodo consequat.
|
||||
|
||||
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
|
||||
|
||||
Code block
|
||||
----------
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
```
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>This is a title</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Hello world!</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
|
||||
Table
|
||||
-----
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
Lorem ipsum | Duis autem vel eum | Ut wisi enim ad minim veniam
|
||||
----------- | ------------------ | ----------------------------
|
||||
**Duis autem vel eum iriure dolor** in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. | *Lorem ipsum dolor sit amet,* consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. | ~~Ut wisi enim ad minim veniam,~~ quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
|
||||
[Duis autem vel eum iriure dolor][Link] in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. | `Nam liber tempor` cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. | Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
|
||||
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. | | Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
|
||||
|
||||
At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
|
||||
|
||||
*[Lorem ipsum]: Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua.
|
||||
|
||||
[Link]: %base_url% "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat."
|
||||
|
||||
[^1]: Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
||||
[^2]: Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
@ -0,0 +1,39 @@
|
|||
<?php // @codingStandardsIgnoreFile
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/Pico/blob/master/index.php.dist>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
// check PHP platform requirements
|
||||
if (PHP_VERSION_ID < 50306) {
|
||||
die('Pico requires PHP 5.3.6 or above to run');
|
||||
}
|
||||
if (!extension_loaded('dom')) {
|
||||
die("Pico requires the PHP extension 'dom' to run");
|
||||
}
|
||||
if (!extension_loaded('mbstring')) {
|
||||
die("Pico requires the PHP extension 'mbstring' to run");
|
||||
}
|
||||
|
||||
// load dependencies
|
||||
require_once(__DIR__ . '/vendor/autoload.php');
|
||||
|
||||
// instance Pico
|
||||
$pico = new Pico(
|
||||
__DIR__, // root dir
|
||||
'config/', // config dir
|
||||
'plugins/', // plugins dir
|
||||
'themes/' // themes dir
|
||||
);
|
||||
|
||||
// override configuration?
|
||||
//$pico->setConfig(array());
|
||||
|
||||
// run application
|
||||
echo $pico->run();
|
|
@ -0,0 +1,155 @@
|
|||
Pico Deprecated Changelog
|
||||
=========================
|
||||
|
||||
**Note:** This changelog only provides technical information about the changes
|
||||
introduced with a particular Pico version, and is meant to supplement
|
||||
the actual code changes. The information in this changelog are often
|
||||
insufficient to understand the implications of larger changes. Please
|
||||
refer to both the UPGRADE and NEWS sections of the docs for more
|
||||
details.
|
||||
|
||||
**Note:** Changes breaking backwards compatibility (BC) are marked with an `!`
|
||||
(exclamation mark). This doesn't include changes for which BC is
|
||||
preserved by this plugin. If a previously deprecated feature is later
|
||||
removed, this change is going to be marked as BC-breaking change.
|
||||
Please note that BC-breaking changes are only possible with a new
|
||||
major version.
|
||||
|
||||
**Note:** Many versions of `PicoDeprecated` include changes which are not
|
||||
explicitly mentioned in this changelog. This primarily concerns
|
||||
changes in Pico's plugin API. These changes aren't listed separately
|
||||
because they are already listed in Pico's changelog. Only functional
|
||||
changes and/or BC-breaking changes are listed below.
|
||||
|
||||
### Version 2.1.4
|
||||
Released: 2020-08-29
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.3
|
||||
Released: 2020-07-10
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.2
|
||||
Released: 2020-04-10
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.1
|
||||
Released: 2019-12-31
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.0
|
||||
Released: 2019-11-24
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.0-beta.1
|
||||
Released: 2019-11-03
|
||||
|
||||
```
|
||||
* [New] Add support for the latest API v3 changes
|
||||
* [New] Support disabled Twig autoescape prior to API v3
|
||||
* [New] Re-introduce `theme_url` config variable
|
||||
* [New] Re-introduce `prev_page`, `base_dir` and `theme_dir` Twig variables
|
||||
* [New] Support loading additional plugins using API v1 `onPluginsLoaded` event
|
||||
* [New] Re-introduce Pico v0.9 config constant `CACHE_DIR`
|
||||
* [New] Add release & build system to test the plugin using PHP_CodeSniffer and
|
||||
to automatically create pre-built release packages
|
||||
* [Changed] Split the plugin's functionality into multiple compatibility
|
||||
plugins (two for each API version, for plugins and themes resp.)
|
||||
and load the necessary compatibility plugins on demand only; also
|
||||
allow 3rd-party plugins to load their own compatibility plugins
|
||||
```
|
||||
|
||||
### Version 2.0.5-beta.1
|
||||
Released: 2019-01-03
|
||||
|
||||
```
|
||||
* [New] Add `2.0.x-dev` alias for master branch to `composer.json`
|
||||
```
|
||||
|
||||
### Version 2.0.4
|
||||
Released: 2018-12-17
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.3
|
||||
Released: 2018-12-03
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.2
|
||||
Released: 2018-08-12
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.1
|
||||
Released: 2018-07-29
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.0
|
||||
Released: 2018-07-01
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.0-beta.3
|
||||
Released: 2018-04-07
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.0-beta.2
|
||||
Released: 2018-01-21
|
||||
|
||||
```
|
||||
* [New] Add support for the latest API v2 changes
|
||||
* [New] ! Add support for themes using the old `.html` file extension for Twig
|
||||
templates; however, starting with API v2 plugins might rely on `.twig`
|
||||
as file extension, making this a BC-breaking change regardless
|
||||
```
|
||||
|
||||
### Version 2.0.0-beta.1
|
||||
Released: 2017-11-05
|
||||
|
||||
**Note:** Pico's official `PicoDeprecated` plugin was moved to this separate
|
||||
repository in preparation for Pico 2.0. Refer to Pico's changelog for
|
||||
a list of changes to this plugin before Pico 2.0.
|
||||
|
||||
```
|
||||
* [New] Update plugin to API v2 and add support for all API v1 events
|
||||
* [New] Keep track of all loaded Pico plugins and distinguish them by the API
|
||||
version they use; deprecated events are only triggered on plugins using
|
||||
this particular API version (`PicoDeprecated::API_VERSION_*` constants)
|
||||
* [New] Take care of triggering events on plugins using older API versions;
|
||||
this includes not only core events, but also all custom events; as a
|
||||
result, old plugin's always depend on `PicoDeprecated` now
|
||||
* [New] Use a simple event alias table to keep track of unchanged or just
|
||||
renamed core events
|
||||
* [New] Add `rewrite_url` and `is_front_page` Twig variables
|
||||
* [New] Add support for the `config/config.php` configuration file
|
||||
* [New] Additionally compare registered meta headers case-insensitive
|
||||
* [New] Make meta headers on the first level of a page's meta data also
|
||||
available using a lowered key (as of Pico 1.0; i.e. `SomeKey: value` is
|
||||
now accessible using both `$meta['SomeKey']` and `$meta['somekey']`)
|
||||
* [New] Add public `PicoDeprecated::triggersApiEvents()` method
|
||||
* [New] Add public `PicoDeprecated::triggerEvent()` method (and the additional
|
||||
`$apiVersion` parameter) as replacement for the previously protected
|
||||
method of the same name
|
||||
* [Fixed] ! Don't overwrite the global `$config` variable if it is defined
|
||||
* [Fixed] ! Improve re-indexing of pages added by the API v0 event `get_pages`
|
||||
* [Changed] No longer try to guess whether the plugin needs to be enabled or
|
||||
not, rather enable it by default (guessing was pretty error-prone)
|
||||
* [Changed] ! Use a scope-isolated `require()` to include configuration files
|
||||
* [Changed] ! Don't pass `$plugins` parameter to API v1 `onPluginsLoaded` event
|
||||
by reference anymore; use `Pico::loadPlugin()` instead
|
||||
* [Changed] ! The API v1 events `onTwigRegistration` and `onMetaHeaders`, as
|
||||
well as the API v0 event `before_twig_register` are no longer part
|
||||
of Pico's event flow and are triggered just once on demand
|
||||
* [Changed] Improve PHP class docs
|
||||
* [Changed] A vast number of small improvements and changes...
|
||||
* [Removed] ! Remove support for `PicoParsePagesContent` plugin
|
||||
* [Removed] ! Remove support for `PicoExcerpt` plugin
|
||||
```
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2012 The Pico Community
|
||||
|
||||
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.
|
|
@ -0,0 +1,383 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/PicoDeprecated.php>
|
||||
*
|
||||
* The file was previously part of the project's main repository; the version
|
||||
* control history of the original file applies accordingly, available from
|
||||
* the following original location:
|
||||
*
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintain backward compatibility to older Pico releases
|
||||
*
|
||||
* `PicoDeprecated`'s purpose is to maintain backward compatibility to older
|
||||
* versions of Pico, by re-introducing characteristics that were removed from
|
||||
* Pico's core.
|
||||
*
|
||||
* `PicoDeprecated` is basically a mandatory plugin for all Pico installs.
|
||||
* Without this plugin you can't use plugins which were written for other
|
||||
* API versions than the one of Pico's core, even when there was just the
|
||||
* slightest change.
|
||||
*
|
||||
* {@see http://picocms.org/plugins/deprecated/} for a full list of features.
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoDeprecated extends AbstractPicoPlugin
|
||||
{
|
||||
/**
|
||||
* API version used by this plugin
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION = 3;
|
||||
|
||||
/**
|
||||
* API version 0, used by Pico 0.9 and earlier
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION_0 = 0;
|
||||
|
||||
/**
|
||||
* API version 1, used by Pico 1.0
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION_1 = 1;
|
||||
|
||||
/**
|
||||
* API version 2, used by Pico 2.0
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION_2 = 2;
|
||||
|
||||
/**
|
||||
* API version 3, used by Pico 2.1
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION_3 = 3;
|
||||
|
||||
/**
|
||||
* Loaded plugins, indexed by API version
|
||||
*
|
||||
* @see PicoDeprecated::getPlugins()
|
||||
*
|
||||
* @var object[]
|
||||
*/
|
||||
protected $plugins = array();
|
||||
|
||||
/**
|
||||
* Loaded compatibility plugins
|
||||
*
|
||||
* @see PicoDeprecated::getCompatPlugins()
|
||||
*
|
||||
* @var PicoCompatPluginInterface[]
|
||||
*/
|
||||
protected $compatPlugins = array();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function __construct(Pico $pico)
|
||||
{
|
||||
parent::__construct($pico);
|
||||
|
||||
if (is_file(__DIR__ . '/vendor/autoload.php')) {
|
||||
require(__DIR__ . '/vendor/autoload.php');
|
||||
}
|
||||
|
||||
if (!class_exists('PicoMainCompatPlugin')) {
|
||||
die(
|
||||
"Cannot find PicoDeprecated's 'vendor/autoload.php'. If you're using a composer-based Pico install, "
|
||||
. "run `composer update`. If you're rather trying to use one of PicoDeprecated's pre-built release "
|
||||
. "packages, make sure to download PicoDeprecated's release package matching Pico's version named "
|
||||
. "'pico-deprecated-release-v*.tar.gz' (don't download a source code package)."
|
||||
);
|
||||
}
|
||||
|
||||
if ($pico::API_VERSION !== static::API_VERSION) {
|
||||
throw new RuntimeException(
|
||||
'PicoDeprecated requires API version ' . static::API_VERSION . ', '
|
||||
. 'but Pico is running API version ' . $pico::API_VERSION
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function handleEvent($eventName, array $params)
|
||||
{
|
||||
parent::handleEvent($eventName, $params);
|
||||
|
||||
// trigger events on compatibility plugins
|
||||
if ($this->isEnabled() || ($eventName === 'onPluginsLoaded')) {
|
||||
$isCoreEvent = in_array($eventName, $this->getCoreEvents());
|
||||
foreach ($this->compatPlugins as $plugin) {
|
||||
if ($isCoreEvent) {
|
||||
if ($plugin->getApiVersion() === static::API_VERSION) {
|
||||
$plugin->handleEvent($eventName, $params);
|
||||
}
|
||||
} elseif ($plugin instanceof PicoPluginApiCompatPluginInterface) {
|
||||
$plugin->handleCustomEvent($eventName, $params);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads all loaded plugins and indexes them by API level, loads the
|
||||
* necessary compatibility plugins
|
||||
*
|
||||
* @see PicoDeprecated::loadPlugin()
|
||||
*
|
||||
* @param object[] $plugins loaded plugin instances
|
||||
*/
|
||||
public function onPluginsLoaded(array $plugins)
|
||||
{
|
||||
$this->loadCompatPlugin('PicoMainCompatPlugin');
|
||||
|
||||
foreach ($plugins as $plugin) {
|
||||
$this->loadPlugin($plugin);
|
||||
}
|
||||
|
||||
$this->getPico()->triggerEvent('onPicoDeprecated', array($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a manually loaded plugin to PicoDeprecated's plugin index, loads
|
||||
* the necessary compatibility plugins
|
||||
*
|
||||
* @see PicoDeprecated::loadPlugin()
|
||||
*
|
||||
* @param object $plugin loaded plugin instance
|
||||
*/
|
||||
public function onPluginManuallyLoaded($plugin)
|
||||
{
|
||||
$this->loadPlugin($plugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a compatibility plugin if Pico's theme uses a old theme API
|
||||
*
|
||||
* @param string $theme name of current theme
|
||||
* @param int $themeApiVersion API version of the theme
|
||||
* @param array $themeConfig config array of the theme
|
||||
*/
|
||||
public function onThemeLoaded($theme, $themeApiVersion, array &$themeConfig)
|
||||
{
|
||||
$this->loadThemeApiCompatPlugin($themeApiVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a plugin to PicoDeprecated's plugin index
|
||||
*
|
||||
* @see PicoDeprecated::onPluginsLoaded()
|
||||
* @see PicoDeprecated::onPluginManuallyLoaded()
|
||||
* @see PicoDeprecated::getPlugins()
|
||||
*
|
||||
* @param object $plugin loaded plugin instance
|
||||
*/
|
||||
protected function loadPlugin($plugin)
|
||||
{
|
||||
$pluginName = get_class($plugin);
|
||||
|
||||
$apiVersion = $this->getPluginApiVersion($plugin);
|
||||
if (!isset($this->plugins[$apiVersion])) {
|
||||
$this->plugins[$apiVersion] = array();
|
||||
$this->loadPluginApiCompatPlugin($apiVersion);
|
||||
}
|
||||
|
||||
$this->plugins[$apiVersion][$pluginName] = $plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all loaded Pico plugins using the given API level
|
||||
*
|
||||
* @param int $apiVersion API version to match plugins
|
||||
*
|
||||
* @return object[] loaded plugin instances
|
||||
*/
|
||||
public function getPlugins($apiVersion)
|
||||
{
|
||||
return isset($this->plugins[$apiVersion]) ? $this->plugins[$apiVersion] : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a compatibility plugin
|
||||
*
|
||||
* @param PicoCompatPluginInterface|string $plugin either the class name of
|
||||
* a plugin to instantiate or a plugin instance
|
||||
*
|
||||
* @return PicoCompatPluginInterface instance of the loaded plugin
|
||||
*/
|
||||
public function loadCompatPlugin($plugin)
|
||||
{
|
||||
if (!is_object($plugin)) {
|
||||
$className = (string) $plugin;
|
||||
if (class_exists($className)) {
|
||||
$plugin = new $className($this->getPico(), $this);
|
||||
} else {
|
||||
throw new RuntimeException(
|
||||
"Unable to load PicoDeprecated compatibility plugin '" . $className . "': Class not found"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$className = get_class($plugin);
|
||||
if (isset($this->compatPlugins[$className])) {
|
||||
return $this->compatPlugins[$className];
|
||||
}
|
||||
|
||||
if (!($plugin instanceof PicoCompatPluginInterface)) {
|
||||
throw new RuntimeException(
|
||||
"Unable to load PicoDeprecated compatibility plugin '" . $className . "': "
|
||||
. "Compatibility plugins must implement 'PicoCompatPluginInterface'"
|
||||
);
|
||||
}
|
||||
|
||||
$apiVersion = $plugin->getApiVersion();
|
||||
$this->loadPluginApiCompatPlugin($apiVersion);
|
||||
|
||||
$dependsOn = $plugin->getDependencies();
|
||||
foreach ($dependsOn as $pluginDependency) {
|
||||
$this->loadCompatPlugin($pluginDependency);
|
||||
}
|
||||
|
||||
$this->compatPlugins[$className] = $plugin;
|
||||
|
||||
return $plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a plugin API compatibility plugin
|
||||
*
|
||||
* @param int $apiVersion API version to load the compatibility plugin for
|
||||
*/
|
||||
protected function loadPluginApiCompatPlugin($apiVersion)
|
||||
{
|
||||
if ($apiVersion !== static::API_VERSION) {
|
||||
$this->loadCompatPlugin('PicoPluginApi' . $apiVersion . 'CompatPlugin');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a theme API compatibility plugin
|
||||
*
|
||||
* @param int $apiVersion API version to load the compatibility plugin for
|
||||
*/
|
||||
protected function loadThemeApiCompatPlugin($apiVersion)
|
||||
{
|
||||
if ($apiVersion !== static::API_VERSION) {
|
||||
$this->loadCompatPlugin('PicoThemeApi' . $apiVersion . 'CompatPlugin');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all loaded compatibility plugins
|
||||
*
|
||||
* @return PicoCompatPluginInterface[] list of loaded compatibility plugins
|
||||
*/
|
||||
public function getCompatPlugins()
|
||||
{
|
||||
return $this->compatPlugins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers deprecated events on plugins of different API versions
|
||||
*
|
||||
* You can use this public method in other plugins to trigger custom events
|
||||
* on plugins using a particular API version. If you want to trigger a
|
||||
* custom event on all plugins, no matter their API version (except for
|
||||
* plugins using API v0, which can't handle custom events), use
|
||||
* {@see Pico::triggerEvent()} instead.
|
||||
*
|
||||
* @see Pico::triggerEvent()
|
||||
*
|
||||
* @param int $apiVersion API version of the event
|
||||
* @param string $eventName event to trigger
|
||||
* @param array $params optional parameters to pass
|
||||
*/
|
||||
public function triggerEvent($apiVersion, $eventName, array $params = array())
|
||||
{
|
||||
foreach ($this->getPlugins($apiVersion) as $plugin) {
|
||||
$plugin->handleEvent($eventName, $params);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the API version of a given plugin
|
||||
*
|
||||
* @param object $plugin plugin instance
|
||||
*
|
||||
* @return int API version used by the plugin
|
||||
*/
|
||||
public function getPluginApiVersion($plugin)
|
||||
{
|
||||
$pluginApiVersion = self::API_VERSION_0;
|
||||
if ($plugin instanceof PicoPluginInterface) {
|
||||
$pluginApiVersion = self::API_VERSION_1;
|
||||
if (defined(get_class($plugin) . '::API_VERSION')) {
|
||||
$pluginApiVersion = $plugin::API_VERSION;
|
||||
}
|
||||
}
|
||||
|
||||
return $pluginApiVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of the names of Pico's core events
|
||||
*
|
||||
* @return string[] list of Pico's core events
|
||||
*/
|
||||
public function getCoreEvents()
|
||||
{
|
||||
return array(
|
||||
'onPluginsLoaded',
|
||||
'onPluginManuallyLoaded',
|
||||
'onConfigLoaded',
|
||||
'onThemeLoading',
|
||||
'onThemeLoaded',
|
||||
'onRequestUrl',
|
||||
'onRequestFile',
|
||||
'onContentLoading',
|
||||
'on404ContentLoading',
|
||||
'on404ContentLoaded',
|
||||
'onContentLoaded',
|
||||
'onMetaParsing',
|
||||
'onMetaParsed',
|
||||
'onContentParsing',
|
||||
'onContentPrepared',
|
||||
'onContentParsed',
|
||||
'onPagesLoading',
|
||||
'onSinglePageLoading',
|
||||
'onSinglePageContent',
|
||||
'onSinglePageLoaded',
|
||||
'onPagesDiscovered',
|
||||
'onPagesLoaded',
|
||||
'onCurrentPageDiscovered',
|
||||
'onPageTreeBuilt',
|
||||
'onPageRendering',
|
||||
'onPageRendered',
|
||||
'onMetaHeaders',
|
||||
'onYamlParserRegistered',
|
||||
'onParsedownRegistered',
|
||||
'onTwigRegistered'
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
Pico Deprecated Plugin
|
||||
======================
|
||||
|
||||
This is the repository of Pico's official `PicoDeprecated` plugin.
|
||||
|
||||
Pico is a stupidly simple, blazing fast, flat file CMS. See http://picocms.org/ for more info.
|
||||
|
||||
`PicoDeprecated`'s purpose is to maintain backward compatibility to older versions of Pico, by re-introducing characteristics that were removed from Pico's core. It for example triggers old events (like the `before_render` event used before Pico 1.0) and reads config files that were written in PHP (`config/config.php`, used before Pico 2.0).
|
||||
|
||||
Please refer to [`picocms/Pico`](https://github.com/picocms/Pico) to get info about how to contribute or getting help.
|
||||
|
||||
Install
|
||||
-------
|
||||
|
||||
You usually don't have to install this plugin manually, it's shipped together with [Pico's pre-built release packages](https://github.com/picocms/Pico/releases/latest) and a default dependency of [`picocms/pico-composer`](https://github.com/picocms/pico-composer).
|
||||
|
||||
If you're using plugins and themes that are compatible with Pico's latest API version only, you can safely remove `PicoDeprecated` from your Pico installation or disable the plugin (please refer to the "Usage" section below). However, if you're not sure about this, simply leave it as it is - it won't hurt... :wink:
|
||||
|
||||
If you use a `composer`-based installation of Pico and want to either remove or install `PicoDeprecated`, simply open a shell on your server and navigate to Pico's install directory (e.g. `/var/www/html`). Run `composer remove picocms/pico-deprecated` to remove `PicoDeprecated`, or run `composer require picocms/pico-deprecated` (via [Packagist.org](https://packagist.org/packages/picocms/pico-deprecated)) to install `PicoDeprecated`.
|
||||
|
||||
If you rather use one of Pico's pre-built release packages, it is best to disable `PicoDeprecated` and not to actually remove it. The reason for this is, that `PicoDeprecated` is part of Pico's pre-built release packages, thus it will be automatically re-installed when updating Pico. However, if you really want to remove `PicoDeprecated`, simply delete the `plugins/PicoDeprecated` directory in Pico's install directory (e.g. `/var/www/html`). If you want to install `PicoDeprecated`, you must first create a empty `plugins/PicoDeprecated` directory on your server, [download the version of `PicoDeprecated`](https://github.com/picocms/pico-deprecated/releases) matching the version of your Pico installation and upload all containing files (esp. `PicoDeprecated.php` and the `lib/`, `plugins/` and `vendor/` directories) into said `plugins/PicoDeprecated` directory (resulting in `plugins/PicoDeprecated/PicoDeprecated.php`).
|
||||
|
||||
The versioning of `PicoDeprecated` strictly follows the version of Pico's core. You *must not* use a version of `PicoDeprecated` that doesn't match the version of Pico's core (e.g. PicoDeprecated 2.0.1 is *not compatible* with Pico 2.0.0). If you're using a `composer`-based installation of Pico, simply use a version constaint like `^2.0` - `PicoDeprecated` ensures that its version matches Pico's version. Even if you're using one of Pico's pre-built release packages, you don't have to take care of anything - a matching version of `PicoDeprecated` is part of Pico's pre-built release packages anyway.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
You can explicitly disable `PicoDeprecated` by adding `PicoDeprecated.enabled: false` to your `config/config.yml`. If you want to re-enable `PicoDeprecated`, simply remove this line from your `config/config.yml`. `PicoDeprecated` itself has no configuration options, it enables and disables all of its features depending on whether there are plugins and/or themes requiring said characteristics.
|
||||
|
||||
`PicoDeprecated`'s functionality is split into various so-called "compatibility plugins". There are compatibility plugins for every old API version (Pico 0.9 and earlier were using API version 0, Pico 1.0 was using API version 1 and Pico 2.0 was using API version 2; the current API version is version 3, used by Pico 2.1), one for plugins and another one for themes. Their purpose is to re-introduce characteristics plugins and themes using said API version might rely on. For example, plugin API compatibility plugins are responsible for simulating old Pico core events (like the `before_render` event used by Pico 0.9 and earlier). Theme API compatibility plugins will e.g. register old Twig variables (like the `is_front_page` Twig variable used by Pico 1.0). If you install a plugin using API version 2, the corresponding `PicoPluginApi2CompatPlugin` will be loaded. All plugin API compatibility plugins also depend on their theme counterpart, thus `PicoThemeApi2CompatPlugin` will be loaded, too. Furthermore all compatibility plugins depend on their respective API successors.
|
||||
|
||||
The plugin exposes a simple API to allow other plugins to load their own compatibility plugins. As a plugin developer you may use the `PicoDeprecated::loadCompatPlugin(PicoCompatPluginInterface $compatPlugin)` method to load a custom compatibility plugin. Use `PicoDeprecated::getCompatPlugins()` to return a list of all loaded compatibility plugins. You can furthermore use the `PicoDeprecated::getPlugins(int $apiVersion)` method to return a list of all loaded Pico plugins using a particular API version. If you want to trigger a custom event on plugins using a particular API version only, use `PicoDeprecated::triggerEvent(int $apiVersion, string $eventName, array $parameters = [])`. `PicoDeprecated` furthermore triggers the custom `onPicoDeprecated(PicoDeprecated $picoDeprecated)` event.
|
||||
|
||||
Getting Help
|
||||
------------
|
||||
|
||||
Please refer to the ["Getting Help" section](https://github.com/picocms/Pico#getting-help) of our main repository.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Please refer to the ["Contributing" section](https://github.com/picocms/Pico#contributing) of our main repository.
|
||||
|
||||
By contributing to Pico, you accept and agree to the *Developer Certificate of Origin* for your present and future contributions submitted to Pico. Please refer to the ["Developer Certificate of Origin" section](https://github.com/picocms/Pico/blob/master/CONTRIBUTING.md#developer-certificate-of-origin) in the `CONTRIBUTING.md` of our main repository.
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"name": "picocms/pico-deprecated",
|
||||
"type": "pico-plugin",
|
||||
"description": "This is Pico's official PicoDeprecated plugin. Pico is a stupidly simple, blazing fast, flat file CMS.",
|
||||
"keywords": [ "pico", "picocms", "picocms-plugin", "pico-deprecated", "compatibility", "deprecation" ],
|
||||
"homepage": "http://picocms.org/",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/pico-deprecated/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"docs": "http://picocms.org/plugins/deprecated/",
|
||||
"issues": "https://github.com/picocms/pico-deprecated/issues",
|
||||
"source": "https://github.com/picocms/pico-deprecated"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0",
|
||||
"picocms/pico": "self.version"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [ "PicoDeprecated.php", "lib/", "plugins/" ]
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.1.x-dev",
|
||||
"dev-pico-3.0": "3.0.x-dev"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/lib/AbstractPicoCompatPlugin.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Abstract class to extend from when implementing a PicoDeprecated
|
||||
* compatibility plugin
|
||||
*
|
||||
* Please refer to {@see PicoCompatPluginInterface} for more information about
|
||||
* how to develop a PicoDeprecated compatibility plugin.
|
||||
*
|
||||
* @see PicoCompatPluginInterface
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
abstract class AbstractPicoCompatPlugin implements PicoCompatPluginInterface
|
||||
{
|
||||
/**
|
||||
* Current instance of Pico
|
||||
*
|
||||
* @see PicoCompatPluginInterface::getPico()
|
||||
*
|
||||
* @var Pico
|
||||
*/
|
||||
protected $pico;
|
||||
|
||||
/**
|
||||
* Instance of the main PicoDeprecated plugin
|
||||
*
|
||||
* @see PicoCompatPluginInterface::getPicoDeprecated()
|
||||
*
|
||||
* @var PicoDeprecated
|
||||
*/
|
||||
protected $picoDeprecated;
|
||||
|
||||
/**
|
||||
* List of plugins which this plugin depends on
|
||||
*
|
||||
* @see PicoCompatPluginInterface::getDependencies()
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array();
|
||||
|
||||
/**
|
||||
* Constructs a new instance of a PicoDeprecated compatibility plugin
|
||||
*
|
||||
* @param Pico $pico current instance of Pico
|
||||
* @param PicoDeprecated $picoDeprecated current instance of PicoDeprecated
|
||||
*/
|
||||
public function __construct(Pico $pico, PicoDeprecated $picoDeprecated)
|
||||
{
|
||||
$this->pico = $pico;
|
||||
$this->picoDeprecated = $picoDeprecated;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function handleEvent($eventName, array $params)
|
||||
{
|
||||
if (method_exists($this, $eventName)) {
|
||||
call_user_func_array(array($this, $eventName), $params);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPico()
|
||||
{
|
||||
return $this->pico;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPicoDeprecated()
|
||||
{
|
||||
return $this->picoDeprecated;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getDependencies()
|
||||
{
|
||||
return (array) $this->dependsOn;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/lib/AbstractPicoPluginApiCompatPlugin.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Abstract class to extend from when implementing a PicoDeprecated plugin API
|
||||
* compatibility plugin
|
||||
*
|
||||
* Please refer to {@see PicoPluginApiCompatPluginInterface} for more information about
|
||||
* how to develop a PicoDeprecated plugin API compatibility plugin.
|
||||
*
|
||||
* @see PicoPluginApiCompatPluginInterface
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
abstract class AbstractPicoPluginApiCompatPlugin extends AbstractPicoCompatPlugin implements
|
||||
PicoPluginApiCompatPluginInterface
|
||||
{
|
||||
/**
|
||||
* Map of core events matching event signatures of older API versions
|
||||
*
|
||||
* @see AbstractPicoPluginApiCompatPlugin::handleEvent()
|
||||
*
|
||||
* @var array<string,string>
|
||||
*/
|
||||
protected $eventAliases = array();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function handleEvent($eventName, array $params)
|
||||
{
|
||||
parent::handleEvent($eventName, $params);
|
||||
|
||||
// trigger core events matching the event signatures of older API versions
|
||||
if (isset($this->eventAliases[$eventName])) {
|
||||
foreach ($this->eventAliases[$eventName] as $eventAlias) {
|
||||
$this->triggerEvent($eventAlias, $params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function handleCustomEvent($eventName, array $params = array())
|
||||
{
|
||||
$this->getPicoDeprecated()->triggerEvent($this->getApiVersionSupport(), $eventName, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers deprecated events on plugins of the supported API version
|
||||
*
|
||||
* @param string $eventName name of the event to trigger
|
||||
* @param array $params optional parameters to pass
|
||||
*/
|
||||
protected function triggerEvent($eventName, array $params = array())
|
||||
{
|
||||
$apiVersion = $this->getApiVersionSupport();
|
||||
$picoDeprecated = $this->getPicoDeprecated();
|
||||
|
||||
if ($apiVersion !== $picoDeprecated::API_VERSION) {
|
||||
foreach ($picoDeprecated->getCompatPlugins() as $compatPlugin) {
|
||||
if ($compatPlugin->getApiVersion() === $apiVersion) {
|
||||
$compatPlugin->handleEvent($eventName, $params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$picoDeprecated->triggerEvent($apiVersion, $eventName, $params);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/lib/PicoCompatPluginInterface.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Common interface for PicoDeprecated compatibility plugins
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
interface PicoCompatPluginInterface
|
||||
{
|
||||
/**
|
||||
* Handles a Pico event
|
||||
*
|
||||
* @param string $eventName name of the triggered event
|
||||
* @param array $params passed parameters
|
||||
*/
|
||||
public function handleEvent($eventName, array $params);
|
||||
|
||||
/**
|
||||
* Returns a list of names of compat plugins required by this plugin
|
||||
*
|
||||
* @return string[] required plugins
|
||||
*/
|
||||
public function getDependencies();
|
||||
|
||||
/**
|
||||
* Returns the plugin's instance of Pico
|
||||
*
|
||||
* @see Pico
|
||||
*
|
||||
* @return Pico the plugin's instance of Pico
|
||||
*/
|
||||
public function getPico();
|
||||
|
||||
/**
|
||||
* Returns the plugin's main PicoDeprecated plugin instance
|
||||
*
|
||||
* @see PicoDeprecated
|
||||
*
|
||||
* @return PicoDeprecated the plugin's instance of Pico
|
||||
*/
|
||||
public function getPicoDeprecated();
|
||||
|
||||
/**
|
||||
* Returns the version of the API this plugin uses
|
||||
*
|
||||
* @return int the API version used by this plugin
|
||||
*/
|
||||
public function getApiVersion();
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/lib/PicoPluginApiCompatPluginInterface.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Common interface for PicoDeprecated plugin API compatibility plugins
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
interface PicoPluginApiCompatPluginInterface extends PicoCompatPluginInterface
|
||||
{
|
||||
/**
|
||||
* Handles custom events for plugins of the supported API version
|
||||
*
|
||||
* @param string $eventName name of the triggered event
|
||||
* @param array $params passed parameters
|
||||
*/
|
||||
public function handleCustomEvent($eventName, array $params = array());
|
||||
|
||||
/**
|
||||
* Returns the API version this plugin maintains backward compatibility for
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getApiVersionSupport();
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoMainCompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with older Pico versions
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoMainCompatPlugin extends AbstractPicoCompatPlugin
|
||||
{
|
||||
/**
|
||||
* Load's config.php from Pico's root and config dir
|
||||
*
|
||||
* Since we want to utilize Pico's own code dealing with particular config
|
||||
* settings (like making paths and URLs absolute), we must call this before
|
||||
* {@see Pico::loadConfig()}. `onConfigLoaded` is triggered later, thus we
|
||||
* use the `onPluginsLoaded` event.
|
||||
*
|
||||
* @see PicoMainCompatPlugin::loadScriptedConfig()
|
||||
*
|
||||
* @param object[] $plugins loaded plugin instances
|
||||
*/
|
||||
public function onPluginsLoaded(array $plugins)
|
||||
{
|
||||
// deprecated since Pico 1.0
|
||||
if (is_file($this->getPico()->getRootDir() . 'config.php')) {
|
||||
$this->loadScriptedConfig($this->getPico()->getRootDir() . 'config.php');
|
||||
}
|
||||
|
||||
// deprecated since Pico 2.0
|
||||
if (is_file($this->getPico()->getConfigDir() . 'config.php')) {
|
||||
$this->loadScriptedConfig($this->getPico()->getConfigDir() . 'config.php');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a Pico PHP config file and injects the config into Pico
|
||||
*
|
||||
* This method injects the config into Pico using PHP's Reflection API
|
||||
* (i.e. {@see ReflectionClass}). Even though the Reflection API was
|
||||
* created to aid development and not to do things like this, it's the best
|
||||
* solution. Otherwise we'd have to copy all of Pico's code dealing with
|
||||
* special config settings (like making paths and URLs absolute).
|
||||
*
|
||||
* @see PicoMainCompatPlugin::onConfigLoaded()
|
||||
* @see Pico::loadConfig()
|
||||
*
|
||||
* @param string $configFile path to the config file to load
|
||||
*/
|
||||
protected function loadScriptedConfig($configFile)
|
||||
{
|
||||
// scope isolated require()
|
||||
$includeConfigClosure = function ($configFile) {
|
||||
require($configFile);
|
||||
return (isset($config) && is_array($config)) ? $config : array();
|
||||
};
|
||||
if (PHP_VERSION_ID >= 50400) {
|
||||
$includeConfigClosure = $includeConfigClosure->bindTo(null);
|
||||
}
|
||||
|
||||
$scriptedConfig = $includeConfigClosure($configFile);
|
||||
|
||||
if (!empty($scriptedConfig)) {
|
||||
$picoReflector = new ReflectionObject($this->getPico());
|
||||
$picoConfigReflector = $picoReflector->getProperty('config');
|
||||
$picoConfigReflector->setAccessible(true);
|
||||
|
||||
$config = $picoConfigReflector->getValue($this->getPico()) ?: array();
|
||||
$config += $scriptedConfig;
|
||||
|
||||
$picoConfigReflector->setValue($this->getPico(), $config);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_3;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,314 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoPluginApi0CompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with plugins using API version 0, written
|
||||
* for Pico 0.9 and earlier
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoPluginApi0CompatPlugin extends AbstractPicoPluginApiCompatPlugin
|
||||
{
|
||||
/**
|
||||
* This plugin extends {@see PicoPluginApi1CompatPlugin} and
|
||||
* {@see PicoThemeApi0CompatPlugin}
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array('PicoPluginApi1CompatPlugin', 'PicoThemeApi0CompatPlugin');
|
||||
|
||||
/**
|
||||
* Map of core events matching event signatures of older API versions
|
||||
*
|
||||
* @see AbstractPicoPluginApiCompatPlugin::handleEvent()
|
||||
*
|
||||
* @var array<string,string>
|
||||
*/
|
||||
protected $eventAliases = array(
|
||||
'onConfigLoaded' => array('config_loaded'),
|
||||
'onRequestUrl' => array('request_url'),
|
||||
'onContentLoading' => array('before_load_content'),
|
||||
'on404ContentLoading' => array('before_404_load_content'),
|
||||
'onMetaParsed' => array('file_meta'),
|
||||
'onContentParsing' => array('before_parse_content'),
|
||||
'onContentParsed' => array('after_parse_content', 'content_parsed'),
|
||||
'onTwigRegistration' => array('before_twig_register'),
|
||||
'onPageRendered' => array('after_render')
|
||||
);
|
||||
|
||||
/**
|
||||
* Pico's request file
|
||||
*
|
||||
* @see Pico::$requestFile
|
||||
* @see PicoPluginApi0CompatPlugin::onRequestFile()
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
protected $requestFile;
|
||||
|
||||
/**
|
||||
* Triggers the plugins_loaded event
|
||||
*
|
||||
* @param object[] $plugins loaded plugin instances
|
||||
*/
|
||||
public function onPluginsLoaded(array &$plugins)
|
||||
{
|
||||
$this->triggerEvent('plugins_loaded');
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines various config-related constants and sets the $config global
|
||||
*
|
||||
* `ROOT_DIR`, `LIB_DIR`, `PLUGINS_DIR`, `THEMES_DIR`, `CONTENT_EXT` and
|
||||
* `CACHE_DIR` were removed wih Pico 1.0, `CONTENT_DIR` existed just in
|
||||
* Pico 0.9 and `CONFIG_DIR` existed just for a short time between Pico 0.9
|
||||
* and Pico 1.0.
|
||||
*
|
||||
* @param array &$config array of config variables
|
||||
*/
|
||||
public function onConfigLoaded(array &$config)
|
||||
{
|
||||
$this->defineConfigConstants($config);
|
||||
|
||||
if (!isset($GLOBALS['config'])) {
|
||||
$GLOBALS['config'] = &$config;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines various config-related constants
|
||||
*
|
||||
* `ROOT_DIR`, `LIB_DIR`, `PLUGINS_DIR`, `THEMES_DIR`, `CONTENT_EXT` and
|
||||
* `CACHE_DIR` were removed wih Pico 1.0, `CONTENT_DIR` existed just in
|
||||
* Pico 0.9 and `CONFIG_DIR` existed just for a short time between Pico 0.9
|
||||
* and Pico 1.0.
|
||||
*
|
||||
* @param array &$config array of config variables
|
||||
*/
|
||||
protected function defineConfigConstants(array &$config)
|
||||
{
|
||||
if (!defined('ROOT_DIR')) {
|
||||
define('ROOT_DIR', $this->getPico()->getRootDir());
|
||||
}
|
||||
if (!defined('CONFIG_DIR')) {
|
||||
define('CONFIG_DIR', $this->getPico()->getConfigDir());
|
||||
}
|
||||
if (!defined('LIB_DIR')) {
|
||||
$picoReflector = new ReflectionClass('Pico');
|
||||
define('LIB_DIR', dirname($picoReflector->getFileName()) . '/');
|
||||
}
|
||||
if (!defined('PLUGINS_DIR')) {
|
||||
define('PLUGINS_DIR', $this->getPico()->getPluginsDir());
|
||||
}
|
||||
if (!defined('THEMES_DIR')) {
|
||||
define('THEMES_DIR', $this->getPico()->getThemesDir());
|
||||
}
|
||||
if (!defined('CONTENT_DIR')) {
|
||||
define('CONTENT_DIR', $this->getPico()->getConfig('content_dir'));
|
||||
}
|
||||
if (!defined('CONTENT_EXT')) {
|
||||
define('CONTENT_EXT', $this->getPico()->getConfig('content_ext'));
|
||||
}
|
||||
if (!defined('CACHE_DIR')) {
|
||||
$twigConfig = $this->getPico()->getConfig('twig_config');
|
||||
define('CACHE_DIR', $twigConfig['cache'] ?: '');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets PicoPluginApi1CompatPlugin::$requestFile
|
||||
*
|
||||
* @see PicoPluginApi0CompatPlugin::$requestFile
|
||||
*
|
||||
* @param string &$file absolute path to the content file to serve
|
||||
*/
|
||||
public function onRequestFile(&$file)
|
||||
{
|
||||
$this->requestFile = &$file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the after_404_load_content event
|
||||
*
|
||||
* @param string &$rawContent raw file contents
|
||||
*/
|
||||
public function on404ContentLoaded(&$rawContent)
|
||||
{
|
||||
$this->triggerEvent('after_404_load_content', array(&$this->requestFile, &$rawContent));
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the after_load_content event
|
||||
*
|
||||
* @param string &$rawContent raw file contents
|
||||
*/
|
||||
public function onContentLoaded(&$rawContent)
|
||||
{
|
||||
$this->triggerEvent('after_load_content', array(&$this->requestFile, &$rawContent));
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the before_read_file_meta event
|
||||
*
|
||||
* @param string &$rawContent raw file contents
|
||||
* @param string[] &$headers list of known meta header fields
|
||||
*/
|
||||
public function onMetaParsing(&$rawContent, array &$headers)
|
||||
{
|
||||
$this->triggerEvent('before_read_file_meta', array(&$headers));
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the get_page_data event
|
||||
*
|
||||
* @param array &$pageData data of the loaded page
|
||||
*/
|
||||
public function onSinglePageLoaded(array &$pageData)
|
||||
{
|
||||
$this->triggerEvent('get_page_data', array(&$pageData, $pageData['meta']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the get_pages event
|
||||
*
|
||||
* Please note that the `get_pages` event gets `$pages` passed without a
|
||||
* array index. The index is rebuild later using either the `id` array key
|
||||
* or is derived from the `url` array key. If it isn't possible to derive
|
||||
* the array key, `~unknown` is being used. Duplicates are prevented by
|
||||
* adding `~dup` when necessary.
|
||||
*
|
||||
* @param array[] &$pages sorted list of all known pages
|
||||
* @param array|null &$currentPage data of the page being served
|
||||
* @param array|null &$previousPage data of the previous page
|
||||
* @param array|null &$nextPage data of the next page
|
||||
*/
|
||||
public function onPagesLoaded(
|
||||
array &$pages,
|
||||
array &$currentPage = null,
|
||||
array &$previousPage = null,
|
||||
array &$nextPage = null
|
||||
) {
|
||||
// remove keys of pages array
|
||||
$plainPages = array();
|
||||
foreach ($pages as &$plainPageData) {
|
||||
$plainPages[] = &$plainPageData;
|
||||
}
|
||||
|
||||
// trigger event
|
||||
$this->triggerEvent('get_pages', array(&$plainPages, &$currentPage, &$previousPage, &$nextPage));
|
||||
|
||||
// re-index pages array
|
||||
$baseUrl = $this->getPico()->getBaseUrl();
|
||||
$baseUrlLength = strlen($baseUrl);
|
||||
$urlRewritingEnabled = $this->getPico()->isUrlRewritingEnabled();
|
||||
|
||||
$pages = array();
|
||||
foreach ($plainPages as &$pageData) {
|
||||
if (!isset($pageData['id'])) {
|
||||
if (substr($pageData['url'], 0, $baseUrlLength) === $baseUrl) {
|
||||
if ($urlRewritingEnabled && (substr($pageData['url'], $baseUrlLength, 1) === '?')) {
|
||||
$pageData['id'] = substr($pageData['url'], $baseUrlLength + 1);
|
||||
} else {
|
||||
$pageData['id'] = substr($pageData['url'], $baseUrlLength);
|
||||
}
|
||||
} else {
|
||||
// foreign URLs are indexed by ~unknown, ~unknown~dup1, ~unknown~dup2, …
|
||||
$pageData['id'] = '~unknown';
|
||||
}
|
||||
}
|
||||
|
||||
// prevent duplicates
|
||||
$id = $pageData['id'];
|
||||
for ($i = 1; isset($pages[$id]); $i++) {
|
||||
$id = $pageData['id'] . '~dup' . $i;
|
||||
}
|
||||
|
||||
$pages[$id] = &$pageData;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the before_render event
|
||||
*
|
||||
* Please note that the `before_render` event gets `$templateName` passed
|
||||
* without its file extension. The file extension is re-added later.
|
||||
*
|
||||
* @param Twig_Environment &$twig Twig instance
|
||||
* @param string &$templateName file name of the template
|
||||
* @param array &$twigVariables template variables
|
||||
*/
|
||||
public function onPageRendering(Twig_Environment &$twig, array &$twigVariables, &$templateName)
|
||||
{
|
||||
$templateNameInfo = pathinfo($templateName) + array('extension' => '');
|
||||
|
||||
// the template name hasn't had a file extension in API v0
|
||||
$templateName = $templateNameInfo['filename'];
|
||||
|
||||
$this->triggerEvent('before_render', array(&$twigVariables, &$twig, &$templateName));
|
||||
|
||||
// recover original file extension
|
||||
// we assume that all templates of a theme use the same file extension
|
||||
$templateName = $templateName . '.' . $templateNameInfo['extension'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function handleCustomEvent($eventName, array $params = array())
|
||||
{
|
||||
// never trigger custom events
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function triggerEvent($eventName, array $params = array())
|
||||
{
|
||||
// we don't support compat plugins using API v0, so no need to take care of compat plugins here
|
||||
// API v0 events are also triggered on plugins using API v1 (but not later)
|
||||
$plugins = $this->getPicoDeprecated()->getPlugins(PicoDeprecated::API_VERSION_0);
|
||||
$plugins += $this->getPicoDeprecated()->getPlugins(PicoDeprecated::API_VERSION_1);
|
||||
|
||||
foreach ($plugins as $plugin) {
|
||||
if (method_exists($plugin, $eventName)) {
|
||||
call_user_func_array(array($plugin, $eventName), $params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_1;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersionSupport()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,347 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoPluginApi1CompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with plugins using API version 1, written
|
||||
* for Pico 1.0
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoPluginApi1CompatPlugin extends AbstractPicoPluginApiCompatPlugin
|
||||
{
|
||||
/**
|
||||
* This plugin extends {@see PicoPluginApi2CompatPlugin} and
|
||||
* {@see PicoThemeApi1CompatPlugin}
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array('PicoPluginApi2CompatPlugin', 'PicoThemeApi1CompatPlugin');
|
||||
|
||||
/**
|
||||
* Map of core events matching event signatures of older API versions
|
||||
*
|
||||
* @see AbstractPicoPluginApiCompatPlugin::handleEvent()
|
||||
*
|
||||
* @var array<string,string>
|
||||
*/
|
||||
protected $eventAliases = array(
|
||||
'onConfigLoaded' => array('onConfigLoaded'),
|
||||
'onRequestUrl' => array('onRequestUrl'),
|
||||
'onRequestFile' => array('onRequestFile'),
|
||||
'on404ContentLoaded' => array('on404ContentLoaded'),
|
||||
'onContentLoaded' => array('onContentLoaded'),
|
||||
'onContentPrepared' => array('onContentPrepared'),
|
||||
'onContentParsed' => array('onContentParsed'),
|
||||
'onPagesLoading' => array('onPagesLoading'),
|
||||
'onSinglePageLoaded' => array('onSinglePageLoaded'),
|
||||
'onPageRendered' => array('onPageRendered')
|
||||
);
|
||||
|
||||
/**
|
||||
* Pico's request file
|
||||
*
|
||||
* @see Pico::$requestFile
|
||||
* @see PicoPluginApi1CompatPlugin::onRequestFile()
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
protected $requestFile;
|
||||
|
||||
/**
|
||||
* Pico's raw contents
|
||||
*
|
||||
* @see Pico::$rawContent
|
||||
* @see PicoPluginApi1CompatPlugin::onContentLoaded()
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
protected $rawContent;
|
||||
|
||||
/**
|
||||
* Pico's meta headers array
|
||||
*
|
||||
* @see Pico::$metaHeaders
|
||||
* @see PicoPluginApi1CompatPlugin::onMetaHeaders()
|
||||
*
|
||||
* @var array<string,string>|null
|
||||
*/
|
||||
protected $metaHeaders;
|
||||
|
||||
/**
|
||||
* Pico's pages array
|
||||
*
|
||||
* @see Pico::$pages
|
||||
* @see PicoPluginApi1CompatPlugin::onPagesLoaded()
|
||||
*
|
||||
* @var array[]|null
|
||||
*/
|
||||
protected $pages;
|
||||
|
||||
/**
|
||||
* Pico's Twig instance
|
||||
*
|
||||
* @see Pico::$twig
|
||||
* @see PicoPluginApi1CompatPlugin::onTwigRegistered()
|
||||
*
|
||||
* @var Twig_Environment|null
|
||||
*/
|
||||
protected $twig;
|
||||
|
||||
/**
|
||||
* Triggers the onPluginsLoaded event
|
||||
*
|
||||
* Prior to API v2 the event `onPluginsLoaded` passed the `$plugins` array
|
||||
* by reference. This is no longer the case. We still pass the parameter by
|
||||
* reference and use {@see Pico::loadPlugin()} to load additional plugins,
|
||||
* however, unloading or replacing plugins was removed without a
|
||||
* replacement. This might be a BC-breaking change for you!
|
||||
*
|
||||
* @param object[] $plugins loaded plugin instances
|
||||
*/
|
||||
public function onPluginsLoaded(array $plugins)
|
||||
{
|
||||
$originalPlugins = $plugins;
|
||||
|
||||
$this->triggerEvent('onPluginsLoaded', array(&$plugins));
|
||||
|
||||
foreach ($plugins as $pluginName => $plugin) {
|
||||
if (!isset($originalPlugins[$pluginName])) {
|
||||
$this->getPico()->loadPlugin($plugin);
|
||||
} elseif ($plugin !== $originalPlugins[$pluginName]) {
|
||||
throw new RuntimeException(
|
||||
"A Pico plugin using API version 1 tried to replace Pico plugin '" . $pluginName . "' using the "
|
||||
. "onPluginsLoaded() event, however, replacing plugins was removed with API version 2"
|
||||
);
|
||||
}
|
||||
|
||||
unset($originalPlugins[$pluginName]);
|
||||
}
|
||||
|
||||
if ($originalPlugins) {
|
||||
$removedPluginsList = implode("', '", array_keys($originalPlugins));
|
||||
throw new RuntimeException(
|
||||
"A Pico plugin using API version 1 tried to unload the Pico plugin(s) '" . $removedPluginsList . "' "
|
||||
. "using the onPluginsLoaded() event, however, unloading plugins was removed with API version 2"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets PicoPluginApi1CompatPlugin::$requestFile
|
||||
*
|
||||
* @see PicoPluginApi1CompatPlugin::$requestFile
|
||||
*
|
||||
* @param string &$file absolute path to the content file to serve
|
||||
*/
|
||||
public function onRequestFile(&$file)
|
||||
{
|
||||
$this->requestFile = &$file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onContentLoading event
|
||||
*/
|
||||
public function onContentLoading()
|
||||
{
|
||||
$this->triggerEvent('onContentLoading', array(&$this->requestFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets PicoPluginApi1CompatPlugin::$rawContent
|
||||
*
|
||||
* @see PicoPluginApi1CompatPlugin::$rawContent
|
||||
*
|
||||
* @param string &$rawContent raw file contents
|
||||
*/
|
||||
public function onContentLoaded(&$rawContent)
|
||||
{
|
||||
$this->rawContent = &$rawContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the on404ContentLoading event
|
||||
*/
|
||||
public function on404ContentLoading()
|
||||
{
|
||||
$this->triggerEvent('on404ContentLoading', array(&$this->requestFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onMetaParsing event
|
||||
*
|
||||
* @see PicoPluginApi1CompatPlugin::onMetaHeaders()
|
||||
*/
|
||||
public function onMetaParsing()
|
||||
{
|
||||
$headersFlipped = $this->getFlippedMetaHeaders();
|
||||
$this->triggerEvent('onMetaParsing', array(&$this->rawContent, &$headersFlipped));
|
||||
$this->updateFlippedMetaHeaders($headersFlipped);
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onMetaParsed and onParsedownRegistration events
|
||||
*
|
||||
* @param string[] &$meta parsed meta data
|
||||
*/
|
||||
public function onMetaParsed(array &$meta)
|
||||
{
|
||||
$this->triggerEvent('onMetaParsed', array(&$meta));
|
||||
$this->triggerEvent('onParsedownRegistration');
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onContentParsing event
|
||||
*/
|
||||
public function onContentParsing()
|
||||
{
|
||||
$this->triggerEvent('onContentParsing', array(&$this->rawContent));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets PicoPluginApi1CompatPlugin::$pages
|
||||
*
|
||||
* @see PicoPluginApi1CompatPlugin::$pages
|
||||
*
|
||||
* @param array[] &$pages sorted list of all known pages
|
||||
*/
|
||||
public function onPagesLoaded(array &$pages)
|
||||
{
|
||||
$this->pages = &$pages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onPagesLoaded and onTwigRegistration events
|
||||
*
|
||||
* @param array|null &$currentPage data of the page being served
|
||||
* @param array|null &$previousPage data of the previous page
|
||||
* @param array|null &$nextPage data of the next page
|
||||
*/
|
||||
public function onCurrentPageDiscovered(
|
||||
array &$currentPage = null,
|
||||
array &$previousPage = null,
|
||||
array &$nextPage = null
|
||||
) {
|
||||
$this->triggerEvent('onPagesLoaded', array(&$this->pages, &$currentPage, &$previousPage, &$nextPage));
|
||||
|
||||
$this->triggerEvent('onTwigRegistration');
|
||||
$this->getPico()->getTwig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onPageRendering event
|
||||
*
|
||||
* @param string &$templateName file name of the template
|
||||
* @param array &$twigVariables template variables
|
||||
*/
|
||||
public function onPageRendering(&$templateName, array &$twigVariables)
|
||||
{
|
||||
$this->triggerEvent('onPageRendering', array(&$this->twig, &$twigVariables, &$templateName));
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onMetaHeaders event with flipped meta headers and sets
|
||||
* PicoPluginApi1CompatPlugin::$metaHeaders
|
||||
*
|
||||
* @see PicoPluginApi1CompatPlugin::$metaHeaders
|
||||
*
|
||||
* @param string[] &$headers list of known meta header fields; the array
|
||||
* key specifies the YAML key to search for, the array value is later
|
||||
* used to access the found value
|
||||
*/
|
||||
public function onMetaHeaders(array &$headers)
|
||||
{
|
||||
$this->metaHeaders = &$headers;
|
||||
|
||||
$headersFlipped = $this->getFlippedMetaHeaders();
|
||||
$this->triggerEvent('onMetaHeaders', array(&$headersFlipped));
|
||||
$this->updateFlippedMetaHeaders($headersFlipped);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets PicoPluginApi1CompatPlugin::$twig
|
||||
*
|
||||
* @see PicoPluginApi1CompatPlugin::$twig
|
||||
*
|
||||
* @param Twig_Environment &$twig Twig instance
|
||||
*/
|
||||
public function onTwigRegistered(Twig_Environment &$twig)
|
||||
{
|
||||
$this->twig = $twig;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the flipped meta headers array
|
||||
*
|
||||
* Pico 1.0 and earlier were using the values of the meta headers array to
|
||||
* match registered meta headers in a page's meta data, and used the keys
|
||||
* of the meta headers array to store the meta value in the page's meta
|
||||
* data. However, starting with Pico 2.0 it is the other way round. This
|
||||
* allows us to specify multiple "search strings" for a single registered
|
||||
* meta value (e.g. "Nyan Cat" and "Tac Nayn" can be synonmous).
|
||||
*
|
||||
* @return array flipped meta headers
|
||||
*/
|
||||
protected function getFlippedMetaHeaders()
|
||||
{
|
||||
if ($this->metaHeaders === null) {
|
||||
// make sure to trigger the onMetaHeaders event
|
||||
$this->getPico()->getMetaHeaders();
|
||||
}
|
||||
|
||||
return array_flip($this->metaHeaders ?: array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Syncs PicoPluginApi1CompatPlugin::$metaHeaders with a flipped headers array
|
||||
*
|
||||
* @param array $headersFlipped flipped headers array
|
||||
*/
|
||||
protected function updateFlippedMetaHeaders(array $headersFlipped)
|
||||
{
|
||||
foreach ($this->metaHeaders as $name => $key) {
|
||||
if (!isset($headersFlipped[$key])) {
|
||||
unset($this->metaHeaders[$name]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($headersFlipped as $key => $name) {
|
||||
$this->metaHeaders[$name] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_2;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersionSupport()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_1;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoPluginApi2CompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with plugins using API version 2, written
|
||||
* for Pico 2.0
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoPluginApi2CompatPlugin extends AbstractPicoPluginApiCompatPlugin
|
||||
{
|
||||
/**
|
||||
* This plugin extends {@see PicoThemeApi2CompatPlugin}
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array('PicoThemeApi2CompatPlugin');
|
||||
|
||||
/**
|
||||
* Map of core events matching event signatures of older API versions
|
||||
*
|
||||
* @see AbstractPicoPluginApiCompatPlugin::handleEvent()
|
||||
*
|
||||
* @var array<string,string>
|
||||
*/
|
||||
protected $eventAliases = array(
|
||||
'onPluginsLoaded' => array('onPluginsLoaded'),
|
||||
'onPluginManuallyLoaded' => array('onPluginManuallyLoaded'),
|
||||
'onRequestUrl' => array('onRequestUrl'),
|
||||
'onRequestFile' => array('onRequestFile'),
|
||||
'onContentLoading' => array('onContentLoading'),
|
||||
'on404ContentLoading' => array('on404ContentLoading'),
|
||||
'on404ContentLoaded' => array('on404ContentLoaded'),
|
||||
'onContentLoaded' => array('onContentLoaded'),
|
||||
'onMetaParsing' => array('onMetaParsing'),
|
||||
'onMetaParsed' => array('onMetaParsed'),
|
||||
'onContentParsing' => array('onContentParsing'),
|
||||
'onContentPrepared' => array('onContentPrepared'),
|
||||
'onContentParsed' => array('onContentParsed'),
|
||||
'onPagesLoading' => array('onPagesLoading'),
|
||||
'onSinglePageLoading' => array('onSinglePageLoading'),
|
||||
'onSinglePageContent' => array('onSinglePageContent'),
|
||||
'onSinglePageLoaded' => array('onSinglePageLoaded'),
|
||||
'onPagesDiscovered' => array('onPagesDiscovered'),
|
||||
'onPagesLoaded' => array('onPagesLoaded'),
|
||||
'onCurrentPageDiscovered' => array('onCurrentPageDiscovered'),
|
||||
'onPageTreeBuilt' => array('onPageTreeBuilt'),
|
||||
'onPageRendering' => array('onPageRendering'),
|
||||
'onPageRendered' => array('onPageRendered'),
|
||||
'onMetaHeaders' => array('onMetaHeaders'),
|
||||
'onYamlParserRegistered' => array('onYamlParserRegistered'),
|
||||
'onParsedownRegistered' => array('onParsedownRegistered'),
|
||||
'onTwigRegistered' => array('onTwigRegistered')
|
||||
);
|
||||
|
||||
/**
|
||||
* Pico's config array
|
||||
*
|
||||
* @see Pico::$config
|
||||
* @see PicoPluginApi2CompatPlugin::onConfigLoaded()
|
||||
*
|
||||
* @var array|null
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* Sets PicoPluginApi1CompatPlugin::$config and handles the theme_url
|
||||
* config param
|
||||
*
|
||||
* @see PicoPluginApi2CompatPlugin::$config
|
||||
*
|
||||
* @param array $config
|
||||
*/
|
||||
public function onConfigLoaded(array &$config)
|
||||
{
|
||||
$this->config = &$config;
|
||||
|
||||
if (!empty($config['theme_url'])) {
|
||||
$config['themes_url'] = $this->getPico()->getAbsoluteUrl($config['theme_url']);
|
||||
$config['theme_url'] = &$config['themes_url'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the onConfigLoaded event
|
||||
*
|
||||
* @param string $theme name of current theme
|
||||
* @param int $themeApiVersion API version of the theme
|
||||
* @param array &$themeConfig config array of the theme
|
||||
*/
|
||||
public function onThemeLoaded($theme, $themeApiVersion, array &$themeConfig)
|
||||
{
|
||||
$this->triggerEvent('onConfigLoaded', array(&$this->config));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_3;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersionSupport()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_2;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoThemeApi0CompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with themes using API version 0, written
|
||||
* for Pico 0.9 and earlier
|
||||
*
|
||||
* Since there were no theme-related changes between Pico 0.9 and Pico 1.0,
|
||||
* this compat plugin doesn't hold any code itself, it just depends on
|
||||
* {@see PicoThemeApi1CompatPlugin}. Since themes didn't support API versioning
|
||||
* until Pico 2.1 (i.e. API version 3), all older themes will appear to use API
|
||||
* version 0.
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoThemeApi0CompatPlugin extends AbstractPicoCompatPlugin
|
||||
{
|
||||
/**
|
||||
* This plugin extends {@see PicoThemeApi1CompatPlugin}
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array('PicoThemeApi1CompatPlugin');
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_3;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,154 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoThemeApi1CompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with themes using API version 1, written
|
||||
* for Pico 1.0
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoThemeApi1CompatPlugin extends AbstractPicoCompatPlugin
|
||||
{
|
||||
/**
|
||||
* This plugin extends {@see PicoThemeApi2CompatPlugin}
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array('PicoThemeApi2CompatPlugin');
|
||||
|
||||
/**
|
||||
* Lowers the page's meta headers
|
||||
*
|
||||
* @see PicoThemeApi1CompatPlugin::lowerFileMeta()
|
||||
*
|
||||
* @param string[] &$meta parsed meta data
|
||||
*/
|
||||
public function onMetaParsed(array &$meta)
|
||||
{
|
||||
$this->lowerFileMeta($meta);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lowers the page's meta headers
|
||||
*
|
||||
* @see PicoThemeApi1CompatPlugin::lowerFileMeta()
|
||||
*
|
||||
* @param array &$pageData data of the loaded page
|
||||
*/
|
||||
public function onSinglePageLoaded(array &$pageData)
|
||||
{
|
||||
// don't lower the file meta of the requested page,
|
||||
// it was already lowered during the onMetaParsed event
|
||||
$contentDir = $this->getPico()->getConfig('content_dir');
|
||||
$contentExt = $this->getPico()->getConfig('content_ext');
|
||||
if ($contentDir . $pageData['id'] . $contentExt !== $this->getPico()->getRequestFile()) {
|
||||
$this->lowerFileMeta($pageData['meta']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles .html Twig templates and re-introcudes the Twig variables
|
||||
* rewrite_url and is_front_page
|
||||
*
|
||||
* @param string &$templateName file name of the template
|
||||
* @param array &$twigVariables template variables
|
||||
*/
|
||||
public function onPageRendering(&$templateName, array &$twigVariables)
|
||||
{
|
||||
if (!isset($twigVariables['rewrite_url'])) {
|
||||
$twigVariables['rewrite_url'] = $this->getPico()->isUrlRewritingEnabled();
|
||||
}
|
||||
|
||||
if (!isset($twigVariables['is_front_page'])) {
|
||||
$contentDir = $this->getPico()->getConfig('content_dir');
|
||||
$contentExt = $this->getPico()->getConfig('content_ext');
|
||||
$requestFile = $this->getPico()->getRequestFile();
|
||||
$twigVariables['is_front_page'] = ($requestFile === $contentDir . 'index' . $contentExt);
|
||||
}
|
||||
|
||||
// API v2 requires themes to use .twig as file extension
|
||||
// try to load the template and if this fails, try .html instead (as of API v1)
|
||||
$templateNameInfo = pathinfo($templateName) + array('extension' => '');
|
||||
$twig = $this->getPico()->getTwig();
|
||||
|
||||
try {
|
||||
$twig->loadTemplate($templateName);
|
||||
} catch (Twig_Error_Loader $e) {
|
||||
if ($templateNameInfo['extension'] === 'twig') {
|
||||
try {
|
||||
$twig->loadTemplate($templateNameInfo['filename'] . '.html');
|
||||
|
||||
$templateName = $templateNameInfo['filename'] . '.html';
|
||||
$templateNameInfo['extension'] = 'html';
|
||||
} catch (Twig_Error_Loader $e) {
|
||||
// template doesn't exist, Twig will very likely fail later
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Lowers a page's meta headers as with Pico 1.0 and older
|
||||
*
|
||||
* This makes unregistered meta headers available using lowered array keys
|
||||
* and matches registered meta headers in a case-insensitive manner.
|
||||
*
|
||||
* @param array &$meta meta data
|
||||
*/
|
||||
protected function lowerFileMeta(array &$meta)
|
||||
{
|
||||
$metaHeaders = $this->getPico()->getMetaHeaders();
|
||||
|
||||
// get unregistered meta
|
||||
$unregisteredMeta = array();
|
||||
foreach ($meta as $key => $value) {
|
||||
if (!in_array($key, $metaHeaders)) {
|
||||
$unregisteredMeta[$key] = &$meta[$key];
|
||||
}
|
||||
}
|
||||
|
||||
// Pico 1.0 lowered unregistered meta unsolicited...
|
||||
if ($unregisteredMeta) {
|
||||
$metaHeadersLowered = array_change_key_case($metaHeaders, CASE_LOWER);
|
||||
foreach ($unregisteredMeta as $key => $value) {
|
||||
$keyLowered = strtolower($key);
|
||||
if (isset($metaHeadersLowered[$keyLowered])) {
|
||||
$registeredKey = $metaHeadersLowered[$keyLowered];
|
||||
if ($meta[$registeredKey] === '') {
|
||||
$meta[$registeredKey] = &$unregisteredMeta[$key];
|
||||
}
|
||||
} elseif (!isset($meta[$keyLowered]) || ($meta[$keyLowered] === '')) {
|
||||
$meta[$keyLowered] = &$unregisteredMeta[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_3;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,205 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of Pico. It's copyrighted by the contributors recorded
|
||||
* in the version control history of the file, available from the following
|
||||
* original location:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/master/plugins/PicoThemeApi2CompatPlugin.php>
|
||||
*
|
||||
* This file was created by splitting up an original file into multiple files,
|
||||
* which in turn was previously part of the project's main repository. The
|
||||
* version control history of these files apply accordingly, available from
|
||||
* the following original locations:
|
||||
*
|
||||
* <https://github.com/picocms/pico-deprecated/blob/90ea3d5a9767f1511f165e051dd7ffb8f1b3f92e/PicoDeprecated.php>
|
||||
* <https://github.com/picocms/Pico/blob/82a342ba445122182b898a2c1800f03c8d16f18c/plugins/00-PicoDeprecated.php>
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
* License-Filename: LICENSE
|
||||
*/
|
||||
|
||||
/**
|
||||
* Maintains backward compatibility with themes using API version 2, written
|
||||
* for Pico 2.0
|
||||
*
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
class PicoThemeApi2CompatPlugin extends AbstractPicoCompatPlugin
|
||||
{
|
||||
/**
|
||||
* Manually configured Twig escape strategy
|
||||
*
|
||||
* @var mixed|null
|
||||
*/
|
||||
protected $twigEscapeStrategy;
|
||||
|
||||
/**
|
||||
* Directory paths of plugins
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $pluginPaths = array();
|
||||
|
||||
/**
|
||||
* Sets PicoThemeApi2CompatPlugin::$twigEscapeStrategy
|
||||
*
|
||||
* @see PicoThemeApi2CompatPlugin::$twigEscapeStrategy
|
||||
*
|
||||
* @param array &$config array of config variables
|
||||
*/
|
||||
public function onConfigLoaded(array &$config)
|
||||
{
|
||||
if (isset($config['twig_config']['autoescape'])) {
|
||||
$this->twigEscapeStrategy = $config['twig_config']['autoescape'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-introduces the Twig variables prev_page, base_dir and theme_dir
|
||||
*
|
||||
* @param string &$templateName file name of the template
|
||||
* @param array &$twigVariables template variables
|
||||
*/
|
||||
public function onPageRendering(&$templateName, array &$twigVariables)
|
||||
{
|
||||
$twigVariables['prev_page'] = &$twigVariables['previous_page'];
|
||||
$twigVariables['base_dir'] = rtrim($this->getPico()->getRootDir(), '/');
|
||||
$twigVariables['theme_dir'] = $this->getPico()->getThemesDir() . $this->getPico()->getTheme();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers PicoPluginApi2CompatPlugin::twigEscapeStrategy() as Twig's
|
||||
* default escape strategy
|
||||
*
|
||||
* @see PicoPluginApi2CompatPlugin::twigEscapeStrategy()
|
||||
*
|
||||
* @param Twig_Environment &$twig Twig instance
|
||||
*/
|
||||
public function onTwigRegistered(Twig_Environment &$twig)
|
||||
{
|
||||
if ($twig->hasExtension('Twig_Extension_Escaper')) {
|
||||
/** @var Twig_Extension_Escaper $escaperExtension */
|
||||
$escaperExtension = $twig->getExtension('Twig_Extension_Escaper');
|
||||
$escaperExtension->setDefaultStrategy(array($this, 'twigEscapeStrategy'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Twig's default escaping strategy for the given template
|
||||
*
|
||||
* This escape strategy takes a template name and decides whether Twig's
|
||||
* global default escape strategy should be used, or escaping should be
|
||||
* disabled. Escaping is disabled for themes using API v2 and below as well
|
||||
* as for templates of plugins using API v2 and below. If a escape strategy
|
||||
* has been configured manually, this method always returns this explicitly
|
||||
* configured escape strategy.
|
||||
*
|
||||
* @param string $templateName template name
|
||||
*
|
||||
* @return string|false escape strategy for this template
|
||||
*/
|
||||
public function twigEscapeStrategy($templateName)
|
||||
{
|
||||
$twigConfig = $this->getPico()->getConfig('twig_config');
|
||||
$escapeStrategy = $twigConfig['autoescape'];
|
||||
|
||||
if (($this->twigEscapeStrategy !== null) && ($escapeStrategy === $this->twigEscapeStrategy)) {
|
||||
return $escapeStrategy;
|
||||
}
|
||||
|
||||
if (!is_string($escapeStrategy) && ($escapeStrategy !== false)) {
|
||||
$escapeStrategy = call_user_func($escapeStrategy, $templateName);
|
||||
}
|
||||
|
||||
if ($escapeStrategy === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @var Twig_SourceContextLoaderInterface $twigLoader */
|
||||
$twigLoader = $this->getPico()->getTwig()->getLoader();
|
||||
if (!$twigLoader instanceof Twig_SourceContextLoaderInterface) {
|
||||
throw new RuntimeException(
|
||||
"PicoDeprecated compat plugin '" . __CLASS__ . "' requires a 'Twig_SourceContextLoaderInterface' "
|
||||
. "Twig loader, '" . get_class($twigLoader) . "' given"
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
$templatePath = $twigLoader->getSourceContext($templateName)->getPath();
|
||||
} catch (\Twig\Error\LoaderError $e) {
|
||||
$templatePath = '';
|
||||
}
|
||||
|
||||
if ($templatePath) {
|
||||
$themePath = realpath($this->getPico()->getThemesDir() . $this->getPico()->getTheme()) . '/';
|
||||
if (substr($templatePath, 0, strlen($themePath)) === $themePath) {
|
||||
$themeApiVersion = $this->getPico()->getThemeApiVersion();
|
||||
return ($themeApiVersion >= PicoDeprecated::API_VERSION_3) ? $escapeStrategy : false;
|
||||
}
|
||||
|
||||
$plugin = $this->getPluginFromPath($templatePath);
|
||||
if ($plugin) {
|
||||
$pluginApiVersion = $this->getPicoDeprecated()->getPluginApiVersion($plugin);
|
||||
return ($pluginApiVersion >= PicoDeprecated::API_VERSION_3) ? $escapeStrategy : false;
|
||||
}
|
||||
}
|
||||
|
||||
// unknown template path
|
||||
// to preserve BC we must assume that the template uses an old API version
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the matching plugin instance when the given path is within a
|
||||
* plugin's base directory
|
||||
*
|
||||
* @param string $path file path to search for
|
||||
*
|
||||
* @return object|null either the matching plugin instance or NULL
|
||||
*/
|
||||
protected function getPluginFromPath($path)
|
||||
{
|
||||
$plugins = $this->getPico()->getPlugins();
|
||||
foreach ($this->pluginPaths as $pluginName => $pluginPath) {
|
||||
if ($pluginPath && (substr($path, 0, strlen($pluginPath)) === $pluginPath)) {
|
||||
return $plugins[$pluginName];
|
||||
}
|
||||
}
|
||||
|
||||
$rootDir = realpath($this->getPico()->getRootDir()) . '/';
|
||||
$vendorDir = realpath($this->getPico()->getVendorDir()) . '/';
|
||||
$pluginsDir = realpath($this->getPico()->getPluginsDir()) . '/';
|
||||
$themesDir = realpath($this->getPico()->getThemesDir()) . '/';
|
||||
foreach ($plugins as $pluginName => $plugin) {
|
||||
if (isset($this->pluginPaths[$pluginName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$pluginReflector = new ReflectionObject($plugin);
|
||||
|
||||
$pluginPath = dirname($pluginReflector->getFileName() ?: '') . '/';
|
||||
if (in_array($pluginPath, array('/', $rootDir, $vendorDir, $pluginsDir, $themesDir), true)) {
|
||||
$pluginPath = '';
|
||||
}
|
||||
|
||||
$this->pluginPaths[$pluginName] = $pluginPath;
|
||||
|
||||
if ($pluginPath && (substr($path, 0, strlen($pluginPath)) === $pluginPath)) {
|
||||
return $plugins[$pluginName];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getApiVersion()
|
||||
{
|
||||
return PicoDeprecated::API_VERSION_3;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Nicolas Liautaud
|
||||
|
||||
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.
|
|
@ -0,0 +1,245 @@
|
|||
<?php
|
||||
/**
|
||||
* Flat and nested pages list navigation for Pico CMS.
|
||||
*
|
||||
* - Adds twig global `{{ nested_pages }}` in addition to `{{ pages }}`
|
||||
* - Render flat or nested HTML navigation tree with `navigation` twig filter
|
||||
* - Filter pages and nested pages by paths with `exclude()` and `only()` twig filters
|
||||
*
|
||||
* Examples :
|
||||
*
|
||||
* {{ pages | navigation }} // output a flat pages list
|
||||
* {{ nested_pages | navigation }} // output a nested pages list
|
||||
* {{ nested_pages | exclude('sub/page') | navigation }} // filtered nested pages list
|
||||
* {% assign filtered = pages | only('sub/path/') %} // get filtered flat pages array
|
||||
*
|
||||
* @author Nicolas Liautaud
|
||||
* @link https://github.com/nliautaud/pico-pages-list
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
*/
|
||||
class PicoPagesList extends AbstractPicoPlugin
|
||||
{
|
||||
const API_VERSION = 3;
|
||||
|
||||
protected $items;
|
||||
|
||||
/**
|
||||
* Construct the nested pages array.
|
||||
*
|
||||
* Triggered after Pico has read all known pages
|
||||
*
|
||||
* See {@link DummyPlugin::onSinglePageLoaded()} for details about the
|
||||
* structure of the page data.
|
||||
*
|
||||
* @see Pico::getPages()
|
||||
* @param array[] &$pages data of all known pages
|
||||
* @return void
|
||||
*/
|
||||
public function onPagesLoaded(array &$pages)
|
||||
{
|
||||
$this->items = $this->nestedPages($pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register `$this` in the Twig `{{ PagesList }}` variable.
|
||||
*
|
||||
*
|
||||
* @see Pico::getTwig()
|
||||
* @param Twig_Environment &$twig Twig instance
|
||||
* @return void
|
||||
*/
|
||||
public function onTwigRegistered(Twig_Environment &$twig)
|
||||
{
|
||||
$twig->addFilter(new Twig_SimpleFilter('navigation', function($pages) {
|
||||
return $this->output($pages);
|
||||
}, array('is_safe' => array('html'))));
|
||||
|
||||
$twig->addFilter(new Twig_SimpleFilter('exclude', function($pages, array $paths = array()) {
|
||||
return $this->filterPages($pages, $paths);
|
||||
}, array('is_variadic' => true)));
|
||||
|
||||
$twig->addFilter(new Twig_SimpleFilter('only', function($pages, array $paths = array()) {
|
||||
return $this->filterPages($pages, $paths, true);
|
||||
}, array('is_variadic' => true)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register `$this` in the Twig `{{ PagesList }}` variable.
|
||||
*
|
||||
* Triggered before Pico renders the page
|
||||
*
|
||||
* @see Pico::getTwig()
|
||||
* @see DummyPlugin::onPageRendered()
|
||||
* @param string &$templateName file name of the template
|
||||
* @param array &$twigVariables template variables
|
||||
* @return void
|
||||
*/
|
||||
public function onPageRendering(string &$templateName, array &$twigVariables)
|
||||
{
|
||||
$twigVariables['nested_pages'] = $this->items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the nested pages array according to the pages paths.
|
||||
*
|
||||
* @see nested_path
|
||||
* @param array $pages Pico pages flat array
|
||||
*/
|
||||
private function nestedPages($pages)
|
||||
{
|
||||
$this->items = array();
|
||||
foreach ($pages as $page) {
|
||||
$nested_path = $this->nested_path($page);
|
||||
$this->items = array_replace_recursive($this->items, $nested_path);
|
||||
}
|
||||
return $this->items['_childs'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a nested array of a given path, with the page at the end.
|
||||
* Each path fragment is in "_childs" of the parent.
|
||||
*
|
||||
* @param array $page the page array
|
||||
* @return array the nested path
|
||||
*/
|
||||
private function nested_path($page)
|
||||
{
|
||||
$path = self::rtrim($page['id'], '/index');
|
||||
$parts = explode('/', $path);
|
||||
$count = count($parts);
|
||||
|
||||
$arr = array();
|
||||
$parent = &$arr;
|
||||
foreach($parts as $id => $part) {
|
||||
$value = [];
|
||||
if(!$part || $id == $count-1) {
|
||||
$value = $page;
|
||||
} else {
|
||||
$currpath = implode('/', array_slice($parts, 0, $id+1));
|
||||
$value['id'] = $currpath;
|
||||
}
|
||||
if($path && !$part) {
|
||||
$parent = $value;
|
||||
break;
|
||||
}
|
||||
|
||||
$parent['_childs'][$part] = $value;
|
||||
$parent = &$parent['_childs'][$part];
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip a substring from the end of a string
|
||||
*
|
||||
* @param array $str The input string.
|
||||
* @param array $substr The substring to remove.
|
||||
* @return string The modified string.
|
||||
*/
|
||||
private static function rtrim($str, $substr)
|
||||
{
|
||||
$length = strlen($substr);
|
||||
return (substr($str, -$length) === $substr) ? substr($str, 0, -$length) : $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the pages array according to given paths, as exclusive or inclusive.
|
||||
*
|
||||
* @param array $pages The flat or nested pages array.
|
||||
* @param array $filteredPaths The paths to filter.
|
||||
* @param boolean $isInclusive If `true` only corresponding paths are kept.
|
||||
* @return array The filtered array of pages.
|
||||
*/
|
||||
public static function filterPages(
|
||||
$pages,
|
||||
$filteredPaths,
|
||||
$isInclusive = false,
|
||||
$inclusiveOutput = []
|
||||
) {
|
||||
foreach($pages as $i => $page) {
|
||||
if (!isset($page['id'])) return;
|
||||
|
||||
$path = self::rtrim($page['id'], '/index');
|
||||
$isSubPath = self::isSubPath($path, $filteredPaths);
|
||||
if ($isSubPath) {
|
||||
if ($isInclusive) $inclusiveOutput[$i] = $page;
|
||||
else unset($pages[$i]);
|
||||
continue;
|
||||
}
|
||||
if (isset($page['_childs'])) {
|
||||
$childs = self::filterPages($page['_childs'], $filteredPaths, $isInclusive, $inclusiveOutput);
|
||||
if ($isInclusive) $inclusiveOutput = $childs;
|
||||
else $pages[$i]['_childs'] = $childs;
|
||||
}
|
||||
}
|
||||
return $isInclusive ? $inclusiveOutput : $pages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return if the given path is a subpath of the given parent path(s)
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $parentPaths array of paths
|
||||
* @return boolean
|
||||
*/
|
||||
private static function isSubPath($path, $parentPaths)
|
||||
{
|
||||
foreach($parentPaths as $p) {
|
||||
if (!is_string($p)) continue;
|
||||
if ($path == $p) return true;
|
||||
if (strncmp($path, $p, strlen($p)) === 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an html nested list based on a nested pages array.
|
||||
*
|
||||
* @param array $pages a nested pages array
|
||||
* @return string the html list
|
||||
*/
|
||||
private function output($pages)
|
||||
{
|
||||
if (!is_array($pages)) return;
|
||||
$html = '<ul>';
|
||||
foreach ($pages as $pageID => $page)
|
||||
{
|
||||
if (!empty($page['hidden'])) continue;
|
||||
|
||||
$childsOutput = '';
|
||||
if(isset($page['_childs'])) {
|
||||
$childsOutput = $this->output($page['_childs']);
|
||||
}
|
||||
|
||||
$url = isset($page['url']) ? $page['url'] : false;
|
||||
|
||||
// use title if the page has one and make a link if the page exists.
|
||||
if(!$url) $item = "<span>$pageID</span>";
|
||||
else {
|
||||
$name = !empty($page['title']) ? $page['title'] : $pageID;
|
||||
$item = "<a href=\"$url\">$name</a>";
|
||||
}
|
||||
|
||||
// add the pageID in class and indicate if it is the current or parent of the current page.
|
||||
$class = $pageID;
|
||||
$class .= $url ? ' is-page' : ' is-directory';
|
||||
if ($childsOutput) $class .= ' has-childs';
|
||||
|
||||
$currentPage = $this->getPico()->getCurrentPage();
|
||||
if ($currentPage && $currentPage['id']) {
|
||||
if ($currentPage['id'] === $page['id']) {
|
||||
$class .= ' is-current is-active';
|
||||
} elseif ($page['id'] !== 'index') {
|
||||
$pagePath = (basename($page['id']) === 'index') ? dirname($page['id']) . '/' : $page['id'] . '/';
|
||||
if (substr_compare($pagePath, $currentPage['id'], 0, strlen($pagePath)) === 0) $class .= ' is-active';
|
||||
}
|
||||
}
|
||||
|
||||
$html .= "<li class=\"$class\">$item$childsOutput</li>";
|
||||
}
|
||||
$html .= '</ul>';
|
||||
return $html;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,154 @@
|
|||
# Pico Pages List
|
||||
|
||||
A flat and nested pages lists plugin for [Pico CMS](http://picocms.org).
|
||||
|
||||
- `{{ nested_pages }}` array
|
||||
- nested or flat html navigations
|
||||
- pages links and directories structures
|
||||
- versatile html/css for dropdown menus, single-line breadcrumbs...
|
||||
- `exclude` and `only` pages filters
|
||||
|
||||
[![Examples](examples/capture.png)](http://pico.nliautaud.fr/PicoPagesList)
|
||||
|
||||
Demo : http://pico.nliautaud.fr/PicoPagesList
|
||||
|
||||
## Installation
|
||||
|
||||
Copy `PicoPagesList.php` to the `plugins` directory of your Pico Project.
|
||||
|
||||
## Usage
|
||||
|
||||
Create a nested HTML navigation tree with :
|
||||
|
||||
```twig
|
||||
{{ nested_pages | navigation }}
|
||||
```
|
||||
|
||||
The nested navigation will look like that :
|
||||
|
||||
* [A cool page]()
|
||||
* [Sub-page is coming]()
|
||||
* [The choosen one]()
|
||||
* category
|
||||
* [A page]()
|
||||
* [untitled]()
|
||||
|
||||
The global `nested_pages` and the filter `navigation` render an HTML navigation. Works on `{{ pages }}` too.
|
||||
|
||||
```twig
|
||||
{{ pages | navigation }} // output a flat pages list
|
||||
```
|
||||
|
||||
## Filtering
|
||||
|
||||
The plugin create two additionnal Twig filters, `exclude()` and `only()`, that filters the given pages array (`pages` or `nested_pages`) by paths.
|
||||
|
||||
```twig
|
||||
pages | exclude('path/') // exclude the page located under "path/"
|
||||
pages | only('path/') // return only the page located at "path/"
|
||||
```
|
||||
|
||||
Use the leading slath to target index pages or not.
|
||||
|
||||
```twig
|
||||
pages | exclude('sub/dir/') // exclude the page located under "sub/dir/", but not "sub/dir" (index)
|
||||
pages | exclude('sub/dir') // exclude "sub/dir" (index) and pages located under "sub/dir/"
|
||||
```
|
||||
|
||||
You can specify multiple paths at once by using multiple arguments.
|
||||
|
||||
```twig
|
||||
exclude('sub/dir', 'page')
|
||||
only('sub/dir', 'page')
|
||||
```
|
||||
|
||||
### Styling
|
||||
|
||||
The default html output is a clean nested list with extra classes that provides the possibility to build hierarchical navigations and to target specific pages and directories.
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li class="titled is-page">
|
||||
<a href="http://mysite.com/titled">A cool page</a>
|
||||
</li>
|
||||
<li class="foo is-page has-childs is-current">
|
||||
<a href="http://mysite.com/foo">Sub-page is coming</a>
|
||||
<ul>
|
||||
<li class="child is-page has-childs is-current is-active">
|
||||
<a href="http://mysite.com/foo/child">The choosen one</a>
|
||||
</li>
|
||||
<li class="category is-directory has-childs">
|
||||
<span>category</span>
|
||||
<ul>
|
||||
<li class="bar is-page">
|
||||
<a href="http://mysite.com/foo/category/bar">A page</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="untitled is-page">
|
||||
<a href="http://mysite.com/untitled">untitled</a>
|
||||
</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
```css
|
||||
.foo-item { /* an item named "foo-item" */ }
|
||||
.foo-item > a { /* the link of a page named "foo-item" */ }
|
||||
.foo-item > span { /* the name of a directory named "foo-item" */ }
|
||||
.foo-item > ul { /* the childs of "foo-item" */ }
|
||||
.foo-item > ul ul { /* the deep childs of "foo-item" */ }
|
||||
|
||||
.is-page { /* the pages, with links */ }
|
||||
.is-directory { /* the directories, with simple names */ }
|
||||
.is-current { /* the current page */ }
|
||||
.is-active { /* the items in the path of the current page */ }
|
||||
.has-childs { /* the items with childs */ }
|
||||
```
|
||||
|
||||
As a simple example, you may show sub-pages only if their parent is active :
|
||||
|
||||
```css
|
||||
.mymenu li.is-page:not(.is-active) ul {
|
||||
display: none;
|
||||
}
|
||||
```
|
||||
|
||||
## Custom loop
|
||||
|
||||
The `{{ nested_pages }}` global is an array of pages, similar to `{{ pages }}`, where sub-pages are nested into `_childs`.
|
||||
|
||||
You may want a recursive Twig template or macro to walk trough it, for example :
|
||||
|
||||
```twig
|
||||
{% macro menu(items) %}
|
||||
<ul>
|
||||
{% for name,item in items %}
|
||||
<li>
|
||||
{% if item.url %}
|
||||
<a href="{{ item.url }}">{{ item.title }}</a> : {{ item.description }}
|
||||
{% else %}
|
||||
<span>{{ name }}</span>
|
||||
{% endif %}
|
||||
{% if item._childs %}
|
||||
{% import _self as macros %}
|
||||
{{ macros.menu(item._childs) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endmacro %}
|
||||
|
||||
{% import _self as macros %}
|
||||
{{ macros.menu(nested_pages) }}
|
||||
```
|
||||
|
||||
## Settings
|
||||
|
||||
The lists are sorted according to the default settings in Pico `config.php`.
|
||||
|
||||
```yml
|
||||
pages_order_by: date
|
||||
pages_order: desc
|
||||
```
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"name": "nliautaud/pico-pages-list",
|
||||
"type": "pico-plugin",
|
||||
"description": "A pages lists plugin for Pico CMS, with nested pages, pages filtering and HTML navigation.",
|
||||
"keywords": [ "pico", "picocms", "picocms-plugin", "pico-pages-list"],
|
||||
"homepage": "http://picocms.org/",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Liautaud",
|
||||
"homepage": "https://github.com/nliautaud/pico-pages-list",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/nliautaud/pico-pages-list/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"docs": "https://github.com/nliautaud/pico-pages-list/blob/master/README.md",
|
||||
"issues": "https://github.com/nliautaud/pico-pages-list/issues",
|
||||
"source": "https://github.com/nliautaud/pico-pages-list"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [ "PicoPagesList.php" ]
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 47 KiB |
|
@ -0,0 +1,162 @@
|
|||
<style>
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
.pageslist-demo .item {
|
||||
border: 1px solid #eee;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 0 5px #0001;
|
||||
margin: 1em;
|
||||
}
|
||||
.pageslist-demo .item.span {
|
||||
grid-column: 1 / span 2;
|
||||
}
|
||||
.pageslist-demo .desc {
|
||||
background: #2EAE9B;
|
||||
color: white;
|
||||
font-size: .8em;
|
||||
overflow: auto;
|
||||
}
|
||||
.pageslist-demo .desc p {
|
||||
margin: 1em;
|
||||
}
|
||||
.pageslist-demo .desc code {
|
||||
font-family: inherit;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
background: #456;
|
||||
padding: .25em .5em;
|
||||
margin: 1em;
|
||||
display: block;
|
||||
white-space: pre-wrap;
|
||||
font-size: 1em;
|
||||
}
|
||||
.pageslist-demo ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 1em;
|
||||
}
|
||||
.pageslist-demo ul ul {
|
||||
padding-left: 1.5em;
|
||||
margin: 0;
|
||||
}
|
||||
.pageslist-demo .is-active a {
|
||||
font-style: italic;
|
||||
}
|
||||
.pageslist-demo .is-current a {
|
||||
font-style: normal;
|
||||
font-weight: bold;
|
||||
}
|
||||
.pageslist-demo a::before,
|
||||
.pageslist-demo span::before {
|
||||
content: "▹";
|
||||
vertical-align: middle;
|
||||
margin-right: .5em;
|
||||
color: grey;
|
||||
font: normal 1.2em normal mono;
|
||||
}
|
||||
.pageslist-demo .has-childs > a::before,
|
||||
.pageslist-demo .has-childs > span::before {
|
||||
content: "▾";
|
||||
}
|
||||
</style>
|
||||
<div class="pageslist-demo">
|
||||
<div class="grid">
|
||||
<div class="item">
|
||||
<div class="desc">
|
||||
<p>Generate a flat navigation using the default page array.</p>
|
||||
<code>{% raw %}{{ pages | navigation }}{% endraw %}</code>
|
||||
</div>
|
||||
{{ pages | navigation }}
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="desc">
|
||||
<p>Generate a nested navigation using the nested array.</p>
|
||||
<code>{% raw %}{{ nested_pages | navigation }}{% endraw %}</code>
|
||||
</div>
|
||||
{{ nested_pages | navigation }}
|
||||
</div>
|
||||
<div class="item span">
|
||||
<div class="desc">
|
||||
<p>The html structure and the css classes allows styling current page, active parent pages, naked directories, getting pages by name, etc. to build any type of navigation : dropdown menus, single-lined breadcrumbs...
|
||||
</p>
|
||||
<code>{% raw %}.is-page, .is-directory, .is-current, .is-active, .has-childs ...{% endraw %}</code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="desc">
|
||||
<p>Filtering pages paths with the <i>exclude</i> filter : </p>
|
||||
<code>{% raw %}{{ nested_pages | exclude('PicoPagesList') | navigation }}{% endraw %}</code>
|
||||
</div>
|
||||
{{ nested_pages | exclude('PicoPagesList') | navigation }}
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="desc">
|
||||
<p>Filter the inner pages by using a trailing slash : </p>
|
||||
<code>{% raw %}{{ nested_pages | exclude('PicoPagesList/') | navigation }}{% endraw %}</code>
|
||||
</div>
|
||||
{{ nested_pages | exclude('PicoPagesList/') | navigation }}
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="desc">
|
||||
<p>Filter all pages except the given ones with <i>only</i>, and chain filters : </p>
|
||||
<code>{% raw %}{{ nested_pages | only('PicoPagesList') | exclude('PicoPagesList/sub/bar') | navigation }}{% endraw %}</code>
|
||||
</div>
|
||||
{{ nested_pages | only('PicoPagesList') | exclude('PicoPagesList/sub/bar') | navigation }}
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="desc">
|
||||
<p>Filters can be given multiple paths : </p>
|
||||
<code>{% raw %}{{ nested_pages | only('PicoPagesList/sub', 'index') | navigation }}{% endraw %}</code>
|
||||
</div>
|
||||
{{ nested_pages | only('PicoPagesList/sub', 'index') | navigation }}
|
||||
</div>
|
||||
<div class="item span">
|
||||
<div class="desc">
|
||||
<p>Custom loop :</p>
|
||||
<code>{% raw %}{% macro menu(items) %}
|
||||
<ul>
|
||||
{% for name,item in items %}
|
||||
<li>
|
||||
{% if item.url %}
|
||||
<a href="{{ item.url }}">{{ item.title }}</a> : {{ item.description }}
|
||||
{% else %}
|
||||
<span>{{ name }}</span>
|
||||
{% endif %}
|
||||
{% if item._childs %}
|
||||
{% import 'macros.twig' as macros %}
|
||||
{{ macros.menu(item._childs) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endmacro %}{% endraw %}</code>
|
||||
|
||||
<code>{% raw %}{% import 'macros.twig' as macros %}
|
||||
{{ macros.menu(nested_pages) }}{% endraw %}</code>
|
||||
</div>
|
||||
{% macro menu(items) %}
|
||||
<ul>
|
||||
{% for name,item in items %}
|
||||
<li>
|
||||
{% if item.url %}
|
||||
<a href="{{ item.url }}">{{ item.title }}</a> : {{ item.description }}
|
||||
{% else %}
|
||||
<span>{{ name }}</span>
|
||||
{% endif %}
|
||||
{% if item._childs %}
|
||||
{% import _self as macros %}
|
||||
{{ macros.menu(item._childs) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endmacro %}
|
||||
|
||||
{% import _self as macros %}
|
||||
{{ macros.menu(nested_pages) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,660 @@
|
|||
### GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
<https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
### Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains
|
||||
free software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, 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
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing
|
||||
under this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
### TERMS AND CONDITIONS
|
||||
|
||||
#### 0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds
|
||||
of works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of
|
||||
an exact copy. The resulting work is called a "modified version" of
|
||||
the earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user
|
||||
through a computer network, with no transfer of a copy, is not
|
||||
conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" to
|
||||
the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
#### 1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work for
|
||||
making modifications to it. "Object code" means any non-source form of
|
||||
a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users can
|
||||
regenerate automatically from other parts of the Corresponding Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same
|
||||
work.
|
||||
|
||||
#### 2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey,
|
||||
without conditions so long as your license otherwise remains in force.
|
||||
You may convey covered works to others for the sole purpose of having
|
||||
them make modifications exclusively for you, or provide you with
|
||||
facilities for running those works, provided that you comply with the
|
||||
terms of this License in conveying all material for which you do not
|
||||
control copyright. Those thus making or running the covered works for
|
||||
you must do so exclusively on your behalf, under your direction and
|
||||
control, on terms that prohibit them from making any copies of your
|
||||
copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the
|
||||
conditions stated below. Sublicensing is not allowed; section 10 makes
|
||||
it unnecessary.
|
||||
|
||||
#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such
|
||||
circumvention is effected by exercising rights under this License with
|
||||
respect to the covered work, and you disclaim any intention to limit
|
||||
operation or modification of the work as a means of enforcing, against
|
||||
the work's users, your or third parties' legal rights to forbid
|
||||
circumvention of technological measures.
|
||||
|
||||
#### 4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
#### 5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these
|
||||
conditions:
|
||||
|
||||
- a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
- b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under
|
||||
section 7. This requirement modifies the requirement in section 4
|
||||
to "keep intact all notices".
|
||||
- c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
- d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
#### 6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms of
|
||||
sections 4 and 5, provided that you also convey the machine-readable
|
||||
Corresponding Source under the terms of this License, in one of these
|
||||
ways:
|
||||
|
||||
- a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
- b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the Corresponding
|
||||
Source from a network server at no charge.
|
||||
- c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
- d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
- e) Convey the object code using peer-to-peer transmission,
|
||||
provided you inform other peers where the object code and
|
||||
Corresponding Source of the work are being offered to the general
|
||||
public at no charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal,
|
||||
family, or household purposes, or (2) anything designed or sold for
|
||||
incorporation into a dwelling. In determining whether a product is a
|
||||
consumer product, doubtful cases shall be resolved in favor of
|
||||
coverage. For a particular product received by a particular user,
|
||||
"normally used" refers to a typical or common use of that class of
|
||||
product, regardless of the status of the particular user or of the way
|
||||
in which the particular user actually uses, or expects or is expected
|
||||
to use, the product. A product is a consumer product regardless of
|
||||
whether the product has substantial commercial, industrial or
|
||||
non-consumer uses, unless such uses represent the only significant
|
||||
mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to
|
||||
install and execute modified versions of a covered work in that User
|
||||
Product from a modified version of its Corresponding Source. The
|
||||
information must suffice to ensure that the continued functioning of
|
||||
the modified object code is in no case prevented or interfered with
|
||||
solely because modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or
|
||||
updates for a work that has been modified or installed by the
|
||||
recipient, or for the User Product in which it has been modified or
|
||||
installed. Access to a network may be denied when the modification
|
||||
itself materially and adversely affects the operation of the network
|
||||
or violates the rules and protocols for communication across the
|
||||
network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
#### 7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders
|
||||
of that material) supplement the terms of this License with terms:
|
||||
|
||||
- a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
- b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
- c) Prohibiting misrepresentation of the origin of that material,
|
||||
or requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
- d) Limiting the use for publicity purposes of names of licensors
|
||||
or authors of the material; or
|
||||
- e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
- f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions
|
||||
of it) with contractual assumptions of liability to the recipient,
|
||||
for any liability that these contractual assumptions directly
|
||||
impose on those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions; the
|
||||
above requirements apply either way.
|
||||
|
||||
#### 8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
#### 9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or run
|
||||
a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
#### 10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
#### 11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims owned
|
||||
or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within the
|
||||
scope of its coverage, prohibits the exercise of, or is conditioned on
|
||||
the non-exercise of one or more of the rights that are specifically
|
||||
granted under this License. You may not convey a covered work if you
|
||||
are a party to an arrangement with a third party that is in the
|
||||
business of distributing software, under which you make payment to the
|
||||
third party based on the extent of your activity of conveying the
|
||||
work, and under which the third party grants, to any of the parties
|
||||
who would receive the covered work from you, a discriminatory patent
|
||||
license (a) in connection with copies of the covered work conveyed by
|
||||
you (or copies made from those copies), or (b) primarily for and in
|
||||
connection with specific products or compilations that contain the
|
||||
covered work, unless you entered into that arrangement, or that patent
|
||||
license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
#### 12. No Surrender of Others' Freedom.
|
||||
|
||||
If 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 convey a
|
||||
covered work so as to satisfy simultaneously your obligations under
|
||||
this License and any other pertinent obligations, then as a
|
||||
consequence you may not convey it at all. For example, if you agree to
|
||||
terms that obligate you to collect a royalty for further conveying
|
||||
from those to whom you convey the Program, the only way you could
|
||||
satisfy both those terms and this License would be to refrain entirely
|
||||
from conveying the Program.
|
||||
|
||||
#### 13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your
|
||||
version supports such interaction) an opportunity to receive the
|
||||
Corresponding Source of your version by providing access to the
|
||||
Corresponding Source from a network server at no charge, through some
|
||||
standard or customary means of facilitating copying of software. This
|
||||
Corresponding Source shall include the Corresponding Source for any
|
||||
work covered by version 3 of the GNU General Public License that is
|
||||
incorporated pursuant to the following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
#### 14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Affero 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 Program
|
||||
specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever
|
||||
published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions
|
||||
of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
#### 15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
|
||||
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
||||
CORRECTION.
|
||||
|
||||
#### 16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
|
||||
CONVEYS THE PROGRAM 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 PROGRAM (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 PROGRAM
|
||||
TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
|
||||
PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
#### 17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
### How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively state
|
||||
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 program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper
|
||||
mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for
|
||||
the specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. For more information on this, and how to apply and follow
|
||||
the GNU AGPL, see <https://www.gnu.org/licenses/>.
|
|
@ -0,0 +1,116 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PicoVideoEmbed - Responsive peerube, vimeo and youtube embeds in shortcode format
|
||||
*
|
||||
* @author Jurij Podgoršek <g1smo@git.kompot.si>
|
||||
* @license https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
* @version 0.1
|
||||
*/
|
||||
class PicoVideoEmbed extends AbstractPicoPlugin
|
||||
{
|
||||
/**
|
||||
* API version used by this plugin
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION = 3;
|
||||
|
||||
/**
|
||||
* This plugin depends on ...
|
||||
*
|
||||
* @see AbstractPicoPlugin::$dependsOn
|
||||
* @var string[]
|
||||
*/
|
||||
protected $dependsOn = array();
|
||||
|
||||
|
||||
const SHORTCODE = '#\[video .+?\]#i';
|
||||
|
||||
/**
|
||||
* Triggered after Pico has prepared the raw file contents for parsing
|
||||
*
|
||||
* @see Pico::parseFileContent()
|
||||
* @see DummyPlugin::onContentParsed()
|
||||
* @param string &$content prepared file contents for parsing
|
||||
* @return void
|
||||
*/
|
||||
public function onContentParsed(&$content)
|
||||
{
|
||||
if (stripos($content, '[video') !== false) {
|
||||
// Search for Embed shortcodes allover the content
|
||||
preg_match_all(self::SHORTCODE, $content, $matches);
|
||||
|
||||
// Make sure we found some shortcodes
|
||||
if (count($matches[0]) > 0) {
|
||||
|
||||
// Walk through shortcodes one by one
|
||||
foreach ($matches[0] as $match) {
|
||||
|
||||
// First, try youtube
|
||||
// Get youtube like and video ID (Ref:http://stackoverflow.com/questions/3717115/regular-expression-for-youtube-links/3726073#3726073)
|
||||
preg_match(self::YOUTUBE_REGEX, $match, $embed_link);
|
||||
if (count($embed_link) > 1) {
|
||||
$content = preg_replace(self::SHORTCODE, $this->getYoutubeEmbed($embed_link), $content, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Next, we try vimeo
|
||||
preg_match(self::VIMEO_REGEX, $match, $embed_link);
|
||||
if (count($embed_link) > 1) {
|
||||
$content = preg_replace(self::SHORTCODE, $this->getVimeoEmbed($embed_link), $content, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Otherwise, it's peertube <3
|
||||
preg_match(self::PEERTUBE_REGEX, $match, $embed_link);
|
||||
if (count($embed_link) > 1) {
|
||||
$content = preg_replace(self::SHORTCODE, $this->getPeertubeEmbed($embed_link), $content, 1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const YOUTUBE_REGEX = '#http(?:s)?\:\/\/(?:www\.)?youtu(?:be\.com/watch\?v=|\.be/|be\.com/embed/)([\w\-]+)(&(amp;)?[\w\?=]*)?#s';
|
||||
private function getYoutubeEmbed(array $embed_link) {
|
||||
return '<div class="pico-video-embed">'
|
||||
. '<iframe id="ytID" width="500" height="480" src="https://www.youtube.com/embed/' . $embed_link[1] . '" frameborder="0" allowfullscreen></iframe>'
|
||||
. '</div>';
|
||||
}
|
||||
|
||||
const VIMEO_REGEX = '#http(?:s)?\:\/\/(?:www\.)?(?:player\.)?vimeo\.com/(?:video/)?([0-9]+)(-:\?.+)?#s';
|
||||
private function getVimeoEmbed(array $embed_link) {
|
||||
return '<div class="pico-video-embed">'
|
||||
. '<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://player.vimeo.com/video/' . $embed_link[1] . '?warningTitle=0" frameborder="0" allowfullscreen></iframe>'
|
||||
. '</div>';
|
||||
}
|
||||
|
||||
const PEERTUBE_REGEX = '#(http(?:s)?)\:\/\/([a-zA-Z0-9](?:(?:[a-zA-Z0-9-]*|(?<!-)\.(?![-.]))*[a-zA-Z0-9]+)?)(?:/videos/embed|/videos/watch|/w)/([0-9a-zA-Z-]+)/?#s';
|
||||
private function getPeertubeEmbed(array $embed_link) {
|
||||
return '<div class="pico-video-embed">'
|
||||
. '<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="' . $embed_link[1] . '://' . $embed_link[2] . '/videos/embed/' . $embed_link[3] . '?warningTitle=0" frameborder="0" allowfullscreen></iframe>'
|
||||
. '</div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggered after Pico has rendered the page
|
||||
*
|
||||
* @param string &$output contents which will be sent to the user
|
||||
* @return void
|
||||
*/
|
||||
public function onPageRendered(&$output)
|
||||
{
|
||||
// Add embed css
|
||||
$output = str_replace('</head>', ($this->getStyleHeader() . '</head>'), $output);
|
||||
}
|
||||
|
||||
private function getStyleHeader() {
|
||||
$header = '<style type="text/css">'
|
||||
. '.pico-video-embed { position: relative; padding-bottom: 56.25%; border: 0;}'
|
||||
. '.pico-video-embed iframe, .video-container object, .video-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;}'
|
||||
. '</style>';
|
||||
return $header;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
# PicoVideoEmbed
|
||||
|
||||
This plugin for [Pico CMS](https://picocms.org/) adds support for embedding responsive videos from peertube, vimeo and youtube. It supports different link formats, such as:
|
||||
|
||||
```
|
||||
[video https://kolektiva.media/videos/embed/a5c6b8e1-6e9e-4a89-ace4-03b6cf97ce07]
|
||||
[video https://kolektiva.media/w/mtiCL28GP9gzLC2FPKjs6v]
|
||||
[video https://tube.mfraters.net/videos/watch/9a2b78db-ef05-4770-9196-8a1fcd243f43]
|
||||
[video https://vimeo.com/566821117]
|
||||
[video https://player.vimeo.com/video/566821117]
|
||||
[video https://youtu.be/NkdUs2Dxv4s]
|
||||
[video https://www.youtube.com/watch?v=NkdUs2Dxv4s]
|
||||
[video https://www.youtube.com/embed/NkdUs2Dxv4s]
|
||||
```
|
||||
|
||||
## TODO
|
||||
|
||||
- add configuration options (peertube IP notice, ...)
|
||||
- add unit tests for URL parsing
|
||||
- also support bare video files?
|
||||
|
||||
## Thanks
|
||||
|
||||
I would like to thank s4ad, who built the [spiritual predecessor](https://github.com/s4ad/PicoEmbed) of this plugin.
|
After Width: | Height: | Size: 339 KiB |
After Width: | Height: | Size: 377 KiB |
After Width: | Height: | Size: 312 KiB |
After Width: | Height: | Size: 396 KiB |
After Width: | Height: | Size: 396 KiB |
After Width: | Height: | Size: 325 KiB |
After Width: | Height: | Size: 322 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,4 @@
|
|||
<link rel="icon" href="{{ theme_url }}/favicon/cropped-favicon-32x32.png" sizes="32x32" />
|
||||
<link rel="icon" href="{{ theme_url }}/favicon/cropped-favicon-192x192.png" sizes="192x192" />
|
||||
<link rel="apple-touch-icon" href="{{ theme_url }}/favicon/cropped-favicon-180x180.png" />
|
||||
<meta name="msapplication-TileImage" content="{{ theme_url }}/favicon/cropped-favicon-270x270.png" />
|
After Width: | Height: | Size: 951 B |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 608 B |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 24 KiB |
|
@ -0,0 +1,101 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>{% if meta.title %}{{ meta.title }}{% else %}{{ site_title }}{% endif %}</title>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
{% if meta.description %}
|
||||
<meta name="description" content="{{ meta.description|striptags }}">
|
||||
{% endif %}{% if meta.robots %}
|
||||
<meta name="robots" content="{{ meta.robots }}">
|
||||
{% endif %}
|
||||
{{ include('favicon/favicon.twig') }}
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" type="text/css" />
|
||||
<link rel='stylesheet' href='{{ theme_url }}/styles/style.css' type='text/css'/>
|
||||
<link rel='stylesheet' href='{{ theme_url }}/styles/unslider.css' type='text/css'/>
|
||||
<link rel='stylesheet' href='{{ theme_url }}/styles/unslider-dots.css' type='text/css'/>
|
||||
<script src="{{ theme_url }}/scripts/jquery-3.1.1.min.js"></script>
|
||||
<script src="{{ theme_url }}/scripts/tinynav.min.js"></script>
|
||||
<script src="{{ theme_url }}/scripts/unslider-min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header id="branding">
|
||||
<div class="container clearfix">
|
||||
<div class="hgroup-wrap clearfix">
|
||||
<section class="hgroup-right">
|
||||
<img src='{{ theme_url }}/images/prva_slika.jpeg'>
|
||||
</section>
|
||||
<hgroup id="site-logo" class="clearfix">
|
||||
<h1 id="site-title"><a href={{ base_url }}>{{ site_title }}</a></h1>
|
||||
<h2 id="site-description">{{ config.site_subtitle }}</h2>
|
||||
</hgroup>
|
||||
</div>
|
||||
</div>
|
||||
<nav id="main-nav" class="clearfix">
|
||||
{{ 'navbar'|content }}
|
||||
</nav>
|
||||
</header>
|
||||
<div id="main" class="clearfix">
|
||||
<div>
|
||||
<div id="primary" class="no-margin-left">
|
||||
<div id="content">
|
||||
<section class="page">
|
||||
<article>
|
||||
<h2>Zadnje novice</h2>
|
||||
{% for page in pages("novice/")|sort_by("date")|reverse if not page.hidden %}
|
||||
<div class="post">
|
||||
{% if page.meta.teaser %}
|
||||
<img class="teaser" src="{{ assets_url }}/{{ page.meta.teaser }}">
|
||||
{% endif %}
|
||||
|
||||
<div>
|
||||
<h3><a href="{{ page.url }}">{{ page.title }}</a></h3>
|
||||
<p class="date">Objavljeno: {{ page.date_formatted }}</p>
|
||||
<p>{{ page.description }} <a href="{{ page.url}}">več</a></p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{{ content }}
|
||||
</article>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<div id="secondary">
|
||||
{% for page in pages %}
|
||||
{% if page.id starts with current_page.id|split('/')|slice(0,-1)|join('/') ~ '/sidebars/' %} {# page-specfic sidebars should be placed before global ones #}
|
||||
<aside class="widget">
|
||||
<h3 class="widget-title">{{ page.title }}</h3>
|
||||
{{ page.id|content }}
|
||||
</aside>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for page in pages %}
|
||||
{% if page.id starts with 'sidebars/' %} {# global sidebars #}
|
||||
<aside class="widget">
|
||||
<h3 class="widget-title">{{ page.title }}</h3>
|
||||
{{ page.id|content }}
|
||||
</aside>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer id="footerarea" class="clearfix">
|
||||
</footer>
|
||||
</div>
|
||||
<script>
|
||||
$(function () {
|
||||
$("#main-nav").children(0).tinyNav({header: 'Navigation'});
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
$(document.links).filter(function() {
|
||||
return this.hostname != window.location.hostname;
|
||||
}).attr('target', '_blank');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,104 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>{% if meta.title %}{{ meta.title }}{% else %}{{ site_title }}{% endif %}</title>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
{% if meta.description %}
|
||||
<meta name="description" content="{{ meta.description|striptags }}">
|
||||
{% endif %}{% if meta.robots %}
|
||||
<meta name="robots" content="{{ meta.robots }}">
|
||||
{% endif %}
|
||||
{{ include('favicon/favicon.twig') }}
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" type="text/css" />
|
||||
<link rel='stylesheet' href='{{ theme_url }}/styles/style.css' type='text/css'/>
|
||||
<link rel='stylesheet' href='{{ theme_url }}/styles/unslider.css' type='text/css'/>
|
||||
<link rel='stylesheet' href='{{ theme_url }}/styles/unslider-dots.css' type='text/css'/>
|
||||
<script src="{{ theme_url }}/scripts/jquery-3.1.1.min.js"></script>
|
||||
<script src="{{ theme_url }}/scripts/tinynav.min.js"></script>
|
||||
<script src="{{ theme_url }}/scripts/unslider-min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header id="branding">
|
||||
<div class="container clearfix">
|
||||
<div class="hgroup-wrap clearfix">
|
||||
<section class="hgroup-right">
|
||||
<img src='{{ theme_url }}/images/prva_slika.jpeg'>
|
||||
</section>
|
||||
<hgroup id="site-logo" class="clearfix">
|
||||
<h1 id="site-title"><a href={{ base_url }}>{{ site_title }}</a></h1>
|
||||
<h2 id="site-description">{{ config.site_subtitle }}</h2>
|
||||
</hgroup>
|
||||
</div>
|
||||
</div>
|
||||
<nav id="main-nav" class="clearfix">
|
||||
{{ 'navbar'|content }}
|
||||
</nav>
|
||||
</header>
|
||||
<div id="main" class="clearfix">
|
||||
<div>
|
||||
<div id="primary" class="no-margin-left">
|
||||
<div id="content">
|
||||
<section class="page">
|
||||
<article>
|
||||
{{ content }}
|
||||
|
||||
{% if meta.title == "Materiali" %}
|
||||
|
||||
{% for page in pages("materiali/")|sort_by("date")|reverse if not page.hidden %}
|
||||
<div class="post">
|
||||
{% if page.meta.teaser %}
|
||||
<img class="teaser" src="{{ assets_url }}/{{ page.meta.teaser }}">
|
||||
{% endif %}
|
||||
|
||||
<div>
|
||||
<h3><a href="{{ page.url }}">{{ page.title }}</a></h3>
|
||||
{% if page.date_formatted %}
|
||||
<p class="date">Objavljeno: {{ page.date_formatted }}</p>
|
||||
{% endif %}
|
||||
<p>{{ page.description }} <a href="{{ page.url}}">več</a></p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</article>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<div id="secondary">
|
||||
{% for page in pages %}
|
||||
{% if page.id starts with current_page.id|split('/')|slice(0,-1)|join('/') ~ '/sidebars/' %} {# page-specfic sidebars should be placed before global ones #}
|
||||
<aside class="widget">
|
||||
<h3 class="widget-title">{{ page.title }}</h3>
|
||||
{{ page.id|content }}
|
||||
</aside>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for page in pages %}
|
||||
{% if page.id starts with 'sidebars/' %} {# global sidebars #}
|
||||
<aside class="widget">
|
||||
<h3 class="widget-title">{{ page.title }}</h3>
|
||||
{{ page.id|content }}
|
||||
</aside>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer id="footerarea" class="clearfix">
|
||||
</footer>
|
||||
</div>
|
||||
<script>
|
||||
$(function () {
|
||||
$("#main-nav").children(0).tinyNav({header: 'Navigation'});
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
$(document.links).filter(function() {
|
||||
return this.hostname != window.location.hostname;
|
||||
}).attr('target', '_blank');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -0,0 +1,11 @@
|
|||
<aside class="widget">
|
||||
<h3 class="widget-title"><a href="https://enlacezapatista.ezln.org.mx/"><img class="rss_ikonca" src="{{ theme_url }}/images/rss.png" alt="RSS"> Enlace Zapatista</a></h3>
|
||||
<ul>
|
||||
{% for item in rss_content %}
|
||||
<li>
|
||||
<a href="{{ item.link }}">{{ item.title }}</a>
|
||||
<div>{{ item.description|raw }}</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</aside>
|
|
@ -0,0 +1,3 @@
|
|||
/*! http://tinynav.viljamis.com v1.2 by @viljamis */
|
||||
(function(a,k,g){a.fn.tinyNav=function(l){var c=a.extend({active:"selected",header:"",indent:"- ",label:""},l);return this.each(function(){g++;var h=a(this),b="tinynav"+g,f=".l_"+b,e=a("<select/>").attr("id",b).addClass("tinynav "+b);if(h.is("ul,ol")){""!==c.header&&e.append(a("<option/>").text(c.header));var d="";h.addClass("l_"+b).find("a").each(function(){d+='<option value="'+a(this).attr("href")+'">';var b;for(b=0;b<a(this).parents("ul, ol").length-1;b++)d+=c.indent;d+=a(this).text()+"</option>"});
|
||||
e.append(d);c.header||e.find(":eq("+a(f+" li").index(a(f+" li."+c.active))+")").attr("selected",!0);e.change(function(){k.location.href=a(this).val()});a(f).after(e);c.label&&e.before(a("<label/>").attr("for",b).addClass("tinynav_label "+b+"_label").append(c.label))}})}})(jQuery,this,0);
|
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* Here's where everything gets included. You don't need
|
||||
* to change anything here, and doing so might break
|
||||
* stuff. Here be dragons and all that.
|
||||
*/
|
||||
/**
|
||||
* Default variables
|
||||
*
|
||||
* While these can be set with JavaScript, it's probably
|
||||
* better and faster to just set them here, compile to
|
||||
* CSS and include that instead to use some of that
|
||||
* hardware-accelerated goodness.
|
||||
*/
|
||||
.unslider-nav {
|
||||
/* position the navigation dots over the slides */
|
||||
opacity: 0.7;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 79%;
|
||||
|
||||
z-index: 1000; /* Make sure the dots show over the images */
|
||||
}
|
||||
.unslider-nav ol {
|
||||
list-style: none;
|
||||
text-align: center;
|
||||
}
|
||||
.unslider-nav ol li {
|
||||
display: inline-block;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
margin: 0 4px;
|
||||
background: transparent;
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
text-indent: -999em;
|
||||
border: 2px solid #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
.unslider-nav ol li.unslider-active {
|
||||
background: #fff;
|
||||
cursor: default;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider li,.unslider ol,.unslider ul{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}
|
|
@ -0,0 +1,135 @@
|
|||
Pico Default Theme Changelog
|
||||
============================
|
||||
|
||||
**Note:** This changelog only provides technical information about the changes
|
||||
introduced with a particular Pico version, and is meant to supplement
|
||||
the actual code changes. The information in this changelog are often
|
||||
insufficient to understand the implications of larger changes. Please
|
||||
refer to both the UPGRADE and NEWS sections of the docs for more
|
||||
details.
|
||||
|
||||
### Version 2.1.4
|
||||
Released: 2020-08-29
|
||||
|
||||
```
|
||||
* [Changed] Don't setup nav toggle JavaScript when there's no menu
|
||||
```
|
||||
|
||||
### Version 2.1.3
|
||||
Released: 2020-07-10
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.2
|
||||
Released: 2020-04-10
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.1
|
||||
Released: 2019-12-31
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.1.0
|
||||
Released: 2019-11-24
|
||||
|
||||
```
|
||||
* [New] Add Pico's official logo and tagline
|
||||
* [New] Add some utility classes for typography and images
|
||||
* [Changed] Improve documentation of `pico-theme.yml`
|
||||
* [Changed] Various small improvements
|
||||
```
|
||||
|
||||
### Version 2.1.0-beta.1
|
||||
Released: 2019-11-03
|
||||
|
||||
```
|
||||
* [Changed] Add basic `pico-theme.yml` to use API v3, enable Twig's autoescape
|
||||
feature (no changes necessary) and register `Social` meta header
|
||||
* [Changed] Use Pico's `pages` Twig function to create the main navigation
|
||||
* [Changed] Improve formatting of definition lists and inline code snippets
|
||||
* [Changed] Improve JSDoc class docs
|
||||
* [Changed] Various small improvements
|
||||
```
|
||||
|
||||
### Version 2.0.5-beta.1
|
||||
Released: 2019-01-03
|
||||
|
||||
```
|
||||
* [New] Add `2.0.x-dev` alias for master branch to `composer.json`
|
||||
```
|
||||
|
||||
### Version 2.0.4
|
||||
Released: 2018-12-17
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.3
|
||||
Released: 2018-12-03
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.2
|
||||
Released: 2018-08-12
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.1
|
||||
Released: 2018-07-29
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.0
|
||||
Released: 2018-07-01
|
||||
|
||||
```
|
||||
* [New] Add Bountysource
|
||||
* [Changed] Improve documentation
|
||||
```
|
||||
|
||||
### Version 2.0.0-beta.3
|
||||
Released: 2018-04-07
|
||||
|
||||
No changes
|
||||
|
||||
### Version 2.0.0-beta.2
|
||||
Released: 2018-01-21
|
||||
|
||||
```
|
||||
* [Fixed] Fix sliding animation of collapsible menu in IE 9
|
||||
* [Changed] Move Fontello font to `icon/` directory
|
||||
* [Changed] Move stylesheets to `css/` directory
|
||||
* [Changed] Improve Fontello font copyright notice
|
||||
* [Changed] Add Droid Sans and Droid Sans Mono font files to `font/` directory,
|
||||
making Pico's default theme fully self-containing
|
||||
```
|
||||
|
||||
### Version 2.0.0-beta.1
|
||||
Released: 2017-11-05
|
||||
|
||||
**Note:** Pico's default theme was completely rewritten from scratch for
|
||||
Pico 2.0 and moved to this separate repository. This changelog only
|
||||
provides basic information about the most important changes compared
|
||||
to Pico 1.0. It therefore doesn't include the changes made before
|
||||
this release. The rewrite breaks backwards compatibility (BC).
|
||||
|
||||
```
|
||||
* [New] Rewrite Pico's default theme from scratch with a much cleaner, more
|
||||
modern, but still "stupidly simple" structure; the new theme officially
|
||||
supports Internet Explorer 9+ as well as all versions of the major
|
||||
desktop and mobile browsers, as long as they are still officially
|
||||
supported by their respective vendor
|
||||
* [New] Pico's default theme is now a fully responsive theme, adapting the
|
||||
layout to the viewing environment (desktops vs. tablets vs. smartphones
|
||||
vs. ...)
|
||||
* [New] Add a collapsible page menu for small screens (menu slides up/down)
|
||||
* [New] Add basic form themeing
|
||||
* [New] Support a "widescreen" mode, demonstrating how themes can adjust their
|
||||
behavior using config parameters (i.e. Pico's `config/config.yml`)
|
||||
* [Changed] Show top-level pages in the website's navigation only (i.e. show
|
||||
`page.md` and `sub/index.md`, but not `sub/page.md`)
|
||||
* [Changed] Hide pages starting with a `_` in the website's navigation
|
||||
* [Changed] Move Pico's social icons from `index.md` to `_meta.md`,
|
||||
demonstrating how themes can use YAML-only meta pages to support
|
||||
dynamic content
|
||||
```
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2012 The Pico Community
|
||||
|
||||
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.
|
|
@ -0,0 +1,67 @@
|
|||
Pico Default Theme
|
||||
==================
|
||||
|
||||
This is the repository of Pico's official default theme.
|
||||
|
||||
Pico is a stupidly simple, blazing fast, flat file CMS. See http://picocms.org/ for more info.
|
||||
|
||||
Please refer to [`picocms/Pico`](https://github.com/picocms/Pico) to get info about how to contribute or getting help.
|
||||
|
||||
Screenshot
|
||||
----------
|
||||
|
||||
![Pico Screenshot](https://picocms.github.io/screenshots/pico-21.png)
|
||||
|
||||
Install
|
||||
-------
|
||||
|
||||
You usually don't have to install this theme manually, it's shipped together with [Pico's pre-built release packages](https://github.com/picocms/Pico/releases/latest) and a default dependency of [`picocms/pico-composer`](https://github.com/picocms/pico-composer).
|
||||
|
||||
If you're using a custom theme, you can safely remove this theme.
|
||||
|
||||
If you use a `composer`-based installation of Pico and want to either remove or install Pico's default theme, simply open a shell on your server and navigate to Pico's install directory (e.g. `/var/www/html`). Run `composer remove picocms/pico-theme` to remove the theme, or run `composer require picocms/pico-theme` (via [Packagist.org](https://packagist.org/packages/picocms/pico-theme)) to install the theme.
|
||||
|
||||
If you rather use one of Pico's pre-built release packages, it is best to simply leave Pico's default theme as it is - it won't hurt... :wink: The reason for this is, that the theme is part of Pico's pre-built release packages, thus it will be automatically re-installed when updating Pico. However, if you really want to remove the theme, simply delete the `themes/default` directory in Pico's install directory (e.g. `/var/www/html`). If you want to install Pico's default theme, you must first create a empty `themes/default` directory on your server, [download the version of the theme](https://github.com/picocms/pico-theme/releases) matching the version of your Pico installation and upload all containing files (i.a. `index.twig`) into said `themes/default` directory (resulting in `themes/default/index.twig`).
|
||||
|
||||
The versioning of Pico's default theme strictly follows the version of Pico's core. You *must not* use a version of the theme that doesn't match the version of Pico's core (e.g. version 2.0.1 is *not compatible* with Pico 2.0.0). If you're using a `composer`-based installation of Pico, simply use a version constaint like `^2.0` - `picocms/pico-theme` ensures that its version matches Pico's version. Even if you're using one of Pico's pre-built release packages, you don't have to take care of anything - a matching version of the theme is part of Pico's pre-built release packages anyway.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Pico's default theme isn't really intended to be used for a productive website, it's rather a starting point for creating your own theme. Simply copy the theme's directory (`themes/default/` to e.g. `themes/my_theme/`) and add the following line to your `config/config.yml`:
|
||||
|
||||
```yaml
|
||||
theme: my_theme
|
||||
```
|
||||
|
||||
You can now edit the theme's stylesheets and JavaScript to fit your needs. If you rather want to use a third-party theme, simply add the theme's directory to your `themes/` directory (e.g. `themes/some_other_theme/`) and update your `config/config.yml` accordingly. Pico's default theme is now completely disabled and won't ever interfere with your custom theme or your website in general anymore. If you want to use Pico's default theme again, either remove the line or replace it by `theme: default`.
|
||||
|
||||
Anyway, since Pico's default theme is meant to be a starting point for your own theme, it demonstrates how themes can allow one to tweak a theme's behavior. For this reason it supports a "Widescreen" mode: By adding `theme_config.widescreen: true` to your `config/config.yml`, the theme's main container grows from 768px to 1152px breadth due to adding `class="widescreen"` to the website's `<body>` element. Pico's default theme furthermore supports displaying both a logo and a tagline in its header, as well as adding social buttons to its footer. Rather than using Pico's config for this, it uses the YAML Frontmatter of the `content/_meta.md` Markdown file. Here's `content/_meta.md` from Pico's sample contents:
|
||||
|
||||
```yaml
|
||||
---
|
||||
Logo: %theme_url%/img/pico-white.svg
|
||||
Tagline: Making the web easy.
|
||||
Social:
|
||||
- title: Visit us on GitHub
|
||||
url: https://github.com/picocms/Pico
|
||||
icon: octocat
|
||||
- title: Join us on Freenode IRC Webchat
|
||||
url: https://webchat.freenode.net/?channels=%23picocms
|
||||
icon: chat
|
||||
---
|
||||
```
|
||||
|
||||
You should also check out the theme's `pico-theme.yml`: First of all it tells Pico to use the latest API version for themes and adjusts Pico's default Twig config. But more importantly it also registers the mentioned `widescreen` theme config as well as the meta headers `Logo`, `Tagline` and `Social`.
|
||||
|
||||
Getting Help
|
||||
------------
|
||||
|
||||
Please refer to the ["Getting Help" section](https://github.com/picocms/Pico#getting-help) of our main repository.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Please refer to the ["Contributing" section](https://github.com/picocms/Pico#contributing) of our main repository.
|
||||
|
||||
By contributing to Pico, you accept and agree to the *Developer Certificate of Origin* for your present and future contributions submitted to Pico. Please refer to the ["Developer Certificate of Origin" section](https://github.com/picocms/Pico/blob/master/CONTRIBUTING.md#developer-certificate-of-origin) in the `CONTRIBUTING.md` of our main repository.
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"name": "picocms/pico-theme",
|
||||
"type": "pico-theme",
|
||||
"description": "This is Pico's official default theme. Pico is a stupidly simple, blazing fast, flat file CMS.",
|
||||
"keywords": [ "pico", "picocms", "picocms-theme", "pico-theme", "default-theme" ],
|
||||
"homepage": "http://picocms.org/",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Rudolf",
|
||||
"email": "picocms.org@daniel-rudolf.de",
|
||||
"role": "Lead Developer"
|
||||
},
|
||||
{
|
||||
"name": "The Pico Community",
|
||||
"homepage": "http://picocms.org/"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/picocms/pico-theme/graphs/contributors"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"docs": "http://picocms.org/themes/default/",
|
||||
"issues": "https://github.com/picocms/pico-theme/issues",
|
||||
"source": "https://github.com/picocms/pico-theme"
|
||||
},
|
||||
"require": {
|
||||
"picocms/pico": "self.version"
|
||||
},
|
||||
"extra": {
|
||||
"installer-name": "default",
|
||||
"branch-alias": {
|
||||
"dev-master": "2.1.x-dev",
|
||||
"dev-pico-3.0": "3.0.x-dev"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
@font-face {
|
||||
font-family: 'Droid Sans';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('../font/DroidSans-Regular.eot?1516549146');
|
||||
src: local('Droid Sans Regular'),
|
||||
local('DroidSans-Regular'),
|
||||
url('../font/DroidSans-Regular.eot?1516549146#iefix') format('embedded-opentype'),
|
||||
url('../font/DroidSans-Regular.woff2?1516549146') format('woff2'),
|
||||
url('../font/DroidSans-Regular.woff?1516549146') format('woff'),
|
||||
url('../font/DroidSans-Regular.ttf?1516549146') format('truetype'),
|
||||
url('../font/DroidSans-Regular.svg?1516549146#droid_sansregular') format('svg');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Droid Sans';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('../font/DroidSans-Bold.eot?1516549146');
|
||||
src: local('Droid Sans Bold'),
|
||||
local('DroidSans-Bold'),
|
||||
url('../font/DroidSans-Bold.eot?1516549146#iefix') format('embedded-opentype'),
|
||||
url('../font/DroidSans-Bold.woff2?1516549146') format('woff2'),
|
||||
url('../font/DroidSans-Bold.woff?1516549146') format('woff'),
|
||||
url('../font/DroidSans-Bold.ttf?1516549146') format('truetype'),
|
||||
url('../font/DroidSans-Bold.svg?1516549146#droid_sansbold') format('svg');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Droid Sans Mono';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('../font/DroidSansMono-Regular.eot?1516549146');
|
||||
src: local('Droid Sans Mono Regular'),
|
||||
local('DroidSansMono-Regular'),
|
||||
url('../font/DroidSansMono-Regular.eot?1516549146#iefix') format('embedded-opentype'),
|
||||
url('../font/DroidSansMono-Regular.woff2?1516549146') format('woff2'),
|
||||
url('../font/DroidSansMono-Regular.woff?1516549146') format('woff'),
|
||||
url('../font/DroidSansMono-Regular.ttf?1516549146') format('truetype'),
|
||||
url('../font/DroidSansMono-Regular.svg?1516549146#droid_sans_monoregular') format('svg');
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('../icon/fontello.eot?29729916');
|
||||
src: url('../icon/fontello.eot?29729916#iefix') format('embedded-opentype'),
|
||||
url('../icon/fontello.woff2?29729916') format('woff2'),
|
||||
url('../icon/fontello.woff?29729916') format('woff'),
|
||||
url('../icon/fontello.ttf?29729916') format('truetype'),
|
||||
url('../icon/fontello.svg?29729916#fontello') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
|
||||
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
|
||||
/*
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('../icon/fontello.svg?13793670#fontello') format('svg');
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
[class^="icon-"]:before, [class*=" icon-"]:before {
|
||||
font-family: "fontello";
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
speak: none;
|
||||
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
width: 1em;
|
||||
margin-right: .2em;
|
||||
text-align: center;
|
||||
/* opacity: .8; */
|
||||
|
||||
/* For safety - reset parent styles, that can break glyph codes*/
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
|
||||
/* fix buttons height, for twitter bootstrap */
|
||||
line-height: 1em;
|
||||
|
||||
/* Animation center compensation - margins should be symmetric */
|
||||
/* remove if not needed */
|
||||
margin-left: .2em;
|
||||
|
||||
/* you can be more comfortable with increased icons size */
|
||||
/* font-size: 120%; */
|
||||
|
||||
/* Font smoothing. That was taken from TWBS */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Uncomment for 3D effect */
|
||||
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
|
||||
}
|
||||
|
||||
.icon-chat:before { content: '\e800'; } /* '' */
|
||||
.icon-octocat:before { content: '\f09b'; } /* '' */
|
||||
.icon-menu:before { content: '\f0c9'; } /* '' */
|
||||
.icon-dollar:before { content: '\f155'; } /* '' */
|
|
@ -0,0 +1,386 @@
|
|||
/**
|
||||
* Pico's Default Theme
|
||||
*
|
||||
* Pico's default theme is a bit bare - but that's intentional! The default
|
||||
* theme isn't meant for production use, it's actually a template for you to
|
||||
* design your own theme around.
|
||||
*
|
||||
* Pico is a stupidly simple, blazing fast, flat file CMS.
|
||||
*
|
||||
* @author Gilbert Pellegrom
|
||||
* @author Daniel Rudolf
|
||||
* @link http://picocms.org
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @version 2.1
|
||||
*/
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
border: 0 none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.hidden { display: none !important; }
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
border: 0 none;
|
||||
}
|
||||
|
||||
.slide {
|
||||
overflow-y: hidden !important;
|
||||
-webkit-transition: height .5s ease-in !important;
|
||||
transition: height .5s ease-in !important;
|
||||
}
|
||||
|
||||
/*** BASIC LAYOUT ***/
|
||||
|
||||
html, body { height: 100%; }
|
||||
|
||||
body { display: flex; flex-direction: column; }
|
||||
#main { flex: 1 0 auto; }
|
||||
#header, #footer { flex: 0 0 auto; }
|
||||
|
||||
#main {
|
||||
padding: 5em 0 4em;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 48em;
|
||||
padding: 0 0.5em;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.widescreen .container { max-width: 72em; }
|
||||
|
||||
/* very ugly overflow fix, avoid this whenever possible! */
|
||||
#main .container { overflow-x: auto; }
|
||||
|
||||
/*** BASIC LAYOUT: HEADER ***/
|
||||
|
||||
#header { background: #2EAE9B; }
|
||||
|
||||
#title, #logo {
|
||||
float: left;
|
||||
padding: 3em 3em 3em 0;
|
||||
}
|
||||
|
||||
#title * { margin: 0; color: #fff; }
|
||||
#title p { font-style: italic; }
|
||||
|
||||
#logo { height: 10.8em; }
|
||||
#logo * { display: block; height: 100%; }
|
||||
#logo img { min-width: 4.8em; }
|
||||
|
||||
#logo + #title h1 { margin: 0.8rem 0; }
|
||||
#logo + #title.tagline h1 { margin: 0; }
|
||||
|
||||
#nav {
|
||||
padding: 3em 0;
|
||||
text-align: right;
|
||||
}
|
||||
#nav ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
#nav ul li {
|
||||
display: inline-block;
|
||||
margin-left: 1em;
|
||||
padding: 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#nav a, #nav-toggle { color: #afe1da; }
|
||||
#nav .active a, #nav a:hover, #nav-toggle:hover { color: #fff; }
|
||||
|
||||
#nav-toggle { display: none; }
|
||||
|
||||
/* IE8 + IE9 clearfix */
|
||||
#header > .container:after {
|
||||
content: '';
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
/*** BASIC LAYOUT: FOOTER ***/
|
||||
|
||||
#footer {
|
||||
background: #707070;
|
||||
color: #C0C0C0;
|
||||
}
|
||||
|
||||
#footer a { color: #ddd; }
|
||||
#footer a:hover { color: #fff; }
|
||||
|
||||
#footer p {
|
||||
margin: 0;
|
||||
padding: 3em 0;
|
||||
}
|
||||
|
||||
#footer .social {
|
||||
float: right;
|
||||
padding: 1.5em 0 1.5em 1em;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
/*** BASIC LAYOUT: EXTRA SMALL DEVICES ***/
|
||||
|
||||
@media (max-width: 767px) {
|
||||
#main { padding: 2em 0 1em; }
|
||||
|
||||
#title, #logo { padding: 2em 1.5em 2em 0; }
|
||||
#logo { height: 8.8em; }
|
||||
|
||||
#nav {
|
||||
clear: both;
|
||||
padding: 0;
|
||||
}
|
||||
#nav ul {
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
#nav ul li {
|
||||
display: block;
|
||||
margin-left: 0;
|
||||
text-align: center;
|
||||
}
|
||||
#nav ul li a {
|
||||
display: block;
|
||||
padding: 0.5em 0;
|
||||
}
|
||||
|
||||
.js #nav-toggle {
|
||||
display: block;
|
||||
float: right;
|
||||
width: 2em;
|
||||
margin: 0.6667em 0;
|
||||
font-size: 1.5rem;
|
||||
line-height: 2em;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.js #nav-toggle > * { vertical-align: middle; }
|
||||
|
||||
#footer p { padding: 1em 0; }
|
||||
#footer .social { padding: 0.5em 0 0.5em 1em; }
|
||||
}
|
||||
|
||||
/*** TYPOGRAPHY ***/
|
||||
|
||||
html { font-size: 16px; }
|
||||
|
||||
body {
|
||||
font-family: 'Droid Sans', 'Helvetica', 'Arial', sans-serif;
|
||||
font-size: 1rem;
|
||||
line-height: 1.6;
|
||||
font-variant-ligatures: common-ligatures;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-kerning: normal;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
p, td, th, li, dd {
|
||||
text-align: justify;
|
||||
overflow-wrap: break-word;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
p, hr, table, .table-responsive, ol, ul, dl, dd, pre, blockquote, fieldset {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #2EAE9B;
|
||||
text-decoration: none;
|
||||
-webkit-transition: color .2s ease-in;
|
||||
transition: color .2s ease-in;
|
||||
}
|
||||
a:hover { color: #444; }
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin-bottom: 0.6em;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
h1 { font-size: 2rem; }
|
||||
h2 { font-size: 1.7rem; }
|
||||
h3 { font-size: 1.4rem; }
|
||||
h4 { font-size: 1.1rem; }
|
||||
h5 { font-size: 1rem; }
|
||||
h6 { font-size: 1rem; font-weight: normal; font-style: italic; }
|
||||
|
||||
img { max-width: 100%; }
|
||||
|
||||
hr {
|
||||
border: 0.15em solid #f5f5f5;
|
||||
border-radius: 0.3em;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
|
||||
abbr { text-decoration: underline dotted; }
|
||||
|
||||
/*** UTILITIES ***/
|
||||
|
||||
.align-left { text-align: left; }
|
||||
.align-center { text-align: center; }
|
||||
.align-right { text-align: right; }
|
||||
.align-justify { text-align: justify; }
|
||||
|
||||
.image { display: block; margin: 0 auto; }
|
||||
.image.xsmall { width: 20%; }
|
||||
.image.small { width: 40%; }
|
||||
.image.large { width: 60%; }
|
||||
.image.xlarge { width: 80%; }
|
||||
.image.float-left { float: left; margin: 1em 2em 1em 0; }
|
||||
.image.float-right { float: right; margin: 1em 0 1em 2em; }
|
||||
.image img { display: block; width: 100%; }
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.image.xsmall { width: 60%; }
|
||||
.image.small { width: 80%; }
|
||||
.image.large, .image.xlarge { width: 100%; }
|
||||
.image.float-left, .image.float-right { float: none; margin: 0 auto; }
|
||||
}
|
||||
|
||||
/*** TABLES ***/
|
||||
|
||||
table { border-spacing: 0; }
|
||||
|
||||
td, th {
|
||||
padding: 0.4em 1em;
|
||||
vertical-align: top;
|
||||
}
|
||||
th {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
background: #f5f5f5;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
td, th { border: 1px solid #ccc; }
|
||||
tr:not(:last-child) td, tr:not(:last-child) th { border-bottom: 0 none; }
|
||||
thead tr:last-child th { border-bottom: 0 none; }
|
||||
td:not(:last-child), th:not(:last-child) { border-right: 0 none; }
|
||||
|
||||
tr:first-child td:first-child, tr:first-child th:first-child { border-top-left-radius: 0.3em; }
|
||||
tr:first-child td:last-child, tr:first-child th:last-child { border-top-right-radius: 0.3em; }
|
||||
tbody tr:last-child td:first-child { border-bottom-left-radius: 0.3em; }
|
||||
tbody tr:last-child td:last-child { border-bottom-right-radius: 0.3em; }
|
||||
table thead + tbody tr:first-child td { border-radius: 0 !important; }
|
||||
|
||||
.table-responsive { overflow-x: auto; }
|
||||
.table-responsive > table { margin-bottom: 0; }
|
||||
|
||||
/*** LISTS ***/
|
||||
|
||||
ol, ul {
|
||||
list-style-position: outside;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
ol { padding-left: 2.5em; }
|
||||
li { padding-left: 0.5em; }
|
||||
|
||||
dt { font-weight: bold; }
|
||||
dd { margin-left: 2em; }
|
||||
|
||||
/*** CODE ***/
|
||||
|
||||
code {
|
||||
margin: 0 0.1em;
|
||||
padding: 0.1em 0.2em;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 0.3em;
|
||||
background: #f5f5f5;
|
||||
font-family: 'Droid Sans Mono', 'Courier New', 'Courier', monospace;
|
||||
font-size: 0.85rem;
|
||||
line-height: 1.9824;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0 1em;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 0.3em;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
pre code {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 1.1111em 0;
|
||||
border: 0 none;
|
||||
background: transparent;
|
||||
overflow-x: auto;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/*** BLOCKQUOTE ***/
|
||||
|
||||
blockquote {
|
||||
font-style: italic;
|
||||
margin-left: 1em;
|
||||
padding-left: 1em;
|
||||
border-left: 0.5em solid #f5f5f5;
|
||||
}
|
||||
|
||||
/*** FORMS ***/
|
||||
|
||||
label, fieldset legend { font-weight: bold; }
|
||||
|
||||
input:not([type="checkbox"]):not([type="radio"]), button, select, textarea, fieldset, fieldset legend {
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 0.3em;
|
||||
background: #fff;
|
||||
-webkit-transition: none .2s ease-in;
|
||||
transition: none .2s ease-in;
|
||||
-webkit-transition-property: border-color, background, box-shadow;
|
||||
transition-property: border-color, background, box-shadow;
|
||||
}
|
||||
|
||||
input:not([type="checkbox"]):not([type="radio"]), button, select, textarea {
|
||||
padding: 0.5em 1em;
|
||||
outline: 0 none;
|
||||
font-size: 1rem;
|
||||
}
|
||||
input:focus:not([type="checkbox"]):not([type="radio"]), button:focus, select:focus, textarea:focus {
|
||||
border-color: #2EAE9B;
|
||||
box-shadow: 0 0 8px #2EAE9B;
|
||||
}
|
||||
input[type="button"]:focus, input[type="submit"]:focus, input[type="reset"]:focus, button:focus,
|
||||
input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover, button:hover {
|
||||
background: #f5f5f5;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
textarea, select[multiple] {
|
||||
vertical-align: bottom;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
padding: 1em;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
fieldset legend { padding: 0 0.5em; }
|
||||
|
||||
fieldset label, fieldset input, fieldset button,
|
||||
fieldset select, fieldset textarea {
|
||||
margin: 0.2em 0.5em;
|
||||
}
|
||||
fieldset label:first-child, fieldset input:first-child, fieldset button:first-child,
|
||||
fieldset select:first-child, fieldset textarea:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
fieldset label:last-child, fieldset input:last-child, fieldset button:last-child,
|
||||
fieldset select:last-child, fieldset textarea:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
/* Firefox input size fix */
|
||||
input::-moz-focus-inner, button::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
After Width: | Height: | Size: 141 KiB |
After Width: | Height: | Size: 140 KiB |
|
@ -0,0 +1,246 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="droid_sans_monoregular" horiz-adv-x="1229" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="500" />
|
||||
<glyph horiz-adv-x="0" />
|
||||
<glyph unicode="
" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode="!" d="M676 414h-121l-51 1048h223zM614 250q127 0 127 -139q0 -140 -127 -140t-127 140q0 139 127 139z" />
|
||||
<glyph unicode=""" d="M522 1462l-41 -528h-155l-41 528h237zM944 1462l-41 -528h-155l-41 528h237z" />
|
||||
<glyph unicode="#" d="M936 893l-64 -328h240v-137h-266l-82 -428h-148l84 428h-290l-82 -428h-144l78 428h-217v137h244l65 328h-233v137h258l82 432h147l-82 -432h293l84 432h144l-84 -432h221v-137h-248zM436 565h291l64 328h-291z" />
|
||||
<glyph unicode="$" d="M684 111v-230h-137v221q-228 0 -365 70v172q196 -92 365 -92v434q-193 64 -270.5 145.5t-77.5 219.5q0 131 92 217t256 106v180h137v-176q187 -9 336 -78l-66 -145q-140 62 -270 72v-422q199 -68 279.5 -148.5t80.5 -210.5q0 -280 -360 -335zM547 854v369 q-172 -29 -172 -174q0 -78 40.5 -121t131.5 -74zM684 635v-373q184 28 184 184q0 127 -184 189z" />
|
||||
<glyph unicode="%" d="M291 784q-131 0 -211 94.5t-80 254.5q0 164 79 255t216 91q129 0 210 -93t81 -253q0 -162 -78.5 -255.5t-216.5 -93.5zM293 903q139 0 139 230q0 225 -139 225q-141 0 -141 -225q0 -230 141 -230zM1057 1462l-729 -1462h-158l729 1462h158zM934 -18q-130 0 -210.5 94.5 t-80.5 253.5q0 164 79 255t216 91q129 0 210 -93t81 -253q0 -161 -78.5 -254.5t-216.5 -93.5zM936 100q139 0 139 230q0 225 -139 225q-141 0 -141 -225q0 -230 141 -230z" />
|
||||
<glyph unicode="&" d="M602 776l281 -348q71 121 104 266h184q-53 -234 -178 -403l234 -291h-217l-131 166q-174 -186 -412 -186q-189 0 -297.5 107t-108.5 294q0 131 63.5 228.5t235.5 199.5q-163 192 -163 356q0 148 95.5 234t274.5 86q168 0 260.5 -85.5t92.5 -234.5q0 -203 -318 -389z M508 897q134 79 183.5 138.5t49.5 133.5t-49.5 120t-130.5 46q-87 0 -136.5 -44.5t-49.5 -125.5q0 -118 133 -268zM778 287l-323 401q-203 -123 -203 -301q0 -105 67 -175.5t160 -70.5q160 0 299 146z" />
|
||||
<glyph unicode="'" d="M733 1462l-41 -528h-155l-41 528h237z" />
|
||||
<glyph unicode="(" d="M739 1462h193q-449 -376 -449 -893q0 -521 447 -893h-191q-444 353 -444 891q0 532 444 895z" />
|
||||
<glyph unicode=")" d="M489 -324h-190q446 371 446 893q0 518 -448 893h192q445 -361 445 -895q0 -540 -445 -891z" />
|
||||
<glyph unicode="*" d="M715 1556l-43 -393l397 111l27 -193l-379 -28l246 -326l-179 -96l-176 358l-157 -358l-185 96l242 326l-375 28l29 193l391 -111l-43 393h205z" />
|
||||
<glyph unicode="+" d="M539 647h-387v150h387v389h149v-389h387v-150h-387v-385h-149v385z" />
|
||||
<glyph unicode="," d="M770 262l16 -24q-57 -224 -194 -527h-152q76 323 111 551h219z" />
|
||||
<glyph unicode="-" d="M285 465v168h659v-168h-659z" />
|
||||
<glyph unicode="." d="M614 301q152 0 152 -166t-152 -166q-151 0 -151 166t151 166z" />
|
||||
<glyph unicode="/" d="M1016 1462l-627 -1462h-178l627 1462h178z" />
|
||||
<glyph unicode="0" d="M612 -20q-229 0 -347 193.5t-118 559.5q0 752 465 752q232 0 350.5 -193.5t118.5 -558.5q0 -753 -469 -753zM612 135q147 0 216 140.5t69 457.5q0 315 -69 455.5t-216 140.5q-145 0 -212.5 -139.5t-67.5 -456.5q0 -318 67.5 -458t212.5 -140z" />
|
||||
<glyph unicode="1" d="M758 0h-176v913q0 122 8 361q-39 -43 -121 -113l-147 -121l-97 123l383 299h150v-1462z" />
|
||||
<glyph unicode="2" d="M1069 0h-911v156l350 381q195 213 257 317.5t62 230.5q0 113 -63.5 178.5t-171.5 65.5q-160 0 -318 -137l-102 119q192 172 422 172q194 0 306 -106t112 -285q0 -119 -59 -244t-291 -375l-281 -299v-8h688v-166z" />
|
||||
<glyph unicode="3" d="M694 770v-6q361 -47 361 -348q0 -203 -138 -319.5t-399 -116.5q-242 0 -387 79v170q184 -96 383 -96q354 0 354 289q0 258 -381 258h-133v151h133q160 0 248 76t88 201q0 102 -68 161.5t-182 59.5q-178 0 -344 -121l-92 125q187 150 436 150q206 0 321.5 -99t115.5 -264 q0 -138 -82 -231t-234 -119z" />
|
||||
<glyph unicode="4" d="M1126 328h-213v-328h-176v328h-676v159l664 983h188v-976h213v-166zM737 494v356q0 176 13 432h-9q-36 -102 -90 -180l-411 -608h497z" />
|
||||
<glyph unicode="5" d="M172 59v172q144 -96 360 -96q336 0 336 314q0 294 -344 294q-89 0 -231 -26l-90 57l55 688h690v-166h-532l-39 -419q107 20 209 20q210 0 339.5 -114.5t129.5 -313.5q0 -234 -138 -361.5t-389 -127.5q-224 0 -356 79z" />
|
||||
<glyph unicode="6" d="M965 1464v-155q-71 24 -166 24q-224 0 -336.5 -141t-122.5 -447h12q95 170 307 170q195 0 305.5 -119t110.5 -325q0 -228 -120.5 -359.5t-323.5 -131.5q-218 0 -347.5 168.5t-129.5 476.5q0 858 639 858q104 0 172 -19zM899 471q0 145 -68.5 223t-195.5 78t-213 -81 t-86 -185q0 -152 81 -262.5t212 -110.5q127 0 198.5 88t71.5 250z" />
|
||||
<glyph unicode="7" d="M334 0l563 1296h-754v166h940v-145l-555 -1317h-194z" />
|
||||
<glyph unicode="8" d="M764 774q309 -160 309 -393q0 -181 -126 -291t-333 -110q-216 0 -337 103.5t-121 289.5q0 257 282 393q-235 146 -235 369q0 161 116.5 255.5t294.5 94.5q184 0 298 -95t114 -257q0 -230 -262 -359zM616 848q232 103 232 278q0 101 -63 154t-173 53q-106 0 -168.5 -53 t-62.5 -154q0 -90 49.5 -152.5t185.5 -125.5zM588 696q-254 -121 -254 -325q0 -240 276 -240q136 0 210.5 65.5t74.5 182.5q0 90 -63 159.5t-214 143.5z" />
|
||||
<glyph unicode="9" d="M264 -2v156q67 -25 166 -25q224 0 336.5 141t122.5 447h-12q-96 -170 -308 -170q-194 0 -304.5 118t-110.5 326q0 228 120.5 360t323.5 132q220 0 348.5 -171t128.5 -474q0 -858 -639 -858q-105 0 -172 18zM330 991q0 -145 68.5 -223t195.5 -78t213 81.5t86 184.5 q0 151 -80 262t-213 111q-128 0 -199 -87t-71 -251z" />
|
||||
<glyph unicode=":" d="M614 1126q127 0 127 -139t-127 -139t-127 139t127 139zM614 250q127 0 127 -139q0 -140 -127 -140t-127 140q0 139 127 139z" />
|
||||
<glyph unicode=";" d="M621 1126q127 0 127 -139t-127 -139t-127 139t127 139zM709 238l14 -23q-51 -197 -176 -479h-137q62 255 100 502h199z" />
|
||||
<glyph unicode="<" d="M1075 221l-923 451v102l923 451v-160l-715 -342l715 -342v-160z" />
|
||||
<glyph unicode="=" d="M152 852v149h923v-149h-923zM152 442v150h923v-150h-923z" />
|
||||
<glyph unicode=">" d="M152 381l714 342l-714 342v160l923 -451v-102l-923 -451v160z" />
|
||||
<glyph unicode="?" d="M465 414v37q0 120 46 195t161 157q130 97 171.5 155t41.5 158q0 92 -74.5 149.5t-206.5 57.5q-174 0 -371 -90l-65 153q209 97 426 97q214 0 339.5 -97.5t125.5 -261.5q0 -133 -53.5 -216t-196.5 -191q-118 -87 -151 -141t-33 -144v-18h-160zM553 250q127 0 127 -139 q0 -140 -127 -140t-127 140q0 139 127 139z" />
|
||||
<glyph unicode="@" d="M799 401h-4q-74 -180 -230 -180q-120 0 -190 104.5t-70 280.5q0 206 97 332.5t255 126.5q137 0 256 -47l-22 -416q-2 -38 -2 -69v-7q0 -176 72 -176q100 0 100 383q0 278 -111 436t-299 158q-226 0 -352.5 -192t-126.5 -527q0 -312 129.5 -482.5t368.5 -170.5 q181 0 346 78v-133q-158 -82 -352 -82q-298 0 -465.5 207t-167.5 577q0 397 167 628.5t455 231.5q248 0 396.5 -196t148.5 -535q0 -231 -64 -370.5t-178 -139.5q-128 0 -157 180zM752 915q-54 21 -103 21q-89 0 -136.5 -93.5t-47.5 -240.5q0 -252 127 -252q131 0 145 312z " />
|
||||
<glyph unicode="A" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385z" />
|
||||
<glyph unicode="B" d="M135 1462h440q274 0 397.5 -87.5t123.5 -282.5q0 -128 -78.5 -213t-212.5 -103v-10q332 -54 332 -342q0 -198 -127.5 -311t-347.5 -113h-527v1462zM322 842h284q156 0 227.5 55t71.5 182q0 120 -76.5 172t-242.5 52h-264v-461zM322 686v-528h307q311 0 311 274 q0 254 -324 254h-294z" />
|
||||
<glyph unicode="C" d="M1124 201v-162q-146 -59 -358 -59q-309 0 -473 196t-164 557q0 346 179 548t489 202q220 0 383 -86l-78 -156q-154 78 -305 78q-215 0 -343 -158.5t-128 -429.5q0 -287 120 -437.5t351 -150.5q130 0 327 58z" />
|
||||
<glyph unicode="D" d="M135 0v1462h342q317 0 493.5 -189t176.5 -528q0 -361 -183 -553t-528 -192h-301zM322 1303v-1143h96q532 0 532 579q0 564 -493 564h-135z" />
|
||||
<glyph unicode="E" d="M1059 0h-842v1462h842v-164h-656v-452h617v-162h-617v-520h656v-164z" />
|
||||
<glyph unicode="F" d="M430 0h-186v1462h841v-164h-655v-516h617v-164h-617v-618z" />
|
||||
<glyph unicode="G" d="M672 772h422v-717q-195 -75 -420 -75q-262 0 -409.5 199.5t-147.5 553.5q0 351 162 550.5t446 199.5q192 0 346 -86l-72 -162q-146 84 -280 84q-192 0 -299 -155.5t-107 -432.5q0 -588 394 -588q97 0 202 29v436h-237v164z" />
|
||||
<glyph unicode="H" d="M1094 0h-187v682h-585v-682h-187v1462h187v-616h585v616h187v-1462z" />
|
||||
<glyph unicode="I" d="M1001 0h-776v123l295 20v1176l-295 20v123h776v-123l-294 -20v-1176l294 -20v-123z" />
|
||||
<glyph unicode="J" d="M137 39v166q162 -62 309 -62q161 0 254 79.5t93 226.5v1013h186v-1011q0 -216 -140.5 -343.5t-377.5 -127.5q-217 0 -324 59z" />
|
||||
<glyph unicode="K" d="M1198 0h-211l-450 698l-140 -114v-584h-186v1462h186v-731l121 168l453 563h209l-521 -637z" />
|
||||
<glyph unicode="L" d="M233 0v1462h187v-1296h635v-166h-822z" />
|
||||
<glyph unicode="M" d="M532 0l-278 1280h-8q18 -266 18 -406v-874h-151v1462h247l248 -1192h6l250 1192h252v-1462h-153v887q0 102 14 391h-8l-283 -1278h-154z" />
|
||||
<glyph unicode="N" d="M1092 0h-215l-580 1210h-8q18 -277 18 -417v-793h-172v1462h213l578 -1204h6q-14 303 -14 404v800h174v-1462z" />
|
||||
<glyph unicode="O" d="M616 -20q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5t-138 -557t-393 -196zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590z" />
|
||||
<glyph unicode="P" d="M362 569v-569h-186v1462h404q514 0 514 -428q0 -219 -138.5 -342t-402.5 -123h-191zM362 727h170q198 0 283.5 72t85.5 225q0 279 -338 279h-201v-576z" />
|
||||
<glyph unicode="Q" d="M862 39q85 -180 279 -311l-121 -142q-236 171 -328 400q-36 -6 -76 -6q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5q0 -526 -285 -694zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590z" />
|
||||
<glyph unicode="R" d="M373 604v-604h-187v1462h357q520 0 520 -415q0 -287 -289 -392l397 -655h-219l-350 604h-229zM373 762h164q171 0 252 66t81 210q0 141 -80 203t-258 62h-159v-541z" />
|
||||
<glyph unicode="S" d="M141 49v178q211 -86 414 -86q350 0 350 240q0 104 -70.5 160t-285.5 133q-208 73 -298.5 174.5t-90.5 263.5q0 174 128.5 272.5t352.5 98.5q229 0 416 -78l-64 -164q-193 78 -360 78q-293 0 -293 -209q0 -102 65.5 -164t270.5 -133q246 -88 328.5 -181.5t82.5 -240.5 q0 -192 -138.5 -301.5t-393.5 -109.5q-265 0 -414 69z" />
|
||||
<glyph unicode="T" d="M707 0h-187v1298h-418v164h1022v-164h-417v-1298z" />
|
||||
<glyph unicode="U" d="M1104 1464v-948q0 -260 -126 -398t-370 -138q-483 0 -483 540v942h186v-932q0 -387 307 -387q295 0 300 389v932h186z" />
|
||||
<glyph unicode="V" d="M997 1462h199l-489 -1462h-187l-487 1462h196l295 -927q41 -127 88 -334q31 145 93 340z" />
|
||||
<glyph unicode="W" d="M528 1008h177l145 -521q61 -219 72 -307q2 53 65 619l70 663h170l-187 -1462h-190l-168 580q-40 138 -66 282q-32 -173 -65 -284l-156 -578h-190l-203 1462h170l88 -663q23 -176 40 -378t17 -241q24 151 70 312z" />
|
||||
<glyph unicode="X" d="M1174 0h-211l-355 635l-366 -635h-189l453 764l-422 698h199l331 -559l334 559h191l-422 -692z" />
|
||||
<glyph unicode="Y" d="M612 723l381 739h201l-487 -893v-569h-187v559l-487 903h203z" />
|
||||
<glyph unicode="Z" d="M1124 0h-1022v145l793 1151h-772v166h981v-145l-793 -1151h813v-166z" />
|
||||
<glyph unicode="[" d="M940 -324h-528v1786h528v-149h-346v-1487h346v-150z" />
|
||||
<glyph unicode="\" d="M389 1462l627 -1462h-178l-627 1462h178z" />
|
||||
<glyph unicode="]" d="M289 -174h346v1487h-346v149h528v-1786h-528v150z" />
|
||||
<glyph unicode="^" d="M111 549l424 924h102l481 -924h-162l-368 735l-318 -735h-159z" />
|
||||
<glyph unicode="_" d="M1243 -324h-1259v140h1259v-140z" />
|
||||
<glyph unicode="`" d="M811 1241h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="a" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99z" />
|
||||
<glyph unicode="b" d="M340 139h-12l-37 -139h-133v1556h182v-376q0 -81 -8 -226h8q107 164 322 164q201 0 315.5 -149.5t114.5 -417.5q0 -270 -115 -420.5t-315 -150.5q-207 0 -322 159zM340 551q0 -227 69.5 -323.5t221.5 -96.5q272 0 272 422q0 414 -274 414q-155 0 -222 -94t-67 -322z" />
|
||||
<glyph unicode="c" d="M1061 1059l-62 -158q-150 57 -268 57q-371 0 -371 -413q0 -406 361 -406q157 0 321 62v-160q-134 -61 -329 -61q-257 0 -399 145.5t-142 417.5q0 281 145 428t408 147q178 0 336 -59z" />
|
||||
<glyph unicode="d" d="M897 147h-8q-113 -167 -322 -167q-201 0 -315.5 149.5t-114.5 417.5q0 270 115 420.5t315 150.5q206 0 322 -160h12q-12 129 -12 162v436h182v-1556h-147zM889 506v41q0 227 -69.5 323.5t-221.5 96.5q-272 0 -272 -422q0 -414 274 -414q152 0 218.5 88.5t70.5 286.5z" />
|
||||
<glyph unicode="e" d="M1096 514h-774q8 -375 344 -375q195 0 370 76v-160q-166 -75 -364 -75q-245 0 -392 149.5t-147 411.5q0 266 135.5 421.5t362.5 155.5q212 0 338.5 -134t126.5 -357v-113zM326 662h573q0 305 -272 305q-275 0 -301 -305z" />
|
||||
<glyph unicode="f" d="M1044 961h-389v-961h-182v961h-317v110l317 33v96q0 193 90 280t299 87q129 0 252 -35l-41 -143q-104 28 -207 28q-123 0 -167 -50t-44 -165v-104h389v-137z" />
|
||||
<glyph unicode="g" d="M1126 1098v-113l-196 -27q65 -85 65 -213q0 -161 -106.5 -256.5t-296.5 -95.5q-55 0 -86 6q-100 -56 -100 -133q0 -84 161 -84h187q174 0 266 -77t92 -220q0 -377 -565 -377q-218 0 -331.5 80.5t-113.5 225.5q0 212 240 270q-96 47 -96 154q0 112 133 192 q-89 37 -140 122.5t-51 186.5q0 182 106.5 280.5t303.5 98.5q86 0 150 -20h378zM594 518q223 0 223 230q0 239 -225 239t-225 -242q0 -227 227 -227zM692 18h-188q-230 0 -230 -198q0 -174 271 -174q395 0 395 223q0 88 -50 118.5t-198 30.5z" />
|
||||
<glyph unicode="h" d="M887 0v707q0 260 -238 260q-307 0 -307 -398v-569h-182v1556h182v-462l-8 -144h10q103 168 336 168q389 0 389 -401v-717h-182z" />
|
||||
<glyph unicode="i" d="M633 1550q106 0 106 -114q0 -58 -31.5 -86.5t-74.5 -28.5q-107 0 -107 115q0 114 107 114zM541 954l-269 21v123h451v-955l352 -20v-123h-878v123l344 20v811z" />
|
||||
<glyph unicode="j" d="M743 1550q107 0 107 -114q0 -115 -107 -115q-106 0 -106 115q0 114 106 114zM135 -457v154q134 -39 289 -39q117 0 182.5 57t65.5 158v1081l-420 21v123h602v-1215q0 -180 -113 -277.5t-319 -97.5q-164 0 -287 35z" />
|
||||
<glyph unicode="k" d="M383 553l135 152l395 393h222l-494 -475l522 -623h-213l-426 504l-129 -82v-422h-180v1556h180v-714l-16 -289h4z" />
|
||||
<glyph unicode="l" d="M532 1413l-268 21v122h451v-1413l352 -20v-123h-879v123l344 20v1270z" />
|
||||
<glyph unicode="m" d="M977 0v707q0 146 -26.5 203t-88.5 57q-87 0 -126.5 -83t-39.5 -278v-606h-161v707q0 260 -125 260q-84 0 -120 -79.5t-36 -318.5v-569h-162v1098h127l27 -148h10q67 168 201 168q163 0 213 -182h6q76 182 219 182q128 0 186 -92.5t58 -308.5v-717h-162z" />
|
||||
<glyph unicode="n" d="M887 0v707q0 260 -238 260q-307 0 -307 -398v-569h-182v1098h147l27 -148h10q103 168 336 168q389 0 389 -401v-717h-182z" />
|
||||
<glyph unicode="o" d="M610 -20q-216 0 -355.5 155.5t-139.5 415.5q0 263 135.5 415t365.5 152q218 0 357 -155t139 -412q0 -265 -137 -418t-365 -153zM614 131q310 0 310 420q0 416 -312 416q-309 0 -309 -416q0 -420 311 -420z" />
|
||||
<glyph unicode="p" d="M340 139h-12q12 -129 12 -162v-469h-182v1590h147l27 -148h8q110 168 322 168q201 0 315.5 -149.5t114.5 -417.5q0 -270 -115 -420.5t-315 -150.5q-207 0 -322 159zM340 592v-41q0 -227 69.5 -323.5t221.5 -96.5q272 0 272 422q0 414 -274 414q-152 0 -218.5 -88 t-70.5 -287z" />
|
||||
<glyph unicode="q" d="M889 950h8l27 148h147v-1590h-182v469q0 41 12 170h-12q-113 -167 -322 -167q-201 0 -315.5 149.5t-114.5 417.5q0 270 115 420.5t315 150.5q207 0 322 -168zM889 506v41q0 227 -69.5 323.5t-221.5 96.5q-272 0 -272 -422q0 -414 274 -414q152 0 218.5 88.5t70.5 286.5z " />
|
||||
<glyph unicode="r" d="M1059 1073l-49 -166q-123 45 -224 45q-163 0 -251.5 -92.5t-88.5 -267.5v-592h-182v1098h148l22 -201h8q76 119 163 170t214 51q118 0 240 -45z" />
|
||||
<glyph unicode="s" d="M203 49v166q193 -86 370 -86q275 0 275 162q0 57 -49 99t-226 106q-233 87 -293.5 159.5t-60.5 171.5q0 136 111.5 213.5t308.5 77.5q198 0 369 -74l-60 -149q-182 72 -319 72q-236 0 -236 -133q0 -61 50.5 -97.5t232.5 -101.5q211 -77 280.5 -151.5t69.5 -182.5 q0 -150 -117 -235.5t-331 -85.5q-248 0 -375 69z" />
|
||||
<glyph unicode="t" d="M1020 150v-138q-130 -32 -252 -32q-362 0 -362 344v637h-267v94l267 49l77 287h105v-293h438v-137h-438v-637q0 -195 192 -195q93 0 240 21z" />
|
||||
<glyph unicode="u" d="M922 0l-27 147h-10q-105 -167 -334 -167q-391 0 -391 401v717h182v-707q0 -260 236 -260q161 0 235 92.5t74 304.5v570h182v-1098h-147z" />
|
||||
<glyph unicode="v" d="M498 0l-416 1098h188l240 -652q85 -231 100 -325h6q7 44 101 325l239 652h189l-416 -1098h-231z" />
|
||||
<glyph unicode="w" d="M813 0l-131 596l-68 330h-6l-65 -334l-135 -592h-189l-223 1098h162l98 -543q34 -186 57 -393h6q31 185 68 358l133 578h193l127 -578q43 -195 67 -358h6q31 242 60 393l102 543h158l-225 -1098h-195z" />
|
||||
<glyph unicode="x" d="M510 563l-393 535h207l290 -410l291 410h207l-395 -535l413 -563h-206l-310 436l-311 -436h-207z" />
|
||||
<glyph unicode="y" d="M82 1098h188l262 -654q82 -205 89 -290h6q23 112 90 292l239 652h189l-475 -1241q-67 -174 -156 -261.5t-246 -87.5q-86 0 -168 17v145q62 -12 136 -12q96 0 149.5 41t95.5 141l58 150z" />
|
||||
<glyph unicode="z" d="M1044 0h-862v125l660 836h-627v137h811v-146l-647 -815h665v-137z" />
|
||||
<glyph unicode="{" d="M745 -16q0 -81 56 -118.5t200 -39.5v-150q-438 6 -438 293v334q0 189 -338 189v155q338 0 338 189v333q0 287 438 293v-149q-144 -2 -200 -39.5t-56 -118.5v-332q0 -207 -233 -248v-12q233 -41 233 -248v-331z" />
|
||||
<glyph unicode="|" d="M539 1556h149v-2048h-149v2048z" />
|
||||
<glyph unicode="}" d="M483 315q0 207 234 248v12q-234 41 -234 248v332q0 81 -56.5 119t-199.5 39v149q439 -6 439 -293v-333q0 -189 338 -189v-155q-338 0 -338 -189v-334q0 -287 -439 -293v150q143 1 199.5 39t56.5 119v331z" />
|
||||
<glyph unicode="~" d="M152 586v162q99 108 247 108q100 0 248 -63q130 -56 201 -56q108 0 227 121v-162q-99 -108 -248 -108q-100 0 -247 63q-131 56 -201 56q-108 0 -227 -121z" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode="¡" d="M614 840q-127 0 -127 139t127 139t127 -139t-127 -139zM553 676h121l51 -1049h-223z" />
|
||||
<glyph unicode="¢" d="M743 1319q162 -3 318 -59l-62 -158q-150 57 -268 57q-371 0 -371 -414q0 -405 361 -405q153 0 321 61v-159q-122 -59 -299 -62v-200h-137v206q-434 69 -434 557q0 494 434 568v172h137v-164z" />
|
||||
<glyph unicode="£" d="M1063 1401l-66 -144q-141 72 -272 72q-223 0 -223 -246v-295h377v-137h-377v-211q0 -196 -140 -274h748v-166h-991v154q200 49 200 284v213h-198v137h198v324q0 168 108.5 268.5t289.5 100.5q192 0 346 -80z" />
|
||||
<glyph unicode="¤" d="M303 936l-129 129l98 98l127 -129q101 68 215 68t213 -68l129 129l99 -96l-129 -129q67 -101 67 -215q0 -120 -67 -215l127 -127l-97 -96l-129 127q-99 -66 -213 -66q-118 0 -215 68l-127 -127l-96 96l127 127q-65 95 -65 213q0 114 65 213zM614 483q100 0 172 70t72 170 q0 101 -71.5 172.5t-172.5 71.5q-99 0 -169 -71t-70 -173q0 -100 70.5 -170t168.5 -70z" />
|
||||
<glyph unicode="¥" d="M612 723l346 739h191l-385 -768h240v-137h-302v-158h302v-137h-302v-262h-178v262h-301v137h301v158h-301v137h234l-379 768h192z" />
|
||||
<glyph unicode="¦" d="M539 1556h149v-780h-149v780zM539 289h149v-781h-149v781z" />
|
||||
<glyph unicode="§" d="M420 1067q-160 80 -160 236q0 120 104 192t277 72q162 0 326 -72l-56 -139q-156 67 -276 67q-201 0 -201 -116q0 -54 49.5 -93t196.5 -100q157 -62 231 -139.5t74 -190.5q0 -182 -145 -270q145 -80 145 -225q0 -138 -110.5 -218.5t-307.5 -80.5q-204 0 -323 65v158 q171 -82 323 -82q240 0 240 141q0 57 -43 97t-195 102q-197 84 -253 159t-56 179q0 179 160 258zM713 573q114 76 114 185q0 89 -73.5 144.5t-206.5 103.5q-133 -48 -133 -175q0 -73 56.5 -126.5t207.5 -116.5z" />
|
||||
<glyph unicode="¨" d="M426 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM801 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="©" d="M614 1483q286 0 447.5 -204t161.5 -548q0 -345 -162 -548t-447 -203q-286 0 -447 203.5t-161 547.5q0 343 160.5 547.5t447.5 204.5zM614 88q240 0 370 170.5t130 472.5t-130 472.5t-370 170.5t-369.5 -171t-129.5 -472t129.5 -472t369.5 -171zM874 453v-131 q-107 -50 -221 -50q-195 0 -300 123.5t-105 337.5q0 209 110 332t301 123q128 0 254 -62l-61 -127q-110 54 -193 54q-121 0 -186 -85.5t-65 -236.5q0 -323 251 -323q94 0 215 45z" />
|
||||
<glyph unicode="ª" d="M799 797l-33 118q-104 -131 -268 -131q-222 0 -222 205q0 116 85 167.5t276 57.5l125 5v10q0 133 -152 133q-112 0 -245 -51l-41 110q138 58 294 58q291 0 291 -238v-444h-110zM662 1116q-114 -2 -174 -28t-60 -101q0 -90 104 -90q105 0 167.5 55t62.5 146v20z" />
|
||||
<glyph unicode="«" d="M197 553l309 414l117 -78l-238 -348l238 -348l-117 -78l-309 411v27zM604 553l309 414l117 -78l-237 -348l237 -348l-117 -78l-309 411v27z" />
|
||||
<glyph unicode="¬" d="M1075 797v-535h-149v385h-774v150h923z" />
|
||||
<glyph unicode="­" d="M285 465v168h659v-168h-659z" />
|
||||
<glyph unicode="®" d="M614 1483q286 0 447.5 -204t161.5 -548q0 -345 -162 -548t-447 -203q-286 0 -447 203.5t-161 547.5q0 343 160.5 547.5t447.5 204.5zM614 88q240 0 370 170.5t130 472.5t-130 472.5t-370 170.5t-369.5 -171t-129.5 -472t129.5 -472t369.5 -171zM748 680l237 -395h-178 l-207 352h-94v-352h-158v893h234q325 0 325 -265q0 -163 -159 -233zM506 768h72q170 0 170 141q0 74 -42 103.5t-131 29.5h-69v-274z" />
|
||||
<glyph unicode="¯" d="M1249 1556h-1269v140h1269v-140z" />
|
||||
<glyph unicode="°" d="M614 1483q129 0 222.5 -93.5t93.5 -222.5t-93 -221t-223 -92q-131 0 -223 92.5t-92 220.5q0 129 92.5 222.5t222.5 93.5zM614 977q79 0 136 56t57 134q0 81 -57.5 138t-135.5 57q-79 0 -135.5 -57.5t-56.5 -137.5q0 -78 56 -134t136 -56z" />
|
||||
<glyph unicode="±" d="M539 647h-387v150h387v389h149v-389h387v-150h-387v-385h-149v385zM152 0v150h923v-150h-923z" />
|
||||
<glyph unicode="²" d="M879 672h-531v102l187 199q111 118 141.5 168.5t30.5 107.5q0 115 -111 115q-81 0 -164 -76l-78 86q117 103 248 103q118 0 183 -60t65 -164q0 -66 -35 -134t-164 -197l-135 -136h363v-114z" />
|
||||
<glyph unicode="³" d="M670 1085q176 -39 176 -186q0 -116 -74.5 -180t-214.5 -64q-131 0 -215 50v124q110 -65 203 -65q149 0 149 137q0 125 -147 125h-72v104h70q123 0 123 127q0 111 -97 111q-71 0 -161 -70l-66 86q111 93 238 93q109 0 173 -54.5t64 -148.5q0 -139 -149 -189z" />
|
||||
<glyph unicode="´" d="M418 1268q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="µ" d="M362 391q0 -260 218 -260q148 0 217 91t69 306v570h183v-1098h-148l-27 147h-10q-96 -167 -295 -167q-139 0 -213 88q6 -153 6 -240v-320h-182v1590h182v-707z" />
|
||||
<glyph unicode="¶" d="M1079 -260h-121v1657h-206v-1657h-121v819q-61 -18 -146 -18q-419 0 -419 501q0 259 108.5 386.5t341.5 127.5h563v-1816z" />
|
||||
<glyph unicode="·" d="M614 862q127 0 127 -139t-127 -139t-127 139t127 139z" />
|
||||
<glyph unicode="¸" d="M428 -483v108q33 -6 80 -6q151 0 151 92q0 74 -172 113l91 176h120l-57 -115q160 -37 160 -172q0 -205 -291 -205q-34 0 -82 9z" />
|
||||
<glyph unicode="¹" d="M586 1460h135v-788h-146v465q0 69 9 200q-41 -44 -74 -65l-70 -51l-73 88z" />
|
||||
<glyph unicode="º" d="M612 784q-144 0 -237.5 93t-93.5 256q0 162 90 254t245 92q145 0 238.5 -92.5t93.5 -253.5q0 -165 -92 -257t-244 -92zM614 903q181 0 181 230q0 225 -181 225q-182 0 -182 -225q0 -230 182 -230z" />
|
||||
<glyph unicode="»" d="M1030 526l-309 -411l-117 78l238 348l-238 348l117 78l309 -414v-27zM623 526l-310 -411l-116 78l237 348l-237 348l116 78l310 -414v-27z" />
|
||||
<glyph unicode="¼" d="M1208 175h-84v-174h-143v174h-375v98l377 523h141v-508h84v-113zM981 288v176q0 82 6 172q-40 -73 -80 -131l-156 -217h230zM241 1460h135v-788h-146v465q0 69 9 200q-41 -44 -74 -65l-70 -51l-73 88zM1057 1462l-729 -1462h-158l729 1462h158z" />
|
||||
<glyph unicode="½" d="M222 1460h135v-788h-146v465q0 69 9 200q-41 -44 -74 -65l-70 -51l-73 88zM992 1462l-729 -1462h-158l729 1462h158zM1225 1h-531v102l187 199q111 118 141.5 168.5t30.5 107.5q0 115 -111 115q-81 0 -164 -76l-78 86q117 103 248 103q118 0 183 -60t65 -164 q0 -66 -35 -134t-164 -197l-135 -136h363v-114z" />
|
||||
<glyph unicode="¾" d="M1229 175h-84v-174h-143v174h-375v98l377 523h141v-508h84v-113zM1002 288v176q0 82 6 172q-40 -73 -80 -131l-156 -217h230zM349 1085q176 -39 176 -186q0 -116 -74.5 -180t-214.5 -64q-131 0 -215 50v124q110 -65 203 -65q149 0 149 137q0 125 -147 125h-72v104h70 q123 0 123 127q0 111 -97 111q-71 0 -161 -70l-66 86q111 93 238 93q109 0 173 -54.5t64 -148.5q0 -139 -149 -189zM1110 1462l-729 -1462h-158l729 1462h158z" />
|
||||
<glyph unicode="¿" d="M674 840q-127 0 -127 139t127 139t127 -139t-127 -139zM762 676v-37q0 -119 -44.5 -193.5t-162.5 -158.5q-129 -97 -171 -155t-42 -159q0 -93 74.5 -149.5t206.5 -56.5q181 0 370 90l62 -144q-219 -106 -422 -106q-217 0 -341 97.5t-124 260.5q0 134 53.5 217t196.5 191 q119 87 151.5 140.5t32.5 143.5v19h160z" />
|
||||
<glyph unicode="À" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385zM734 1579h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="Á" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385zM520 1606q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="Â" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385zM946 1579h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z " />
|
||||
<glyph unicode="Ã" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385zM357 1579h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57 q-100 56 -140 56q-82 0 -107 -115z" />
|
||||
<glyph unicode="Ä" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385zM426 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM801 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z " />
|
||||
<glyph unicode="Å" d="M1004 0l-144 453h-491l-146 -453h-190l483 1468h195l485 -1468h-192zM807 618l-133 424q-39 124 -62 226q-20 -99 -46 -183l-144 -467h385zM610 1366q-102 0 -162.5 58t-60.5 157t60.5 157t162.5 58q101 0 165.5 -59t64.5 -154q0 -98 -63.5 -157.5t-166.5 -59.5z M610 1694q-49 0 -80.5 -30t-31.5 -83q0 -113 112 -113q50 0 81.5 30t31.5 83t-31.5 83t-81.5 30z" />
|
||||
<glyph unicode="Æ" d="M1210 0h-653v453h-289l-96 -453h-172l338 1462h872v-164h-477v-452h438v-162h-438v-520h477v-164zM305 618h252v680h-106z" />
|
||||
<glyph unicode="Ç" d="M1124 201v-162q-146 -59 -358 -59q-309 0 -473 196t-164 557q0 346 179 548t489 202q220 0 383 -86l-78 -156q-154 78 -305 78q-215 0 -343 -158.5t-128 -429.5q0 -287 120 -437.5t351 -150.5q130 0 327 58zM508 -483v108q33 -6 80 -6q151 0 151 92q0 74 -172 113l91 176 h120l-57 -115q160 -37 160 -172q0 -205 -291 -205q-34 0 -82 9z" />
|
||||
<glyph unicode="È" d="M1059 0h-842v1462h842v-164h-656v-452h617v-162h-617v-520h656v-164zM738 1579h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="É" d="M1059 0h-842v1462h842v-164h-656v-452h617v-162h-617v-520h656v-164zM481 1606q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="Ê" d="M1059 0h-842v1462h842v-164h-656v-452h617v-162h-617v-520h656v-164zM981 1579h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="Ë" d="M1059 0h-842v1462h842v-164h-656v-452h617v-162h-617v-520h656v-164zM451 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM826 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="Ì" d="M1001 0h-776v123l295 20v1176l-295 20v123h776v-123l-294 -20v-1176l294 -20v-123zM703 1579h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="Í" d="M1001 0h-776v123l295 20v1176l-295 20v123h776v-123l-294 -20v-1176l294 -20v-123zM537 1606q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="Î" d="M1001 0h-776v123l295 20v1176l-295 20v123h776v-123l-294 -20v-1176l294 -20v-123zM946 1579h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="Ï" d="M1001 0h-776v123l295 20v1176l-295 20v123h776v-123l-294 -20v-1176l294 -20v-123zM428 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM803 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="Ð" d="M135 0v659h-135v162h135v641h342q317 0 493.5 -189t176.5 -528q0 -361 -183 -553t-528 -192h-301zM322 1303v-482h380v-162h-380v-499h96q532 0 532 579q0 564 -493 564h-135z" />
|
||||
<glyph unicode="Ñ" d="M1092 0h-215l-580 1210h-8q18 -277 18 -417v-793h-172v1462h213l578 -1204h6q-14 303 -14 404v800h174v-1462zM362 1579h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57q-100 56 -140 56q-82 0 -107 -115z" />
|
||||
<glyph unicode="Ò" d="M616 -20q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5t-138 -557t-393 -196zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590zM730 1579h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z " />
|
||||
<glyph unicode="Ó" d="M616 -20q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5t-138 -557t-393 -196zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590zM508 1606q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z " />
|
||||
<glyph unicode="Ô" d="M616 -20q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5t-138 -557t-393 -196zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590zM946 1579h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27 q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="Õ" d="M616 -20q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5t-138 -557t-393 -196zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590zM366 1579h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56 q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57q-100 56 -140 56q-82 0 -107 -115z" />
|
||||
<glyph unicode="Ö" d="M616 -20q-532 0 -532 755q0 750 534 750q256 0 392.5 -195.5t136.5 -556.5t-138 -557t-393 -196zM616 143q173 0 253.5 145t80.5 445q0 303 -81.5 445.5t-250.5 142.5q-337 0 -337 -588q0 -590 335 -590zM428 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z M803 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="×" d="M508 723l-318 319l105 105l317 -318l322 318l104 -103l-321 -321l319 -320l-102 -102l-322 317l-317 -315l-102 103z" />
|
||||
<glyph unicode="Ø" d="M309 74l-92 -150l-137 78l121 197q-117 184 -117 536q0 750 534 750q186 0 310 -105l92 152l137 -78l-125 -201q115 -188 115 -520q0 -361 -138 -557t-393 -196q-189 0 -307 94zM319 391l515 836q-80 94 -216 94q-337 0 -337 -588q0 -212 38 -342zM915 1061l-512 -832 q80 -86 213 -86q173 0 253.5 145t80.5 445q0 209 -35 328z" />
|
||||
<glyph unicode="Ù" d="M1104 1464v-948q0 -260 -126 -398t-370 -138q-483 0 -483 540v942h186v-932q0 -387 307 -387q295 0 300 389v932h186zM742 1579h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="Ú" d="M1104 1464v-948q0 -260 -126 -398t-370 -138q-483 0 -483 540v942h186v-932q0 -387 307 -387q295 0 300 389v932h186zM494 1606q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="Û" d="M1104 1464v-948q0 -260 -126 -398t-370 -138q-483 0 -483 540v942h186v-932q0 -387 307 -387q295 0 300 389v932h186zM946 1579h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="Ü" d="M1104 1464v-948q0 -260 -126 -398t-370 -138q-483 0 -483 540v942h186v-932q0 -387 307 -387q295 0 300 389v932h186zM428 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM803 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="Ý" d="M612 723l381 739h201l-487 -893v-569h-187v559l-487 903h203zM494 1606q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="Þ" d="M362 317v-317h-186v1462h186v-252h218q514 0 514 -428q0 -219 -138.5 -342t-402.5 -123h-191zM362 475h170q198 0 283.5 72t85.5 225q0 279 -338 279h-201v-576z" />
|
||||
<glyph unicode="ß" d="M479 49v166q143 -86 277 -86q213 0 213 174q0 81 -45.5 132t-143.5 112q-123 78 -173 139t-50 148q0 117 129 223t129 196q0 164 -227 164q-242 0 -242 -215v-1202h-182v1200q0 367 424 367q194 0 302.5 -79.5t108.5 -227.5q0 -132 -133 -249q-84 -74 -108.5 -105 t-24.5 -64q0 -39 29 -69t151 -111q144 -95 191 -173t47 -176q0 -162 -100 -247.5t-283 -85.5q-182 0 -289 69z" />
|
||||
<glyph unicode="à" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99zM726 1241h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="á" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99zM502 1268q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="â" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99zM954 1241h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="ã" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99zM368 1241h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57q-100 56 -140 56q-82 0 -107 -115z" />
|
||||
<glyph unicode="ä" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99zM438 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM813 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="å" d="M895 0l-37 152h-8q-77 -97 -158 -134.5t-209 -37.5q-163 0 -255.5 86t-92.5 241q0 332 510 348l203 7v69q0 236 -244 236q-147 0 -328 -82l-63 137q196 96 383 96q227 0 328.5 -87t101.5 -279v-752h-131zM846 537l-162 -7q-196 -8 -278 -61.5t-82 -163.5q0 -178 200 -178 q147 0 234.5 81.5t87.5 229.5v99zM609 1241q-102 0 -162.5 58t-60.5 157t60.5 157t162.5 58q101 0 165.5 -59t64.5 -154q0 -98 -63.5 -157.5t-166.5 -59.5zM609 1569q-49 0 -80.5 -30t-31.5 -83q0 -113 112 -113q50 0 81.5 30t31.5 83t-31.5 83t-81.5 30z" />
|
||||
<glyph unicode="æ" d="M522 662v69q0 236 -139 236q-107 0 -211 -82l-57 137q131 96 276 96q188 0 246 -178q78 178 240 178q137 0 223 -135.5t86 -355.5v-113h-496q3 -192 67 -283.5t169 -91.5q111 0 233 76v-162q-107 -73 -241 -73q-222 0 -316 229q-105 -229 -301 -229q-115 0 -185.5 86.5 t-70.5 240.5q0 332 328 348zM694 662h316q0 141 -40.5 223t-111.5 82q-68 0 -113 -78t-51 -227zM520 537l-88 -7q-217 -17 -217 -225q0 -83 32 -130.5t87 -47.5q82 0 134 82.5t52 228.5v99z" />
|
||||
<glyph unicode="ç" d="M1061 1059l-62 -158q-150 57 -268 57q-371 0 -371 -413q0 -406 361 -406q157 0 321 62v-160q-134 -61 -329 -61q-257 0 -399 145.5t-142 417.5q0 281 145 428t408 147q178 0 336 -59zM477 -483v108q33 -6 80 -6q151 0 151 92q0 74 -172 113l91 176h120l-57 -115 q160 -37 160 -172q0 -205 -291 -205q-34 0 -82 9z" />
|
||||
<glyph unicode="è" d="M1096 514h-774q8 -375 344 -375q195 0 370 76v-160q-166 -75 -364 -75q-245 0 -392 149.5t-147 411.5q0 266 135.5 421.5t362.5 155.5q212 0 338.5 -134t126.5 -357v-113zM326 662h573q0 305 -272 305q-275 0 -301 -305zM767 1241h-121q-166 142 -272 307v21h219 q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="é" d="M1096 514h-774q8 -375 344 -375q195 0 370 76v-160q-166 -75 -364 -75q-245 0 -392 149.5t-147 411.5q0 266 135.5 421.5t362.5 155.5q212 0 338.5 -134t126.5 -357v-113zM326 662h573q0 305 -272 305q-275 0 -301 -305zM500 1268q94 133 174 301h219v-21 q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="ê" d="M1096 514h-774q8 -375 344 -375q195 0 370 76v-160q-166 -75 -364 -75q-245 0 -392 149.5t-147 411.5q0 266 135.5 421.5t362.5 155.5q212 0 338.5 -134t126.5 -357v-113zM326 662h573q0 305 -272 305q-275 0 -301 -305zM962 1241h-121q-85 56 -211 186 q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="ë" d="M1096 514h-774q8 -375 344 -375q195 0 370 76v-160q-166 -75 -364 -75q-245 0 -392 149.5t-147 411.5q0 266 135.5 421.5t362.5 155.5q212 0 338.5 -134t126.5 -357v-113zM326 662h573q0 305 -272 305q-275 0 -301 -305zM444 1497q96 0 96 -102q0 -103 -96 -103t-96 103 q0 102 96 102zM819 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="ì" d="M541 954l-269 21v123h451v-955l352 -20v-123h-878v123l344 20v811zM726 1241h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="í" d="M541 954l-269 21v123h451v-955l352 -20v-123h-878v123l344 20v811zM531 1268q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="î" d="M541 954l-269 21v123h451v-955l352 -20v-123h-878v123l344 20v811zM946 1241h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="ï" d="M541 954l-269 21v123h451v-955l352 -20v-123h-878v123l344 20v811zM426 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM801 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="ð" d="M889 852l8 4q-58 226 -242 391l-256 -153l-73 114l217 131q-104 71 -172 109l69 123q143 -70 246 -148l227 138l74 -113l-194 -117q301 -291 301 -758q0 -277 -128.5 -435t-353.5 -158q-213 0 -345 133.5t-132 363.5q0 234 120.5 364t334.5 130q211 0 299 -119zM614 823 q-286 0 -286 -352q0 -340 288 -340q154 0 221.5 99.5t67.5 295.5q0 129 -77.5 213t-213.5 84z" />
|
||||
<glyph unicode="ñ" d="M887 0v707q0 260 -238 260q-307 0 -307 -398v-569h-182v1098h147l27 -148h10q103 168 336 168q389 0 389 -401v-717h-182zM364 1241h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57q-100 56 -140 56 q-82 0 -107 -115z" />
|
||||
<glyph unicode="ò" d="M610 -20q-216 0 -355.5 155.5t-139.5 415.5q0 263 135.5 415t365.5 152q218 0 357 -155t139 -412q0 -265 -137 -418t-365 -153zM614 131q310 0 310 420q0 416 -312 416q-309 0 -309 -416q0 -420 311 -420zM771 1241h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z " />
|
||||
<glyph unicode="ó" d="M610 -20q-216 0 -355.5 155.5t-139.5 415.5q0 263 135.5 415t365.5 152q218 0 357 -155t139 -412q0 -265 -137 -418t-365 -153zM614 131q310 0 310 420q0 416 -312 416q-309 0 -309 -416q0 -420 311 -420zM498 1268q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z " />
|
||||
<glyph unicode="ô" d="M610 -20q-216 0 -355.5 155.5t-139.5 415.5q0 263 135.5 415t365.5 152q218 0 357 -155t139 -412q0 -265 -137 -418t-365 -153zM614 131q310 0 310 420q0 416 -312 416q-309 0 -309 -416q0 -420 311 -420zM941 1241h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27 q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="õ" d="M610 -20q-216 0 -355.5 155.5t-139.5 415.5q0 263 135.5 415t365.5 152q218 0 357 -155t139 -412q0 -265 -137 -418t-365 -153zM614 131q310 0 310 420q0 416 -312 416q-309 0 -309 -416q0 -420 311 -420zM358 1241h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56 q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57q-100 56 -140 56q-82 0 -107 -115z" />
|
||||
<glyph unicode="ö" d="M610 -20q-216 0 -355.5 155.5t-139.5 415.5q0 263 135.5 415t365.5 152q218 0 357 -155t139 -412q0 -265 -137 -418t-365 -153zM614 131q310 0 310 420q0 416 -312 416q-309 0 -309 -416q0 -420 311 -420zM419 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z M794 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="÷" d="M612 1196q115 0 115 -125t-115 -125q-114 0 -114 125t114 125zM152 647v150h923v-150h-923zM612 498q115 0 115 -125t-115 -125q-114 0 -114 125t114 125z" />
|
||||
<glyph unicode="ø" d="M377 33l-76 -119l-131 84l84 131q-139 158 -139 422q0 266 133 416.5t368 150.5q128 0 236 -57l76 119l131 -84l-84 -131q137 -156 137 -414q0 -271 -134.5 -421t-367.5 -150q-129 0 -233 53zM356 276l406 656q-66 35 -156 35q-161 0 -232 -103.5t-71 -312.5 q0 -180 53 -275zM872 817l-405 -653q61 -33 154 -33q161 0 232 105.5t71 314.5q0 164 -52 266z" />
|
||||
<glyph unicode="ù" d="M922 0l-27 147h-10q-105 -167 -334 -167q-391 0 -391 401v717h182v-707q0 -260 236 -260q161 0 235 92.5t74 304.5v570h182v-1098h-147zM734 1241h-121q-166 142 -272 307v21h219q86 -178 174 -301v-27z" />
|
||||
<glyph unicode="ú" d="M922 0l-27 147h-10q-105 -167 -334 -167q-391 0 -391 401v717h182v-707q0 -260 236 -260q161 0 235 92.5t74 304.5v570h182v-1098h-147zM500 1268q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="û" d="M922 0l-27 147h-10q-105 -167 -334 -167q-391 0 -391 401v717h182v-707q0 -260 236 -260q161 0 235 92.5t74 304.5v570h182v-1098h-147zM954 1241h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="ü" d="M922 0l-27 147h-10q-105 -167 -334 -167q-391 0 -391 401v717h182v-707q0 -260 236 -260q161 0 235 92.5t74 304.5v570h182v-1098h-147zM428 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM803 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="ý" d="M82 1098h188l262 -654q82 -205 89 -290h6q23 112 90 292l239 652h189l-475 -1241q-67 -174 -156 -261.5t-246 -87.5q-86 0 -168 17v145q62 -12 136 -12q96 0 149.5 41t95.5 141l58 150zM494 1268q94 133 174 301h219v-21q-112 -173 -272 -307h-121v27z" />
|
||||
<glyph unicode="þ" d="M340 950q110 168 322 168q201 0 315.5 -149.5t114.5 -417.5q0 -270 -115 -420.5t-315 -150.5q-207 0 -322 159h-12q12 -129 12 -162v-469h-182v2048h182v-458l-8 -148h8zM340 592v-41q0 -227 69.5 -323.5t221.5 -96.5q272 0 272 422q0 414 -274 414q-152 0 -218.5 -88 t-70.5 -287z" />
|
||||
<glyph unicode="ÿ" d="M82 1098h188l262 -654q82 -205 89 -290h6q23 112 90 292l239 652h189l-475 -1241q-67 -174 -156 -261.5t-246 -87.5q-86 0 -168 17v145q62 -12 136 -12q96 0 149.5 41t95.5 141l58 150zM434 1497q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM809 1497 q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="ı" d="M541 954l-269 21v123h451v-955l352 -20v-123h-878v123l344 20v811z" />
|
||||
<glyph unicode="Œ" d="M1227 0h-574l-48 -10q-51 -10 -97 -10q-488 0 -488 755q0 750 512 750q82 0 154 -23h541v-164h-398v-452h359v-162h-359v-520h398v-164zM651 176v1112q-58 33 -131 33q-311 0 -311 -588q0 -590 309 -590q70 0 133 33z" />
|
||||
<glyph unicode="œ" d="M651 201q-88 -221 -266 -221q-146 0 -237 153.5t-91 417.5q0 268 88 417.5t242 149.5q171 0 260 -217q84 217 242 217q131 0 208 -133.5t77 -357.5v-113h-439q3 -375 189 -375q108 0 204 76v-162q-94 -73 -217 -73q-87 0 -158.5 59t-101.5 162zM397 131q168 0 168 410 q0 426 -170 426q-90 0 -129 -103t-39 -313q0 -211 39.5 -315.5t130.5 -104.5zM997 662q0 305 -123 305q-125 0 -137 -305h260z" />
|
||||
<glyph unicode="Ÿ" d="M612 723l381 739h201l-487 -893v-569h-187v559l-487 903h203zM428 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102zM803 1835q96 0 96 -102q0 -103 -96 -103t-96 103q0 102 96 102z" />
|
||||
<glyph unicode="ˆ" d="M946 1241h-121q-85 56 -211 186q-133 -136 -211 -186h-120v27q25 29 59 67q139 155 176 234h193q37 -79 176 -234l59 -67v-27z" />
|
||||
<glyph unicode="˚" d="M610 1241q-102 0 -162.5 58t-60.5 157t60.5 157t162.5 58q101 0 165.5 -59t64.5 -154q0 -98 -63.5 -157.5t-166.5 -59.5zM610 1569q-49 0 -80.5 -30t-31.5 -83q0 -113 112 -113q50 0 81.5 30t31.5 83t-31.5 83t-81.5 30z" />
|
||||
<glyph unicode="˜" d="M358 1241h-104q25 264 211 264q58 0 161 -56q102 -56 136 -56q80 0 106 114h105q-27 -264 -211 -264q-57 0 -157 57q-100 56 -140 56q-82 0 -107 -115z" />
|
||||
<glyph unicode=" " horiz-adv-x="953" />
|
||||
<glyph unicode=" " horiz-adv-x="1907" />
|
||||
<glyph unicode=" " horiz-adv-x="953" />
|
||||
<glyph unicode=" " horiz-adv-x="1907" />
|
||||
<glyph unicode=" " horiz-adv-x="635" />
|
||||
<glyph unicode=" " horiz-adv-x="476" />
|
||||
<glyph unicode=" " horiz-adv-x="317" />
|
||||
<glyph unicode=" " horiz-adv-x="317" />
|
||||
<glyph unicode=" " horiz-adv-x="238" />
|
||||
<glyph unicode=" " horiz-adv-x="381" />
|
||||
<glyph unicode=" " horiz-adv-x="105" />
|
||||
<glyph unicode="‐" d="M285 465v168h659v-168h-659z" />
|
||||
<glyph unicode="‑" d="M285 465v168h659v-168h-659z" />
|
||||
<glyph unicode="‒" d="M285 465v168h659v-168h-659z" />
|
||||
<glyph unicode="–" d="M184 465v168h860v-168h-860z" />
|
||||
<glyph unicode="—" d="M-6 465v168h1241v-168h-1241z" />
|
||||
<glyph unicode="‘" d="M461 961l-15 22q54 206 177 479h157q-62 -255 -100 -501h-219z" />
|
||||
<glyph unicode="’" d="M766 1462l14 -22q-55 -213 -176 -479h-158q65 266 101 501h219z" />
|
||||
<glyph unicode="‚" d="M756 238l14 -23q-55 -213 -176 -479h-137q71 292 100 502h199z" />
|
||||
<glyph unicode="“" d="M674 961l-15 22q54 206 177 479h157q-62 -255 -100 -501h-219zM248 961l-15 22q54 206 177 479h157q-62 -255 -100 -501h-219z" />
|
||||
<glyph unicode="”" d="M553 1462l14 -22q-55 -213 -176 -479h-158q65 266 101 501h219zM979 1462l14 -22q-55 -213 -176 -479h-158q65 266 101 501h219z" />
|
||||
<glyph unicode="„" d="M543 238l14 -23q-55 -213 -176 -479h-137q71 292 100 502h199zM969 238l14 -23q-51 -197 -176 -479h-137q71 292 100 502h199z" />
|
||||
<glyph unicode="•" d="M614 1010q236 0 236 -262q0 -128 -63.5 -195.5t-172.5 -67.5q-111 0 -173 67t-62 196q0 262 235 262z" />
|
||||
<glyph unicode="…" d="M205 250q127 0 127 -139q0 -140 -127 -140t-127 140q0 139 127 139zM614 250q127 0 127 -139q0 -140 -127 -140t-127 140q0 139 127 139zM1024 250q127 0 127 -139q0 -140 -127 -140t-127 140q0 139 127 139z" />
|
||||
<glyph unicode=" " horiz-adv-x="381" />
|
||||
<glyph unicode="‹" d="M401 553l310 414l116 -78l-237 -348l237 -348l-116 -78l-310 411v27z" />
|
||||
<glyph unicode="›" d="M827 526l-309 -411l-117 78l238 348l-238 348l117 78l309 -414v-27z" />
|
||||
<glyph unicode="⁄" d="M1057 1462l-729 -1462h-158l729 1462h158z" />
|
||||
<glyph unicode=" " horiz-adv-x="476" />
|
||||
<glyph unicode="€" d="M442 934h432v-137h-446q0 -15 -1 -29l-1 -25v-62q0 -20 2 -42h385v-137h-367q73 -359 369 -359q136 0 268 58v-162q-122 -59 -282 -59q-447 0 -541 522h-164v137h148l-2 38l2 120h-148v137h160q39 262 179.5 405.5t359.5 143.5q191 0 335 -92l-79 -146q-122 74 -242 74 q-136 0 -233 -99.5t-134 -285.5z" />
|
||||
<glyph unicode="™" d="M303 741h-127v613h-176v108h481v-108h-178v-613zM797 741l-146 549h-12l10 -180v-369h-123v721h187l139 -534l149 534h179v-721h-127v342q0 87 10 207h-12l-154 -549h-100z" />
|
||||
<glyph unicode="◼" horiz-adv-x="1100" d="M0 1100h1100v-1100h-1100v1100z" />
|
||||
<glyph unicode="fi" d="M672 961h-246v-961h-182v961h-195v75l195 68v96q0 190 76.5 278.5t254.5 88.5q97 0 197 -37l-47 -141q-79 28 -143 28q-92 0 -124 -50.5t-32 -164.5v-104h246v-137zM961 1509q106 0 106 -114q0 -58 -31.5 -86.5t-74.5 -28.5q-107 0 -107 115q0 114 107 114zM1051 0h-183 v1098h183v-1098z" />
|
||||
<glyph unicode="fl" d="M672 961h-246v-961h-182v961h-195v75l195 68v96q0 190 76.5 278.5t254.5 88.5q97 0 197 -37l-47 -141q-79 28 -143 28q-92 0 -124 -50.5t-32 -164.5v-104h246v-137zM1051 0h-183v1556h183v-1556z" />
|
||||
<glyph unicode="ffi" d="M1065 0h-164v971h-203v-971h-163v971h-205v-971h-164v971h-100v65l100 62v82q0 106 20 176.5t58.5 112.5t94.5 59.5t128 17.5q49 0 92.5 -11t77.5 -24q38 29 89 42.5t114 13.5q52 0 97.5 -11.5t82.5 -25.5l-41 -131q-29 11 -63.5 19.5t-71.5 8.5q-38 0 -65.5 -11 t-45.5 -37t-26.5 -69.5t-8.5 -107.5v-104h367v-1098zM330 1098h205v102q0 115 24 193q-20 6 -42.5 10t-45.5 4q-35 0 -61.5 -11t-44 -37t-26.5 -69.5t-9 -107.5v-84z" />
|
||||
<glyph unicode="ffl" d="M840 971h-142v-971h-163v971h-205v-971h-164v971h-100v65l100 62v82q0 106 20 176.5t58.5 112.5t94.5 59.5t128 17.5q49 0 92.5 -11t77.5 -24q38 29 89 42.5t114 13.5q48 0 94 -11h131v-1556h-164v1421q-14 3 -28.5 4.5t-28.5 1.5q-38 0 -65.5 -11t-45.5 -37t-26.5 -69.5 t-8.5 -107.5v-104h142v-127zM330 1098h205v102q0 115 24 193q-20 6 -42.5 10t-45.5 4q-35 0 -61.5 -11t-44 -37t-26.5 -69.5t-9 -107.5v-84z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 47 KiB |
|
@ -0,0 +1,189 @@
|
|||
|
||||
Copyright (c) 2005-2008, The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
|
@ -0,0 +1,23 @@
|
|||
Icon fonts generator
|
||||
|
||||
## Fontello
|
||||
|
||||
Copyright (C) 2011 by Vitaly Puzrin
|
||||
|
||||
Author: Vitaly Puzrin
|
||||
License: The MIT License <https://github.com/fontello/fontello/blob/master/LICENSE>
|
||||
Homepage: http://fontello.com/
|
||||
|
||||
|
||||
|
||||
Font license info
|
||||
|
||||
## Font Awesome
|
||||
|
||||
Copyright (C) 2016 by Dave Gandy
|
||||
|
||||
Author: Dave Gandy
|
||||
License: SIL OFL 1.1 <http://scripts.sil.org/OFL>
|
||||
Homepage: http://fortawesome.github.com/Font-Awesome/
|
||||
|
||||
Icons: chat, github-circled ("octocat"), menu, dollar
|
|
@ -0,0 +1,21 @@
|
|||
(The MIT License)
|
||||
|
||||
Copyright (C) 2011 by Vitaly Puzrin
|
||||
|
||||
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.
|
|
@ -0,0 +1,94 @@
|
|||
Copyright (c) 2016, Dave Gandy <http://fontawesome.io>,
|
||||
with Reserved Font Name Font Awesome.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Copyright (C) 2018 by original authors @ fontello.com</metadata>
|
||||
<defs>
|
||||
<font id="fontello" horiz-adv-x="1000" >
|
||||
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
||||
<missing-glyph horiz-adv-x="1000" />
|
||||
<glyph glyph-name="chat" unicode="" d="M786 421q0-77-53-143t-143-104-197-38q-48 0-98 9-70-49-155-72-21-5-48-9h-2q-6 0-12 5t-6 12q-1 1-1 3t1 4 1 3l1 3t2 3 2 3 3 3 2 2q3 3 13 14t15 16 12 17 14 21 11 25q-69 40-108 98t-40 125q0 78 53 144t143 104 197 38 197-38 143-104 53-144z m214-142q0-67-40-126t-108-98q5-14 11-25t14-21 13-16 14-17 13-14q0 0 2-2t3-3 2-3 2-3l1-3t1-3 1-4-1-3q-2-8-7-13t-12-4q-28 4-48 9-86 23-156 72-50-9-98-9-151 0-263 74 32-3 49-3 90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85 72-39 114-99t42-128z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="octocat" unicode="" d="M429 779q116 0 215-58t156-156 57-215q0-140-82-252t-211-155q-15-3-22 4t-7 17q0 1 0 43t0 75q0 54-29 79 32 3 57 10t53 22 45 37 30 58 11 84q0 67-44 115 21 51-4 114-16 5-46-6t-51-25l-21-13q-52 15-107 15t-108-15q-8 6-23 15t-47 22-47 7q-25-63-5-114-44-48-44-115 0-47 12-83t29-59 45-37 52-22 57-10q-21-20-27-58-12-5-25-8t-32-3-36 12-31 35q-11 18-27 29t-28 14l-11 1q-12 0-16-2t-3-7 5-8 7-6l4-3q12-6 24-21t18-29l6-13q7-21 24-34t37-17 39-3 31 1l13 3q0-22 0-50t1-30q0-10-8-17t-22-4q-129 43-211 155t-82 252q0 117 58 215t155 156 216 58z m-267-616q2 4-3 7-6 1-8-1-1-4 4-7 5-3 7 1z m18-19q4 3-1 9-6 5-9 2-4-3 1-9 5-6 9-2z m16-25q6 4 0 11-4 7-9 3-5-3 0-10t9-4z m24-23q4 4-2 10-7 7-11 2-5-5 2-11 6-6 11-1z m32-14q1 6-8 9-8 2-10-4t7-9q8-3 11 4z m35-3q0 7-10 6-9 0-9-6 0-7 10-6 9 0 9 6z m32 5q-1 7-10 5-9-1-8-8t10-4 8 7z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="menu" unicode="" d="M857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="dollar" unicode="" d="M546 189q0-86-56-147t-144-77v-97q0-8-5-13t-13-5h-75q-7 0-13 5t-5 13v97q-37 5-71 18t-57 25-41 26-26 21-10 10q-9 12-1 23l58 76q3 5 12 6 9 1 14-5l1-1q63-55 135-70 21-4 42-4 45 0 79 24t35 68q0 16-9 30t-18 23-33 21-37 18-45 18q-21 9-34 14t-34 15-35 17-32 20-29 24-25 27-20 32-11 37-5 44q0 77 55 135t142 75v100q0 7 5 13t13 5h75q8 0 13-5t5-13v-98q32-3 62-13t48-19 36-20 21-17 9-7q9-11 3-22l-46-81q-4-9-12-9-8-2-15 4-2 2-9 7t-21 14-33 18-42 15-47 6q-53 0-87-24t-33-62q0-14 4-27t17-23 22-18 31-18 34-15 39-15q30-11 45-17t43-20 42-24 34-28 30-35 18-43 7-52z" horiz-adv-x="571.4" />
|
||||
</font>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |