| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| |
| # Contribution Guide |
| |
| This guide consists of: |
| |
| - [Project structure](#project-structure) |
| - [Configuration walkthrough](#configuration-walkthrough) |
| - [How to add a new doc](#how-to-add-a-new-doc) |
| - [How to add a new blogpost](#how-to-add-a-new-blogpost) |
| - [How to add a new landing page](#how-to-add-a-new-landing-page) |
| - [How to write in Hugo way](#how-to-write-in-hugo-way) |
| - [Define TableOfContents](#define-tableofcontents) |
| - [Language switching](#language-switching) |
| - [Code highlighting](#code-highlighting) |
| - [Adding class to markdown text](#adding-class-to-markdown-text) |
| - [Table](#table) |
| - [Github sample](#github-sample) |
| - [Others](#others) |
| - [How to add relative links to JavaScript or CSS](#how-to-add-relative-links-to-javascript-or-css) |
| - [What to be replaced in Jekyll](#what-to-be-replaced-in-jekyll) |
| - [Translation guide](#translation-guide) |
| - [How to add new case study](#how-to-add-a-new-apache-beam-case-study) |
| - [How to add new logo](#how-to-add-a-new-logo-to-case-studies-page) |
| |
| ## Project structure |
| |
| ``` |
| www/ |
| ├── dist # bundle files |
| ├── site |
| │ ├── archetypes # frontmatter template |
| │ ├── assets |
| │ │ ├── icons # svg icons |
| │ │ ├── js # scripts |
| │ │ ├── scss # styles |
| │ ├── content # pages |
| │ │ └── en |
| │ │ ├── blog |
| │ │ ├── case-studies |
| │ │ ├── community |
| │ │ ├── contribute |
| │ │ ├── documentation |
| │ │ ├── get-started |
| │ │ ├── privacy_policy |
| │ │ ├── roadmap |
| │ │ └── security |
| │ │ └── _index.md |
| │ ├── data |
| │ ├── layouts # content template |
| │ ├── static |
| │ │ ├── downloads # downloaded files |
| │ │ └── fonts |
| │ │ └── images |
| │ └── themes |
| │ └── docsy |
| ├── build_code_samples.sh |
| ├── check-links.sh # links checker |
| └── package.json |
| ``` |
| |
| ## Configuration walkthrough |
| |
| If you prefer to experience locally instead of using our gradle commands, this [Hugo installation](https://gohugo.io/getting-started/installing/) is a good start. |
| |
| When we mention the `config file` in this documentation, we mean the Hugo configuration file located at `/www/site/config.toml`. |
| |
| Most of the setup are self-explained in the comments. Please refer to the [Hugo documentation](https://gohugo.io/getting-started/configuration/) for more details. |
| |
| You should notice at `[params]`, they are considered as global variables. For instance, when you'd like to replace the release latest version, make a change on `release_latest = ""` to replace it everywhere in the project. |
| |
| ## How to add a new doc |
| |
| Let's start with an example as you'd like to add a new doc named `new-doc` in `/www/site/content/en/documentation/runtime/`. Locate to `/www/site/` and run: |
| |
| ``` |
| $ hugo new documentation/runtime/new-doc.md |
| ``` |
| |
| A markdown file will be created with pre-filled frontmatter: |
| |
| ``` |
| --- |
| title: "New Doc" |
| --- |
| ``` |
| |
| Then, put your content below the frontmatter. Do not worry about its layout, since its inside `documentation`, the layout at `/www/site/layouts/documentation/` will be shared with its children. |
| |
| **Note**: if you'd like to add a new doc in another language, apart from English version. For example, a new doc inside `pl` directory. Use: |
| |
| ``` |
| $ hugo new -c content/pl documentation/runtime/new-doc.md |
| ``` |
| |
| ## How to add a new blogpost |
| |
| To add a new blogpost with pre-filled frontmatter, in `/www/site/` run: |
| |
| ``` |
| $ hugo new blog/my-new-blogpost.md |
| ``` |
| |
| That will create a markdown file `/www/site/content/en/blog/my-new-blogpost.md` with following content: |
| |
| ``` |
| --- |
| title: "My New Blogpost" |
| date: "2020-04-20T14:02:57+02:00" |
| categories: |
| - blog |
| authors: |
| - "Your Name" |
| --- |
| ``` |
| |
| Below frontmatter, put your blogpost content. The filename will also serve as URL for your blogpost as `/blog/{filename}`. Don't forget to add `<!--more-->`, which is the delimiter between summary and the main content. |
| |
| **Note**: if you'd like to add a new blog in another language, apart from English version. For example, a new blog inside `pl` directory. Use: |
| |
| ``` |
| $ hugo new -c content/pl blog/my-new-blogpost.md |
| ``` |
| |
| ## How to add a new landing page |
| |
| For example, you would like to add a new `About` page. |
| |
| First, you need to create a markdown file in `/www/site/content/<LANGUAGE_VERSION>/about/_index.md` with following content: |
| |
| ``` |
| --- |
| title: "Your page title" |
| --- |
| ``` |
| |
| Below frontmatter, put your page content. The filename will also serve as URL for your page as `/about`. |
| |
| Second, define your page layout in the `layout` section with the same structure `/www/site/layout/about/{your_template}`. Hugo will help you to pick up the template behind the scene. Please refer to the [Hugo documentation](https://gohugo.io/templates/) for the usage of templates. |
| |
| You can also create a new page with pre-filled frontmatter, for instance, in `/www/site/` run: |
| |
| ``` |
| $ hugo new about/_index.md |
| ``` |
| |
| **Note**: if you'd like to add a new page in another language, apart from English version. For example, a new page inside `pl` directory. Use: |
| |
| ``` |
| $ hugo new -c content/pl about/_index.md |
| ``` |
| |
| ## How to write in Hugo way |
| |
| This section will guide you how to use Hugo shortcodes in Apache Beam website. Please refer to the [Hugo documentation](https://gohugo.io/content-management/shortcodes/) for more details of usage. |
| |
| ### Define TableOfContents |
| |
| To automatically generate table of contents in a markdown file. Simply use: |
| |
| ``` |
| {{< toc >}} |
| ``` |
| |
| ### Language switching |
| |
| To have a programming language tab switcher, for instance of java, python and go. Use: |
| |
| ``` |
| {{< language-switchers java py go >}} |
| ``` |
| |
| The purpose is to switch languages of codeblocks. |
| |
| You can also provide language tabs without the language switcher widget. To do so, place `{{< highlight >}}` shortcodes next to each other, like this: |
| |
| ``` |
| {{< highlight java >}} |
| // Java code here... |
| {{< /highlight >}} |
| {{< highlight py >}} |
| # Python code here... |
| {{< /highlight >}} |
| ``` |
| |
| Note that the `{{< highlight >}}` blocks should be directly adjacent to each other, without an extra return between them. |
| |
| Do NOT do this: |
| |
| ``` |
| {{< highlight java >}} |
| // Java code here... |
| {{< /highlight >}} |
| |
| {{< highlight py >}} |
| # Python code here... |
| {{< /highlight >}} |
| ``` |
| |
| In some circumstances, the Hugo markdown parser will generate a pair of empty `<p>` tags for the extra return, and that breaks the formatting of the code tabs. TODO: Fix this issue: [Issue 21030](https://github.com/apache/beam/issues/21030). |
| |
| ### Code highlighting |
| |
| To be consistent, please prefer to use `{{< highlight >}}` syntax instead of ` ``` `, for code-blocks or syntax-highlighters. |
| |
| 1. To apply code highlighting to java, python or go. Use: |
| |
| ``` |
| {{< highlight java >}} |
| // This is java |
| {{< /highlight >}} |
| ``` |
| |
| 2. To apply code highlighting to a wrapper class |
| |
| Usage: |
| |
| ``` |
| {{< highlight class="class-name" >}} |
| Write some code here. |
| {{< /highlight >}} |
| ``` |
| |
| Render: |
| |
| ``` |
| <div class="class-name"> |
| <pre> |
| <code> |
| "Write some code here." |
| </code> |
| </pre> |
| </div> |
| ``` |
| |
| The purpose of adding classes or programming languages (java, py or go) in code highlighting is to activate the language switching feature. |
| If you want highlighting for a code block that should *not* be affected by language switching - that is, if you want to a highlight a code block, and you don't want the block to go away when a different language is selected - use ` ``` `. For example: ` ```java // Java code here...``` `. |
| |
| ### Adding class to markdown text |
| |
| 1. To add a class to a single line in mardown. Use: |
| |
| ``` |
| {{< paragraph class="java-language">}} |
| This is an inline markdown text. |
| {{< /paragraph >}} |
| ``` |
| |
| 2. To add a class to multi lines in markdown. Use: |
| |
| ``` |
| {{< paragraph class="java-language" wrap="span">}} |
| - This is the first text. |
| - This is the second text. |
| - This is the third text. |
| {{< /paragraph >}} |
| ``` |
| |
| The purpose of adding classes in markdown text is to activate the language switching feature. |
| |
| ### Table |
| |
| If you would like to use the table markdown syntax but also have bootstrap table styles. Wrap your table markdown inside: |
| |
| ``` |
| {{< table >}} |
| A table markdown here. |
| {{< /table >}} |
| ``` |
| |
| ### Github sample |
| |
| To retrieve a piece of code from Beam project. |
| |
| Usage: |
| |
| ``` |
| {{< code_sample "path/to/file" selected_tag >}} |
| ``` |
| |
| Example: |
| |
| ``` |
| {{< code_sample "sdks/python/apache_beam/examples/complete/game/user_score.py" extract_and_sum_score >}} |
| ``` |
| |
| ### Others |
| |
| To get released latest version in markdown: |
| |
| ``` |
| {{< param release_latest >}} |
| ``` |
| |
| To get branch of the repository in markdown: |
| |
| ``` |
| {{< param branch_repo >}} |
| ``` |
| |
| To render capability matrix, please take a look at [this example](/www/site/content/en/documentation/runners/capability-matrix/#beam-capability-matrix). |
| |
| ### How to add relative links to JavaScript or CSS |
| Please take a note that relative links should be added with relative paths to JavaScript or CSS files with using Hugo syntax, so that they are able to form correct absolute links on localhost, staging and production. Examples: |
| ``` |
| /themes/docsy/assets/js/search.js # var searchPage = "{{ "search/" | absURL }}?q=" + query; |
| /assets/js/page-nav.js # img.src = "{{ "images/arrow-expandable.svg" | absURL }}"; |
| /assets/js/copy-to-clipboard.js # <img src="{{ "images/copy-icon.svg" | absURL }}"/> |
| /assets/scss/_case_study.scss # background-image: url('{{ "images/open-quote.svg" | absURL }}'); |
| ``` |
| |
| ## What to be replaced in Jekyll |
| |
| This section will briefly let you know the replaced features of Jekyll in terms of writing a new blog post or documentation in Hugo. |
| |
| 1. Redirect to: |
| |
| The `redirect_to` feature will no longer be used since Hugo doesn't support it. You can solve this in Hugo by replacing the external URLs directly in links, instead of using markdown file to be the third-person. |
| |
| Currently, there are 3 removed `redirect_to` links which were used in Jekyll: |
| |
| ``` |
| /contribute/project/team/ # https://home.apache.org/phonebook.html?pmc=beam |
| /contribute/team/ # https://home.apache.org/phonebook.html?pmc=beam |
| /contribute/design-documents/ # https://cwiki.apache.org/confluence/display/BEAM/Design+Documents |
| ``` |
| |
| 2. Redirect from: |
| |
| Fortunately, Hugo supports `redirect_from` with `aliases` in the frontmatter. |
| |
| ``` |
| aliases: |
| - /path/example.html |
| ``` |
| |
| 3. IALs: |
| |
| IALs feature is used in Jekyll to add a class to markdown paragraph, `{:.myclass}` as an example. And to show this matter, we use Hugo shortcodes to [add a class to inline texts](#adding-class-to-markdown-text) or [blocks](#code-highlighting). |
| |
| 4. Filenames of blog posts: |
| |
| In Jekyll, filenames included the typical date prefix as part of the filename and it will cause some issues when we'd like to change the date later. Hugo prefers to get rid of them and add date as metadata in frontmatter. |
| |
| 5. Relative URLs: |
| |
| `{{ site.baseurl }}` will no longer be used, since Hugo handle the relative or absolute path in the config file. |
| |
| 6. Global variables: |
| |
| The `param` - global variables are placed in the [config file](#configuration-walkthrough). |
| |
| In Jekyll: |
| |
| ``` |
| {{ site.release_latest }} |
| {{ site.branch_repo }} |
| ``` |
| |
| In Hugo: |
| |
| ``` |
| {{< param release_latest >}} |
| {{< param branch_repo >}} |
| ``` |
| |
| ## Translation guide |
| |
| In order to add a new language into Apache Beam website, please follow this guide. You could take a look at an [example branch](https://github.com/PolideaInternal/beam/tree/example/i18n/) to see how we completely translate the whole website. |
| |
| For more details of syntax, please refer to the [Hugo documentation](https://gohugo.io/content-management/multilingual/). Below is a step-by-step instructions of translating our website to Polish as an example. |
| |
| 1. Configuring a new language |
| |
| Firstly, we add the following params to our config file `/www/site/config.toml`. |
| |
| ``` |
| [languages.pl] |
| contentDir = "content/pl" |
| title = "Apache Beam title" |
| description = "Apache Beam description" |
| languageName = "Polish" |
| weight = 2 |
| ``` |
| |
| 2. Translating markdown contents |
| |
| The `www/site/content/pl` directory will be your main workspace of contents here. Therefore, you need to translate all of the markdown files inside `/www/site/content/en` and place them into your workspace. Remember to keep the same project structure for both, since they're sharing the same layouts. |
| |
| 3. Localizing our strings |
| |
| Some of the texts are placed into layouts which are html files, you need to translate all of these phrases inside `www/site/i18n`. Afterwards from our templates, Hugo's `i18n` function does the localization job. Please follow [our example](https://github.com/PolideaInternal/beam/tree/example/i18n/website/www/site/i18n) to understand the structure. |
| |
| 4. Data files |
| |
| Consider the following structure for your data directories `/www/site/data` where `en` and `pl` are your website’s languages’ respective codes. |
| |
| ``` |
| data |
| ├── en |
| │ └── people.yaml |
| └── pl |
| └── people.yaml |
| ``` |
| |
| Now from your template: |
| |
| ``` |
| {{ $data := index .Site.Data .Site.Language.Lang }} |
| {{ range $data.people }} |
| <a href="{{ .url }}">{{ .name }}</a> |
| {{ end }} |
| ``` |
| |
| 5. Section menus |
| |
| Similar to markdown content translation, there are two separated section menus `/www/site/layouts/partials/section-menu` corresponding to your languages. Your job is to take the section menus in `en` directory, translate and place them inside your `pl` directory. |
| |
| **Note**: if you get stuck at adding translation, please refer to [our example](https://github.com/PolideaInternal/beam/tree/example/i18n/). |
| |
| ## How to add a new Apache Beam case study |
| Please follow this guide to [add a new case study](https://github.com/apache/beam/tree/master/website/ADD_CASE_STUDY.md) |
| |
| ## How to add a new logo to case studies page |
| Please follow this guide to add [a new logo](https://github.com/apache/beam/tree/master/website/ADD_LOGO.md) to the [case studies](https://beam.apache.org/case-studies/) page. |