Verzija 1

master
root 2021-12-19 12:26:37 +01:00
commit 3635385278
35 changed files with 14039 additions and 0 deletions

198
.ddev/config.yaml 100644
View File

@ -0,0 +1,198 @@
name: vihor
type: php
docroot: ""
php_version: "8.0"
webserver_type: nginx-fpm
router_http_port: "80"
router_https_port: "443"
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
mariadb_version: "10.3"
mysql_version: ""
nfs_mount_enabled: false
mutagen_enabled: false
bind_all_interfaces: true
omit_containers: [db, dba]
host_webserver_port: "8000"
use_dns_when_possible: true
composer_version: ""
web_environment: []
webimage_extra_packages: [php8.0-imagick]
# Key features of ddev's config.yaml:
# name: <projectname> # Name of the project, automatically provides
# http://projectname.ddev.site and https://projectname.ddev.site
# type: <projecttype> # drupal6/7/8, backdrop, typo3, wordpress, php
# docroot: <relative_path> # Relative path to the directory containing index.php.
# php_version: "7.4" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1"
# You can explicitly specify the webimage, dbimage, dbaimage lines but this
# is not recommended, as the images are often closely tied to ddev's' behavior,
# so this can break upgrades.
# webimage: <docker_image> # nginx/php docker image.
# dbimage: <docker_image> # mariadb docker image.
# dbaimage: <docker_image>
# mariadb_version and mysql_version
# ddev can use many versions of mariadb and mysql
# However these directives are mutually exclusive
# mariadb_version: 10.2
# mysql_version: 8.0
# router_http_port: <port> # Port to be used for http (defaults to port 80)
# router_https_port: <port> # Port for https (defaults to 443)
# xdebug_enabled: false # Set to true to enable xdebug and "ddev start" or "ddev restart"
# Note that for most people the commands
# "ddev xdebug" to enable xdebug and "ddev xdebug off" to disable it work better,
# as leaving xdebug enabled all the time is a big performance hit.
# xhprof_enabled: false # Set to true to enable xhprof and "ddev start" or "ddev restart"
# Note that for most people the commands
# "ddev xhprof" to enable xhprof and "ddev xhprof off" to disable it work better,
# as leaving xhprof enabled all the time is a big performance hit.
# webserver_type: nginx-fpm # or apache-fpm
# timezone: Europe/Berlin
# This is the timezone used in the containers and by PHP;
# it can be set to any valid timezone,
# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# For example Europe/Dublin or MST7MDT
# composer_version: "2"
# if composer_version:"2" it will use the most recent composer v2
# It can also be set to "1", to get most recent composer v1
# or "" for the default v2 created at release time.
# It can be set to any existing specific composer version.
# After first project 'ddev start' this will not be updated until it changes
# additional_hostnames:
# - somename
# - someothername
# would provide http and https URLs for "somename.ddev.site"
# and "someothername.ddev.site".
# additional_fqdns:
# - example.com
# - sub1.example.com
# would provide http and https URLs for "example.com" and "sub1.example.com"
# Please take care with this because it can cause great confusion.
# upload_dir: custom/upload/dir
# would set the destination path for ddev import-files to <docroot>/custom/upload/dir
# working_dir:
# web: /var/www/html
# db: /home
# would set the default working directory for the web and db services.
# These values specify the destination directory for ddev ssh and the
# directory in which commands passed into ddev exec are run.
# omit_containers: [db, dba, ddev-ssh-agent]
# Currently only these containers are supported. Some containers can also be
# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit
# the "db" container, several standard features of ddev that access the
# database container will be unusable. In the global configuration it is also
# possible to omit ddev-router, but not here.
# nfs_mount_enabled: false
# Great performance improvement but requires host configuration first.
# See https://ddev.readthedocs.io/en/stable/users/performance/#using-nfs-to-mount-the-project-into-the-container
# mutagen_enabled: false
# Experimental performance improvement using mutagen asynchronous updates.
# See https://ddev.readthedocs.io/en/latest/users/performance/#using-mutagen
# fail_on_hook_fail: False
# Decide whether 'ddev start' should be interrupted by a failing hook
# host_https_port: "59002"
# The host port binding for https can be explicitly specified. It is
# dynamic unless otherwise specified.
# This is not used by most people, most people use the *router* instead
# of the localhost port.
# host_webserver_port: "59001"
# The host port binding for the ddev-webserver can be explicitly specified. It is
# dynamic unless otherwise specified.
# This is not used by most people, most people use the *router* instead
# of the localhost port.
# host_db_port: "59002"
# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic
# unless explicitly specified.
# phpmyadmin_port: "8036"
# phpmyadmin_https_port: "8037"
# The PHPMyAdmin ports can be changed from the default 8036 and 8037
# host_phpmyadmin_port: "8036"
# The phpmyadmin (dba) port is not normally bound on the host at all, instead being routed
# through ddev-router, but it can be specified and bound.
# mailhog_port: "8025"
# mailhog_https_port: "8026"
# The MailHog ports can be changed from the default 8025 and 8026
# host_mailhog_port: "8025"
# The mailhog port is not normally bound on the host at all, instead being routed
# through ddev-router, but it can be bound directly to localhost if specified here.
# webimage_extra_packages: [php7.4-tidy, php-bcmath]
# Extra Debian packages that are needed in the webimage can be added here
# dbimage_extra_packages: [telnet,netcat]
# Extra Debian packages that are needed in the dbimage can be added here
# use_dns_when_possible: true
# If the host has internet access and the domain configured can
# successfully be looked up, DNS will be used for hostname resolution
# instead of editing /etc/hosts
# Defaults to true
# project_tld: ddev.site
# The top-level domain used for project URLs
# The default "ddev.site" allows DNS lookup via a wildcard
# If you prefer you can change this to "ddev.local" to preserve
# pre-v1.9 behavior.
# ngrok_args: --subdomain mysite --auth username:pass
# Provide extra flags to the "ngrok http" command, see
# https://ngrok.com/docs#http or run "ngrok http -h"
# disable_settings_management: false
# If true, ddev will not create CMS-specific settings files like
# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php
# In this case the user must provide all such settings.
# You can inject environment variables into the web container with:
# web_environment:
# - SOMEENV=somevalue
# - SOMEOTHERENV=someothervalue
# no_project_mount: false
# (Experimental) If true, ddev will not mount the project into the web container;
# the user is responsible for mounting it manually or via a script.
# This is to enable experimentation with alternate file mounting strategies.
# For advanced users only!
# bind_all_interfaces: false
# If true, host ports will be bound on all network interfaces,
# not just the localhost interface. This means that ports
# will be available on the local network if the host firewall
# allows it.
# Many ddev commands can be extended to run tasks before or after the
# ddev command is executed, for example "post-start", "post-import-db",
# "pre-composer", "post-composer"
# See https://ddev.readthedocs.io/en/stable/users/extending-commands/ for more
# information on the commands that can be extended and the tasks you can define
# for them. Example:
#hooks:

22
.gitignore vendored 100644
View File

@ -0,0 +1,22 @@
# Linux
*~
*.swp
# Syncthing
.stversions
# Windows
Thumbs.db
desktop.ini
# Mac OS X
.DS_Store
._*
# Composer
/composer.phar
/vendor
# Pico
/assets/*
.cache

21
LICENSE 100644
View File

@ -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.

34
README.md 100644
View File

@ -0,0 +1,34 @@
Pico
====
[![License](https://picocms.github.io/badges/pico-license.svg)](https://github.com/picocms/pico-composer/blob/master/LICENSE)
[![Version](https://picocms.github.io/badges/pico-version.svg)](https://github.com/picocms/pico-composer#install)
[![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.
This is Pico's [Composer][] starter project. `picocms/pico-composer` is the frame for basically all Pico installations starting with Pico 2.0, but doesn't consist of any considerable code itself. It's main purpose is to simply depend on Pico. Please refer to the ["Install"][MainRepoInstall] and ["Upgrade"][MainRepoUpgrade] sections of our main repository for information about how to install, upgrade and use Pico.
Screenshot
----------
![Pico Screenshot](https://picocms.github.io/screenshots/pico-21.png)
Getting Help
------------
Please refer to the ["Getting Help" section][MainRepoGettingHelp] of our main repository.
Contributing
------------
Please refer to the ["Contributing" section][MainRepoContributing] of our main repository.
[Composer]: https://getcomposer.org/
[MainRepoInstall]: https://github.com/picocms/Pico#install
[MainRepoUpgrade]: https://github.com/picocms/Pico#upgrade
[MainRepoGettingHelp]: https://github.com/picocms/Pico#getting-help
[MainRepoContributing]: https://github.com/picocms/Pico#contributing

37
composer.json 100644
View File

@ -0,0 +1,37 @@
{
"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",
"intervention/image": "^2.7"
},
"minimum-stability": "beta",
"prefer-stable": true
}

968
composer.lock generated 100644
View File

@ -0,0 +1,968 @@
{
"_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": "2aac09be095121bbb0b668c41a13fb66",
"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": "guzzlehttp/psr7",
"version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72",
"reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0",
"ralouphie/getallheaders": "^3.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4.1",
"http-interop/http-factory-tests": "^0.9",
"phpunit/phpunit": "^8.5.8 || ^9.3.10"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.1-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://sagikazarmark.hu"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.1.0"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
"type": "tidelift"
}
],
"time": "2021-10-06T17:43:30+00:00"
},
{
"name": "intervention/image",
"version": "2.7.1",
"source": {
"type": "git",
"url": "https://github.com/Intervention/image.git",
"reference": "744ebba495319501b873a4e48787759c72e3fb8c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Intervention/image/zipball/744ebba495319501b873a4e48787759c72e3fb8c",
"reference": "744ebba495319501b873a4e48787759c72e3fb8c",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"guzzlehttp/psr7": "~1.1 || ^2.0",
"php": ">=5.4.0"
},
"require-dev": {
"mockery/mockery": "~0.9.2",
"phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15"
},
"suggest": {
"ext-gd": "to use GD library based image processing.",
"ext-imagick": "to use Imagick based image processing.",
"intervention/imagecache": "Caching extension for the Intervention Image library"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.4-dev"
},
"laravel": {
"providers": [
"Intervention\\Image\\ImageServiceProvider"
],
"aliases": {
"Image": "Intervention\\Image\\Facades\\Image"
}
}
},
"autoload": {
"psr-4": {
"Intervention\\Image\\": "src/Intervention/Image"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oliver Vogel",
"email": "oliver@olivervogel.com",
"homepage": "http://olivervogel.com/"
}
],
"description": "Image handling and manipulation library with support for Laravel integration",
"homepage": "http://image.intervention.io/",
"keywords": [
"gd",
"image",
"imagick",
"laravel",
"thumbnail",
"watermark"
],
"support": {
"issues": "https://github.com/Intervention/image/issues",
"source": "https://github.com/Intervention/image/tree/2.7.1"
},
"funding": [
{
"url": "https://www.paypal.me/interventionphp",
"type": "custom"
},
{
"url": "https://github.com/Intervention",
"type": "github"
}
],
"time": "2021-12-16T16:49:26+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/",
"PicoPluginInterface": "lib/",
"AbstractPicoPlugin": "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": "psr/http-factory",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"shasum": ""
},
"require": {
"php": ">=7.0.0",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interfaces for PSR-7 HTTP message factories",
"keywords": [
"factory",
"http",
"message",
"psr",
"psr-17",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-factory/tree/master"
},
"time": "2019-04-30T12:38:16+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/master"
},
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/ralouphie/getallheaders.git",
"reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
"autoload": {
"files": [
"src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Khattar",
"email": "ralph.khattar@gmail.com"
}
],
"description": "A polyfill for getallheaders.",
"support": {
"issues": "https://github.com/ralouphie/getallheaders/issues",
"source": "https://github.com/ralouphie/getallheaders/tree/develop"
},
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.23.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
"reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-ctype": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
},
"files": [
"bootstrap.php"
]
},
"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.23.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": "2021-02-19T12:13:01+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.6",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/ae39480f010ef88adc7938503c9b02d3baf2f3b3",
"reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3",
"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.6"
},
"funding": [
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/twig/twig",
"type": "tidelift"
}
],
"time": "2021-11-25T13:31:46+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "beta",
"stability-flags": [],
"prefer-stable": true,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"plugin-api-version": "2.1.0"
}

1
config/.gitignore vendored 100644
View File

@ -0,0 +1 @@
# This file is meant to be empty

62
config/config.yml 100644
View File

@ -0,0 +1,62 @@
##
# Basic
#
site_title: ŠS6 # The title of your website
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: vihor # 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/
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: false # Enable Twig's debug mode
cache: .cache # Enable Twig template caching by specifying a path to a writable directory
auto_reload: false # Recompile Twig templates whenever the source code changes
##
# Content
#
date_format: %D %T # Pico's default date format;
# See https://php.net/manual/en/function.strftime.php for more info
pages_order_by_meta: Order # Sort pages by meta value "author" (set "pages_order_by" to "meta")
pages_order_by: meta # Change how Pico sorts pages ("alpha" for alphabetical order, "date", or "meta")
pages_order: asc # 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: false # 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 }}
ImageResize:
folder: thumb
quality: 90

View File

@ -0,0 +1,60 @@
##
# Basic
#
site_title: Pico # The title of your website
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: default # 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: false # Enable Twig template caching by specifying a path to a writable directory
auto_reload: ~ # Recompile Twig templates whenever the source code changes
##
# Content
#
date_format: %D %T # 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: alpha # Change how Pico sorts pages ("alpha" for alphabetical order, "date", or "meta")
pages_order: asc # 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: false # 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 }}

1
content/.gitignore vendored 100644
View File

@ -0,0 +1 @@
# This file is meant to be empty

View File

@ -0,0 +1,8 @@
---
Title: Galerija
Order: 1
---
Slike pridejo sem nekam?
[galerija assets/galerije/gal1]

18
content/index.md 100644
View File

@ -0,0 +1,18 @@
## Šišenski soseski 6 grozi pozidava!
Predlog OPN, ki bo obravnavan na januarski seji Mestnega sveta, spreminja namembnost zemljišč znotraj ŠS-6, kar bo omogočilo pozidavo zelenih površin, ki trenutno opravljajo pomembno socialno, rekreativno in ekološko funkcijo.
Načrtovani grobi posegi so problematični tudi v urbanističnem smislu, ker bi te spremembe posegle v smiselno zaključeno zasnovo soseske in enega najkakovostnejših primerov oblikovanja mestne krajine pri nas. Prav tako to ne bi bilo v skladu s strateškim ciljem ohranjanje kakovosti bivanja in urbanističnim kriterijem varovanja odprtih zelenih površin v zgoščenih stanovanjskih soseskah.
![ŠS6 slika](%assets_url%/slike/2021-09-07-v-mestu-se-gradi-129290.jpg)
V preteklosti so podobne pobude Video arta d.o.o. na magistratu zavrnili. Občina je takrat pojasnila, da »pobuda ni skladna z urbanističnim kriterijem ohranjanja bivalne kakovosti v obstoječih poselitvenih območjih soseskah. Obravnavano območje predstavlja zeleno površino strnjenega naselja. Te površine imajo pomembno socialno in ekološko funkcijo, ker omogočajo ureditev prostorov druženja in izboljšujejo mikroklimatske pogoje. Zgoščevanje soseske z gradnjo novih objektov na odprtih zelenih površinah ni sprejemljivo.«
Trenutni argument MOL je, da bi s potencialno gradnjo stanovanj na omenjenih površinah rešili dolgoletni spor z zasebnim investitorjem torej gre za nekakšno »poravnavo« - na račun tretjega, to je stanovalcev v soseski. Urejanje prostorsko-urbanističnih nepravilnosti se ne bi smelo reševati s »poravnavo«.
Stanovalci ŠS-6 takšni poravnavi odločno nasprotujemo. V preteklih mesecih smo se prešteli z informativnim oz. posvetovalnim zbiranjem podpisov; v le dveh dneh smo jih zbrali več kot 600. Prav tako se zavedamo, da bo predlagana »rešitev« ustvarila precedens, ki bo vzpodbudil tudi ostale lastnike špekulativno pridobljenih zemljišč, da začnejo s pozidavo zelenih površin v gosto naseljenih in urbanistično zaključenih soseskah.
Naši 4 gradniki so: ljubezen, znanje, stroka in smeh.

View File

@ -0,0 +1,32 @@
---
Title: Pridruži se nam
Order: 2
---
# O nas
Smo predstavniki širše skupnosti prebivalcev Šišenske soeske 6, ki se s svojim delovanjem zavzemamo za zaščito javnih in odprtih zelenih površin. Zavedamo se, da podobno usodo delijo tudi številne druge soseske po Ljubljani in Sloveniji. Naša prizadevanja so absolutno neideološka in nepolitična. Naši člani so predstavniki vseh starostnih skupin in širokega spektra političnih prepričanj.
# Bodi obveščen_a
Obveščen bodi preko tega obrazca:
OBRAZEC
# Pridruži se našim prizadevanjem
## Bodimo slišani
Svoje nasprotovanje načrtom spremembe OPN posreduj mestnim svetnikom, kontaktne podatke najdeš na tej [povezavi](https://docs.google.com/document/d/1x-69AccNGbaQQU9MykRa5J_2i4jbwCqYrucx0CUc0NU/edit?usp=sharing).
Za oporo lahko uporabiš šablono, ki smo jo pripravili in je dostopna [tukaj](https://docs.google.com/document/d/1DKI8idnhQXBpLSdjBBZ60y8jx79bq3YmmcSJuB3fbc4/edit?usp=sharing).
## Pomagaj na terenu
Na naslov sisenskasoseska6@gmail.com se javi, če si pripravljen_a sodelovati pri deljenju letakov in zbiranju podpisov.
## Podpri nas z donacijo
Trenutno preučujemo pravne možnosti, ki bi nam omogočile ustaviti načrtovane spremembe.
Vsak evro, ki ga prejmemo iz donacij, bo namenjen za plačilo pravne pomoči.
Za donacijo nas kontaktiraj na sisenskasoseska6@gmail.com

View File

@ -0,0 +1,15 @@
---
Title: Zgodovina soseske
Order: 0
---
Šišenska soseska 6 (ŠS-6) predstavlja enega kvalitetnejših primerov stanovanjske gradnje v Ljubljani, ki je bila realizirana kot prva zaključena urbanistična enota za 10.000 prebivalcev. Načrtovana je bila skladno z urbanističnimi načeli Ravnikarjeve “idealne soseske” in bila zgrajena v letih 1964-1972.
Naselje leži ob severni mestni vpadnici Celovški cesti. Skozi sosesko poteka sprehajalna pot Pot spominov in tovarištva ali Pot ob žici (POT), speljana po trasi bodeče žice, s katero je bila Ljubljana ograjena med 2. svetovno vojno. POT sosesko povezuje z zelenim zaledjem griča Rožnik.
Urbanista Aleš Šarec in Janez Vovk sta predvidela pahljačasto zasnovo soseske, ki jo opredeljujejo višinsko hierarhično strukturirana zazidava, mreža peš poti in urbanistični elementi tradicionalnega mesta. Že v času nastanka je soseska v urbanističnem smislu predstavljala velik odklon od funkcionalističnih načel. Visoke, osem do štirinajst nadstropne stanovanjske stolpnice tvorijo središče soseske, ki je locirano ob mestni vpadnici. Z oddaljenostjo od glavne ceste višinski gabariti objektov padajo vse do individualne zazidave.
Stanovanjski bloki z zamaknjenimi osnovnimi stavbnimi enotami tvorijo členjene nize, prostore med njimi pa zasedajo obsežne, z visokodebelnim drevjem zasajene parkovne površine z otroškimi igrišči in vrtovi, ki jih ozelenjeni nasipi delijo na intimnejše odseke. Odprte zelene površine in parki soseske ŠS-6 spadajo med lepše primere krajinskega oblikovanja javnih površin v Ljubljani. V zelenju sredi soseske so šola, vrtec in telovadnica.
VIR: [Kubusarhitektura](https://kubusarhitektura.com/sl/sisenska-soseska-ss-6/)

33
index.php 100644
View File

@ -0,0 +1,33 @@
<?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-composer/blob/master/index.php>
*
* SPDX-License-Identifier: MIT
* License-Filename: LICENSE
*/
// load dependencies
// pico-composer MUST be installed as root package
if (is_file(__DIR__ . '/vendor/autoload.php')) {
require_once(__DIR__ . '/vendor/autoload.php');
} else {
die("Cannot find 'vendor/autoload.php'. Run `composer install`.");
}
// 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();

2
plugins/.gitignore vendored 100644
View File

@ -0,0 +1,2 @@
# You should add plugins installed by Composer here
/PicoDeprecated

View File

@ -0,0 +1,193 @@
<?php
/**
* Galerija - Responsive gallery 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 Galerija 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();
protected $useImagick = false;
const SHORTCODE = '#\[galerija .+?\]#i';
/**
* Triggered after Pico has read its configuration
*
* @see Pico::getConfig()
* @see Pico::getBaseUrl()
* @see Pico::getBaseThemeUrl()
* @see Pico::isUrlRewritingEnabled()
*
* @param array &$config array of config variables
*
* @return void
*/
public function onConfigLoaded(array &$config)
{
$this->folder = '.resized';
if (isset($config['ImageResize']['folder']))
$this->folder = $config['ImageResize']['folder'];
$this->quality = 85;
if (isset($config['ImageResize']['quality']))
$this->quality = $config['ImageResize']['quality'];
$this->width = 500;
if (isset($config['ImageResize']['width']))
$this->quality = $config['ImageResize']['width'];
$this->height = 300;
if (isset($config['ImageResize']['height']))
$this->quality = $config['ImageResize']['height'];
}
/**
* Triggered when Pico registers the twig template engine
*
* @see Pico::getTwig()
*
* @param Twig_Environment &$twig Twig instance
*
* @return void
*/
public function onTwigRegistered(Twig_Environment &$twig)
{
if (extension_loaded('imagick'))
$this->useImagick = true;
elseif (!extension_loaded('gd'))
exit('PHP extension "imagick" or "gd" is not installed, or not enabled in php.ini');
$twig->addFunction(new Twig_SimpleFunction('resize', array($this, 'resize')));
}
/**
* 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, '[galerija') !== 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) {
$p = explode(' ', $match)[1];
$pot = substr($p, 0, strlen($p) - 1);
$content = preg_replace(self::SHORTCODE, $this->getGalerija($pot), $content, 1);
}
}
}
}
protected function getGalerija($path) {
$slike = glob($path . DIRECTORY_SEPARATOR . '*');
$galerija = '<section class="galerija">' . "\n";
foreach ($slike as $s) {
if (is_file($s)) {
$thumb = $this->resize($s, $this->width, $this->height);
$lightbox = "data-lightbox=\"hue\"";
$galerija .= "<a href=\"$s\" $lightbox><img alt=\"$s\" src=\"$thumb\"></a>\n";
}
}
$galerija .= '</section>' . "\n";
return $galerija;
}
/*
protected function onContentLoading($file) {
var_dump('loading', $file);
}
*/
/**
* Resize an image, save it to a temporary folder and return new filename
* @param string $file
* @param int $width
* @param int $height
* @return string
*/
public function resize($file, $width = null, $height = null)
{
if (is_null($width) && is_null($height)) {
error_log(new InvalidArgumentException("Width and height can't both be null"));
return $file;
}
// determine resized filename
$newFile = sprintf('%s/%s/%s-%dx%d.jpg',
dirname($file),
$this->folder,
pathinfo($file, PATHINFO_FILENAME),
$width,
$height
);
// if we have already resized, just return the existing file
if (file_exists($newFile))
return $newFile;
// load file dimensions
$dimensions = getimagesize($file);
$originalWidth = $dimensions[0];
$originalHeight = $dimensions[1];
// calculate the final width and height (keep ratio)
$widthRatio = $originalWidth / ($width ?: 1);
$heightRatio = $originalHeight / ($height ?: 1);
if ($widthRatio < 1 || $heightRatio < 1) {
$resizedWidth = $originalWidth;
$resizedHeight = $originalHeight;
} else if ($widthRatio < $heightRatio) {
$resizedWidth = $width;
$resizedHeight = round($originalHeight / $widthRatio);
} else {
$resizedWidth = round($originalWidth / $heightRatio);
$resizedHeight = $height;
}
// make sure folder exists
if (!file_exists(pathinfo($newFile, PATHINFO_DIRNAME)))
mkdir(pathinfo($newFile, PATHINFO_DIRNAME));
// resize and save
if ($this->useImagick) {
$image = new Imagick($file);
$image->setImageCompressionQuality($this->quality);
$image->thumbnailImage($resizedWidth, $resizedHeight);
$image->writeImage($newFile);
} else {
$image = imagecreatefromstring(file_get_contents($file));
$newResource = imagescale($image, $resizedWidth, $resizedHeight);
imagejpeg($newResource, $newFile, $this->quality);
}
return $newFile;
}
}

2
themes/.gitignore vendored 100644
View File

@ -0,0 +1,2 @@
# You should add themes installed by Composer here
/default

5
themes/vihor/.gitignore vendored 100644
View File

@ -0,0 +1,5 @@
Session.vim
*.html
*.swp
*.swo
tags

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 Eike C. Kühn
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.

View File

@ -0,0 +1,77 @@
A very minimal theme for [Pico CMS](https://www.picocms.org), designed to help
simple blogs.
## Installation
For Pico CMS > 2.0:
* Download or clone the code and upload it to `themes/femto`.
* Edit `config/config.yml`, so it contains
```
theme: femto
```
* That's it!
## Demo
* You can find a live demo at <http://blog.pixelwoelkchen.de>
## Usage
### Structure
For things like Impressum just create a file `/impressum.md`.
Blog content goes into subfolders, either a single folder, e.g. `/blog/` or one
folder per topic. Make sure every folder has an `index.md` with **optional**
content (the theme will automagically display all posts as links).
So your folder structure may look like:
```
/index.md
/impressum.md
/blog/index.md
/blog/my_latest_craze.md
/blog/a_fancy_idea.md
/blog/my_first_post_sigh.md
...
```
or
```
/index.md
/impressum.md
/ideas/index.md
/ideas/my_latest_craze.md
/ideas/a_fancy_idea.md
/ideas/my_first_post_sigh.md
/notsobrilliant/index.md
/notsobrilliant/don_t_do_this.md
...
```
Content in a folder called `archive` will not be listed on the front page.
### Ordering first level pages
By default, the pages on the first level appear in alphabetical order in your navigation. If you wanted to change that behaviour you need to edit `config/config.yml` so it contains these lines:
```
pages_order_by_meta: order
pages_order_by: meta
```
Now you can add an `Order: NUMERICALVALUE` to each YAML-Header on your first level pages, *e.g.*:
```
/*
Title: Archive
Author: AUTHOR
Date: 19 September 2019
Order: 3
*/
Old stuff
```

View File

@ -0,0 +1 @@
.lb-loader,.lightbox{text-align:center;line-height:0;position:absolute;left:0}body.lb-disable-scrolling{overflow:hidden}.lightboxOverlay{position:absolute;top:0;left:0;z-index:9999;background-color:#000;filter:alpha(Opacity=80);opacity:.8;display:none}.lightbox{width:100%;z-index:10000;font-weight:400;outline:0}.lightbox .lb-image{display:block;height:auto;max-width:inherit;max-height:none;border-radius:3px;border:4px solid #fff}.lightbox a img{border:none}.lb-outerContainer{position:relative;width:250px;height:250px;margin:0 auto;border-radius:4px;background-color:#fff}.lb-outerContainer:after{content:"";display:table;clear:both}.lb-loader{top:43%;height:25%;width:100%}.lb-cancel{display:block;width:32px;height:32px;margin:0 auto;background:url(../images/loading.gif) no-repeat}.lb-nav{position:absolute;top:0;left:0;height:100%;width:100%;z-index:10}.lb-container>.nav{left:0}.lb-nav a{outline:0;background-image:url(data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==)}.lb-next,.lb-prev{height:100%;cursor:pointer;display:block}.lb-nav a.lb-prev{width:34%;left:0;float:left;background:url(../images/prev.png) left 48% no-repeat;filter:alpha(Opacity=0);opacity:0;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;-o-transition:opacity .6s;transition:opacity .6s}.lb-nav a.lb-prev:hover{filter:alpha(Opacity=100);opacity:1}.lb-nav a.lb-next{width:64%;right:0;float:right;background:url(../images/next.png) right 48% no-repeat;filter:alpha(Opacity=0);opacity:0;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;-o-transition:opacity .6s;transition:opacity .6s}.lb-nav a.lb-next:hover{filter:alpha(Opacity=100);opacity:1}.lb-dataContainer{margin:0 auto;padding-top:5px;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.lb-dataContainer:after{content:"";display:table;clear:both}.lb-data{padding:0 4px;color:#ccc}.lb-data .lb-details{width:85%;float:left;text-align:left;line-height:1.1em}.lb-data .lb-caption{font-size:13px;font-weight:700;line-height:1em}.lb-data .lb-caption a{color:#4ae}.lb-data .lb-number{display:block;clear:left;padding-bottom:1em;font-size:12px;color:#999}.lb-data .lb-close{display:block;float:right;width:30px;height:30px;background:url(../images/close.png) top right no-repeat;text-align:right;outline:0;filter:alpha(Opacity=70);opacity:.7;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.lb-data .lb-close:hover{cursor:pointer;filter:alpha(Opacity=100);opacity:1}

View File

@ -0,0 +1,303 @@
/* Typography */
/* reset inspired by http://meyerweb.com/eric/tools/css/reset/ */
html, body, div, span, h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, s, samp,
small, strong, sub, sup, var, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border-style: none;
border-width: 0;
font-size: 1;
font: inherit;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
font-family: Courier New;
font-size: 16px;
line-height: 1.3;
color: #3F3F3F;
box-sizing: border-box;
}
h1 {
font-weight: bold;
font-size: 1.8rem;
}
h2 {
font-weight: bold;
font-size: 1.4rem;
}
h3 {
font-weight: bold;
font-size: 1.2rem;
}
h4 {
font-weight: bold;
font-size: 1rem;
}
h5 {
font-weight: normal;
font-style: italic;
font-size: 1rem;
}
h6 {
font-weight: normal;
font-size: 1rem;
}
ol, ul {
margin-left: 2.5rem;
}
ol {
list-style-type: decimal-leading-zero;
}
ul {
list-style-type: circle;
}
h1, h2, h3, h4, h5, h6, table, ul, ol, img, p, blockquote, pre {
margin-bottom: 0.8rem;
}
ul ul, ol ol, ul ol, ol ul {
margin-bottom: 0;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
th, td {
vertical-align: top;
}
img {
border-style: none;
border-width: 0;
}
a, a:link {
text-decoration: underline;
color: #6ca2d8;
}
a:visited {
color: #a26cd8;
}
code, pre {
font-family: monospace;
font-size: 0.8rem;
background-color: #CCCCCC;
padding: 0.1rem;
border-radius: 0.1rem;
}
pre {
padding: 0.5rem;
}
q {
font-style: italic;
}
blockquote {
font-style: italic;
border-style: none none none solid;
border-width: 0.3rem;
border-color: #CCCCCC;
padding-left: 0.8rem;
}
/* Layout */
body {
width: 90%;
max-width: 800px;
margin: auto;
}
header {
/*box-shadow: 0 8px 8px -6px rgba(0, 0, 0, 0.4);*/
margin-bottom: 3rem;
/*position: sticky */;
top: 0;
background-color: #FFFFFF;
text-align: center;
}
@media screen and (min-width: 600px) {
.blog header {
margin: 0;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
}
nav ul {
margin: 0;
padding-bottom: 0.3rem;
}
nav li {
display: inline;
padding: 0 0.5rem;
}
nav li:first-child, nav li:last-child {
padding: 0;
}
body > header h1 {
font-size: 2rem;
margin-bottom: 0;
}
@media screen and (min-width: 600px) {
body > header h1 {
font-size: 2.2rem;
margin-bottom: 0;
}
body.blog > header h1 {
font-size: 4.6rem;
}
main header {
/* the difference between site-heading (2.2rem x 1.3) and page-heading (1.8rem x 1.3) */
padding-bottom: calc(0.4rem * 1.3);
margin-bottom: 0.8rem;
}
}
main header h1 {
/*display: inline;
padding-right: 0.5rem;*/
margin: 0;
}
body > header a,
body > header a:link,
body > header a:visited,
main.blog a,
main.blog a:link,
main.blog a:visited {
text-decoration: none;
color: #3F3F3F;
}
body > header nav a:hover,
body > header nav .active a,
.blog main a:hover {
font-weight: bold;
}
@media screen and (min-width: 600px) {
.blog main.blog {
position: absolute;
top: 85%;
height: 15%;
width: 90%;
max-width: 800px;
overflow: scroll;
}
}
main.blog ul {
margin-left: 0;
list-style-type: none;
}
main.blog a {
text-decoration: none;
font-weight: bold;
}
header {
padding-top: 2rem;
}
header > a {
display: flex;
flex-direction: column;
}
header img {
max-height: 20rem;
}
header h1 {
margin-top: 2rem;
margin-bottom: 2rem;
}
header nav {
margin-top: 2rem;
}
header nav li {
padding-left: 0;
padding-right: 0;
}
header nav li:not(:first-child):before {
content: '| ';
}
main p img {
width: 100%;
}
main header h1 {
text-align: left;
}
main > p,
main > ul {
margin-bottom: 1.5rem;
}
.galerija {
column-gap: .5rem;
column-count: 3;
}
.galerija > a {
display: block;
margin-bottom: .5rem;
}
.galerija > a > img {
margin: 0;
display: block;
width: 100%;
}

View File

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{% if meta.title %}{{ meta.title }} | {% endif %}{{ site_title }}</title>
{% if meta.description %}
<meta name="description" content="{{ meta.description|striptags }}" />
{% endif %}
{% if meta.robots %}
<meta name="robots" content="{{ meta.robots }}" />
{% endif %}
{% if current_page %}
<link rel="canonical" href="{{ current_page.url }}" />
{% endif %}
<link rel="stylesheet" href="{{ theme_url }}/css/style.css" type="text/css" />
</head>
<body class="">
<header>
<a href="{{ "index"|link }}">
<img src="{{ assets_url }}/slike/logo.svg" alt="Šišenska soseska 6 logotip">
<h1>
Samoorganizirana skupnost
</h1>
</a>
<nav role="region" tabindex="-1">
<ul>
{% for page in pages if page.title and not page.hidden %}
{% set page_depth = page.id|split('/')|length %}
{% if ((page_depth == 2) and (page.id ends with "/index") or (page_depth == 1 and (current_page.id != page.id or current_page.id != "index"))) %}
<li{% if page.id == current_page.id %} class="active"{% endif %}>
<a href="{{ page.url }}">{{ page.title }}</a>
</li>
{% endif %}
{% endfor %}
</ul>
</nav>
</header>
{% if current_page.id ends with "index" %}
{% set current_tag = current_page.id|split('/')[0] %}
<main class="blog">
{{ content }}
<ul>
{% for page in pages|sort_by("time")|reverse if page.title and not page.hidden %}
{% set page_depth = page.id|split('/')|length %}
{% set page_tag = page.id|split('/')[0] %}
{#
* display all pages in subfolders (depth: 2), that are not index pages for their subfolder (do not end with "index)
* display pages of all tags on the start page (current_page.id: "index")
* else display only the tag of the current index
* do not display pages from the archive (page_tag: "archive") on the start page
#}
{% if page_depth == 2 and (current_page.id == "index" or page_tag == current_tag) and not (page.id ends with "index") and not (page_tag == "archive" and current_page.id == "index") %}
<li>
<a href="{{ page.url }}">/ {{ page.date_formatted }} / {% if current_page.id == "index" %}{{ page_tag }} / {% endif %}{{ page.title }}</a>
</li>
{% endif %}
{% endfor %}
</ul>
</main>
{% else %}
<main>
<header>
{% set page_depth = current_page.id|split('/')|length %}
<h1>{{ meta.title }}</h1>
{% if page_depth > 1 %}
({{ meta.date_formatted }}, {{ meta.author }})
{% endif %}
</header>
{{ content }}
</main>
{% endif %}
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,83 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{% if meta.title %}{{ meta.title }} | {% endif %}{{ site_title }}</title>
{% if meta.description %}
<meta name="description" content="{{ meta.description|striptags }}" />
{% endif %}
{% if meta.robots %}
<meta name="robots" content="{{ meta.robots }}" />
{% endif %}
{% if current_page %}
<link rel="canonical" href="{{ current_page.url }}" />
{% endif %}
<link rel="stylesheet" href="{{ theme_url }}/css/style.css" type="text/css" />
<link rel="stylesheet" href="{{ theme_url }}/css/lightbox.min.css" type="text/css" />
</head>
<body class="">
<header>
<a href="{{ "index"|link }}">
<img src="{{ assets_url }}/slike/logo.svg" alt="Šišenska soseska 6 logotip">
<h1>
Samoorganizirana skupnost
</h1>
</a>
<nav role="region" tabindex="-1">
<ul>
{% for page in pages if page.title and not page.hidden %}
{% set page_depth = page.id|split('/')|length %}
{% if ((page_depth == 2) and (page.id ends with "/index") or (page_depth == 1 and (current_page.id != page.id or current_page.id != "index"))) %}
<li{% if page.id == current_page.id %} class="active"{% endif %}>
<a href="{{ page.url }}">{{ page.title }}</a>
</li>
{% endif %}
{% endfor %}
</ul>
</nav>
</header>
{% if current_page.id ends with "index" %}
{% set current_tag = current_page.id|split('/')[0] %}
<main class="blog">
{{ content }}
<ul>
{% for page in pages|sort_by("time")|reverse if page.title and not page.hidden %}
{% set page_depth = page.id|split('/')|length %}
{% set page_tag = page.id|split('/')[0] %}
{#
* display all pages in subfolders (depth: 2), that are not index pages for their subfolder (do not end with "index)
* display pages of all tags on the start page (current_page.id: "index")
* else display only the tag of the current index
* do not display pages from the archive (page_tag: "archive") on the start page
#}
{% if page_depth == 2 and (current_page.id == "index" or page_tag == current_tag) and not (page.id ends with "index") and not (page_tag == "archive" and current_page.id == "index") %}
<li>
<a href="{{ page.url }}">/ {{ page.date_formatted }} / {% if current_page.id == "index" %}{{ page_tag }} / {% endif %}{{ page.title }}</a>
</li>
{% endif %}
{% endfor %}
</ul>
</main>
{% else %}
<main>
<header>
{% set page_depth = current_page.id|split('/')|length %}
<h1>{{ meta.title }}</h1>
{% if page_depth > 1 %}
({{ meta.date_formatted }}, {{ meta.author }})
{% endif %}
</header>
{{ content }}
</main>
{% endif %}
</body>
<script src="{{ theme_url }}/js/lightbox-plus-jquery.min.js" type="text/javascript"></script>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,554 @@
/*!
* Lightbox v2.11.3
* by Lokesh Dhakar
*
* More info:
* http://lokeshdhakar.com/projects/lightbox2/
*
* Copyright Lokesh Dhakar
* Released under the MIT license
* https://github.com/lokesh/lightbox2/blob/master/LICENSE
*
* @preserve
*/
// Uses Node, AMD or browser globals to create a module.
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require('jquery'));
} else {
// Browser globals (root is window)
root.lightbox = factory(root.jQuery);
}
}(this, function ($) {
function Lightbox(options) {
this.album = [];
this.currentImageIndex = void 0;
this.init();
// options
this.options = $.extend({}, this.constructor.defaults);
this.option(options);
}
// Descriptions of all options available on the demo site:
// http://lokeshdhakar.com/projects/lightbox2/index.html#options
Lightbox.defaults = {
albumLabel: 'Image %1 of %2',
alwaysShowNavOnTouchDevices: false,
fadeDuration: 600,
fitImagesInViewport: true,
imageFadeDuration: 600,
// maxWidth: 800,
// maxHeight: 600,
positionFromTop: 50,
resizeDuration: 700,
showImageNumberLabel: true,
wrapAround: false,
disableScrolling: false,
/*
Sanitize Title
If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
This will free you to add html tags, such as links, in the caption.
If the caption data is user submitted or from some other untrusted source, then set this to true
to prevent xss and other injection attacks.
*/
sanitizeTitle: false
};
Lightbox.prototype.option = function(options) {
$.extend(this.options, options);
};
Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
};
Lightbox.prototype.init = function() {
var self = this;
// Both enable and build methods require the body tag to be in the DOM.
$(document).ready(function() {
self.enable();
self.build();
});
};
// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
// that contain 'lightbox'. When these are clicked, start lightbox.
Lightbox.prototype.enable = function() {
var self = this;
$('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
self.start($(event.currentTarget));
return false;
});
};
// Build html for the lightbox and the overlay.
// Attach event handlers to the new DOM elements. click click click
Lightbox.prototype.build = function() {
if ($('#lightbox').length > 0) {
return;
}
var self = this;
// The two root notes generated, #lightboxOverlay and #lightbox are given
// tabindex attrs so they are focusable. We attach our keyboard event
// listeners to these two elements, and not the document. Clicking anywhere
// while Lightbox is opened will keep the focus on or inside one of these
// two elements.
//
// We do this so we can prevent propogation of the Esc keypress when
// Lightbox is open. This prevents it from intefering with other components
// on the page below.
//
// Github issue: https://github.com/lokesh/lightbox2/issues/663
$('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
// Cache jQuery objects
this.$lightbox = $('#lightbox');
this.$overlay = $('#lightboxOverlay');
this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
this.$container = this.$lightbox.find('.lb-container');
this.$image = this.$lightbox.find('.lb-image');
this.$nav = this.$lightbox.find('.lb-nav');
// Store css values for future lookup
this.containerPadding = {
top: parseInt(this.$container.css('padding-top'), 10),
right: parseInt(this.$container.css('padding-right'), 10),
bottom: parseInt(this.$container.css('padding-bottom'), 10),
left: parseInt(this.$container.css('padding-left'), 10)
};
this.imageBorderWidth = {
top: parseInt(this.$image.css('border-top-width'), 10),
right: parseInt(this.$image.css('border-right-width'), 10),
bottom: parseInt(this.$image.css('border-bottom-width'), 10),
left: parseInt(this.$image.css('border-left-width'), 10)
};
// Attach event handlers to the newly minted DOM elements
this.$overlay.hide().on('click', function() {
self.end();
return false;
});
this.$lightbox.hide().on('click', function(event) {
if ($(event.target).attr('id') === 'lightbox') {
self.end();
}
});
this.$outerContainer.on('click', function(event) {
if ($(event.target).attr('id') === 'lightbox') {
self.end();
}
return false;
});
this.$lightbox.find('.lb-prev').on('click', function() {
if (self.currentImageIndex === 0) {
self.changeImage(self.album.length - 1);
} else {
self.changeImage(self.currentImageIndex - 1);
}
return false;
});
this.$lightbox.find('.lb-next').on('click', function() {
if (self.currentImageIndex === self.album.length - 1) {
self.changeImage(0);
} else {
self.changeImage(self.currentImageIndex + 1);
}
return false;
});
/*
Show context menu for image on right-click
There is a div containing the navigation that spans the entire image and lives above of it. If
you right-click, you are right clicking this div and not the image. This prevents users from
saving the image or using other context menu actions with the image.
To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
set pointer-events to none on the nav div. This is so that the upcoming right-click event on
the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
we set the pointer events back to auto for the nav div so it can capture hover and left-click
events as usual.
*/
this.$nav.on('mousedown', function(event) {
if (event.which === 3) {
self.$nav.css('pointer-events', 'none');
self.$lightbox.one('contextmenu', function() {
setTimeout(function() {
this.$nav.css('pointer-events', 'auto');
}.bind(self), 0);
});
}
});
this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
self.end();
return false;
});
};
// Show overlay and lightbox. If the image is part of a set, add siblings to album array.
Lightbox.prototype.start = function($link) {
var self = this;
var $window = $(window);
$window.on('resize', $.proxy(this.sizeOverlay, this));
this.sizeOverlay();
this.album = [];
var imageNumber = 0;
function addToAlbum($link) {
self.album.push({
alt: $link.attr('data-alt'),
link: $link.attr('href'),
title: $link.attr('data-title') || $link.attr('title')
});
}
// Support both data-lightbox attribute and rel attribute implementations
var dataLightboxValue = $link.attr('data-lightbox');
var $links;
if (dataLightboxValue) {
$links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
for (var i = 0; i < $links.length; i = ++i) {
addToAlbum($($links[i]));
if ($links[i] === $link[0]) {
imageNumber = i;
}
}
} else {
if ($link.attr('rel') === 'lightbox') {
// If image is not part of a set
addToAlbum($link);
} else {
// If image is part of a set
$links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
for (var j = 0; j < $links.length; j = ++j) {
addToAlbum($($links[j]));
if ($links[j] === $link[0]) {
imageNumber = j;
}
}
}
}
// Position Lightbox
var top = $window.scrollTop() + this.options.positionFromTop;
var left = $window.scrollLeft();
this.$lightbox.css({
top: top + 'px',
left: left + 'px'
}).fadeIn(this.options.fadeDuration);
// Disable scrolling of the page while open
if (this.options.disableScrolling) {
$('body').addClass('lb-disable-scrolling');
}
this.changeImage(imageNumber);
};
// Hide most UI elements in preparation for the animated resizing of the lightbox.
Lightbox.prototype.changeImage = function(imageNumber) {
var self = this;
var filename = this.album[imageNumber].link;
var filetype = filename.split('.').slice(-1)[0];
var $image = this.$lightbox.find('.lb-image');
// Disable keyboard nav during transitions
this.disableKeyboardNav();
// Show loading state
this.$overlay.fadeIn(this.options.fadeDuration);
$('.lb-loader').fadeIn('slow');
this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
this.$outerContainer.addClass('animating');
// When image to show is preloaded, we send the width and height to sizeContainer()
var preloader = new Image();
preloader.onload = function() {
var $preloader;
var imageHeight;
var imageWidth;
var maxImageHeight;
var maxImageWidth;
var windowHeight;
var windowWidth;
$image.attr({
'alt': self.album[imageNumber].alt,
'src': filename
});
$preloader = $(preloader);
$image.width(preloader.width);
$image.height(preloader.height);
windowWidth = $(window).width();
windowHeight = $(window).height();
// Calculate the max image dimensions for the current viewport.
// Take into account the border around the image and an additional 10px gutter on each side.
maxImageWidth = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - self.options.positionFromTop - 70;
/*
Since many SVGs have small intrinsic dimensions, but they support scaling
up without quality loss because of their vector format, max out their
size.
*/
if (filetype === 'svg') {
$image.width(maxImageWidth);
$image.height(maxImageHeight);
}
// Fit image inside the viewport.
if (self.options.fitImagesInViewport) {
// Check if image size is larger then maxWidth|maxHeight in settings
if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
maxImageWidth = self.options.maxWidth;
}
if (self.options.maxHeight && self.options.maxHeight < maxImageHeight) {
maxImageHeight = self.options.maxHeight;
}
} else {
maxImageWidth = self.options.maxWidth || preloader.width || maxImageWidth;
maxImageHeight = self.options.maxHeight || preloader.height || maxImageHeight;
}
// Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
// option than we need to size down while maintaining the aspect ratio.
if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
imageWidth = maxImageWidth;
imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
$image.width(imageWidth);
$image.height(imageHeight);
} else {
imageHeight = maxImageHeight;
imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
$image.width(imageWidth);
$image.height(imageHeight);
}
}
self.sizeContainer($image.width(), $image.height());
};
// Preload image before showing
preloader.src = this.album[imageNumber].link;
this.currentImageIndex = imageNumber;
};
// Stretch overlay to fit the viewport
Lightbox.prototype.sizeOverlay = function() {
var self = this;
/*
We use a setTimeout 0 to pause JS execution and let the rendering catch-up.
Why do this? If the `disableScrolling` option is set to true, a class is added to the body
tag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar is
hidden before we measure the document width, as the presence of the scrollbar will affect the
number.
*/
setTimeout(function() {
self.$overlay
.width($(document).width())
.height($(document).height());
}, 0);
};
// Animate the size of the lightbox to fit the image we are showing
// This method also shows the the image.
Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
var self = this;
var oldWidth = this.$outerContainer.outerWidth();
var oldHeight = this.$outerContainer.outerHeight();
var newWidth = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
function postResize() {
self.$lightbox.find('.lb-dataContainer').width(newWidth);
self.$lightbox.find('.lb-prevLink').height(newHeight);
self.$lightbox.find('.lb-nextLink').height(newHeight);
// Set focus on one of the two root nodes so keyboard events are captured.
self.$overlay.focus();
self.showImage();
}
if (oldWidth !== newWidth || oldHeight !== newHeight) {
this.$outerContainer.animate({
width: newWidth,
height: newHeight
}, this.options.resizeDuration, 'swing', function() {
postResize();
});
} else {
postResize();
}
};
// Display the image and its details and begin preload neighboring images.
Lightbox.prototype.showImage = function() {
this.$lightbox.find('.lb-loader').stop(true).hide();
this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
this.updateNav();
this.updateDetails();
this.preloadNeighboringImages();
this.enableKeyboardNav();
};
// Display previous and next navigation if appropriate.
Lightbox.prototype.updateNav = function() {
// Check to see if the browser supports touch events. If so, we take the conservative approach
// and assume that mouse hover events are not supported and always show prev/next navigation
// arrows in image sets.
var alwaysShowNav = false;
try {
document.createEvent('TouchEvent');
alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
} catch (e) {}
this.$lightbox.find('.lb-nav').show();
if (this.album.length > 1) {
if (this.options.wrapAround) {
if (alwaysShowNav) {
this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
}
this.$lightbox.find('.lb-prev, .lb-next').show();
} else {
if (this.currentImageIndex > 0) {
this.$lightbox.find('.lb-prev').show();
if (alwaysShowNav) {
this.$lightbox.find('.lb-prev').css('opacity', '1');
}
}
if (this.currentImageIndex < this.album.length - 1) {
this.$lightbox.find('.lb-next').show();
if (alwaysShowNav) {
this.$lightbox.find('.lb-next').css('opacity', '1');
}
}
}
}
};
// Display caption, image number, and closing button.
Lightbox.prototype.updateDetails = function() {
var self = this;
// Enable anchor clicks in the injected caption html.
// Thanks Nate Wright for the fix. @https://github.com/NateWr
if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
this.album[this.currentImageIndex].title !== '') {
var $caption = this.$lightbox.find('.lb-caption');
if (this.options.sanitizeTitle) {
$caption.text(this.album[this.currentImageIndex].title);
} else {
$caption.html(this.album[this.currentImageIndex].title);
}
$caption.fadeIn('fast');
}
if (this.album.length > 1 && this.options.showImageNumberLabel) {
var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
} else {
this.$lightbox.find('.lb-number').hide();
}
this.$outerContainer.removeClass('animating');
this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
return self.sizeOverlay();
});
};
// Preload previous and next images in set.
Lightbox.prototype.preloadNeighboringImages = function() {
if (this.album.length > this.currentImageIndex + 1) {
var preloadNext = new Image();
preloadNext.src = this.album[this.currentImageIndex + 1].link;
}
if (this.currentImageIndex > 0) {
var preloadPrev = new Image();
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
}
};
Lightbox.prototype.enableKeyboardNav = function() {
this.$lightbox.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
this.$overlay.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
};
Lightbox.prototype.disableKeyboardNav = function() {
this.$lightbox.off('.keyboard');
this.$overlay.off('.keyboard');
};
Lightbox.prototype.keyboardAction = function(event) {
var KEYCODE_ESC = 27;
var KEYCODE_LEFTARROW = 37;
var KEYCODE_RIGHTARROW = 39;
var keycode = event.keyCode;
if (keycode === KEYCODE_ESC) {
// Prevent bubbling so as to not affect other components on the page.
event.stopPropagation();
this.end();
} else if (keycode === KEYCODE_LEFTARROW) {
if (this.currentImageIndex !== 0) {
this.changeImage(this.currentImageIndex - 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(this.album.length - 1);
}
} else if (keycode === KEYCODE_RIGHTARROW) {
if (this.currentImageIndex !== this.album.length - 1) {
this.changeImage(this.currentImageIndex + 1);
} else if (this.options.wrapAround && this.album.length > 1) {
this.changeImage(0);
}
}
};
// Closing time. :-(
Lightbox.prototype.end = function() {
this.disableKeyboardNav();
$(window).off('resize', this.sizeOverlay);
this.$lightbox.fadeOut(this.options.fadeDuration);
this.$overlay.fadeOut(this.options.fadeDuration);
if (this.options.disableScrolling) {
$('body').removeClass('lb-disable-scrolling');
}
};
return new Lightbox();
}));

15
themes/vihor/js/lightbox.min.js vendored 100644

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long