249 lines
9.1 KiB
Bash
Executable File
249 lines
9.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
|
|
urequire DEFAULTS udir tiddlywiki javaproperties
|
|
|
|
function display_help() {
|
|
uecho "$scriptname: synchroniser un répertoire de wiki avec un tiddlywiki
|
|
|
|
USAGE
|
|
$scriptname [options]
|
|
|
|
Un répertoire de wiki est un répertoire où chaque page est contenu dans un
|
|
fichier avec l'extension .twp
|
|
Un tiddlywiki est un fichier html contenant le code de TiddlyWiki et les données
|
|
associées.
|
|
|
|
OPTIONS
|
|
-d wikidir
|
|
-f wikifile
|
|
Spécifier le répertoire de wiki et le tiddlywiki à traiter. Par défaut,
|
|
il s'agit de wiki.html dans le répertoire courant.
|
|
-u Importer les pages de wikidir dans le tiddlywiki. Utiliser cette action
|
|
quand les pages de wikidir sont modifiées et qu'il faut mettre à jour le
|
|
tiddlywiki.
|
|
Il s'agit de l'action par défaut
|
|
--force
|
|
Forcer l'importation des pages même si les tiddlers correspondant sont
|
|
plus récents dans le tiddlywiki
|
|
Forcer aussi la regénération de wikifile même si aucune modification n'a
|
|
été détectée
|
|
-e Exporter les tiddlers du tiddlywiki vers wikidir. Utiliser cette action
|
|
quand le tiddlywiki a été modifié, et qu'il faut synchroniser wikidir
|
|
avec les dernières modifications.
|
|
-U Mettre à jour le fichier wikifile avec la dernière version de tiddlywiki
|
|
située dans $(ppath "$TEMPLATE")"
|
|
}
|
|
|
|
TEMPLATE="$scriptdir/lib/tiddlywiki/empty.html"
|
|
|
|
function find_wikifile() {
|
|
local -a htmls
|
|
local wikidir="$1"
|
|
array_from_lines htmls "$(list_files "$wikidir" "*.html")"
|
|
case "${#htmls[*]}" in
|
|
1) # un seul, prendre celui-là
|
|
wikifile="$wikidir/${htmls[0]}"
|
|
;;
|
|
*) # sinon, prendre le nom par défaut
|
|
wikifile="$wikidir/wiki.html"
|
|
;;
|
|
esac
|
|
echo "$wikifile"
|
|
}
|
|
|
|
function init_wikidir() {
|
|
# Créer les fichiers de base correspondant à un tiddlywiki vide,
|
|
# $1(=wiki.html) étant le tiddlywiki et $2(=.) le répertoire destination
|
|
local wikifile="$1" wikidir="${2:-.}"
|
|
|
|
# créer le répertoire
|
|
if [ ! -f "$wikidir/.udir" ]; then
|
|
estep "Configuration du répertoire"
|
|
udir_create_maybe "$wikidir"
|
|
local set_udir_types
|
|
set_udir_types="$(udir_eval "$wikidir" "array_set udir_types wikidir; set_array_cmd udir_types")"
|
|
udir_update "$wikidir" "$set_udir_types"
|
|
fi
|
|
|
|
# calculer le nom par défaut à prendre pour le titre et le sous-titre
|
|
local -a parentdirs
|
|
local parentdir projtitle projsubtitle
|
|
local tmpname tmpdesc
|
|
parentdirs parentdirs "$wikidir/.."
|
|
for parentdir in "${parentdirs[@]}"; do
|
|
if [ -f "$parentdir/build.properties" ]; then
|
|
# il faut avoir project.name et éventuellement project.desc
|
|
read_property "$parentdir/build.properties" project.name tmpname
|
|
read_property "$parentdir/build.properties" project.desc tmpdesc
|
|
if [ -n "$tmpname" ]; then
|
|
projtitle="$tmpname"
|
|
projsubtitle="$tmpdesc"
|
|
break
|
|
fi
|
|
fi
|
|
if [ -f "$parentdir/.udir" ]; then
|
|
# prendre udir_desc
|
|
projtitle="$(basename "$parentdir")"
|
|
projsubtitle="$(udir_eval "$parentdir" 'echo "$udir_desc"')"
|
|
break
|
|
fi
|
|
done
|
|
if [ -z "$projtitle" ]; then
|
|
projtitle="$(basename "${parentdirs[0]}")"
|
|
fi
|
|
|
|
# créer le tiddlywiki
|
|
[ -n "$wikifile" ] || wikifile="$wikidir/$projtitle.html"
|
|
local created=
|
|
if [ ! -f "$wikifile" ]; then
|
|
estep "Copie du modèle de wiki"
|
|
cp "$TEMPLATE" "$wikifile"
|
|
created=1
|
|
|
|
# créer les pages de wiki de base, seulement si on a créé le tiddlywiki
|
|
etitle "Création des pages initiales"
|
|
local now="$(twdate_curtid)"
|
|
local CWD="$(pwd)"
|
|
local TW_VERBOSE=
|
|
cd "$wikidir"
|
|
[ -f SiteTitle.twp ] || twwrite_twpage SiteTitle "$USER" "$USER" "$now" "" "" 1 "$projtitle"
|
|
[ -f SiteSubtitle.twp ] || twwrite_twpage SiteSubtitle "$USER" "$USER" "$now" "" "" 1 "$projsubtitle"
|
|
[ -f SiteUrl.twp ] || twwrite_twpage SiteUrl "$USER" "$USER" "$now" "" "" 1 ""
|
|
[ -f MainMenu.twp ] || twwrite_twpage MainMenu "$USER" "$USER" "$now" "" "" 1 "[[GettingStarted]]"
|
|
[ -f DefaultTiddlers.twp ] || twwrite_twpage DefaultTiddlers "$USER" "$USER" "$now" "" "" 1 "[[Main]]"
|
|
[ -f Main.twp ] || twwrite_twpage Main "$USER" "$USER" "$now" "" "" 1 ""
|
|
cd "$CWD"
|
|
eend
|
|
fi
|
|
}
|
|
|
|
action=update
|
|
wikidir=
|
|
wikifile=
|
|
delete=
|
|
force=
|
|
parse_opts "${PRETTYOPTS[@]}" \
|
|
--help '$exit_with display_help' \
|
|
-u action=update \
|
|
-e action=export \
|
|
-U action=upgrade \
|
|
-d: wikidir= \
|
|
-f: wikifile= \
|
|
--delete delete=1 \
|
|
--force force=1 \
|
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
|
|
|
[ -n "$wikidir" ] || wikidir=.
|
|
[ -n "$wikifile" ] || wikifile="$(find_wikifile "$wikidir")"
|
|
|
|
if [ "$action" == "update" ]; then
|
|
udir_eval "$wikidir" "array_contains udir_types wikidir" || {
|
|
ask_yesno "Ce répertoire ne semble pas être un répertoire de wiki. Voulez-vous créer les fichiers de base?" O || die
|
|
}
|
|
# laisser init_wikidir choisir le nom du fichier s'il n'existe pas
|
|
[ -f "$wikifile" ] || wikifile=
|
|
init_wikidir "$wikifile" "$wikidir"
|
|
[ -n "$wikifile" ] || wikifile="$(find_wikifile "$wikidir")"
|
|
|
|
wikidir="$(abspath "$wikidir")"
|
|
wikifile="$(abspath "$wikifile")"
|
|
|
|
# exporter wikifile vers un répertoire de travail
|
|
etitle "Création des répertoires de travail"
|
|
estep "Pages du wikidir"
|
|
# exporter les pages de wikidir sous forme canonique pour qu'on puisse les
|
|
# comparer avec les fichiers extraits du tiddlywiki
|
|
ac_set_tmpdir oldwikidir
|
|
(
|
|
function __twpage_data() {
|
|
local title="$1" creator="$2" modifier="$3" created="$4" modified="$5" tags="$6" changecount="$7" content="$8"
|
|
created="$(twdate_twp2tid "$created")"
|
|
modified="$(twdate_twp2tid "$modified")"
|
|
twwrite_twpage "$title" "$creator" "$modifier" "$created" "$modified" "$tags" "$changecount" "$content"
|
|
}
|
|
TW_VERBOSE=
|
|
cd "$oldwikidir"
|
|
array_from_lines twpages "$(list_files "$wikidir" "*.twp")"
|
|
for twpage in "${twpages[@]}"; do
|
|
eval "$(twdump_twpage "$wikidir/$twpage")"
|
|
done
|
|
)
|
|
array_from_lines oldtwpages "$(list_files "$oldwikidir" "*.twp")"
|
|
estep "Pages du tiddlywiki"
|
|
ac_set_tmpdir newwikidir
|
|
TW_VERBOSE= export_to_twpages "$wikifile" "$newwikidir"
|
|
array_from_lines newtwpages "$(list_files "$newwikidir" "*.twp")"
|
|
eend
|
|
|
|
# Calculer les modifications
|
|
etitle "Calcul des modifications"
|
|
modified=
|
|
for oldtwpage in "${oldtwpages[@]}"; do
|
|
pagename="${oldtwpage%.twp}"
|
|
if ! array_contains newtwpages "$oldtwpage"; then
|
|
estep "$pagename: nouvelle page"
|
|
cp "$oldwikidir/$oldtwpage" "$newwikidir"
|
|
modified=1
|
|
elif testsame "$oldwikidir/$oldtwpage" "$newwikidir/$oldtwpage"; then
|
|
:
|
|
elif twcheck_twpage_newtwpage "$newwikidir/$oldtwpage" "$oldwikidir/$oldtwpage"; then
|
|
estepw "$pagename: mise à jour"
|
|
cp "$oldwikidir/$oldtwpage" "$newwikidir"
|
|
modified=1
|
|
elif [ -n "$force" ]; then
|
|
estepw "$pagename: mise à jour forcée"
|
|
cp "$oldwikidir/$oldtwpage" "$newwikidir"
|
|
modified=1
|
|
else
|
|
estepw "$pagename: tiddler non écrasé car il est plus récent dans $(ppath "$wikifile")
|
|
Utilisez -e pour mettre à jour le répertoire"
|
|
fi
|
|
done
|
|
for newtwpage in "${newtwpages[@]}"; do
|
|
pagename="${newtwpage%.twp}"
|
|
if ! array_contains oldtwpages "$newtwpage"; then
|
|
if [ -n "$delete" ]; then
|
|
estepe "$pagename: suppression"
|
|
rm "$newwikidir/$newtwpage"
|
|
modified=1
|
|
else
|
|
estepw "$pagename: Ce tiddler n'existe que dans $(ppath "$wikifile")
|
|
Utilisez -e pour l'exporter ou --delete pour le supprimer"
|
|
fi
|
|
fi
|
|
done
|
|
eend
|
|
|
|
# puis réimporter les fichiers de newwikidir dans wikifile
|
|
if [ -n "$modified" -o -n "$force" ]; then
|
|
etitle "Importation des tiddlers"
|
|
import_from_twpages "$wikifile" "$newwikidir"
|
|
eend
|
|
fi
|
|
|
|
elif [ "$action" == "export" ]; then
|
|
[ -f "$wikifile" ] || die "$wikifile: fichier introuvable"
|
|
wikidir="$(abspath "$wikidir")"
|
|
wikifile="$(abspath "$wikifile")"
|
|
|
|
export_to_twpages "$wikifile" "$wikidir"
|
|
|
|
elif [ "$action" == "upgrade" ]; then
|
|
[ -f "$wikifile" ] || die "$wikifile: fichier introuvable"
|
|
wikidir="$(abspath "$wikidir")"
|
|
wikifile="$(abspath "$wikifile")"
|
|
|
|
theversion="$(twget_version "$wikifile")"
|
|
srcversion="$(twget_version "$TEMPLATE")"
|
|
|
|
if [ "$theversion" != "$srcversion" ]; then
|
|
einfo "La version actuelle est $theversion"
|
|
if ask_yesno "Une nouvelle version $srcversion est disponible. Faut-il l'installer?" O; then
|
|
twupgrade "$wikifile" "$TEMPLATE"
|
|
fi
|
|
elif [ "$templatefile" -nt "$wikifile" ]; then
|
|
twupgrade "$wikifile" "$TEMPLATE"
|
|
fi
|
|
fi
|