| Index: README.md |
| =================================================================== |
| --- a/README.md |
| +++ b/README.md |
| @@ -1,75 +1,135 @@ |
| -# adblockplus.org web content # |
| +# CMS # |
| -The web content of the adblockplus.org domain is generated automatically from |
| -the files in this repository. |
| +We use this CMS for [adblockplus.org](https://github.com/adblockplus/web.adblockplus.org/) |
| +and related websites. It converts a directory with content data into static |
| +files. You are free to use it for other projects but please keep in mind that we |
| +make no stability guarantees whatsoever and might change functionality any time. |
|
Sebastian Noack
2015/03/12 09:27:51
Really worth pointing this out here? Isn't it the
Wladimir Palant
2015/03/12 16:40:01
No. Most our projects are explicitly developed for
|
| -## Testing your changes ## |
| +## How to use ## |
| -You can easily test your changes to these files locally. What you need: |
| +### Running the test server ### |
| + |
| +The test server will convert your content directory on the fly, your changes |
| +will become visible immediately. To run it you need: |
| * Python 2.7 |
| * [Flask](http://flask.pocoo.org/), [Jinja2](http://jinja.pocoo.org/) and |
| [Markdown](https://pypi.python.org/pypi/Markdown) modules (can be installed by |
| running `easy_install Flask Jinja2 Markdown` from the command line) |
| * A current copy of the |
| - [sitescripts repository](https://hg.adblockplus.org/sitescripts/) (can be |
| - downloaded from the web or cloned via |
| - `hg clone https://hg.adblockplus.org/sitescripts/`) |
| + [cms repository](https://github.com/adblockplus/cms/) (can be |
|
Sebastian Noack
2015/03/12 09:27:51
This README goes into the CMS repo, right? So any
Wladimir Palant
2015/03/12 16:40:01
Because repositories like web.adblockplus.org will
|
| + [downloaded as ZIP file](https://github.com/adblockplus/cms/archive/master.zip) |
| + or cloned via `git clone https://github.com/adblockplus/cms.git`) |
| -Run the following command from the directory of the sitescripts repository: |
| +Run the following command from the directory of the `cms` repository: |
|
Sebastian Noack
2015/03/12 09:27:51
How about making runserver.py run from everywhere,
Wladimir Palant
2015/03/12 16:40:01
Done.
|
| - python -m sitescripts.cms.bin.test_server www_directory |
| + python runserver.py www_directory |
| -Here `www_directory` should be replaced by the directory of this repository. |
| -This will start a local web server on port 5000, e.g. you can open the about |
| -page as [http://localhost:5000/en/about](http://localhost:5000/en/about). |
| +Here `www_directory` should be replaced by the path to your content directory. |
| +This will start a local web server on port 5000, e.g. the page the page |
| +`pages/example.md` will be accessible under `http://localhost:5000/en/example`. |
| -## Configuration ## |
| +Note that the test server is inefficient and shouldn't be run in production. |
| +There you should generate static files as explained below. |
| -Repository configuration is stored in the `settings.ini` file. The following |
| -sections can be defined: |
| +### Generating the standalone test server ### |
| + |
| +The standalone test server is a single binary, without any further dependencies. |
| +It can be copied to another system and will no longer require Python or any of |
| +its modules. In order to generate the standalone test server you need all the |
| +prerequisites required to run the test server and |
| +[PyInstaller](https://github.com/pyinstaller/pyinstaller/wiki). PyInstaller can |
| +be installed by running `easy_install pyinstaller`. |
| + |
| +Run the following command from the directory of the `cms` repository: |
| + |
| + pyinstaller runserver.spec |
| + |
| +If successful, this will put the standalone test server into the `dist` |
| +directory. |
| + |
| +### Generating static files ### |
| + |
| +On your production server you should convert the content directory into static |
| +files. To do that you need: |
| + |
| +* Python 2.7 |
| +* [Jinja2](http://jinja.pocoo.org/) and |
| + [Markdown](https://pypi.python.org/pypi/Markdown) modules (can be installed by |
| + running `easy_install Jinja2 Markdown` from the command line) |
| +* A current copy of the |
| + [cms repository](https://github.com/adblockplus/cms/) (can be |
| + [downloaded as ZIP file](https://github.com/adblockplus/cms/archive/master.zip) |
| + or cloned via `git clone https://github.com/adblockplus/cms.git`) |
| + |
| +Run the following command from the directory of the `cms` repository: |
| + |
| + python -m cms.bin.generate_static_pages www_directory target_directory |
| + |
| +Here `www_directory` should be replaced by the path to your content directory. |
| +`target_directory` is the path where static files will be placed.. |
| + |
| +## Content structure ## |
| + |
| +Currently, the following directories of your content directory will be |
| +considered: |
| + |
| +* `filters`: Custom Jinja2 filters |
| +* `includes`: Various include files |
| +* `locales`: Localization files |
| +* `pages`: User-visible pages |
| +* `static`: Static content |
| +* `templates`: Page layout templates |
| + |
| +There should also be a `settings.ini` file with configuration. |
| + |
| +All of these are explained in more detail below. |
| + |
| +### Configuration (settings.ini) ### |
| + |
| +The following sections can be defined in `settings.ini`: |
| * `[general]`: following settings should be listed here: |
| * `defaultlocale`: The fallback locale, to be used whenever no localized |
| page/strings can be found for a locale. |
| * `defaultpage`: the default page which is displayed by the server if the URL |
| doesn't contain a page name. Note that while the test server will consider |
| that setting automatically, the real server might need to be configured |
| accordingly. |
| * `[langnames]`: defines the language names correspoding to particular language |
| codes. |
| * `[rtl]`: any language codes listed here are treated as right-to-left languages. |
| The values of the settings are ignored. |
| * `[locale_overrides]`: every entry defines that a page should use a different |
| locale file, not the one matching its name (to be used when multiple pages |
| share localization data). |
| -## Locales ## |
| +### Localization files ### |
| The language-specific data is stored in the `locales` directory. Each language |
| -(identified by its locale code) is given a subdirectory here. The `json` files |
| +(identified by its locale code) is given a subdirectory here. The `.json` files |
| contain localizable strings using the following format: |
| { |
| "stringid": { |
| "message": "Translated string", |
| "description": "Optional string description" |
| }, |
| ... |
| } |
| Any other files are considered localizable files and will be available on the |
| server unchanged. This is useful for images for example: a language-dependent |
| image can be placed into the `locales/en` directory and a German version |
| of the same image into the `locales/de` directory. E.g. the file |
| `locales/en/foo.png` will be available on the server under the URL `/en/foo.png`. |
| -## Pages ## |
| +### Pages ### |
| The pages are defined in the `pages` directory. The file extension defines the |
| format in which a page is specified and won't be visible on the web server. |
| The page name is prepended by the locale code in the URL, e.g. `pages/foo.md` |
| can be available under the URLs `/en/foo` and `/de/foo` (the English and German |
| versions respectively). Regardless of the format, a page can define a number of |
| settings using the following format: |
| @@ -92,17 +152,17 @@ The following tag inserts an include fil |
| format): |
| <? include foo ?> |
| Include files should be placed into the `includes` directory of the repository. |
| In the case above the contents of `includes/foo.md` or `includes/foo.tmpl` will |
| be inserted (whichever is present). |
| -### Markdown format (md) ### |
| +#### Markdown format (md) #### |
| This format should normally be used, it allows the pages to be defined using the |
| [Markdown](http://daringfireball.net/projects/markdown/syntax) syntax. Raw HTML |
| tags are allowed and can be used where Markdown syntax isn't sufficient. The |
| [Attribute Lists](http://pythonhosted.org/Markdown/extensions/attr_list.html) |
| extension is active and allows specifying custom attributes for the generated |
| HTML tags. |
| @@ -114,23 +174,23 @@ look for `<a>...</a>` blocks in the stri |
| to the page `foopage`, the second will become a link to `http://example.com/`. |
| Any content between `<head>` and `</head>` tags will be inserted into the head |
| of the generated web page, this is meant for styles, scripts and the like. |
| Other pages should be linked by using their name as link target (relative links), |
| these links will be resolved to point to the most appropriate page language. |
| Embedding localizable images works the same, use the image name as image source. |
| -### Raw HTML format (raw) ### |
| +#### Raw HTML format (raw) #### |
| This format is similar to the Markdown format but uses regular HTML syntax. |
| No processing is performed beyond inserting localized strings and resolving |
| links to pages and images. This format is mainly meant for legacy content. |
| -### Jinja2 format (tmpl) ### |
| +#### Jinja2 format (tmpl) #### |
| Complicated pages can be defined using the |
| [Jinja2 template format](http://jinja.pocoo.org/docs/templates/). Automatic |
| escaping is active so by default values inserted into the page cannot contain |
| any HTML code. Any content between `<head>` and `</head>` tags will be inserted |
| into the head of the generated web page, everything else defined the content of |
| the page. |
| @@ -147,27 +207,36 @@ Following custom filters can be used: |
| * `translate(string, locale=None)`: retrieves a string from a locale file. |
| Unless a locale is specified the locale file matching the page name is used. |
| * `linkify(url)`: generates an `<a href="...">` tag for the URL. If the URL is |
| a page name it will be converted into a link to the most appropriate page |
| language. |
| * `toclist(html)`: extracts a list of headings from HTML code, this can be used |
| to generate a table of contents. |
| -## Static files ## |
| +### Static files ### |
| Any files located in the `static` directory will be available on the server |
| unchanged. The file `static/css/foo.css` will be available under the URL |
| `/css/foo.css`. |
| -## Templates ## |
| +### Templates ### |
| The templates specified in the `templates` directory specify the overall |
| structure that is common for all pages. These templates should have the file |
| extension `tmpl` and use the [Jinja2 template format](http://jinja.pocoo.org/docs/templates/). |
| The differences to pages using the same format are: |
| * No special treatment of the `<head>` tag. |
| * Additional variables `head` and `body` are defined with the HTML code that |
| should be added to the head and content of the page respectively. |
| By default, `default.tmpl` will be used for all pages. If other templates are |
| defined, the pages need to choose them explicitly using the `template` setting. |
| + |
| +### Custom filters ### |
| + |
| +The `filters` directory can define custom Jinja2 filters which will be available |
| +in all Jinja2 templates. The file name defines the filter name, e.g. |
| +`myfilter.py` will define a file named `myfilter`. This file should also contain |
|
Sebastian Noack
2015/03/12 09:27:51
I suppose you mean "will define a filter name `myf
Wladimir Palant
2015/03/12 16:40:01
Done.
|
| +a function called `myfilter`, this one will be called when the filter is |
| +invoked. For more information on Jinja2 filters see |
| +[official documentation](http://jinja.pocoo.org/docs/dev/api/#writing-filters). |