////
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.
////
= Apache OFBiz Documentation Guidelines
The Apache OFBiz Project
:imagesdir: ./images
ifdef::backend-pdf[]
:title-logo-image: image::OFBiz-Logo.svg[Apache OFBiz Logo, pdfwidth=4.25in, align=center]
:source-highlighter: rouge
endif::[]

image:https://img.shields.io/badge/License-Apache%202.0-blue.svg[link="http://www.apache.org/licenses/LICENSE-2.0"]

== Intro

These guidelines serve as a general style guide and collection of examples of how we are documenting the project.
This is intentionally not a complete user manual, but lists the subset of functionality and formatting options we
would like to use.

For further reference and more examples see

* Official Asciidoc User Guide
footnote:[http://asciidoc.org/userguide.html]
* Asciidoc Writers Guide
footnote:[https://asciidoctor.org/docs/asciidoc-writers-guide/].
* Asciidoc Quick Reference
footnote:[https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/]
* Asciidoc Recommended Practices
footnote:[https://asciidoctor.org/docs/asciidoc-recommended-practices/]

If you would like to help out with the documentation of the project, please see the following wiki page
footnote:[https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Documentation+Team] for further information and
how we are organised.

== General rules

=== Document configuration

Documents that will be published as standalone guides (e.g. link:developer-manual.adoc[developer manual], link:user-manual.adoc[user manual]) should contain common configuration
so that the output will be generated in exactly the same way for all documents.

[NOTE]
This is not necessary for documents that will only be included as part of parent documents. In this case the documents will inherit the
configuration from the parent.

Please see below for details of the proposed configuration:

----
The Apache OFBiz Project // <1>
:imagesdir: ./images // <2>
ifdef::backend-pdf[] // <3>
:title-logo-image: image::OFBiz-Logo.svg[Apache OFBiz Logo, pdfwidth=4.25in, align=center] // <4>
:source-highlighter: rouge // <5>
endif::[] // <6>
----
<1> author
<2> global definition of the image directory
<3> begin block of configurations only for pdf rendering
<4> define the title logo image
<5> use the Rouge source code highlighter
<6> end block of configurations only for PDF rendering

The following configuration options are set globally in the Gradle build file.
They are not configured in the document itself and are listed for reference only:

.build.gradle
----
'doctype': 'book', // <1>
'revnumber': 'Trunk', // <2>
'experimental': '', // <3>
'icons': 'font', // <4>
'sectnums': '', // <5>
'chapter-label': '', // <6>
'toc': '', // <7>
'toclevels': '5' // <8>
----
<1> doctype book
<2> target release, indicates the release for which the documentation is valid
<3> allow experimental features like keyboard shortcuts
<4> make font awesome icons available
<5> number chapters and sections automatically
<6> do not prefix the chapters
<7> insert a table of contents
<8> max levels to show in the table of contents

=== Apache License Header

Each .adoc file must contain the Apache license header (put between "//// license... ////"). You can just copy the
following block:
----
////
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.
////
----

=== file organization
There are one main file per application (located in the 'src/docs/asciidoc' directory), which include some other files
located in 'src/docs/asciidoc/_include'.

.For each component, there are these directories:
====
    src
      |- docs
          |- asciidoc
              |- _include
              |- images
                  |- ${componentName}
====

So, for include file use

  include::_include/xxxxxxx

and for image, it's necessary to add on top of main file

  :imagesdir: ./images/${compnentName}

and so include them with

  image::/xxxxxxx

During generating process images are copied on the root asciidoc/images directory

=== File name conventions

We will be implementing a consistent naming convention for the documentation content files.
Filenames should be in lower case with the extension `.adoc`.

Each guide will be named after the component / module name (e.g. humanres.adoc, accounting.adoc, manufacturing.adoc,
party.adoc etc).
Lower level files that are in the include directory will include a prefix/shortname indicating the component name,
separated by dashes (e.g `hr-intro.adoc`, `hr-glossary.adoc`, etc.)
Similar pages will have consistent naming. We will have several intro, glossary, FAQ, settings, security pages,
so the naming format will be ([shortname]-intro, [shortname]-glossary, [shortname]-faq, [shortname]-settings,
[shortname]-security etc.)

.For Human Resources this will be as follows:
====
    humanres.adoc
        |- hr-intro.adoc
        |- hr-employee-evaluations.adoc
        |- hr-glossary.adoc
        |- hr-employee-positions.adoc
        |- hr-employees.adoc
        |- hr-employments.adoc
        |- hr-performance-review.adoc
        |- hr-positions.adoc
        |- hr-qualifications.adoc
        |- hr-recruitment.adoc
        |- hr-skills.adoc
        |- hr-resumes.adoc
        |- hr-training.adoc
        |- hr-leave.adoc
        |- hr-security.adoc
        |- hr-global-settings.adoc
====


=== General formatting

* It is recommended to write one sentence per line and/or manually break the line after approximately 80 to 120 characters.
* Section titles will use asymmetric atx style +
  (e.g. `== This is an example of an Asymmetric Section Title`)
* When including another file using the `include` directive, please ensure that there is a blank line between each
  include line.


== Text formatting

=== Quoted Text

Words and phrases can be formatted by enclosing inline text with quote characters:

.Emphasized text

Word phrases enclosed in 'single quote characters' (acute accents) or _underline characters_ are emphasized.

.Strong text
Word phrases *enclosed in asterisk characters* are rendered in a strong font (usually bold).

.Monospaced text
Word phrases +enclosed in plus characters+ are rendered in a monospaced font.
Word phrases `enclosed in backtick characters` (grave accents) are also rendered in a monospaced font but in this case
the enclosed text is rendered literally and is not subject to further expansion (see inline literal passthrough).

.‘Single quoted text’
Phrases enclosed with a `single grave accent to the left and a single acute accent to the right' are rendered in single
quotation marks.

.“Double quoted text”
Phrases enclosed with ``two grave accents to the left and two acute accents to the right'' are rendered in quotation marks.

.Unquoted text
Placing #hashes around text# does nothing, it is a mechanism to allow inline attributes to be applied to otherwise unformatted text.


=== Paragraphs

You can indicate special information with an eye catching symbol. Please don't overuse this (less is more).

----
[TIP]
This is a tip or idea.
----

[TIP]
This is a tip or idea.

You can also have multiple lines and empty lines inside the paragraph using a whitespace and a plus sign:

----
[TIP]
This is a tip or idea. +
This is another idea. +
 +
More ideas...
----

[TIP]
This is a tip or idea. +
This is another idea. +
 +
More ideas...

----
[NOTE]
This is an information note.
----

[NOTE]
This is an information note.

----
[IMPORTANT]
This indicates important information.
----

[IMPORTANT]
This indicates important information.

----
[WARNING]
This is a warning or something to pay attention to.
----

[WARNING]
This is a warning or something to pay attention to.

----
[CAUTION]
This is something you should treat with caution.
----

[CAUTION]
This is something you should treat with caution.

----
[normal]
This is a Normal paragraph.
----

[normal]
This is a Normal paragraph.

----
[literal]
This is a Literal paragraph.
----

[literal]
This is a Literal paragraph.

----
[quote]
This is a Quote paragraph.
----

[quote]
This is a Quote paragraph.

----
[listing]
This is a Listing paragraph.
----

[listing]
This is a Listing paragraph.

----
[abstract]
This is an Abstract paragraph.
----

[abstract]
This is an Abstract paragraph.

----
[comment]
This is a Comment paragraph. It does not show up in the rendered text ;-)
----

[comment]
This is a Comment paragraph. It does not show up in the rendered text ;-)

----
[example]
This is a Example paragraph.
----

[example]
This is a Example paragraph.

----
[sidebar]
This is a Sidebar paragraph.
----
[sidebar]
This is a Sidebar paragraph.

----
[source]
This is a Source paragraph. See Code formatting for further examples.
----

[source]
This is a Source paragraph. See Code formatting for further examples.

.This indicates a simple description headline
This is the text for the simple description headline

.This indicates an example inside a block
====
Just a simple block example.
====

=== Keyboard shortcuts

You can also define keyboard shortcuts with the `kbd` macro.

 kbd:[Alt+F11] - Toggle Full Screen Mode in the Eclipse IDE

The result is the following:

kbd:[Alt+F11] - Toggle Full Screen Mode in the Eclipse IDE

The result will be different depending on the rendering (PDF, HTML).

=== Using inline icons

You can also add the `:icons: font` directive to the top of your document, which allows you to use the icons
from http://fortawesome.github.io/Font-Awesome/icons/ directory via a macro using any of the following icon sets:

* fa - https://fontawesome.com/v4.7.0/icons (default)
* fas - https://fontawesome.com/icons?d=gallery&s=solid[Font Awesome - Solid]
* fab - https://fontawesome.com/icons?d=gallery&s=brands[Font Awesome - Brands]
* far - https://fontawesome.com/icons?d=gallery&s=regular[Font Awesome - Regular]
* fi - http://zurb.com/playground/foundation-icon-fonts-3[Foundation Icons]
* pf - https://paymentfont.com/[Payment font]

The fa icon set is deprecated. Please use one of the other three FontAwesome icon sets. +
when icon is not available in fa icon set but in an other, it's possible to give the correct set.

The generate Document process generate a INFOS message, if icon is available in an other set and it is not given.
----
icon:comment[set=far] This is a comment icon
icon:file[set=far] And a file icon
icon:battery-full[set=fas] And a battery icon
----

.The output looks like the following
[example]
icon:comment[set=far] This is a comment icon +
icon:file[set=far] And a file icon +
icon:battery-full[set=fas] And a battery icon


== Code formatting

Asciidoc and the used highlighter provide support for code syntax highlighting of several programming languages
and formats. The following are examples for code which is widely used within OFBiz.

.Java source code formatting
 [source,java]
 ----
 public class Foo {
   public String bar;
   public String bar() {
    return bar;
   }
 }
 ----

Renders to

[source,java]
----
public class Foo {
  public String bar;

  public String bar() {
    return bar;
  }
}
----

.Java source code formatting (numbered)
[source,java,numbered]
----
public class Foo {
  public String bar;

  public String bar() {
    return bar;
  }
}
----

.Java source code formatting (with explanation callouts)
[source,java]
----
public class Foo {
  public String bar; # <1>

  public String bar() {
    return bar; # <2>
  }
}
----
<1> Declares the `bar` field
<2> Returns the `bar` value


.Groovy
[source,groovy]
----
selected = UtilHttp.parseMultiFormData(parameters)
selected.each { row ->
    payment = from("Payment").where("paymentId", row.paymentId).queryOne()
    if (payment) {
        payments.add(payment)
    }
}
context.payments = payments
----


.XML document
[source,xml]
----
<author id="1">
  <personname>
    <firstname>Lazarus</firstname>
    <surname>het Draeke</surname>
  </personname>
</author>
----

.Cascading Stylesheet (CSS)
[source,css]
----
body {
    background: transparent url(/images/ofbiz_logo.png) no-repeat scroll left top;
    color: #000;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: .75em;
    line-height: 1.5em;
    padding: 50px 0 0;
    bgcolor: #ffffcc;
}
----

.Javascript
[source,javascript]
----
function msg(){
    alert("Hello OFBiz");
}
----

.JSON
[source,json]
----
{
    "id": 1,
    "name": "A green door",
    "price": 12.50,
    "tags": ["home", "green"]
}
----

.Properties files
[source,properties]
----
foo = bar
----

.SQL
[source,sql]
----
SELECT * FROM FOO;
----

.HTML
[source,html]
----
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   </head>
   <body style="background-color: rgb(255, 255, 255);">
      <h1>Headline</h1>
  </body>
</html>
----


== Importing files or file includes

You can import files via the include macro.
This also works for source code includes. +
It's possible to use [listing] ---- before include to have the correct style. +
The following example imports a file formatted as Java source code.

  [source,java]
  ----
  include::docs/asciidoc/resource/source.java[]
  ----

[source,java]
----
include::docs/asciidoc/resource/source.java[]
----

=== Using leveloffset

Via the `leveloffset` attribute you can change the section offset, for example a `=` section will become `==` if you
add the following statement `:leveloffset: 1`.
Use `:leveloffset: 0` to reset the offset.

=== Importing files partially

It is also possible to include partial files.
For this, please mark the part of the file to be included with a tag similar to the following:

.article.adoc
----
# tag::tagname[]
This should be included!
# end::tagname[]
This text will not be included!
----

and include the file with the tagname in the brackets like this:

 include::docs/asciidoc/resource/article.adoc[tags=tagname]

The result would be

----
include::docs/asciidoc/resource/article.adoc[tags=tagname]
----

=== Importing images

You can import images with
----
image::
----

For the HTML output you can add the alt text within the brackets [].
If the image is located in the images folder then the import would look like this:

 image::OFBiz-Logo.svg[Apache OFBiz Logo, pdfwidth=3.0in, align=left]

Result:

image::OFBiz-Logo.svg[Apache OFBiz Logo, pdfwidth=3.0in, align=left]

Please notice that the images folder is specified in the document header configuration
and is therefore not provided here again.

The import of an image with `image::` will add the image in a new line.
If you want to add an image to be inline then use the macro `image:`

  This is just a text image:OFBiz-Logo.svg[Apache OFBiz Logo, width=40%] to show inline images.

Result:

This is just a text image:OFBiz-Logo.svg[Apache OFBiz Logo, width=40%] to show inline images.


== How to write a...

=== FAQ or Glossary

FAQ's and glossaries should be written as a labeled list.
For hyperlinking, they should also have an ID which can be linked within a list.

For example
----
<<faq_entry_1,FAQ entry 1>>
<<faq_entry_2,FAQ entry 2>>

[#faq_entry_1]
FAQ entry 1::
This is entry #1 in our example FAQ.

[#faq_entry_2]
FAQ entry 2::
This is entry #2 in our example FAQ.
----

Renders to

<<faq_entry_1,FAQ entry 1>> +
<<faq_entry_2,FAQ entry 2>>

[#faq_entry_1]
FAQ entry 1::
This is entry #1 in our example FAQ.

[#faq_entry_2]
FAQ entry 2::
This is entry #2 in our example FAQ.

==== Glossary

There is one Glossary per Component and a General Glossary in user-manual.

For glossary entries ID should be in Uppercase with space replace by "_"


== Asciidoc FAQ

=== How to reset Heading Counter in Asciidoc

You can deactivate the counter for a section:
----
:sectnums!:

== Preface

:sectnums:

== First Chapter
----


