iredmail-doc/convert.sh

289 lines
9.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Author: Zhang Huangbin <zhb _at_ iredmail.org>
# Purpose: Convert markdown articles to HTML files.
export ROOTDIR="$(pwd)"
export OUTPUT_DIR="${ROOTDIR}/html"
# A temporary directory used to copy and modify markdown files, will be removed
# after all files were converted.
export TMP_DIR="${OUTPUT_DIR}/tmp"
export CONVERTER="${ROOTDIR}/tools/markdown2html.py"
export CMD_CONVERT="python ${CONVERTER}"
export CMD_CHECK_CHANGE="git status"
export CHANGED_FILES="$(git status | grep -E '(modified:|new file:)' | grep '\.md$' | awk -F':' '{print $2}')"
export TODAY="$(date +%Y-%m-%d)"
[ -d ${OUTPUT_DIR} ] || mkdir -p ${OUTPUT_DIR}
[ -d ${TMP_DIR} ] || mkdir -p ${TMP_DIR}
strip_name_prefix()
{
name="${1}"
name="$(echo ${name/#\.\//})" # ./filename
name="$(echo ${name/#[0-9][0-9][0-9]-/})" # nnn-
name="$(echo ${name/#[0-9][0-9]-/})" # nn-
name="$(echo ${name/#[0-9]-/})" # n-
echo "${name}"
}
# Available translations
export all_languages='en_US it_IT zh_CN es_MX'
# Chapter directories in specified order
export all_chapter_dirs="overview \
installation \
mua \
upgrade \
iredmail-easy \
migrations \
howto \
integrations \
cluster \
iredadmin \
troubleshooting \
faq"
# Additional directories which stores scripts or other non-Markdown files.
additional_dirs=""
# Compile all Markdown files.
if echo "$@" | grep -q -- '--all' &>/dev/null; then
compile_all='YES'
fi
article_counter=0
for lang in ${all_languages}; do
src_dir="${ROOTDIR}/${lang}"
if [ ! -d ${src_dir} ]; then
echo "* [SKIP] No translation for language: ${lang}."
break
fi
if [ X"${compile_all}" != X'YES' ]; then
if ${CMD_CHECK_CHANGE} | grep "${lang}/" &>/dev/null; then
echo "* Change found for language: ${lang}."
else
echo "* [SKIP] No change found for language: ${lang}."
continue
fi
fi
# Generate a Markdown file used to store index of chapters/articles.
if [ X"${lang}" == X'en_US' ]; then
INDEX_MD="${OUTPUT_DIR}/index.md"
else
INDEX_MD="${OUTPUT_DIR}/index-${lang}.md"
fi
cd ${src_dir}
# Show different languages
echo -e '!!! note "Some tutorials have been translated to different languages. [Help translate more](https://github.com/iredmail/docs)"' > ${INDEX_MD}
_md_lang=''
for l in ${all_languages}; do
# Latvian has only one tutorial which is hidden due to file name starts
# with '0-'. So we hide this language temporarily.
if [ X"${l}" == X'lv_LV' ]; then
continue
fi
if [ X"${l}" != X"${lang}" ]; then
if [ X"${l}" == X'en_US' ]; then
_md_lang="${_md_lang} [$(cat ${ROOTDIR}/${l}/_lang.md)](./index.html) /"
else
_md_lang="${_md_lang} [$(cat ${ROOTDIR}/${l}/_lang.md)](./index-${l}.html) /"
fi
fi
done
echo -e "\t${_md_lang}\n" >> ${INDEX_MD}
unset _md_lang
# Initial index file.
if [ -f ${src_dir}/_title.md ]; then
cat ${src_dir}/_title.md >> ${INDEX_MD}
fi
# Used for prettier printing
break_line='NO'
# Get chapter info
# - chapter summary: _summary.md
# - article title: _title.md
for chapter_dir in ${all_chapter_dirs}; do
if [ ! -d ${chapter_dir} ]; then
continue
fi
# Get articles
all_chapter_articles="$(find ${chapter_dir} -type f -iname '[0-9a-z]*.md' | sort)"
# Output directory.
# Remove prefix '[number]-' in chapter directory name.
#chapter_dir_in_article="$(strip_name_prefix ${chapter_dir})"
#_output_chapter_dir="${OUTPUT_DIR}/${chapter_dir_in_article}"
# Get chapter title.
_title_md="${chapter_dir}/_title.md"
_summary_md="${chapter_dir}/_summary.md"
if [ -f ${_title_md} ]; then
# generate index info of chapter
_chapter_title="$(cat ${_title_md})"
echo -e "### ${_chapter_title}" >> ${INDEX_MD}
if [ -f ${_summary_md} ]; then
echo '' >> ${INDEX_MD}
cat ${_summary_md} >> ${INDEX_MD}
# Insert an empty line to not mess up other formats like list.
echo '' >> ${INDEX_MD}
fi
fi
for article_file in ${all_chapter_articles}; do
article_counter="$((article_counter+1))"
article_file_basename="$(basename ${article_file})"
article_html_file_orig="$(strip_name_prefix ${article_file_basename})"
# Replace '.md' suffix by '-<lang>.html'
if [ X"${lang}" == X'en_US' ]; then
article_html_file="$(echo ${article_html_file_orig/%.md/.html})"
else
article_html_file="$(echo ${article_html_file_orig/%.md/-${lang}.html})"
fi
hide_article_in_index='NO'
if echo "${article_file_basename}" | grep '^0-' &>/dev/null; then
hide_article_in_index='YES'
fi
# Get first line (without the leading '# ') as article title
_article_title="$(head -1 ${article_file} | awk -F'# ' '{print $2}')"
#
# Get title in markdown file: 'Title: title'
#_article_title="$(grep '^Title: ' ${article_file} | head -1 | awk -F'Title: ' '{print $2}')"
#
# Get title in markdown file: '<h1>title</h1>'
#_article_title="$(head -1 ${article_file} | awk -F'[<|>]' '{print $3}')"
if [ X"${hide_article_in_index}" == X'NO' ]; then
echo "* [${_article_title}](${article_html_file})" >> ${INDEX_MD}
fi
# Convert modified file
echo ${CHANGED_FILES} | grep ${article_file} &> /dev/null
compile_this_file="$?"
if [ X"${compile_this_file}" == X'0' -o X"${compile_all}" == X'YES' ]; then
if [ X"${break_line}" == X'YES' ]; then
echo -en "* Converting (#${article_counter}): ${lang}/${article_file}"
else
echo -en "\n* Converting (#${article_counter}): ${lang}/${article_file}"
fi
# * Detect same file in different languages
# * Modify markdown file to append a note paragraph to remind
# reader that current document has different language version.
translations=''
for tlang in ${all_languages}; do
if [ X"${tlang}" != X"${lang}" ]; then
if [ -f ${ROOTDIR}/${tlang}/${chapter_dir}/${article_file_basename} ]; then
translations="${translations} ${tlang}"
fi
fi
done
# Has translation(s).
md_src="${article_file}"
if echo ${translations} | grep '_' &>/dev/null; then
tmp_md_orig="${TMP_DIR}/${article_file_basename}-${lang}"
tmp_md="${TMP_DIR}/${article_file_basename}"
cp -f ${article_file} ${tmp_md_orig}
# Generate new markdown file
# Get title line
_title_line="$(head -1 ${tmp_md_orig})"
# Remove title line
perl -pi -e 's#${_title_line}##' ${tmp_md_orig}
echo -e "${title_line}\n\n" > ${tmp_md}
echo -e '!!! note "This tutorial is available in other languages. [Help translate more](https://github.com/iredmail/docs)"\n\n' >> ${tmp_md}
_md_l='\t'
for l in ${translations}; do
if [ X"${l}" == X'en_US' ]; then
tmp_article_html_file="$(echo ${article_html_file_orig/%.md/.html})"
else
tmp_article_html_file="$(echo ${article_html_file_orig/%.md/-${l}.html})"
fi
_md_l="${_md_l} [$(cat ${ROOTDIR}/${l}/_lang.md)](./${tmp_article_html_file}) /"
done
echo -e "${_md_l}\n" >> ${tmp_md}
cat ${tmp_md_orig} >> ${tmp_md}
md_src="${tmp_md}"
rm -f ${tmp_md_orig}
fi
# Convert
${CMD_CONVERT} ${md_src} \
${OUTPUT_DIR} \
output_filename="${article_html_file}" \
title="${_article_title}" \
add_index_link='yes' &
if [ X"$?" == X'0' ]; then
echo -e ' [DONE]'
else
echo -e ' <<< FAILED >>>'
fi
break_line='YES'
else
echo -n '.'
break_line='NO'
fi
done
# Append addition links at the chapter bottom on index page.
_links_md="${chapter_dir}/_links.md"
if [ -f ${_links_md} ]; then
echo '' >> ${INDEX_MD}
cat ${_links_md} >> ${INDEX_MD}
echo '' >> ${INDEX_MD}
fi
done
# Copy additional directories.
for d in ${additional_dirs}; do
cp -rf ${d} ${OUTPUT_DIR} &>/dev/null
done
echo ''
echo "* ${article_counter} files total for ${lang}."
echo "* Converting ${INDEX_MD} for index page."
${CMD_CONVERT} ${INDEX_MD} ${OUTPUT_DIR} title="iRedMail Documentations"
# Cleanup and reset variables
rm -f ${INDEX_MD}
article_counter=0
done
rm -rf ${TMP_DIR} &>/dev/null
# Show changed files.
echo "* Changed files:"
echo "---------------"
${CMD_CHECK_CHANGE}
echo "---------------"