<!--
{% comment %}
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.
{% endcomment %}
-->

# Apache SystemDS Documentation

The primary SystemDS documentation is written in markdown (*.md) and can be converted to HTML using
[Jekyll](http://jekyllrb.com).

The Documentation is separated into different parts by sub folders.

``` py
.
├── _layouts
│   ├── global.html # The Default content layout and html file.
│   ├── site.html   # The Default content layout for docs pages contained in site folder
├── _site # If run locally a _site folder is generated containing the compiled site.
├── _config.yml # The configuration for jekyll to construct the site.
├── Gemfile.yml # The dependency list for the documentation
├── index.md #  The main entry File
├── css # The style files folder
├── img # The Images folder
├── js  # The JavaScript folder
├── site # The different pages in the documentation
├── api # Contains autogenerated files. Don't touch manually
│   ├── java # The generated Java docs from source code.
│   ├── python # The generated Python docs from source code.
```

## Ubuntu Install

1. Install Ruby development environment [Jekyll on Ubuntu](https://jekyllrb.com/docs/installation/ubuntu/).
2. Install Jekyll inside the Ruby environment.

   - `gem install jekyll jekyll-redirect-from bundler pygments.rb`
   - To do this you might need to change permissions on folders `/var/lib/gems` and `/var/lib/gems/2.5.0`.
   - The Pygments package is optional, and does require sudo permissions.

3. Install python dependencies (Optionally).

   - Install [Sphinx](https://pypi.org/project/Sphinx/) and [sphinx_rtd_theme](https://pypi.org/project/sphinx-rtd-theme/).

   ```bash
   pip install Sphinx sphinx-rtd-theme
   ```
   - `pip install Pygments numpy pandas py4j`
   
   and install any other missing packages

4. Make sure Maven and [Java 17 and above](https://www.java.com/releases/) are installed.

   ```bash
   mvn --version
   ```

5. Now, update the API docs (Optional)

   ```bash
   ./updateAPI.sh
   ```

6. Launch the Documentation locally

   - `jekyll serve -w`
   - The serving will per default be on localhost port 4000 [Link](http://localhost:4000)
  
  
## Mac Install

1. Jekyll (and optionally Pygments) can be installed on the Mac OS in the following manner.

```bash
brew install ruby
gem install jekyll
gem install jekyll-redirect-from
gem install bundler
brew install python
gem install pygments.rb
```

2. Python depedencies

```bash
pip install Sphinx sphinx-rtd-theme Pygments numpy pandas py4j
```

and install any missing Python packages.

To generate SystemDS documentation in HTML, navigate to the ```docs``` folder, the root directory of the
documentation. From there, you can have Jekyll convert the markdown files to HTML. If you run in server mode,
Jekyll will serve up the generated documentation by default at <http://127.0.0.1:4000>. Modifications
to *.md files will be converted to HTML and can be viewed in a web browser.

```bash
jekyll serve -w
```
