summaryrefslogtreecommitdiffstats
path: root/solenv/bin/mkdocs.sh
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/mkdocs.sh')
-rwxr-xr-xsolenv/bin/mkdocs.sh281
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> &raquo; ${module_name}" "$BASE_OUTPUT/${module_name}.html"
+ text="<p><b>View module in:</b>"
+ text="${text} &nbsp; <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} &nbsp; <a href=\"${module_name}/html/classes.html\">Doxygen</a>"
+ fi
+ text="${text} </p><p>&nbsp;</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>&nbsp;</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