diff options
Diffstat (limited to 'solenv/bin/mkdocs.sh')
-rwxr-xr-x | solenv/bin/mkdocs.sh | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/solenv/bin/mkdocs.sh b/solenv/bin/mkdocs.sh new file mode 100755 index 000000000..b61d53a29 --- /dev/null +++ b/solenv/bin/mkdocs.sh @@ -0,0 +1,281 @@ +#!/usr/bin/env bash +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Doxygen / README doc generation +# +# See git for contributors +# + +function header { + title=$1 + breadcrumb=$2 + output=$3 + + cat - > $output <<EOF +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> + <title>$title</title> + + <style> + * { margin: 0; padding: 0; } + body { font-family: sans-serif; font-size: 12px; } + #head { padding: 20px; background: #00A500; } + #head a { color: #000; } + #body { padding: 20px; } + #foot { padding: 10px; font-size: 9px; border-top: 1px #18A303 solid; margin-top: 25px; } + p { line-height: 1.7em; margin-bottom: 1em; } + pre { margin-bottom: 0.5em; } + .multi-col { -moz-column-width: 20em; -webkit-column-width: 20em; -moz-column-gap: 1em; -webkit-column-gap: 1em; } + h1 { margin-bottom: 0.5em; } + h2,h3,h4 { margin: 1.3em 0 0.5em 0; } + ul, ol { margin: 0.5em 1.5em; } + </style> +</head> +<body> + <div id="head"> + <h1>$title</h1> + <p>$breadcrumb</p> + </div> + <div id="body" style="multi-col"> +EOF +} + +function footer { + output=$1 + + cat - >> $output <<EOF + +</div> +<div id="foot"> + <small> + <p>Generated by Libreoffice <a href="https://git.libreoffice.org/core/+/refs/heads/master/solenv/bin/mkdocs.sh">Module Description Tool</a></p> + <p>Last updated: +EOF +LANG= date >> $output +cat - >> $output <<EOF + </p> + </small> +</div> +</body> +</html> +EOF + +} + +function proc_text { + # Local links: [[...]] + # Git links: [git:...] + # Other remote links: [...] + # Headings: == bleh == + # Paragraphs: \n\n + sed -re ' s/\[\[([-_a-zA-Z0-9]+)\]\]/<a href="\1.html">\1<\/a>/g' - \ + | sed -re ' s/\[git:([^]]+)\]/<a href="https:\/\/git.libreoffice.org\/core\/+\/refs\/heads\/master\/\1">\1<\/a>/g' \ + | sed -re ' s/\[([^]]+)\]/<a href="\1">\1<\/a>/g' \ + | sed -re ' s/====([^=]+)====/<h4>\1<\/h4>/g' \ + | sed -re ' s/===([^=]+)===/<h3>\1<\/h3>/g' \ + | sed -re ' s/==([^=]+)==/<h2>\1<\/h2>/g' \ + | sed -re ':a;N;$!ba;s/\n\n/<\/p><p>/g' \ + | awk 'BEGIN { print "<p>" } { print } END { print "</p>" }' +} + +function proc_text_markdown { + sed -re ' s/\[git:([^]]+)\]/<a href="\.\.\/\1">\1<\/a>/g' +} + +function check_cmd { + cmds_needed="$1" + error_msg="$2" + + found=0; cmd= + for cmd_needed in $cmds_needed; do + which $cmd_needed > /dev/null 2>&1 && { found=1; cmd=$cmd_needed; } + done + if [ $found = 0 ]; then + echo "$error_msg" >&2 + exit 1 + fi + export "${cmds_needed%% *}"=$cmd +} + +function setup { + parm=$1 + if [ -z "${!parm}" ] ; then + echo "grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")" + echo "$parm=$(grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")" + eval "$parm=$(grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")" + fi + if [ -z "${!parm}" ] ; then + echo "could not determine $parm" >&2 + exit 1 + fi +} + +# binaries that we need +check_cmd doxygen "You need doxygen for doc generation" +check_cmd dot "You need the graphviz tools to create the nice inheritance graphs" +check_cmd "markdown markdown2 markdown2-3" "You need either markdown or markdown2 in order to convert README.md into html" + +# suck setup +setup "SOLARINC" +shopt -s nullglob + +# Title of the documentation +DOXYGEN_PROJECT_PREFIX="LibreOffice" + +# get list of modules +if [ -z "$INPUT_PROJECTS" ]; then + INPUT_PROJECTS="`ls */Module_*.mk | sed 's#/.*##'`" +fi + + +# output directory for generated documentation +BASE_OUTPUT="$1" +mkdir -p "$BASE_OUTPUT" || { + echo "Cannot create $BASE_OUTPUT" + exit 1 +} + +# paths for binary and configuration file +BASE_PATH=`pwd` +DOXYGEN_CFG="$2" +if test ! -f "$DOXYGEN_CFG"; then + echo "doxygen.cfg not found" + exit 1 +fi + +# strip -I. and bin -I prefix; exclude system headers +DOXYGEN_INCLUDE_PATH=`echo $SOLARINC | sed -e 's/-I\.//g' -e 's/ -I/ /'g -e 's/ -isystem/ /g' -e 's|/usr/[^ ]*| |g'` + +# setup version string +DOXYGEN_VERSION="master" + + +################################################### +# +# Generate docs +# +################################################### + +# cleanup +echo "cleaning up" && rm -rf $BASE_OUTPUT/* + +# make the stuff world-readable +umask 022 + +# generate docs +echo "generating doxygen docs" +DOXYGEN_REF_TAGFILES="" +for PROJECT in $INPUT_PROJECTS; +do + # avoid processing of full project subdirs, only add source and inc + + # project header files can be in $PROJECT/inc and/or include/$PROJECT + if [ -d "$PROJECT/inc" ]; then + PROJECT_INCLUDE="$PROJECT/inc" + else + PROJECT_INCLUDE="" + fi + + if [ -d "include/$PROJECT" ]; then + PROJECT_INCLUDE="$PROJECT_INCLUDE include/$PROJECT" + if [ "$PROJECT" = "sal" ]; then + PROJECT_INCLUDE="$PROJECT_INCLUDE include/osl include/rtl" + fi + fi + + DOXYGEN_INPUT=`printf "%s" "$PROJECT/source $PROJECT_INCLUDE"` + + DOXYGEN_OUTPUT="$BASE_OUTPUT/$PROJECT" + DOXYGEN_OUR_TAGFILE="$DOXYGEN_OUTPUT/$PROJECT.tags" + DOXYGEN_PROJECTNAME="$DOXYGEN_PROJECT_PREFIX Module $PROJECT" + + # export variables referenced in doxygen config file + export DOXYGEN_INPUT + export DOXYGEN_OUTPUT + export DOXYGEN_INCLUDE_PATH + export DOXYGEN_VERSION + export DOXYGEN_OUR_TAGFILE + export DOXYGEN_REF_TAGFILES + export DOXYGEN_PROJECTNAME + + # debug + echo "Calling $DOXYGEN_PATH/doxygen $DOXYGEN_CFG with" + echo "Input: $DOXYGEN_INPUT" + echo "Output: $DOXYGEN_OUTPUT" + echo "Include: $DOXYGEN_INCLUDE_PATH" + echo "Version: $DOXYGEN_VERSION" + echo "Tagfile: $DOXYGEN_OUR_TAGFILE" + echo "Ref-Tags: $DOXYGEN_REF_TAGFILES" + echo "Title: $DOXYGEN_PROJECTNAME" + + nice -15 doxygen "$DOXYGEN_CFG" >>$BASE_OUTPUT/doxygen.log 2>&1 || exit 1 + + # setup referenced tagfiles for next round + DOXYGEN_REF_TAGFILES="$DOXYGEN_REF_TAGFILES $DOXYGEN_OUR_TAGFILE=$BASE_URL/$PROJECT/html" +done + +# generate entry page +echo "generating index page" +header "LibreOffice Modules" " " "$BASE_OUTPUT/index.html" +for module_name in *; do + if [ -d $module_name ]; then + cur_file=$(echo $module_name/README.md) + if [ -f "$cur_file" ]; then + # write index.html entry + text=$(echo -e "<h2><a href=\"${module_name}.html\">${module_name}</a></h2>\n") + + if [ ${cur_file: -3} == ".md" ]; then + # This is a markdown file. + header_text="$(head -n1 $cur_file)" + header_text="$(echo ${header_text} | sed -e 's/^\#*//g')" + text="${text}${header_text}" + else + text="${text}$(head -n1 $cur_file | proc_text)" + fi + echo -e "$text" >> "$BASE_OUTPUT/index.html" + + # write detailed module content + header "$module_name" "<a href=\"index.html\">LibreOffice</a> » ${module_name}" "$BASE_OUTPUT/${module_name}.html" + text="<p><b>View module in:</b>" + text="${text} <a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">git</a>" + if $(echo $INPUT_PROJECTS | grep -q $module_name); then + text="${text} <a href=\"${module_name}/html/classes.html\">Doxygen</a>" + fi + text="${text} </p><p> </p>" + echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html" + + if [ ${cur_file: -3} == ".md" ]; then + # This is a markdown file. + text="$(${markdown} $cur_file | proc_text_markdown)" + echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html" + else + proc_text < $cur_file >> "$BASE_OUTPUT/${module_name}.html" + fi + footer "$BASE_OUTPUT/${module_name}.html" + else + empty_modules[${#empty_modules[*]}]=$module_name + fi + fi +done + +if [ ${#empty_modules[*]} -gt 10 ]; then + echo -e "<p> </p><p>READMEs were not available for these modules:</p><ul>\n" >> "$BASE_OUTPUT/index.html" + for module_name in "${empty_modules[@]}"; do + # Do not process these directories + if [[ "$module_name" =~ ^(autom4te.cache|dictionaries|docs|helpcompiler|helpcontent2|include|instdir|lo|translations|workdir)$ ]]; then + continue + fi + echo -e "<li><a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">${module_name}</a></li>\n" >> "$BASE_OUTPUT/index.html" + done + echo -e "</ul>\n" >> "$BASE_OUTPUT/index.html" +fi + +footer "$BASE_OUTPUT/index.html" + +## done |