289 lines
9.9 KiB
Bash
Executable file
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 lv_LV zh_CN'
|
|
|
|
# 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 "---------------"
|