Commit 7afc4a81 authored by carlosperate's avatar carlosperate

Update the build file for the static documentation from GitHub Wiki.

parent 67787801
...@@ -99,7 +99,7 @@ TestTemp_* ...@@ -99,7 +99,7 @@ TestTemp_*
ardublockly_run.* ardublockly_run.*
# The documentation is built with the GitHub wiki data # The documentation is built with the GitHub wiki data
/Documentation /docs
package/ardublocklydocs/site package/ardublocklydocs/site
# Materialize uncompress source # Materialize uncompress source
......
Subproject commit 11b6f7a8aee84b97b7b15d6adc053ed9fe588bd6 Subproject commit a677d6c7a1b209b2deaf8be12ed744a91c8ab8d6
site_name: 'Ardublockly Documentation' site_name: 'Ardublockly Documentation'
site_url: http://ardublockly.embeddedlog.com
repo_url: http://github.com/carlosperate/ardublockly/wiki
site_description: Visual programming for Arduino.
site_author: carlosperate
site_dir: ../../docs
docs_dir: 'ardublockly.wiki' docs_dir: 'ardublockly.wiki'
theme: 'readthedocs' theme: 'readthedocs'
# It is IMPERATIVE to leave this property to the end without anything after it. # It is IMPERATIVE to leave this property to the end without anything after it.
# This is because the build file will delete everything after this line and # This is because the build file will delete everything after this line and
# replace it with newly generated data. # replace it with newly generated data.
pages: pages:
- ['Compiler-Settings.md', 'Compiler Settings'] - Home: 'home.md'
- ['Configure-Ardublockly.md', 'Configure Ardublockly'] - Quick Start: 'Quick-Start.md'
- ['Git-settings.md', 'Git settings'] - User Guide:
- ['Home.md', 'Home'] - Installing Ardublockly: 'Installing-Ardublockly.md'
- ['Installing-Ardublockly.md', 'Installing Ardublockly'] - Configure Ardublockly: 'Configure-Ardublockly.md'
- Arduino Compiler Settings: 'Arduino-Compiler-Settings.md'
- Developer Guide:
- Building Ardublockly: 'Building-Ardublockly.md'
- FAQs: 'FAQs.md'
- About:
- About Ardublocly: 'About.md'
- License: 'License.md'
- Credits: 'Credits.md'
\ No newline at end of file
#!/usr/bin/env python2 #!/usr/bin/env python2
# -*- coding: utf-8 -*- # # -*- coding: utf-8 -*- #
# #
# Builds the GitHub Wiki documentation into a static HTML site. # Builds the GitHub Wiki documentation into a static HTML site saved into the
# project root directory.
# #
# Copyright (c) 2015 carlosperate https://github.com/carlosperate/ # Copyright (c) 2016 carlosperate https://github.com/carlosperate/
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
...@@ -48,21 +49,23 @@ GITHUB_WIKI_REPO = "github.com/%s/%s.git" % (GITHUB_USER, WIKI_NAME) ...@@ -48,21 +49,23 @@ GITHUB_WIKI_REPO = "github.com/%s/%s.git" % (GITHUB_USER, WIKI_NAME)
MKDOCS_FOLDER = "ardublocklydocs" MKDOCS_FOLDER = "ardublocklydocs"
THIS_FILE_DIR = os.path.dirname(os.path.realpath(__file__)) THIS_FILE_DIR = os.path.dirname(os.path.realpath(__file__))
MKDOCS_DIR = os.path.join(THIS_FILE_DIR, MKDOCS_FOLDER) MKDOCS_DIR = os.path.join(THIS_FILE_DIR, MKDOCS_FOLDER)
WIKI_DIR = os.path.join(MKDOCS_DIR, WIKI_NAME)
DOCS_DIR = os.path.join(os.path.dirname(THIS_FILE_DIR), "docs")
# Set the index page name for the static documentation
DEFAULT_INDEX = 'Home' DEFAULT_INDEX = 'Home'
def pull_wiki_repo(): def pull_wiki_repo():
""" """
Pulls latest changes from the wiki repo. Pulls latest changes from the wiki repository.
:return: Boolean indicating if the operation was successful. :return: Boolean indicating if the operation was successful.
""" """
# Set working directory to the wiki repository # Set working directory to the wiki repository
wiki_folder = os.path.join(MKDOCS_DIR, WIKI_NAME) if os.path.isdir(WIKI_DIR):
if os.path.isdir(wiki_folder): os.chdir(WIKI_DIR)
os.chdir(wiki_folder)
else: else:
print("ERROR: Wiki repo directory is not correct: %s" % wiki_folder) print("ERROR: Wiki repo directory is not correct: %s" % WIKI_DIR)
return False return False
# Ensure the submodule is initialised, progress is printed to stderr so just # Ensure the submodule is initialised, progress is printed to stderr so just
...@@ -81,39 +84,25 @@ def pull_wiki_repo(): ...@@ -81,39 +84,25 @@ def pull_wiki_repo():
"repository !\n%s" + std_err_op) "repository !\n%s" + std_err_op)
return False return False
if not GITHUB_WIKI_REPO in std_op: if GITHUB_WIKI_REPO not in std_op:
print(("ERROR: Wiki repository:\n\t%s\n" % GITHUB_WIKI_REPO) + print("ERROR: Wiki repository: %s\nnot found in directory %s: \n%s" %
"not found in directory %s url:\n\t%s\n" % (wiki_folder, std_op)) (GITHUB_WIKI_REPO, WIKI_DIR, std_op))
return False return False
# Git Fetch prints progress in stderr, so cannot check for erros that way # Git Fetch prints progress in stderr, so cannot check for errors that way
print("\nPull from Wiki repository...") print("Pull from Wiki repository...")
subprocess.call(["git", "pull", "origin", "master"]) subprocess.call(["git", "pull", "origin", "master"])
print("") print("")
return True return True
def edit_mkdocs_config(): def edit_mkdocs_config(pages_str):
""" """
Edits the mkdocs.yml MkDocs configuration file to include all markdown Edits the mkdocs.yml MkDocs configuration file to include the pages data.
files as part of the documentation. :param pages_str: Text to append as the pages configuration.
These files are created by default with the '.md' extension and it is
assumed no other file extensions are to be linked.
:return: Boolean indicating the success of the operation. :return: Boolean indicating the success of the operation.
""" """
path_list = []
for file in os.listdir(os.path.join(MKDOCS_DIR, WIKI_NAME)):
if file.endswith(".md"):
path_list.append("- ['%s', '%s']" %
(file, file[:-3].replace("-", " ")))
if not path_list:
print(("ERROR: No markdown files found in %s ! " % MKDOCS_DIR) +
"Check if repository has been set up correctly.")
return False
pages_str = "pages:\n" + "\n".join(path_list) + "\n"
# Replace the pages data, strategically located at the end of the file # Replace the pages data, strategically located at the end of the file
mkdocs_yml = os.path.join(MKDOCS_DIR, "mkdocs.yml") mkdocs_yml = os.path.join(MKDOCS_DIR, "mkdocs.yml")
if not os.path.exists(mkdocs_yml): if not os.path.exists(mkdocs_yml):
...@@ -125,16 +114,15 @@ def edit_mkdocs_config(): ...@@ -125,16 +114,15 @@ def edit_mkdocs_config():
with open(temp_abs_path, 'w') as temp_file: with open(temp_abs_path, 'w') as temp_file:
with open(mkdocs_yml) as original_file: with open(mkdocs_yml) as original_file:
for line in original_file: for line in original_file:
if not "pages:" in line: if "pages:" not in line:
temp_file.write(line) temp_file.write(line)
else: else:
print("Replacing 'pages' property found in mkdocs.yml ...") print("Replacing 'pages' property found in mkdocs.yml ...")
break break
else: else:
print("Did not find the 'pages' property in mkdocs.yml.\n" + print("Did not find the 'pages' property in mkdocs.yml file." +
"Attaching the property at the end of the file.") "Attaching the property at the end.")
temp_file.write(pages_str) temp_file.write(pages_str)
print(pages_str)
# Remove original file and move the new temp to replace it # Remove original file and move the new temp to replace it
os.close(temp_file_handler) os.close(temp_file_handler)
...@@ -152,6 +140,58 @@ def edit_mkdocs_config(): ...@@ -152,6 +140,58 @@ def edit_mkdocs_config():
return True return True
def generate_pages_from_sidebar():
"""
The GitHub Wiki allows you to add a sidebar with a manual markdown code to
be used as a table of contents. This function reads the file and converts
it to the format require by MkDocs configuration file for its ToC.
:return: String with the pages configuration.
"""
sidebar = os.path.join(WIKI_DIR, '_Sidebar.md')
if not os.path.exists(sidebar):
return None
# Let any file exception to stop execution
with open(sidebar, 'r') as sidebar_file:
sidebar_data = sidebar_file.readlines()
print("sidebar file data:\n\t%s\n" % "\t".join(sidebar_data))
yml_sections = ["pages:\n"]
for line in sidebar_data:
yml_sections.append(line.replace("[", "").replace("](", ": '")
.replace(")", ".md'"))
print("Converted to MkDocs yml format:\n\t%s\n" % "\t".join(yml_sections))
return "".join(yml_sections)
def build_mkdocs():
"""
Invokes MkDocs to build the static documentation and moves the folder
into the project root folder.
:return: Boolean indicating the success of the operation.
"""
# Setting the working directory
if os.path.isdir(MKDOCS_DIR):
os.chdir(MKDOCS_DIR)
else:
print("ERROR: MkDocs directory is not correct: %s" % MKDOCS_DIR)
return False
# Building the MkDocs project
print("\nClean and build the MkDocs project...")
pipe = subprocess.PIPE
mkdocs_process = subprocess.Popen(
["mkdocs", "build", "--clean"], stdout=pipe, stderr=pipe)
std_op, std_err_op = mkdocs_process.communicate()
print("%s%s" % (std_op, std_err_op))
if "ERROR" in std_err_op:
print("ERROR: Could not build MkDocs !")
return False
return True
def create_index(): def create_index():
""" """
Creates an HTML index page to redirect to an MkDocs generated page. Creates an HTML index page to redirect to an MkDocs generated page.
...@@ -175,74 +215,19 @@ def create_index(): ...@@ -175,74 +215,19 @@ def create_index():
"\t</body>\n" \ "\t</body>\n" \
"</html>\n" "</html>\n"
print("Creating the index.html file...\n") print("Creating the index.html file in %s ..." % DOCS_DIR)
generated_site_dir = os.path.join(MKDOCS_DIR, "site") if not os.path.exists(DOCS_DIR):
if not os.path.exists(generated_site_dir): print("ERROR: Final docs directory does not exists: %s !" % DOCS_DIR)
try:
os.makedirs(generated_site_dir)
except IOError:
print("ERROR: Could not create site folder in %s !\n" %
generated_site_dir)
return False return False
try: try:
index_file = open(os.path.join(generated_site_dir, "index.html"), "w") index_file = open(os.path.join(DOCS_DIR, "index.html"), "w")
index_file.write(html_code) index_file.write(html_code)
index_file.close() index_file.close()
return True return True
except IOError: except IOError:
print("ERROR: Could not create index.html file in %s !\n" % print("ERROR: Could not create index.html file in %s !" % DOCS_DIR)
generated_site_dir)
return False
def build_mkdocs():
"""
Invokes MkDocs to build the static documentation and moves the folder
into the project root folder.
:return: Boolean indicating the success of the operation.
"""
# Setting the working directory
if os.path.isdir(MKDOCS_DIR):
os.chdir(MKDOCS_DIR)
else:
print("ERROR: MkDocs directory is not correct: %s" % MKDOCS_DIR)
return False return False
# Building the MkDocs project
pipe = subprocess.PIPE
mkdocs_process = subprocess.Popen(
["mkdocs", "build"], stdout=pipe, stderr=pipe)
std_op, std_err_op = mkdocs_process.communicate()
if std_err_op:
print("ERROR: Could not build MkDocs !\n%s" %
std_err_op)
return False
else:
print(std_op)
# Remove root Documentation folder and copy the new site files into it
generated_site_dir = os.path.join(MKDOCS_DIR, "site")
root_documentation_dir = os.path.join(
os.path.dirname(THIS_FILE_DIR), "documentation")
print("Copy folder %s into %s ...\n" %
(generated_site_dir, root_documentation_dir))
if os.path.exists(root_documentation_dir):
try:
shutil.rmtree(root_documentation_dir)
except shutil.Error:
print("ERROR: Could not remove root documentation folder !")
return False
try:
shutil.move(generated_site_dir, root_documentation_dir)
except shutil.Error:
print("ERROR: Could move new documentation files from " +
"%s to %s !" % (generated_site_dir, root_documentation_dir))
return False
return True
def build_docs(): def build_docs():
""" Builds the documentation HTML pages from the Wiki repository. """ """ Builds the documentation HTML pages from the Wiki repository. """
...@@ -250,20 +235,23 @@ def build_docs(): ...@@ -250,20 +235,23 @@ def build_docs():
if success is False: if success is False:
sys.exit(1) sys.exit(1)
success = edit_mkdocs_config() pages_str = generate_pages_from_sidebar()
if success is False: if not pages_str:
sys.exit(1) sys.exit(1)
# Create index.html before the MkDocs site is created in case the project success = edit_mkdocs_config(pages_str)
# already contains an index file.
success = create_index()
if success is False: if success is False:
sys.exit(1) sys.exit(1)
success = build_mkdocs() success = build_mkdocs()
if success is False: if success is False:
sys.exit(1) sys.exit(1)
print("Build process finished!")
success = create_index()
if success is False:
sys.exit(1)
print("\nBuild process finished!")
if __name__ == "__main__": if __name__ == "__main__":
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment