mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-18 12:00:31 +01:00
Website: Create script to update the list of man pages in the index
It is a good idea to have an Index web page with the list of the man pages available, but there is a risk to have it outdated, so there is a script to take care of this for us. Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
This commit is contained in:
committed by
Carlos R. Mafra
parent
a2bf67f54c
commit
6afa419b01
@@ -46,7 +46,8 @@ EXTRA_DIST = TODO BUGS BUGFORM FAQ INSTALL \
|
|||||||
script/generate-po-from-template.sh \
|
script/generate-po-from-template.sh \
|
||||||
script/generate-txt-from-texi.sh \
|
script/generate-txt-from-texi.sh \
|
||||||
script/nested-func-to-macro.sh \
|
script/nested-func-to-macro.sh \
|
||||||
script/replace-ac-keywords.sh
|
script/replace-ac-keywords.sh \
|
||||||
|
script/replace-generated-content.sh
|
||||||
|
|
||||||
|
|
||||||
.PHONY: coverage-reset coverage
|
.PHONY: coverage-reset coverage
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ if WITH_WEB_REPO
|
|||||||
# We convert all man pages except those that are a link to other man page (.so command)
|
# We convert all man pages except those that are a link to other man page (.so command)
|
||||||
website: $(MANS) website.menu
|
website: $(MANS) website.menu
|
||||||
@local_pages=`echo "$^" | sed -e 's/ [^ ]*\.menu$$// ; s,[^ /]*/,,g' `; \
|
@local_pages=`echo "$^" | sed -e 's/ [^ ]*\.menu$$// ; s,[^ /]*/,,g' `; \
|
||||||
|
generated_pages=""; \
|
||||||
for man in $^; do \
|
for man in $^; do \
|
||||||
[ "$$man" = "website.menu" ] && continue; \
|
[ "$$man" = "website.menu" ] && continue; \
|
||||||
grep -i '^\.so[ \t]' "$$man" > /dev/null && continue; \
|
grep -i '^\.so[ \t]' "$$man" > /dev/null && continue; \
|
||||||
@@ -140,7 +141,12 @@ website: $(MANS) website.menu
|
|||||||
--local-pages "$$local_pages" --external-url 'http://linux.die.net/man/%s/%l' \
|
--local-pages "$$local_pages" --external-url 'http://linux.die.net/man/%s/%l' \
|
||||||
--with-menu "website.menu" --package '$(PACKAGE_STRING)' \
|
--with-menu "website.menu" --package '$(PACKAGE_STRING)' \
|
||||||
$$man || exit $$?; \
|
$$man || exit $$?; \
|
||||||
done
|
generated_pages="$$generated_pages $$man"; \
|
||||||
|
done; \
|
||||||
|
echo " UPDATE index.md"; \
|
||||||
|
$(top_srcdir)/script/replace-generated-content.sh --man-pages "$$generated_pages" \
|
||||||
|
--template '<tr><td class="name"><a href="\1">\2</a></td><td class="section">\3</td><td>\4</td></tr>' \
|
||||||
|
--marker LIST_MANPAGES_COMMANDS $(WEB_REPO_ROOT)/docs/manpages/index.md
|
||||||
|
|
||||||
MOSTLYCLEANFILES += website.menu
|
MOSTLYCLEANFILES += website.menu
|
||||||
|
|
||||||
|
|||||||
218
script/replace-generated-content.sh
Executable file
218
script/replace-generated-content.sh
Executable file
@@ -0,0 +1,218 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# Window Maker window manager
|
||||||
|
#
|
||||||
|
# Copyright (c) 2021 Christophe CURIS
|
||||||
|
# Copyright (c) 2021 Window Maker Team
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# replace-generated-content.sh:
|
||||||
|
# Re-generate some list of things and replace it in an existing file
|
||||||
|
#
|
||||||
|
# The script can generate these kind of information:
|
||||||
|
#
|
||||||
|
# - a list of man pages (--man-pages), in which case the following fields
|
||||||
|
# are available for the template replacement:
|
||||||
|
# \1: file for the man page, with directories removed, with '.html' extension
|
||||||
|
# \2: name of the man page, taken from the file name
|
||||||
|
# \3: section of the page, taken from the file name
|
||||||
|
# \4: one line description, taken from the man page's NAME section
|
||||||
|
#
|
||||||
|
# The 'template' argument provides the template on how to generate one line
|
||||||
|
# with the new content, the '\n' being replaced with the values explained
|
||||||
|
# above.
|
||||||
|
#
|
||||||
|
# The 'marker' arguments tells the script where the content is to be placed
|
||||||
|
# in the edited file:
|
||||||
|
# - the beginning of generated content is located from the line containing
|
||||||
|
# the pattern 'start ' + the marker text
|
||||||
|
# - the end is marked by 'end ' + marker
|
||||||
|
# No content outside the start/end is modified. When inserting the content
|
||||||
|
# the script is re-using the indentation that was found in the line with the
|
||||||
|
# start marker.
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# For portability, we stick to the same sh+awk constraint as Autotools to
|
||||||
|
# limit problems, see for example:
|
||||||
|
# http://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Portable-Shell.html
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# Report an error on stderr and exit with status 2 to tell make that we could
|
||||||
|
# not do what we were asked
|
||||||
|
arg_error() {
|
||||||
|
echo "`basename $0`: $@" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
# print help and exit with success status
|
||||||
|
print_help() {
|
||||||
|
echo "$0: replace lines by new content"
|
||||||
|
echo "Usage: $0 options... file"
|
||||||
|
echo "valid options are:"
|
||||||
|
echo " --template string : template text for generating the data"
|
||||||
|
echo " --man-pages list : content from the list of these man pages"
|
||||||
|
echo " --marker mark : comment mark surrounding the data to update"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract command line arguments
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
--man-pages)
|
||||||
|
shift
|
||||||
|
man_pages="$man_pages $1 "
|
||||||
|
;;
|
||||||
|
|
||||||
|
--marker)
|
||||||
|
shift
|
||||||
|
[ "x$mark" = "x" ] || arg_error "only 1 marker can be specified (option: --marker)"
|
||||||
|
mark=$1
|
||||||
|
;;
|
||||||
|
|
||||||
|
--template)
|
||||||
|
shift
|
||||||
|
[ "x$template" = "x" ] || arg_error "only 1 template can be specified (option: --template)"
|
||||||
|
template="$1"
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|-help|--help) print_help ;;
|
||||||
|
-*) arg_error "unknow option '$1'" ;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
[ -z "$edit_file" ] || arg_error "only 1 file to modify can be specified"
|
||||||
|
edit_file=$1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check consistency of command-line
|
||||||
|
[ -z "$edit_file" ] && arg_error "no file to update was specified"
|
||||||
|
[ -f "$edit_file" ] || arg_error "file \"$edit_file\" cannot be read"
|
||||||
|
[ -z "$template" ] && arg_error "Template for generation not specified"
|
||||||
|
[ -z "$mark" ] && arg_error "No content mark specified"
|
||||||
|
[ -z "$man_pages" ] && arg_error "No input list provided"
|
||||||
|
|
||||||
|
# Make sure the file to edit contains the appropriate marks
|
||||||
|
grep "start $mark" "$edit_file" > /dev/null || arg_error "Start mark \"start $mark\" not found in \"$edit_file\" (option: --marker)"
|
||||||
|
grep "end $mark" "$edit_file" > /dev/null || arg_error "End mark \"end $mark\" not found in \"$edit_file\""
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# Generate the content from the list of man pages provided
|
||||||
|
###########################################################################
|
||||||
|
if [ -n "$man_pages" ]; then
|
||||||
|
parse_man_page() {
|
||||||
|
# Build the name of the HTML file from the man page name
|
||||||
|
target=`echo $1 | sed 's,[^/]*/,,g ; s/\.[^.]*$//' `.html
|
||||||
|
section=`echo $1 | sed 's/^.*\.\([^.]*\)$/\1/' `
|
||||||
|
|
||||||
|
# Extract the name and the description from the .SH NAME
|
||||||
|
sed -n '/^\.SH "*NAME"*$/ {
|
||||||
|
n
|
||||||
|
s/^\([^ ]*\) *\\- */'$target':\1:'$section':/
|
||||||
|
:append_next_line
|
||||||
|
N
|
||||||
|
/\n\./ b end_section_found
|
||||||
|
s/[ \t]*\n[ \t]*/ /
|
||||||
|
b append_next_line
|
||||||
|
:end_section_found
|
||||||
|
s/[ \t]*\n\..*$//
|
||||||
|
s/\\f[BIPR]//g
|
||||||
|
p
|
||||||
|
}' $1
|
||||||
|
}
|
||||||
|
|
||||||
|
content=`
|
||||||
|
for file in $man_pages ; do
|
||||||
|
parse_man_page $file
|
||||||
|
done
|
||||||
|
`
|
||||||
|
nb_fields=4
|
||||||
|
fi
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# Convert the content to the specified format
|
||||||
|
###########################################################################
|
||||||
|
for i in `seq 2 $nb_fields`; do
|
||||||
|
sed_from="$sed_from\\([^:]*\\):"
|
||||||
|
done
|
||||||
|
sed_from="^$sed_from\\(.*\\)\$"
|
||||||
|
|
||||||
|
content=`echo "$content" | sed -e "s,$sed_from,$template," `
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# Replace the content in the file
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# We are working in 2 steps because we cannot edit in place
|
||||||
|
# In step one we remove the existing content from the file
|
||||||
|
purged_file=`sed -e "/start $mark/ {
|
||||||
|
p
|
||||||
|
:search_end
|
||||||
|
N
|
||||||
|
s/^.*\n//
|
||||||
|
/end $mark/! b search_end
|
||||||
|
}" "$edit_file"
|
||||||
|
`
|
||||||
|
|
||||||
|
# Convert the content to an AWK array
|
||||||
|
awk_start=`echo "$content" | awk '
|
||||||
|
BEGIN {
|
||||||
|
print "BEGIN {";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Add a backslash before the double-quotes
|
||||||
|
line = "";
|
||||||
|
while (1) {
|
||||||
|
idx = index($0, "\"");
|
||||||
|
if (idx == 0) break;
|
||||||
|
line = line substr($0, 1, idx - 1) "\\\\\"";
|
||||||
|
$0 = substr($0, idx + 1);
|
||||||
|
}
|
||||||
|
print " content[" NR "] = \"" line $0 "\";";
|
||||||
|
}
|
||||||
|
END {
|
||||||
|
print " nb_content = " NR ";";
|
||||||
|
print "}";
|
||||||
|
}
|
||||||
|
' `
|
||||||
|
|
||||||
|
# In step two we insert the generated content between the marks
|
||||||
|
awk_cmd='
|
||||||
|
# When the start mark is found, insert the generated content
|
||||||
|
/start '"$mark"'/ {
|
||||||
|
print;
|
||||||
|
|
||||||
|
# Isolate the indentation so it can be applied to all generated lines
|
||||||
|
sub(/[^ \t].*$/, "");
|
||||||
|
|
||||||
|
for (i = 1; i <= nb_content; i++) {
|
||||||
|
print $0 content[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
# Thanks to the pre-processing done, the next line will be the end mark
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
# All the rest of the file is kept as-is
|
||||||
|
{ print }
|
||||||
|
'
|
||||||
|
|
||||||
|
echo "$purged_file" | awk "$awk_start$awk_cmd" > "$edit_file" || exit $?
|
||||||
Reference in New Issue
Block a user