Pico is a stupidly simple, blazing fast, flat file CMS.

Overview

Pico

License Version Build Status Libera.Chat Open Bounties on Bountysource

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

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):

$ 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 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 using GitHub's fork button. 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:

    $ 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:

    $ 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 as well as the Git repositories of Pico's default theme and the PicoDeprecated plugin. You can set up your workspace using Pico's Composer starter project 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:

    $ 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:

    $ 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:

    {
        "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:

    $ 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: Pico's core, Pico's default theme, the PicoDeprecated plugin and Pico's Composer starter project.

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

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:

$ 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 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, Pico's default theme and the PicoDeprecated plugin. Let Composer update your dependencies and you're ready to go.

$ 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. Please read the upgrade notes if you want to upgrade from Pico 1.0 to Pico 2.0. You can find officially supported plugins and themes on our website. A greater choice of third-party plugins and themes can be found in our Wiki on the plugins or themes 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. To get you started with creating a plugin or theme, please read the developer docs on our website.

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 Libera.Chat (logs). When you're experiencing problems with Pico, please don't hesitate to create a new Issue 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. 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 or reporting issues, but please take note of our contribution guidelines. 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 or themes page. You may also Submit it to our website, where it'll be displayed on the official plugin or theme pages!

  2. Documentation: We always appreciate people improving our documentation. You can either improve the inline user docs or the more extensive user docs on our website. You can also improve the docs for plugin and theme developers. Simply fork our website's Git repository from https://github.com/picocms/picocms.github.io, change the Markdown files and open a pull request.

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

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 or implement a feature, simply pledge a new bounty 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 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.

Comments
  • Customization Redesign & Portfolio

    Customization Redesign & Portfolio

    Redesigned Customization page using Webpaint's Portfolio style.

    Viewable here: Themes and Plugins

    This PR is both for the page itself and for the portfolio framework that generates it.

    Also note that it contains currently unmerged changes from #352 that are unrelated to this PR. Actual changes begin at Implemented Portfolio and Revamped Customization. https://github.com/picocms/Pico/pull/358/commits/8819d4379aea0814e1bae513660cc65abdba0bb3

    Previously discussed in #352.

    Areas to improve on:

    • [x] Customizable "Launch Site" Button Text.
      • [x] What should the text be on customization? Download? Launch Site? View on GitHub? (since I think all but NotePaper go to GitHub).
    • [x] Better utilization of Meta text in existing tiles...
    • [x] Separate Plugins and Themes
    • [x] Improve Javascript on portfolio-detail-view.
    • [x] Multiple categories for themes/plugins - Started, but always room for improvements / more
      • For Themes: Single-page, Static Website, Blog-Style, etc.
      • For Plugins: Blogging, Social, Developer, etc
    • [x] Better representation of Plugins (especially when too abstract for a screenshot)
      • [x] Possible Style: "muted", gray puzzle piece background with persistent overlay text, but only turns green on hover.
      • [x] Initial Styles and Effect
      • [x] Better Puzzle Piece graphic.
    • [x] Use Jekyll "Collections" to separate each theme and plugin into its own file.
      • [x] Migrate Heading and Description to content
        • [x] ~~Migrate Heading~~
          • Markdownified Heading instead, since it's not contiguous with the Description.
          • Also, it's used for the Overlay, so it needs to be in an isolated variable for that.
        • [x] Migrate Description
      • [x] Provide backwards compatibility with YAML method for non-collection based portfolio pages.
      • [x] Provide a blank YAML template that contributors can fill out to easily add their content.
        • [x] Include submission guidelines / readme with things like screenshot resolution and location.
        • [x] Fork and PR instructions? ~~This is probably out-of-scope.~~ As Links.
      • [x] Move images into collection
        • [x] Remove "Theme" from the names of theme screenshots, as it's redundant now.
        • ~~Remove "Default Theme" images. Maybe re-purpose them elsewhere.~~
        • ~~Use these images for the About Page, instead of its own.~~
    • [x] a tags in the info section should be white, not green.
    • ~~Captions for carousel items?~~ Probably not worth the effort, since we already have a content area.
    • [x] Escape all variables that are vulnerable to apostrophes.
    • ~~Provide "Documentation" on how to use gallery and portfolio.~~ "Unnecessary"
      • ~~Don't forget about things like info._blank, page.portfolio.categories, include categories=variable and other examples that may not be represented on the current page.~~
    • [x] Fix whitespace on either side of : in the Item-Details <span>.
    • [x] Customize or slow carousel.
      • [x] Slowed
    • [x] Second, text-focused, pop-up content area for Plugins page.
    • [x] Fix odd cut-off on right edge.
    • [x] Update About page URLs ~~(and image locations)~~
    • [x] Add styles for portfolio-detail-view code
    • [x] Better implementation of ~~plugin~~ defaultThumbnail styles trigger
    • [x] Merge new styles with regular styles.
    • [x] Correct image paths (and any others) with {{ site.github.url }}. Remove leading / from paths.
    • [x] Change myCarousel ID to entry-{{ forloop.index0 }}-carousel or something similar.
    • [x] Check commented JS from https://github.com/picocms/Pico/pull/358/commits/e3cd95b4fe3a30d8a3aa82c8db9c38d9d53843fa
    • [x] Use the "active item" class to make active item stay lit.
    • [x] Don't break the styles for "standalone" overlay images
    • [x] Make sure that the bg color transitions are located in the right CSS file (pico.css) for consistency with other styles.
    • [x] IE8 Compatible Styles (https://github.com/picocms/Pico/pull/358#issuecomment-247850979)
    • [x] Change meta to description
    • [x] New blank info lines implementation.
    • ~~Find a replacement for the None category? (created when I removed multi-page)~~
    • [x] Create Theme/Code image for "Plus" tile.
    • [x] Bigger plugin content (excerpts or whole readme's)
    • [x] Standardize Description (meta) punctuation.
    • [x] Set "Contribute" tile layout.
    • [x] Change name of layout variable.
    • [x] Image/List Layout Problem (Card View)
    • [x] Contribute Tile Text
    • [x] Getting Started Section
    • [x] Revise Docs Contribute section
    • [x] Recreate defaultThumbnail Images as SVG
    • [x] Create Plugin-Specific Contribute Tile
    • [ ] Clean and Upload Source Files
    • [x] Replace Default Theme images with high-res plugin graphic

    • Investigate odd YAML behavior that is treating my categories as an array instead of a string. For now, I'm treating this variable as an array (and maybe converting the syntax) since it probably should be an array. It was just confusing because I was expecting a string of HTML ID's separated by spaces. For comparison, description is correctly treated as a string (otherwise it'd be a spaceless jumble of letters).
    description: Google Analytics for Pico with basic options.<br><br>This plugin will automatically add the Google Analytics tracking script to the < head > section of each page generated by Pico.
    categories: plugin developer. Why is this an array and not a string?
    

    Is creating:

    description: "Google Analytics for Pico with basic options.<br><br>This plugin will automatically add the Google Analytics tracking script to the < head > section of each page generated by Pico."
    categories: ["plugin","developer.","Why","is","this","an","array","and","not","a","string?"]
    
    type: Feature status: Resolved info: Website 
    opened by mayamcdougall 146
  • About Page & Fancybox / Portfolio Template

    About Page & Fancybox / Portfolio Template

    Reissuing this PR since @PhrozenByte goofed. :wink:

    View the current page at: http://smcdougall.github.io/Pico/about/

    Old Discussion at: #349


    • [x] Remove "Expert Webmaster".
      • [x] Keep "But what does that even mean"?
    • [x] Bottleneck on large sites, Overkill on small sites.
    • [x] Workflow gallery should tell a story.
      • [x] Add index.twig and DummyPlugin.php screenshots.
    • [x] Use theme images from #358.
    • [x] Link to Markdown basics and syntax.
    • [x] For Markdown example, use actual content, italics, bold, links, images, lists, and headings.
    • [x] Dashes for dates.
    • [x] Actual content for YAML to match Markdown.
      • [x] Revise Content
      • Remember to reuse this example for a tutorial later on.
    • [x] Associative array of social links and multi-line description examples for YAML.
      • [x] Add social buttons to content-sample.
        • See bf1663cc1c6f31626c7274c3221411c7956f703f
        • Add this idea to the cookbook. (Or at least make a proper note for later).
    • [x] Add a line about "stupidly simple" applying to Pico's code base as well (customization section, see #355).
    • [x] Remove "Themes" quotes.
    • [x] Remove "Theme" from all themes and file names, same as planned for #358.
    • [x] Add more themes, like Identity and Clean Blog.
      • [x] Remove Simple Sidebar.
    • [x] Expand Plugin Section with Details.
    • [x] Add a note (or more) about Pico being Open Source and MIT licensed!
    • [x] "Blazing fast" should be mentioned in the "not a turn-key" section.
    • [x] Add a line about overcomplicated CMS interfaces.
    • [x] Restore accidentally removed CSS chunk.
    • [x] Remove redundant image versions.
    • [x] Compare and merge Fancybox styles with original styles.
    type: Feature status: Resolved info: Website 
    opened by mayamcdougall 85
  • Pico 1.0 development & release process

    Pico 1.0 development & release process

    The phpDocumentor folder of the gh-pages branch (introduced with Pico 1.0 resp. #260) should be automatically generated when both a release is published (create a distinct phpDocumentor folder for any minor release - see http://semver.org/) and someone commits to the master branch.

    By the way, our ToDo list for the final 1.0.0 release:

    • [x] Add "Build & Release process" to CONTRIBUTING.md, added in bef1502
    • [x] Automatically generate phpDoc, added in bef1502
    • [x] Website: Add "What's new" to upgrade.md, added in #276
    • [x] Add a README.md for the gh-pages branch, added in https://github.com/picocms/Pico/commit/66bcb181cc82d760573a00d2bf472e4c7fb900c9
      • Don't forget to link to http://themes.iki-bir.com/webpaint/multipage/full/
    • [x] Remove the Pico 0.X Plugins section from website with the final release of Pico 1.0.0
    • [x] Update Pico Wiki
    • [x] Wait for more feedback :smile:

    Deferred:

    • ~~New default theme using Bootstrap 3 or (provided it has been released already) Bootstrap 4~~
    • ~~Website: Overhaul _development/ collection resp. development.md~~
    • ~~Website: Improve _cookbook/ collection resp. cookbook.html~~
      • ~~Decide where to put links to it (inline user docs? website user docs? website dev docs?) and actually create the links~~
    pri: High type: Discussion 
    opened by PhrozenByte 51
  • Improve Nginx Documentation

    Improve Nginx Documentation

    Pico's Nginx documentation is practically non-existent. It should be improved and provide some detailed examples equivalent to what is provided for Apache in .htaccess.

    A discussion has already begun on https://github.com/picocms/Pico/commit/d8f916691809b19b05104906ee3700c5cf3f8407. It seems there is a lot to consider when using a Regex Location Block for Pico's rewriting, as Nginx will only use the first matching rule it finds. Since a typical Nginx setup also uses Regex to detect when to send a page to PHP, a misconfiguration can easily break PHP detection altogether.

    The solution seems to be placing the PHP Location Block above any Pico rewrite blocks, that way any requests to index.php get properly matched.

    In the current example, location ~ ^/pico(.*) matches both the Page ID you're trying to rewrite (eg /pico/page) and also the index itself (at /pico/index.php, resolved from the URI /pico/?page).

    Since /pico/index.php matches location ~ ^/pico(.*), Nginx has succeeded in finding a match and will not move on to match it to location ~ \.php$. The PHP page gets served as a download file instead of interpreted by PHP.

    type: Discussion 
    opened by mayamcdougall 49
  • Pico 2.0

    Pico 2.0

    At the moment this PR is "the mother of WORK IN PROGRESS"... :smile:

    Actually I don't have much to show yet, I'm primarily trying to point to PhrozenByte/pico-admin. I decided to start with development of the admin plugin, because it may give us some more ideas for Pico ~~1.1~~ 2.0 (renamed 2016-12-12). Please use this PR to give feedback about the plugin (otherwise the discussion may get a bit fragmented).

    @theshka: Do you think it makes sense to ask @picocms once again to convert his/her account to an GitHub Organization? This will allow us to use picocms/pico-admin instead... This is particularly meaningful when bearing in mind that I'm planning to create multiple repositories (picocms/pico-composer, picocms/pico-pagination, picocms/pico-tags, picocms/pico-feeds, picocms/pico-i18n, picocms/pico-search)...

    Most importantly we have to make a decision about replacing Pico's default theme (see #297) with Pico 2.0 or to defer this until Pico 3.0. What are your opinions about this? (especially, but not solely, @theshka) My objections are primarily related to BC, but I have not formed a opinion about this yet. Please also refer to the "Decisions to make" section below.

    Refer to http://picocms.org/phpDoc/pico-1.1/ for updated phpDoc class docs.

    Plannings for the more distant future (i.e. Pico 3.0) can be found in #317. ~~At the moment it's planned to let Pico 3.0 follow Pico 2.0 (i.e. no Pico 2.1).~~

    As always, feedback is highly appreciated!

    #edit: This release has been renamed to Pico 2.0 (previously Pico 1.1) on 2016-12-12, however we can't rename the branch, thus development will still happen on the pico-1.1 branch.

    Planned changes to Pico's core

    • [x] Add Pico::VERSION constant
    • [x] Add includePico() function to prevent access to $this/Pico object in config/plugin files (use composer's includeFile() function instead?)
    • [x] #330: Implement a modular config
      • [x] Instead of using *.config.php files, use *.yml files to configure Pico. YAML is much easier to understand, more user friendly and (at least a bit) more error-tolerant, but still very powerful. Don't break BC by letting PicoDeprecated still read config/config.php.
    • [x] Allow Markdown configuration (Parsedown doesn't support much configuration, probably it will be limited to the optional usage of Parsedown instead of ParsedownExtra, Parsedown::setBreaksEnabled(), Parsedown::setMarkupEscaped() and Parsedown::setUrlsLinked())
    • [x] Create a (de facto never updated) pico-composer project to allow composer users to install Pico as dependency and benefit from composer's update mechanism; see @gilbitron's BaunCMS/Baun repo
      • ~~Think about how users can easily install plugins with dependencies when they aren't using composer, but a pre-bundled release~~
    • [x] #299: Integrated 404 Not Found page
    • [x] Add Pico::is404Content() method returning true when Pico::$requestFile doesn't exist (i.e. on404ContenLoading has been triggered)
    • [x] Remove PicoParsePagesContent
    • [x] Remove PicoExcerpt
    • [x] Don't sort pages when a unknown $config['pages_order_by'] is specified -- breaks BC
    • [x] Trigger the onMetaHeaders event only once, cache results of Pico::getMetaHeaders().
    • [x] Update README.md to use a screenshot hosted on our website
    • [x] Let users sort pages by arbitrary meta values (like Pico's sort_by Twig filter)
    • Overhaul Pico::parseFileMeta(). Preserve BC with PicoDeprecated.
      • [x] Don't lower unregistered meta headers on the first level unsolicited (e.g. SomeNotRegisteredKey: foobar in the YAML Frontmatter should result in $meta['SomeNotRegisteredKey'], not $meta['somenotregisteredkey']).
      • [x] Don't compare registered meta headers case insensitive, rather allow registering multiple meta headers to result in the same meta value by flipping Pico::$metaHeaders
      • [x] Let users explicitly set the formatted date in the YAML Frontmatter (e.g. date_formatted: Friday, 1st of December, 2000)
    • [x] Add a tree structure for all known pages

    Planned changes to Pico's plugin system

    • [x] Allow Pico plugins to trigger custom events
    • [x] Add onSinglePageLoading event (new preliminary event to onSinglePageLoaded)
    • [x] When changing the $page parameter of the onSinglePageLoaded event to null, don't add this page to $pages (keeping $page['sub/page'] = null makes no sense, thus no BC break)
    • [x] Add plugin API versioning (new DummyPlugin::API_VERSION constant with Pico's major.minor version describing which API version the plugin expects; if the constant doesn't exist, assume 1.0); this allows us to overhaul the plugin event system in the future without breaking BC
      • [x] #318: Add onParsedownRegistered event and pass $parsedown (instance of Parsedown) to allow extending erusev/parsedown
      • [x] Replace onTwigRegistration event with onTwigRegistered and pass $twig (instance of Twig_Environment), remove $twig parameter from onPageRendering event
    • [x] Let PicoDeprecate differentiate between legacy levels (i.e. always enable the plugin to e.g. read config.php in Pico's root dir, but trigger deprecated events only when plugins of a specific legacy level are present)
    • [x] Allow to manually load plugins (i.e. add Pico::loadPlugin() method)
    • [x] Allow Pico plugins to be installed through composer.json
    • ~~Support multiple plugin dirs~~
    • ~~Add hook/event for Pico::getPageUrl()~~
    • [x] Add more events to Pico::readPages(), similar to the events of the current page
    • [x] Order plugins (execution order matters!) by evaluating their dependencies. Older plugins implicitly depend on PicoDeprecated. See tsort, marcj/topsort.php, haberco/topological-sort-php.
    • [x] Add a event between onPagesLoading and onPagesLoaded passing the unsorted pages array (e.g. onPagesDiscovered).
      • Also remove the $currentPage, $nextPage and $previousPage parameters from the onPagesLoaded event, fire a separate event to "publish" them
    • [x] Load plugins from plugins/<plugin name>.php (non-recursive) and plugins/<plugin name>/<plugin name>.php (the class file must be named after the directory) only. Plugins with multiple classes may need to register an autoloader on their own. Also see #203 -- breaks BC

    Planned changes to Pico's UI (themes, Twig, routing, …)

    • [x] #347: Drop the "index" part of URLs
    • ~~Support multiple theme dirs~~
    • [x] Make theme_url configurable; the default value should support that Pico::$themesDir is a arbitrary deep sub path of dirname($_SERVER['SCRIPT_FILENAME']) (i.e. index.php resp. httpdocs folder); otherwise fallback to ~~themes (and not~~ basename(Pico::$themesDir)~~)~~
    • ~~Use Twig blocks in default theme (i.e. {% block replace_or_extend_me %}...{% endblock %})~~
    • [x] #305: Allow access to query string in Twig templates (i.e. $_GET superglobal)
    • [x] Support REQUEST_URI-based URL rewriting to allow a much simpler webserver configuration
    • [x] Use flexbox in Pico's default theme to pin the footer to the bottom of the window
    • [x] Drop ~~{{ site_title }} and~~ {{ rewrite_url }} in favour of ~~their~~ its {{ config.* }} equivalent~~s~~. ~~Rename {{ current_page }} to {{ page }}.~~ Drop {{ is_front_page }} (use {% if page.id == "index" %} instead). Preserve BC with PicoDeprecated.
    • [x] Calculate the previous and next page for all pages (doesn't increase calculation time, array_search() in Pico::discoverCurrentPage() walks through all pages anyway). ~~Drop {{ next_page }} and {{ previous_page }} in favor of their resulting {{ page.* }} equivalents (see above). Preserve BC with PicoDeprecated.~~
    • [x] Add only pages of the first level to the page navigation by default (e.g. page.md and sub/index.md, but not sub/page.md) -- breaks BC (more or less...)
    • [x] Ignore all pages starting with a _ for the page navigation by default (e.g. _meta.md and all files in _collection/ are skipped) -- breaks BC (more or less...)

    Website & Documentation

    See picocms/picocms.github.io#18

    • [x] Add Bountysource (merge enhancement/bountysource branch)

    New official plugins/themes

    The following plugins won't defer the release of Pico 2.0:

    • Blog features
    • Robots (serve a robots.txt and sitemap.xml)
    • ☐ Contact form
    • ☐ https://github.com/picocms/Pico/issues/376#issuecomment-265972068: Excerpts
    • ☐ #297: Bootstrap 4 theme
    • Editor/Page Admin
    status: Resolved type: Release 
    opened by PhrozenByte 44
  • Pico 1.0

    Pico 1.0

    First of all: Why? The sourcecode of existing forks like BaunCMS and PhilleCMS isn't "stupidly simple" anymore... You can read Picos sourcecode from top to down and even copy&paste programmers will understand what's going on. It's all about "understanding at first glance".

    Most important second: All changes are 100% backward compatible.

    I considered writing something own, but then caught up with Pico. The only thing missing was clean code - Picos concept, workflow and code really is "stupidly simple", but very powerful. Actually I just did a code refactoring. I don't want to fork Pico and I won't do it even if you reject my changes (obviously I'll still use it myself :smile:).

    This should be v1.0 ready. I recommend to release it as v1.0-beta, waiting some weeks to test it on a large user basis (I'll fix all appearing problems) and finally releasing it as Pico 1.0 :smile:

    Please give me a hint if you'll merge this, I'll then update the homepage (gh-pages branch), changelog.txt etc. accordingly.

    What did I do?

    • Fixes #79, Closes #93, Fixes #99, Closes #103, Closes #116, Fixes #140, Fixes #158, Closes #171, Fixes #210, Closes #241, Closes #244, Closes #246, Fixes #248, Fixes #249, Fixes #250, Fixes #251, Fixes #253, Fixes #257, Fixes #267
    • The code is now documented, code styling follows PSR. Pico superficially grows from 400 LoC to 1000 LoC, when removing all comments, Pico grows from 300 LoC to 500 LoC, mostly because of new public getter and helper methods (= 100 LoC) and PSR code styling. As said, there are no big functional changes, it's more a code refactoring.
    • The new routing system now works out-of-the-box (even without rewriting) with any webserver using the QUERY_STRING routing method. Internal links now look like ?sub/page, rewriting to basically remove the ? is still possible and recommended. Contrary to Pico 0.9 every webserver should work just fine. Pico 0.9 required working URL rewriting, so if you want to use old plugins/themes/contents, a working rewrite setup may still be required. If you're not using the default .htaccess, you must update your rewrite rules to follow the new principles. Internal links in content files are declared with %base_url%?sub/page. Internal links in templates should be declared using the new link filter (e.g. {{ "sub/page"|link }}), what basically calls Pico::getPageUrl(). You musn't change anything if you setup rewriting (what was required in Pico 0.9...), so I assume this to be fully backward compatible :smile:
    • I've implemented a whole new plugin system while maintaining full backward compatibility. See the class docs of IPicoPlugin for details. The new event system supports plugin dependencies as well as some new events. It was necessary to reliably distinct between old and new events, so all events were renamed. The new PicoDeprecated plugin is crucial for backward compatibility, it's enabled on demand. Refer to its class docs for details.
    • I completely overhauled the sorting algorithms, so sorting by date now works as expected by using timestamps and index files are listed before their sub pages (so e.g. sub/index.md is listed before sub/foo.md).
    • Inaccessible files (like sub.md while sub/index.md exists) are now excluded from the pages list.
    • Now supporting per-directory 404.md files (if there is a sub/404.md, this file is displayed in favour of the global 404.md file, when e.g. the non-existing sub/notexisting.md is requested)
    • The file extension of content files is now configurable.
    • Heads up! #158 is fixed only when the PicoParsePagesContent plugin isn't enabled. It's disabled by default, but gets automatically enabled with PicoDeprecated as soon as an old plugin is loaded. This is necessary to maintain backward compatibility. You can still disable it manually by executing $pico->getPlugin('PicoParsePagesContent')->setEnabled(false); or adding $config['PicoParsePagesContent.enabled'] = false; to your config.php.
    • The meta headers are now parsed by the YAML component of the Symfony project (see #116) and it isn't necessary to register new headers during the onMetaHeaders event anymore. The implicit availability of headers is supposed to be used by users and pure (!) theme developers only, so we're still instructing plugin developers to register their headers. See the commit message of 7537159 for more detail.
    • Meta header variables are now accessible in content files using %meta.*%, so you mustn't repeat yourself. You can now put an excerpt into the description meta variable and output the same content at the beginning of the article using %meta.description% (see index.md for a example).
    • Initialization of Pico now works completely different: rather than defining constants (which are probably conflicting with other applications...), Pico now expects its paths to be passed as parameters to the constructor. The constructor doesn't start Picos processing anymore, you now have to call the Pico::run() method, which returns the parsed page contents instead of directly echoing them. The PicoDeprecated plugin defines the now deprecated constants ROOT_DIR, LIB_DIR etc., so old plugins can still use them. Those constants are defined before reading config.php in Picos root folder, so upgrading users usually aren't bothered with e.g. a PHP Notice: Use of undefined constant ROOT_DIR - assumed 'ROOT_DIR' error when using ROOT_DIR in their config.php (so: no BC break). New users don't need the constants anymore, relative paths are now always interpreted to be relative to Picos root dir, so $config['content_dir'] = 'content'; is always sufficient (previously this was depending on the webserver config). All these changes are supposed to improve Picos interoperability with other applications and allows developers to integrate Pico in other applications, therefore I additionally added a new Pico::setConfig() method to even make the use of a config.php optional.
    • The Twig cache dir doesn't exist anymore. The provided directory never was helpful, in most cases one still had to make the directory writable for the webserver, so it never worked out-of-the-box.
    • All index.html files were removed; instead of helping users to secure their website, they create a false sense of security. This leads to situations like "I'm receiving a empty website when navigating to the content folder, thus everything must be safe!"
    • I decided explicitly to NOT implement pages as objects ("stupidly simple", see above). Anyway, I think plugin developers shouldn't manipulate data in "wrong" events, this could lead us to unexpected behaviour. Sure, plugin developers still can do this, we're passing variables by reference, but it's not that obvious. I even thought about dereferencing the values after the corrosponding event was called, but that would be backward incompatible. What do you think?
    • How to fix the "composer problem" discussed in #221 and #223? There's a very simple solution: When creating a release on GitHub (after you've pushed the tag) you can upload "binaries". Simply execute composer locally, create a ZIP archive and upload the result as "binary".
    • I didn't care much about #110, #238, #239 and #240 because I simply don't need these features. But I think they are good ideas and the core should support this. Just my 2 cents :smile:
    • #201 and #231 should be closed - this can easily be achieved with plugins. In fact, there are already plugins adding support for these features...
    • Imo distinct documentations for users, theme designers and plugin devs is MUCH more important than unit tests... Pico is a project with just about 500 LoC (+ comments), such a manageable project doesn't necessarily require unit tests - they are nice to have, but that's it. Documentation should be the top priority!
    • Note: I'm no english native speaker. Maybe someone should look through my code comments :smile:
    status: Resolved type: Release 
    opened by PhrozenByte 35
  • About Page

    About Page

    Work in progress for an About/Overview type page. Something users can read to learn what Pico is before moving on to the Docs (which begin with "Install" instructions).

    http://smcdougall.github.io/Pico/about/

    Currently, any notes I have are inline. Any bulleted items are notes. I'll remove them as I fill out the page more.

    status: Conflict type: Enhancement info: Website 
    opened by mayamcdougall 33
  • Nginx Documentation

    Nginx Documentation

    Rough draft is complete. Still needs further revision and editing, but I wanted to share what I've gotten done so far.

    View-able at http://smcdougall.github.io/Pico/nginx/

    Any input is appreciated. :smiley:

    status: Resolved type: Enhancement info: Website 
    opened by mayamcdougall 30
  • 🎉 First beta release of Pico 2.0

    🎉 First beta release of Pico 2.0

    After 21 months and 157 commits, we're happy to announce the release of the first beta of Pico's second major release! 🎉

    Click here to download Pico v2.0.0-beta.1: pico-release-v2.0.0-beta.1.tar.gz

    Screenshot of Pico 2.0

    Pico 2.0 introduces some major new features, but unfortunately also comes with some BC-breaking changes. However, as always, we tried to maintain BC whenever possible using Pico's official PicoDeprecated plugin. If you've spared to use features, that are deprecated since Pico 1.0, you should be fine. Since we wanted to finally release the first beta, we unfortunately didn't have time to write a changelog or upgrade instructions yet. We'll publish them with the second beta. Nevertheless, the upgrade process should be pretty straight-forward and is basically the same as with Pico 1.0.

    Even though the changes are pretty immense, we are aware of the fact that developing Pico 2.0 took a pretty long time. In the future we'll try to release Pico more often and in smaller pieces.

    For a complete list of changes, please refer to Pico 2.0's main pull request #334. You can find Pico 2.0's source code in the pico-1.1 branch. Please note that you can now find both Pico's official PicoDeprecated plugin and Pico's official default theme in separate repos.

    As always, feedback is highly appreciated! ❤️

    type: Notice info: Stale 
    opened by PhrozenByte 29
  • Pico is dead... probably

    Pico is dead... probably

    If you've come here for support, I suggest you take a look at the history of how effective that is likely to be. Just go down the list and see how many responses you find, and make your assumptions on how likely your problem is to get solved here accordingly.

    In my case, I even went so far as to contact the dev directly, and was summarily rebuffed and told this was the place... which it clearly isn't.

    Pico, I have to suggest, is dead. Indeed, I now rather suspect it was an ego thing the dev did to see how many links and how much ranking he could get. Disappointing, really... this could have been a killer app.

    opened by Snip1 28
  • Update Website & Documentation

    Update Website & Documentation

    This is a long-live issue to track and discuss wished updates of our website resp. documentation.

    Website

    • [x] Add GitHub, Twitter and IRC icon to website
    • [x] Add current version number to Download page
    • [ ] Overhaul and extend _development/ collection resp. development.md
    • [ ] Improve _cookbook/ collection resp. cookbook.html
      • Decide where to put links to it (inline user docs? website user docs? website dev docs?) and actually create the links
    • [x] #358: Use Webpaint portfolio ("Showcase") to re-implement customization.md with extended information about and screenshots of all plugins and themes
      • Use distinct data files (_data/plugins.md and _data/themes.md) to make adding plugins/themes much easier
      • See phpDoc.html and _data/phpDoc.md as a reference
    • [ ] Look through the wiki to include more plugins and themes on Pico's website
    • [ ] Decide where to put large source files, see https://github.com/picocms/Pico/pull/358#issuecomment-257721007 and following
    • [x] Add a sane way to add "Read more..." pages (e.g. upgrade.md or nginx.md (#343))
    • [x] #309: Add a phpDoc overview page
    • [x] #345: Add extended nginx documentation
    • [x] #349 + #352: Add "About Us" page
    • [ ] #368: Create a "advanced asset handling" howto (allow access to certain files (matched by MIME type) in the content/ folder)
    • Decision to make: Replace <h2> headers with a floating box in the TOC-reserved space on the left, see https://github.com/picocms/Pico/pull/349#issuecomment-220638496 for an example

    Documentation

    • [x] Add IRC to the "Getting Help" section
    • [x] Add the "What information do we need" paragraph of the Issues section of our CONTRIBUTING.md to the "Getting Help" section
    • [ ] Explain how to use Pico with composer require picocms/Pico and provide a appropriate index.php
      • Maybe create a distinct pico-composer project instead? See #317
    • [ ] Pico 1.1: Update nginx rewrite rules in user docs/nginx details page
    type: Idea info: Meta status: Deferred 
    opened by PhrozenByte 25
  • Map filter doesn't work as documented by Twig

    Map filter doesn't work as documented by Twig

    According to the Twig documentation, this example should display "Bob Smith, Alice Dupond":

    {% set people = [
        {first: "Bob", last: "Smith"},
        {first: "Alice", last: "Dupond"},
    ] %}
    
    {{ people|map(p => "#{p.first} #{p.last}")|join(', ') }}
    

    However, it throws the following error:

    [Sun Mar 20 23:32:27.248660 2022] [php:error] [pid 12] [client 172.17.0.1:64928] PHP Fatal error:  Uncaught TypeError: Illegal offset type in isset or empty in /var/www/localhost/htdocs/pico/vendor/picocms/pico/lib/PicoTwigExtension.php:285
    Stack trace:
    #0 /var/www/localhost/htdocs/pico/vendor/picocms/pico/lib/PicoTwigExtension.php(152): PicoTwigExtension::getKeyOfVar()
    #1 /var/www/localhost/htdocs/pico/vendor/twig/twig/src/Environment.php(497) : eval()'d code(40): PicoTwigExtension->mapFilter()
    #2 /var/www/localhost/htdocs/pico/vendor/twig/twig/src/Template.php(453): __TwigTemplate_5751ea7c50eca1750bc3952b6ce22d8d4c2142ae3b68d7ee69add82bb55ba61d->doDisplay()
    #3 /var/www/localhost/htdocs/pico/vendor/twig/twig/src/Template.php(420): Twig\\Template->displayWithErrorHandling()
    #4 /var/www/localhost/htdocs/pico/vendor/twig/twig/src/Template.php(432): Twig\\Template->display()
    #5 /var/www/localhost/htdocs/pico/vendor/twig/twig/src/TemplateWrapper.php(47): Twig\\Template->render()
    #6 /var/www/localhost/htdocs/pico/vendor/twig/twig/src/Environment.php(384): Twig\\TemplateWrapper->render()
    #7 /var/www/localhost/htdocs/pico/vendor/picocms/pico/lib/Pico.php(514): Twig\\Environment->render()
    #8 /var/www/localhost/htdocs/pico/index.php(33): Pico->run()
    #9 {main}
      thrown in /var/www/localhost/htdocs/pico/vendor/picocms/pico/lib/PicoTwigExtension.php on line 285
    

    The second example doesn't throw an error:

    {% set people = {
        "Bob": "Smith",
        "Alice": "Dupond",
    } %}
    
    {{ people|map((last, first) => "#{first} #{last}")|join(', ') }}
    

    However, instead of displaying "Bob Smith, Alice Dupond" it displays "Smith, Dupond".

    What I'd really like to do is map a list of tags to lowercase, e.g.:

    {% set tags = ['Foo', 'Bar', 'Blah'] %}
    
    {{ tags | map(t => "#{t}" | lower) | join(', ') }}
    

    I've tried several variations, including:

    • {{ tags | map(t => t | lower) | join(', ') }}
    • {{ tags | map(t => t | lower()) | join(', ') }}
    • {{ tags | map(t => t.lower) | join(', ') }}
    • {{ tags | map(t => t.lower()) | join(', ') }}
    • {{ tags | map(t => t | lower(t)) | join(', ') }}
    • {{ tags | map(t => t.strtolower) | join(', ') }}
    • {{ tags | map(t => t.strtolower()) | join(', ') }}

    None of these work -- the output is always "Foo, Bar, Blah" -- yet none throw an error. It seems that anything I pass to the map filter it simply ignored. I wonder if the filter is being replaced by Pico's own map filter, which works as described here:

    You can return all values of a given array key using the map filter (e.g. {{ pages|map("title") }} returns all page titles).

    Any ideas?

    type: Bug 
    opened by dave-kennedy 3
  •  NOTICE: PHP message: PHP Fatal error:  Unparenthesized

    NOTICE: PHP message: PHP Fatal error: Unparenthesized

    Hi, PicoCMS not working with highers PHP versions (in my case 8.0). Error which I reciving:

    NOTICE: PHP message: PHP Fatal error:  Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /var/www/html/vendor/twig/twig/lib/Twig/Node.php on line 42
    

    As far as I found, PHP 7.4+ changing this: https://www.php.net/manual/en/migration74.deprecated.php

    I think, this should be fixed because older versions are comming to end of life. image

    or maybe I missed something, and someone could help me.

    Thanks for amaizing work!

    type: Bug pri: High info: Pinned 
    opened by dawidmachon 10
  • Pico's Markdown Filter doesn't throw errors

    Pico's Markdown Filter doesn't throw errors

    Mentioned in #600.

    Pico's markdown filter doesn't throw any errors. This is a different behavior to Twig's built in filters, which are very verbose and will print errors directly on the page if used incorrectly.

    I accidentally fed the markdown filter an array a couple times and it just silently failed. 🤦🏻‍♀️

    No idea if Pico's other filters are like this or not, but it's probably worth investigating.

    type: Bug 
    opened by mayamcdougall 2
  • 404 on an _page replaces that page in the Pages Array with 404's contents

    404 on an _page replaces that page in the Pages Array with 404's contents

    Mentioned in #600

    When you attempt to navigate to an underscore page (eg _meta), the entry for that page in the pages array is replaced with the contents of your 404 page (either the internal one or 404.md).

    This can lead to some odd behavior if your theme is trying to access that underscore page, and also overall doesn't seem like it should be happening. 😉

    (Ugh, and yes, that 👆🏻was the most readable issue title I could come up with... it took me a whole five minutes. 🤦🏻‍♀️)

    type: Bug 
    opened by mayamcdougall 2
  • Theming Discussion

    Theming Discussion

    @PhrozenByte don't feel the need to read or answer this all at once. I just didn't see the point of making multiple issues on very similar topics.

    I've been laser focused on updating an old theme this week (Freelancer). It's gonna be pretty good. 😉

    But, in the process I've had a few issues I wanted to discuss, especially considering the pico-theme.yml standard (and our as far as I can tell lack of documentation on it). (Okay, I lied here, it was like one question. 😂)

    I've had a bunch of random thoughts and questions related to theming as I've been going, but I figured I'd hold them until the end and see what I couldn't just answer myself.

    This is just meant to be a thread for a general discussion, not a singular issue. So, let's get into it.


    1. The pico-theme.yml's meta-headers section doesn't seem to support arrays for having multiple levels of depth. Not sure whether this is an oversight or by design. The use case I'd describe here would be:

    I have several meta-headers named portfolio_title, portfolio_divider, portfolio_nav and portfolio_disabled.

    These could be written:

    Portfolio Title: Recent Projects
    Portfolio Divider: clock
    Portfolio Nav: Projects
    Portfolio Disabled: false
    

    But I feel they'd look better as:

    Portfolio:
      Title: Recent Projects
      Divider: clock
      Nav: Projects
      Disabled: false
    

    It's fine if you've decided you just don't want Pico to have multi-level arrays of metadata, but I have been using them to simplify the YML on my themes for quite a while, lol. 😂

    What are your thoughts on this? Is it an idea you absolutely hate or might it have potential?

    Obviously in the meantime I can still accomplish this without registering them in pico_theme.yml (that's how I've been developing it anyway), they'll just have mandatory lower-case names like portfolio > title.

    On a related side note, I almost opened this issue a few days ago to discuss how weird and inconsistent it feels when, if you don't register meta headers, they behave somewhat opposite of the built-in ones:

    We typically write the meta headers with the first letter capitalized. When you do this, it then only presents itself as lowercase in Twig (eg Title becomes title). But if you have an unregistered custom header, the opposite becomes true. You write it with the first letter capitalized and it is only available the way you wrote it (Image stays Image).

    I know why this is the case... it just feels odd and like it could be something of a trap for new users.


    1. I've noticed that on some of my old themes (that I haven't got around to fixing yet), whitespace has started being removed by Twig. This has led to text beingcrushedtogether in some cases. Just curious if you knew when and why this behavior changed (besides the obvious "sometime between Pico 1 and 2 😂).

    1. Is Twig's raw filter generally "safe" to use in Pico? I've been using it on this project more than I intended too because if I do anything to manipulate strings before printing them they become escaped, which doesn't work so well for HTML tags. 😅

    It doesn't really seem like an issue considering our usual attitude toward security (that any access to Pico's files is the same level of security, and if someone had access to put something malicious in the markdown anyway, then they could probably already do a lot worse without caring about the Twig template, etc).


    1. Pico's markdown filter doesn't seem to throw errors. This is a very different behavior to Twig's built in filters (which complain. A lot.). I accidentally fed it an array a couple times and it just silently fails. Compare this to Twig throwing an "Array to string conversion" notice every time I accidentally forget to json_encode my debug code (🤦🏻‍♀️), and I just feel like it should say something when you do it wrong. No idea if Pico's other filters are like this or not.

    Do you think they should print errors for debugging?


    1. It seems like having a _meta.md file is now an "officially endorsed" concept (at least in the docs). A lot of themes (Freelancer included) ignore index.md in favor of giving a custom front-page (or single-page) experience.

    I like the idea of having theme-related/site-wide metadata in _meta.md (and it's what I've used this time), however, it does leave an awkward index.md-sized hole to be filled. 😉

    Specifically, I mean you still require an empty index.md in this case, even if you're not using it, both for Pico's content folder detection and for preventing 404's (with the content dir manually specified in config.yml).

    I guess this is mostly an opinion thing, but it leaves me wondering what approach is better in this case. If I use index.md for the metadata, it's at least used for something. The instructions wouldn't need a step that says "make sure you have an index.md, even if it's empty". What do you think? Would you rather themes suggest a blank index or that they forgo _meta.md in favor of sticking everything in index.md?


    1. 404-ing on _meta.md behaves weird.

    So, this theme rewrite is heavily dependent on _meta.md containing all its variables (don't worry, I've hard-coded defaults, so it all looks very professional even with an empty _meta.md 😉). I decided to test that Pico supposedly denies access to _ files, and I discovered an odd behavior. When it 404's on trying to access _meta.md... it also denies access to all the metadata I was accessing on _meta.md, causing my very customized site to revert to the demo data I've included.

    Presumably this is happening because there's a shortcut somewhere in Pico that goes "I need to access this page. Oh, good, I'm already on it, I'll just look at current_page instead." Except its current page has been redirected to the 404 page. 🤦🏻‍♀️

    Just kind of an odd quirk. I don't need it fixed or anything, just thought I'd bring it to your attention. 😂


    1. Kind of surprised that using pages.pageid instead of pages["pageid"] still works. I'm assuming this is still just a legacy, compatibility behavior, since I remember you telling me a long time ago that it was preferred to use pages["pageid"] instead. I guess that's all, it was just kind of a "Huh... neat" moment. 🤷🏻‍♀️

    1. This one should probably be a separate discussion entirely. Do you have any good suggestions for maintaining a large patch set against an upstream? The Twig bits I've written for Freelancer are exhaustively extensive. I've spent over a week on it now (while the Themes Gallery project hangs in limbo 😒). It just keeps going, lol. I need to stop adding things to it.

    The original theme is written with Bootstrap, in SCSS and PUG. Since the Pico port is based on the compiled version, I can't exactly just grab the original repo as an upstream (though, maybe I could potentially pull from their compiled dist folder somehow).

    At the moment, I plan to remove the upstream on my existing port (it was based on an out-of-date Jekyll version), and just replace the entire repo with the new version and sort this out later.

    For future updates of Bootstrap and Freelancer though, it'd be nice to have a solution in place to be able to bring the changes forward without essentially starting from scratch every time.

    At the moment, the best idea I'd have would be to diff the old and new Freelancer versions and simply use that to get a rough idea of what changed between versions. Or, you know, see if I could somehow make a patch file based on the diff between my version and theirs, but I think the changes might be too extensive for that (or at the very least, I might have to merge all my includes back into one mega-template). Either way, I don't see it being as easy as "fetch and merge upstream". 😩

    So, if there's a fairly obvious solution you think I should look into, let me know. Not looking for a full solution, just a nudge in the right direction if you have any ideas. 😅


    Alright, this has gone on long enough. I'm so ready to move on from this theme, but I keep finding one more thing to do.

    And I promise the next one will be a "regular" theme. This one's just been needing some attention. 😉

    type: Discussion info: Pinned 
    opened by mayamcdougall 13
  • Pico 3.0

    Pico 3.0

    Since the issues with our old dependencies kinda got out of hand lately (see #528, #534 and 8a44584291685e5e163765ed6578c184c991794e), it's time to kick-start development of Pico 3.0 :tada:

    Major changes are going to be updated dependencies (Twig 3.0+ and Symfony YAML 5.0+) and lifting the requirements to PHP 7.2.5+. We definitely won't implement all of #317, but rather focus on lazy page discovery and loading. We definitely won't overhaul Pico's event system now, neither will we implement caching or i18n support with Pico 3.0 (maybe with Pico 3.1? :thinking:).

    We'll also think about changing Pico's Markdown parser. Unfortunately Parsedown's development process got very unreliable lately. However, there's a lot to consider - not just BC, but also performance-wise (Parsedown is by far the most performant Markdown parser I know). Thus there's no decision made yet. Other opinions are very welcome on this topic! Also see e.g. #576

    Pico 3.0 is a major release, thus it will break BC. As always, Pico's official PicoDeprecated plugin (Pull Request) will do its best to maintain BC. However, be warned, we'll explicitly drop all pre-v1.0 and v1.0 behaviour that affects performance.

    As always, feedback is highly appreciated! :heart:


    Ideas

    • #581: Pico bundle package with various official plugins

    Release of Pico v3.0.0-alpha.1

    Since the mentioned issues are affecting live installations already, I decided to release a intermediate Pico v3.0.0-alpha.1. This release upgrades Pico's dependencies to Twig 2.12, Symfony YAML 3.4, Parsedown 1.7.4 and Parsedown Extra 0.8.1 for now (requiring PHP 7.0.8+). Both are still officially supported and are basically drop-in replacements, since they maintain BC on a best-effort basis ("best-effort" means "should work for most users", there can still be issues for some users). Pico v3.0.0-alpha.1 is meant as a fast solution for all people experiencing the issues mentioned above.

    Feedback about Pico v3.0.0-alpha.1 is highly appreciated, especially regarding issues! :+1:


    Related links


    Major changes

    • Require PHP 7.0.8+
    • Update dependencies: Twig 2.12, Symfony YAML 3.4, Parsedown 1.7.4 and Parsedown Extra 0.8.1; this is just an interim step, we'll update to Twig 3.0+ and Symfony YAML 5.0+ later

    Resolves #528, Resolves #534 Fixes #602, Fixes #603, Fixes #608

    info: Feedback Needed type: Release info: Work In Progress 
    opened by PhrozenByte 13
Releases(v3.0.0-alpha.2)
  • v3.0.0-alpha.2(Dec 24, 2020)

  • v2.1.4(Aug 29, 2020)

  • v2.1.3(Jul 10, 2020)

  • v2.1.2(Apr 10, 2020)

  • v3.0.0-alpha.1(Mar 29, 2020)

  • v2.1.1(Dec 31, 2019)

  • v2.1.0(Nov 25, 2019)

    This is Pico 2.1 - small, but mighty! :tada: :confetti_ball:

    If you want to upgrade to Pico 2.1, simply follow the usual upgrade instructions for minor releases. Installing Pico is as easy as before. You can find more extensive upgrade instructions as well as a complete list of all additions and changes in Pico's upgrade docs - even though this is a minor release, it's still a lot of new and improved stuff! :heartbeat:

    You might also want to give Pico CMS for Nextcloud 1.0 a try - it's now an official part of Pico. You can find more info at picocms.org.


    For a complete list of all changes compared to Pico 2.0, please refer to Pico's CHANGELOG.md (including the beta release v2.1.0-beta.1).

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.1.0.tar.gz(793.89 KB)
    pico-release-v2.1.0.zip(1.18 MB)
  • v2.1.0-beta.1(Nov 4, 2019)

    First beta release of Pico v2.1. This is a pre-release!

    * [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,
            cehcking 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] Introduce API version 3
    * [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 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 PHP class docs
    * [Changed] Various small improvements
    * [Removed] Remove superfluous `base_dir` and `theme_dir` Twig variables
    * [Removed] Remove `PicoPluginInterface::__construct()`
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.1.0-beta.1.tar.gz(792.31 KB)
    pico-release-v2.1.0-beta.1.zip(1.18 MB)
  • v2.0.5-beta.1(Jan 3, 2019)

  • v2.0.4(Dec 17, 2018)

  • v2.0.3(Dec 3, 2018)

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.0.3.tar.gz(765.72 KB)
  • v2.0.2(Aug 12, 2018)

  • v2.0.1(Jul 29, 2018)

  • v2.0.0(Jul 1, 2018)

    This is Pico's second major release! :tada:

    For a complete list of all changes compared to Pico 1.0, please refer to Pico's CHANGELOG.md (including the three beta releases v2.0.0-beta.1, v2.0.0-beta.2 and v2.0.0-beta.3).

    Please refer to Pico's new upgrade docs to find out what has changed and how to upgrade your Pico 1.0 installation to Pico 2.0.

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.0.0.tar.gz(763.44 KB)
  • v2.0.0-beta.3(Apr 7, 2018)

    Third beta release of Pico's second major release. This is a pre-release!

    * [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`
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.0.0-beta.3.tar.gz(756.70 KB)
  • v2.0.0-beta.2(Jan 21, 2018)

    Second beta release of Pico's second major release. This is a pre-release!

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.0.0-beta.2.tar.gz(737.93 KB)
  • v2.0.0-beta.1(Nov 5, 2017)

    First beta release of Pico's second major release. This is a pre-release!

    * [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)
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v2.0.0-beta.1.tar.gz(419.79 KB)
  • v1.0.6(Jul 25, 2017)

  • v1.0.5(May 1, 2017)

  • v1.0.4(Oct 4, 2016)

  • v1.0.3(May 11, 2016)

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v1.0.3.tar.gz(350.95 KB)
  • v1.0.2(Mar 16, 2016)

  • v1.0.1(Feb 27, 2016)

  • v1.0.0(Dec 24, 2015)

    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! :santa:

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v1.0.0.tar.gz(343.90 KB)
  • v1.0.0-beta.2(Nov 30, 2015)

    * [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
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v1.0.0-beta.2.tar.gz(341.93 KB)
  • v1.0.0-beta.1(Nov 6, 2015)

    Note: This changelog only provides basic information about the enormous changes introduced with Pico 1.0.0-beta.1. Please refer to the UGPRADE section of the docs for details.

    * [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] #93, #158: Pico doesn't parse all content files anymore; moved to
                `PicoParsePagesContent` plugin, but still impacts performance;
                Note: This means `$page['content']` isn't available anymore, but
                usually the new `$page['raw_content']` is suitable as replacement.
    * [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] Moving Pico's excerpt feature to `PicoExcerpt` plugin
    
    Source code(tar.gz)
    Source code(zip)
    pico-release-v1.0.0-beta.1.tar.gz(8.39 MB)
  • v0.9(Apr 29, 2015)

    • [New] Default theme is now mobile-friendly
    • [New] Description meta now available in content areas
    • [Changed] content folder is now content-sample
    • [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
    • [Fixed] Pico now only removes the 1st comment block in .md file
    • [Fixed] Issue wherein the alphabetical sorting of pages did not happen
    Source code(tar.gz)
    Source code(zip)
    pico-release-v0.9.tar.gz(308.87 KB)
  • 0.8(Oct 23, 2013)

    • [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 depreciated
    • [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
    Source code(tar.gz)
    Source code(zip)
  • 0.7(Sep 4, 2013)

    • [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
    Source code(tar.gz)
    Source code(zip)
Pico is a stupidly simple, blazing fast, flat file CMS.

Pico is a stupidly simple, blazing fast, flat file CMS.

null 15 Jul 30, 2022
Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS

Grav Grav is a Fast, Simple, and Flexible, file-based Web-platform. There is Zero installation required. Just extract the ZIP archive, and you are alr

Grav 13.6k Jan 4, 2023
True Multisite, Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

True Multisite, Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

null 4 Oct 28, 2022
Herbie is a simple Flat-File CMS- und Blogsystem based on human readable text files

Herbie is a simple Flat-File CMS- und Blogsystem based on human readable text files

HERBIE 63 Nov 13, 2022
FlatPress is a lightweight, easy-to-set-up flat-file blogging engine.

[flatpress.org] [Support forum] [Wiki] [GitHub] [Mastodon] [Twitter] [Changelog] [Contributors] Welcome to FlatPress! FlatPress is a lightweight, easy

FlatPress 143 Dec 22, 2022
HTMLy is an open source Databaseless Blogging Platform or Flat-File Blog prioritizes simplicity and speed written in PHP

HTMLy is an open source Databaseless Blogging Platform or Flat-File Blog prioritizes simplicity and speed written in PHP. HTMLy can be referred to as Flat-File CMS either since it will also manage your content.

Dan 858 Jan 6, 2023
Mecha is a flat-file content management system for minimalists.

Mecha CMS Mecha is a flat-file content management system for minimalists. Front-End The default layout uses only Serif and Mono fonts. Different opera

Mecha 133 Jan 1, 2023
Feindura - Flat File Content Management System

feindura - Flat File Content Management System Copyright (C) Fabian Vogelsteller [frozeman.de] published under the GNU General Public License version

Fabian Vogelsteller 39 Dec 30, 2022
Statamic 3 - the flat-first, Laravel + Git powered CMS designed for building beautiful, easy to manage websites

Statamic 3 - the flat-first, Laravel + Git powered CMS designed for building beautiful, easy to manage websites

Statamic 600 Jan 4, 2023
GetSimple CMS - a flatfile CMS that works fast and efficient and has the best UI around, it is written in PHP

GetSimple CMS is a flatfile CMS that works fast and efficient and has the best UI around, it is written in PHP.

null 370 Dec 30, 2022
Amila Laravel CMS - Free, open-source Simple Bootstrap Laravel CMS

Simple Bootstrap Laravel CMS. Support Laravel 8.x Can integrate into any existing Laravel project. Only add few database tables with prefixes, not affect your existing database tables. Support Laravel 7.x & Laravel 6.x & Laravel 5.x & MySql & PostgreSql - Amila Laravel CMS

Alex Zeng 96 Sep 6, 2022
Azuriom is a modern, reliable, fast and secure game CMS.

Azuriom Azuriom is the next generation game CMS, it's free and open-source, and is a modern, reliable, fast and secure alternative to existing CMS so

Azuriom 359 Jan 4, 2023
A flexible and fast Cms built with Symfony and Vuejs.

GreenCheap CMS A modular and lightweight CMS made with Symfony and Vuejs components GreenCheap works with PHP 8 version. In this case, lower versions

GreenCheap 57 Oct 29, 2022
Azuriom - a modern, reliable, fast and secure game CMS.

Azuriom is the next generation game CMS, it's free and open-source, and is a modern, reliable, fast and secure alternative to existing CMS so you can have the best web experience possible.

Azuriom 281 May 5, 2022
Flextype is an open-source Hybrid Content Management System with the freedom of a headless CMS and with the full functionality of a traditional CMS

Flextype is an open-source Hybrid Content Management System with the freedom of a headless CMS and with the full functionality of a traditional CMS. Building this Content Management System, we focused on simplicity. To achieve this, we implemented a simple but powerful API's.

Flextype 524 Dec 30, 2022
PHPVibe Open source video CMS / Video Sharing CMS / Youtube Api v3 / Video Embeds

PHPVibe Video CMS Free Video Sharing CMS The modern choice of design inspired by Youtube and a social videos sharing module that may just cut it for y

MediaVibe 71 Dec 18, 2022
NukeViet 132 Nov 27, 2022
BaiCloud-cms is a powerful open source CMS that allows you to create professional websites and scalable web applications. Visit the project website for more information.

BaiCloud-cms About BaiCloud-cms is a powerful open source CMS that allows you to create professional websites and scalable web applications. Visit the

null 5 Aug 15, 2022
Baicloud CMS is a lightweight content management system (CMS) based on PHP and MySQL and running on Linux, windows and other platforms

BaiCloud-cms About BaiCloud-cms is a powerful open source CMS that allows you to create professional websites and scalable web applications. Visit the

null 5 Aug 15, 2022