Index: README.md |
=================================================================== |
--- a/README.md |
+++ b/README.md |
@@ -1,21 +1,20 @@ |
# CMS # |
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. |
-## How to use ## |
+## Getting started ## |
-### 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: |
+The easiest way to get started is to run a 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 |
* [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) |
@@ -31,301 +30,28 @@ |
Alternatively, the content directory could also be specified as command line |
parameter of `runserver.py`. 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`. |
Note that the test server is inefficient and shouldn't be run in production. |
There you should generate static files as explained below. |
-### 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. |
- |
-Note: Localized versions of pages will only be generated when their translations |
-are at least 30% complete. (Measured by comparing the total number |
-of translatable strings on a page to the number of strings that have been |
-translated for a given locale.) This is different from the test server which |
-will include less complete translations. |
- |
-### Syncing translations ### |
- |
-Before syncing translations ensure the following: |
- |
-- The `crowdin-project-name` setting has been set in the site's configuration. |
-- The `urllib3` Python module is installed. |
- |
-Now to sync with Crowdin type the following: |
- |
- python -m cms.bin.translate www_directory crowdin_project_api_key [logging_level] |
- |
-The script might take a while to run, it does the following things: |
- |
-1. Requests information about your Crowdin project |
-2. Checks all local locales are supported by Crowdin and enabled for your project |
-3. Renders all pages in your default language and extracts all page strings |
-4. Creates any required directories in your Crowdin project |
-5. Uploads any new page strings and updates any existing page strings |
-6. Uploads any pre-existing translation files for any newly uploaded pages |
-7. Requests Crowdin generate a fresh translations export archive |
-8. Downloads the archive of translations and extracts it replacing all local |
- translation files |
- |
-Notes: |
- |
-- You have to use the Crowdin project's API key, not your account API key |
-- You should probably enable "Skip untranslated strings" under your |
- project settings. |
-- Translations are only _uploaded_ for new files. If you are syncing with |
- Crowdin for the first time, and you have existing translation files pay |
- attention to any warnings. If there are any problems it is recommended |
- you re-create another fresh Crowdin project and try again. (Otherwise |
- translations for the pages already uploaded could be lost!) |
-- If you are running the script from a cronjob or similar you will probably |
- want to set the logging level to `ERROR` or similar |
- |
-## Content structure ## |
- |
-Currently, the following directories of your content directory will be |
-considered: |
- |
-* `filters`: Custom Jinja2 filters |
-* `globals`: Custom Jinja2 global functions and variables |
-* `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. |
- * `crowdin-project-name`: The Crowdin project name, this must be set for if |
- you intend to use the cms.bin.translate script to update the Crowdin |
- translations. |
-* `[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). |
- |
-### 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 |
-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 ### |
- |
-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: |
+## Documentation ## |
- setting = value |
- |
-Note that the settings have to placed at the beginning of the file, before the |
-actual content. The following settings can be changed: |
- |
-* `template`: This defines the template to be used for this page (without the |
- file extension). By default the `default` template is used for all pages. |
-* `title`: The locale string to be used as page title. By default the `title` |
- string is used. |
-* `noheading`: Setting this to any value will make sure no heading is displayed. |
- By default a `<h1>` tag with the page title is added above the content. |
-* `notoc`: Setting this to any value will prevent a table of contents from being |
- generated. By default a table of contents is always generated if the page |
- contains any headers with an `id` attribute. |
- |
-The following tag inserts an include file into the page (can be in a different |
-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) #### |
- |
-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 |
-[Python-Markdown Extra](https://pythonhosted.org/Markdown/extensions/extra.html) |
-extension is active and allows specifying custom attributes for the generated |
-HTML tags, HTML block elements that contain Markdown and more. |
- |
-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. |
- |
-Localizable strings can be specified inline with the following syntax: |
- |
- {{string_name String contents in default language}} |
- |
-Try to give the string a descriptive name as it will help translators. |
-Optionally you can add a description for strings as well to provide even more |
-context: |
- |
- {{string_name[The string description] String contents}} |
- |
-_Note: String names and descriptions have no effect on the generated page, |
-assuming string name is unique to the page. The name and description are just |
-used to provide translators with additional context about the string._ |
- |
-Finally if you find yourself using the same string multiple times in a page |
-you can reduce duplication by simply omitting the description and contents |
-after the first use. For example: |
- |
- {{title[Title of the page] Adblock Plus - Home}} |
- {{title}} |
- |
-#### Raw HTML format (html) #### |
- |
-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. |
-The syntax for localizable strings documented above can be used as with |
-Markdown. |
- |
-#### 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. |
- |
-The following variables can be used: |
- |
-* `page`: The page name |
-* `config`: Contents of the `settings.ini` file in this repository (a |
- [configparser object](http://docs.python.org/2/library/configparser.html)) |
-* `locale`: Locale code of the page language |
-* `available_locales`: Locale codes of all languages available for this page |
- |
-Following custom filters can be used: |
- |
-* `translate(default, name, comment=None)`: translates the given default string |
- and string name for the current page and locale. The string name should be |
- unique for the page but otherwise is only seen by the translators. Optionally |
- a comment (description) can be specified to help provide the translators with |
- additional context. |
-* `linkify(url, locale=None, **attrs)`: 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. The language used can also be specified |
- manually with the locale parameter. Any further keyword arguments passed |
- are turned into additional HTML attributes for the tag. |
-* `toclist(html)`: extracts a list of headings from HTML code, this can be used |
- to generate a table of contents. |
- |
-The following global functions can be used: |
- |
-* `get_string(name, page=None)`: retrieves a string from a locale file. |
- Unless a page is specified the locale file matching the name of the current |
- page is used. |
-* `get_page_content(page, locale=None)`: returns a dictionary of the content |
- and params for the given page and locale. Locale defaults to the current one |
- if not specified. Provided keys include `head`, `body`, `available_locales` |
- and `translation_ratio`. |
- |
-### 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 ### |
- |
-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. |
-`filters/myfilter.py` will define a filter named `myfilter`. This file should |
-also contain 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). |
- |
-### Custom functions and variables ### |
- |
-The `globals` directory can define custom Jinja2 globals which will be available |
-in all Jinja2 templates. Typically, this is used for custom functions. The file |
-name should match the name of the function or variable to be defined, and export |
-a variable with that name. E.g. `globals/myfunction.py` can define a function |
-called `myfunction` that will become available to all Jinja2 templates. |
+- How to use |
+ - [Running the test server](docs/usage/test-server.md) |
+ - [Generating the standalone test server](docs/usage/standalone-test-server.md) |
+ - [Generating static files](docs/usage/generate-static-files.md) |
+ - [Syncing translations](docs/usage/syncing-translations.md) |
+- Content structure |
+ - [Configuration (`settings.ini`)](docs/content/settings.md) |
+ - [Custom Jinja2 global functions and variables (`globals`)](docs/content/globals.md) |
+ - [Custom Jinja2 filters (`filters`)](docs/content/filters.md) |
+ - [Localization files (`locales`)](docs/content/locales.md) |
+ - [Page layout templates (`templates`)](docs/content/templates.md) |
+ - [Various include files (`includes`)](docs/content/includes.md) |
+ - [User-visible pages (`pages`)](docs/content/pages.md) |
+ - [Static content (`static`)](docs/content/static.md) |
+- API |
+ - [Variables](docs/api/variables.md) |
+ - [Custom filters](docs/api/filters.md) |
+ - [Global functions](docs/api/functions.md) |