446 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			446 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| 
 | |
| function display_help() {
 | |
|     uecho "$scriptname: générer un fichier $NAME
 | |
| 
 | |
| USAGE
 | |
|     $scriptname [options] <file>
 | |
| 
 | |
| OPTIONS
 | |
|     -t TEMPLATE
 | |
|         Indiquer le modèle de fichier à utiliser pour la génération. Les valeurs
 | |
|         valides sont:
 | |
|             ${TEMPLATES[*]}
 | |
|     -e, --edit
 | |
|     -g, --no-edit
 | |
|         Editer (resp. ne pas éditer) le fichier après l'avoir généré.
 | |
|         Par défaut, l'éditeur est lancé après la génération.
 | |
|     -f, --overwrite
 | |
|         Ecraser le fichier s'il existe déjà
 | |
|     -E, --encoding ENCODING
 | |
|         Spécifier l'encoding à utiliser pour la génération du fichier
 | |
|     --doctype DOCTYPE
 | |
|     -4, --html4
 | |
|     -5, --html5
 | |
|         Spécifier le type de document. Les options -4 et -5 sont équivalentes à
 | |
|         --doctype html4 et --doctype html5, respectivement.
 | |
|     -b, --baseurl BASEURL
 | |
|         Spécifier le chemin à partir de la racine qui contient les resources
 | |
|         blueprint et bootstrap
 | |
|     -B, --bspath, --bppath CLPATH
 | |
|         Spécifier le chemin sous BASEURL à partir duquel charger bootstrap ou
 | |
|         blueprint. La valeur par défaut est 'bootstrap' pour l'option --bs,
 | |
|         'blueprint' pour l'option --bp
 | |
|     -s, --bs, --bootstrap
 | |
|         Activer le support de bootstrap. L'option --bs est automatiquement
 | |
|         activée si l'option --bspath n'est pas utilisée et le répertoire
 | |
|         [BASEURL/]bootstrap/ existe
 | |
|     -p, --bp, --blueprint
 | |
|         Activer le support de blueprint. L'option --bp est automatiquement
 | |
|         activée si l'option --bppath n'est pas utilisée et le répertoire
 | |
|         [BASEURL/]blueprint/ existe
 | |
|     -n, --nobs, --no-bootstrap, --nobp, --no-blueprint
 | |
|         Désactiver le support de bootstrap et blueprint
 | |
|     -j, --jquery
 | |
|     -k, --no-jquery
 | |
|         Activer (resp. désactiver) le chargement de jQuery à partir de BASEURL
 | |
|         pour les pages nues et avec blueprint. Avec bootstrap, le chargement de
 | |
|         jQuery est toujours effectué et cette option est ignorée.
 | |
|     --hl, --titlehl TITLEHL
 | |
|         Spécifier le tag à utiliser pour le titre. Vaut par défaut 'h1' pour les
 | |
|         templates HTML et PHP, 'h2' pour les templates overview et package
 | |
|     -T, --title TITLE
 | |
|         Spécifier le titre du document.
 | |
|     --head-title HTITLE
 | |
|         Spécifier le titre pour le tag <title> dans la section <head>. La valeur
 | |
|         par défaut est celle de l'option --title."
 | |
| }
 | |
| 
 | |
| NAME=www
 | |
| TEMPLATES=(html javadoc-package javadoc-overview php cakephp-ctp css javascript)
 | |
| NAMES=(package.html overview.html)
 | |
| EXTS=(html htm php phps ctp css js)
 | |
| 
 | |
| if [ $# -eq 2 ]; then
 | |
|     if [ "$1" == "--matches-template" ]; then
 | |
|         for template in "${TEMPLATES[@]}"; do
 | |
|             [ "$template" == "$2" ] && exit 0
 | |
|         done
 | |
|         exit 1
 | |
|     elif [ "$1" == "--matches-name" ]; then
 | |
|         for name in "${NAMES[@]}"; do
 | |
|             [ "$name" == "$2" ] && exit 0
 | |
|         done
 | |
|         exit 1
 | |
|     elif [ "$1" == "--matches-ext" ]; then
 | |
|         for ext in "${EXTS[@]}"; do
 | |
|             [ "$ext" == "$2" ] && exit 0
 | |
|         done
 | |
|         exit 1
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| #source /etc/ulib || exit 1
 | |
| source "$(dirname "$0")/../ulib/ulib" || exit 1
 | |
| urequire DEFAULTS
 | |
| 
 | |
| function check_overwrite() {
 | |
|     if [ -e "$1" -a -z "$overwrite" ]; then
 | |
|         eerror "$1: refus d'écraser un fichier déjà existant (utiliser -f)"
 | |
|         return 1
 | |
|     fi
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function __update_title() {
 | |
|     titlehl="$(strlower "$titlehl")"
 | |
|     [ -n "$titlehl" ] || titlehl=h1
 | |
|     [ "${titlehl:0:1}" == "h" ] || titlehl="h$titlehl"
 | |
| 
 | |
|     [ -n "$title" ] || {
 | |
|         title="$(basename "$file")"
 | |
|         title="${title%.*}"
 | |
|     }
 | |
|     [ -n "$head_title" ] || head_title="$title"
 | |
| }
 | |
| function __generate_html() {
 | |
|     # $file et $mode doivent être initialisés
 | |
| 
 | |
|     local dir="$(dirname "$file")"
 | |
|     local nobpsuppl nobplocal nobpmobile
 | |
|     if [ "$csslib" == auto ]; then
 | |
|         if [ -n "$clpath" ]; then
 | |
|             if [ "$clpath" == bootstrap -o -z "${clpath##*/bootstrap}" ]; then
 | |
|                 csslib=bootstrap
 | |
|             elif [ "$clpath" == blueprint -o -z "${clpath##*/blueprint}" ]; then
 | |
|                 csslib=blueprint
 | |
|             else
 | |
|                 csslib=
 | |
|             fi
 | |
|         elif [ -d "$dir/${baseurl#/}bootstrap" ]; then
 | |
|             csslib=bootstrap
 | |
|         elif [ -d "$dir/${baseurl#/}blueprint" ]; then
 | |
|             csslib=blueprint
 | |
|         else
 | |
|             csslib=
 | |
|         fi
 | |
|     fi
 | |
|     if [ "$csslib" == bootstrap ]; then
 | |
|         [ -n "$clpath" ] || clpath=bootstrap
 | |
|     elif [ "$csslib" == blueprint ]; then
 | |
|         [ -n "$clpath" ] || clpath=blueprint
 | |
|         [ -f "$dir/${baseurl#/}bpsuppl.css" ] || nobpsuppl=1
 | |
|         [ -f "$dir/${baseurl#/}bplocal.css" ] || nobplocal=1
 | |
|         [ -f "$dir/${baseurl#/}bpmobile.css" ] || nobpmobile=1
 | |
|     fi
 | |
| 
 | |
|     clpath="$baseurl$clpath"
 | |
|     [ "${clpath:$((-1)):1}" == / ] || clpath="$clpath/"
 | |
| 
 | |
|     local jquerymin
 | |
|     if [ "$jquery" == auto ]; then
 | |
|         if [ "$csslib" == bootstrap ]; then
 | |
|             jquery=
 | |
|         elif [ -f "$dir/${baseurl#/}jquery.min.js" ]; then
 | |
|             jquery=1
 | |
|             jquerymin=1
 | |
|         elif [ -f "$dir/${baseurl#/}jquery.js" ]; then
 | |
|             jquery=1
 | |
|         else
 | |
|             jquery=
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     if [ "$doctype" == auto ]; then
 | |
|         if [ "$csslib" == bootstrap ]; then
 | |
|             doctype=html5
 | |
|         else
 | |
|             doctype=html4
 | |
|         fi
 | |
|     fi
 | |
|     head='<head>'
 | |
|     if [ "$doctype" == html5 ]; then
 | |
|         head="$head
 | |
| "'<meta charset="'"$encoding"'" />'
 | |
|     else
 | |
|         head="$head
 | |
| "'<meta http-equiv="Content-Type" content="text/html; charset='"$encoding"'" />'
 | |
|     fi
 | |
| 
 | |
|     if [ "$csslib" == bootstrap ]; then
 | |
|         head="$head
 | |
| "'<meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | |
| <link rel="shortcut" href="'"$clpath"'favicon.ico" />
 | |
| <link rel="icon apple-touch-icon" href="'"$clpath"'icon.png" />'
 | |
|         csslib='<link href="'"$clpath"'bootstrap/css/bootstrap.min.css" rel="stylesheet"/>
 | |
| <script src="'"$clpath"'jquery.min.js" type="text/javascript"></script>
 | |
| <script src="'"$clpath"'bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
 | |
| <!--[if lt IE 9]>
 | |
| <script src="'"$clpath"'html5shiv/html5shiv.js"></script>
 | |
| <script src="'"$clpath"'respond/respond.min.js"></script>
 | |
| <![endif]-->'
 | |
|         startcl='<div class="container">'
 | |
|         endcl='</div>'
 | |
|     elif [ "$csslib" == blueprint ]; then
 | |
|         head="$head
 | |
| "'<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | |
| <link rel="shortcut" href="'"$baseurl"'favicon.ico" />
 | |
| <link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />'
 | |
|         csslib='<link rel="stylesheet" href="'"$clpath"'screen.css" type="text/css" media="screen, projection" />
 | |
| <link rel="stylesheet" href="'"$clpath"'print.css" type="text/css" media="print" />
 | |
| <!--[if lt IE 8]>
 | |
| <link rel="stylesheet" href="'"$clpath"'ie.css" type="text/css" media="screen, projection" />
 | |
| <![endif]-->
 | |
| <'"${nobpsuppl:+!--}"'link rel="stylesheet" href="'"$baseurl"'bpsuppl.css" type="text/css" media="screen, projection" /'"${nobpsuppl:+--}"'>
 | |
| <'"${nobplocal:+!--}"'link rel="stylesheet" href="'"$baseurl"'bplocal.css" type="text/css" media="screen, projection" /'"${nobplocal:+--}"'>
 | |
| <'"${nobpmobile:+!--}"'link rel="stylesheet" href="'"$baseurl"'bpmobile.css" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /'"${nobpmobile:+--}"'>'
 | |
|         startcl='<div class="container">'
 | |
|         endcl='</div>'
 | |
|     else
 | |
|         # pas de csslib ou csslib non supporté
 | |
|         head="$head
 | |
| "'<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | |
| <link rel="shortcut" href="'"$baseurl"'favicon.ico" />
 | |
| <link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />'
 | |
|         csslib=
 | |
|         startcl=
 | |
|         endcl=
 | |
|     fi
 | |
|     if [ -n "$jquery" ]; then
 | |
|         jquery='<script src="'"${baseurl}jquery${jquerymin:+.min}.js"'"></script>'
 | |
|     fi
 | |
|     start='<title>'"$head_title"'</title>
 | |
| </head>
 | |
| <body>'
 | |
|     end='</body>
 | |
| </html>'
 | |
| 
 | |
|     case "$doctype" in
 | |
|     html4)
 | |
|         doctype='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'
 | |
|         html='<html lang="fr" xmlns="http://www.w3.org/TR/REC-html40">'
 | |
|         ;;
 | |
|     html5)
 | |
|         doctype='<!DOCTYPE html>'
 | |
|         html='<html lang="fr">'
 | |
|         ;;
 | |
|     *)
 | |
|         doctype=
 | |
|         html='<html>'
 | |
|         ;;
 | |
|     esac
 | |
| }
 | |
| function __before_write_html() {
 | |
|     doctype="$doctype<!-- -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=4:sts=4:et:ai:si:sta:fenc=$encoding
 | |
| -->"
 | |
| }
 | |
| function __write_html() {
 | |
|     # $file et $mode doivent être initialisés
 | |
|     check_overwrite "$1" || return
 | |
|     estep "$(ppath "$file")"
 | |
|     echo >"$file" "$doctype$html
 | |
| $head
 | |
| ${csslib:+$csslib
 | |
| }${jquery:+$jquery
 | |
| }$start
 | |
| ${csslib:+$startcl
 | |
| }${title:+<$titlehl>$title</$titlehl>
 | |
| }${csslib:+$endcl
 | |
| }$end"
 | |
| }
 | |
| 
 | |
| function generate_html() {
 | |
|     local file="$1"
 | |
|     local mode=html
 | |
| 
 | |
|     local titlehl="${titlehl:-h1}"
 | |
|     local title="$title"
 | |
|     __update_title
 | |
| 
 | |
|     local doctype="$doctype"
 | |
|     local csslib="$csslib"
 | |
|     local jquery="$jquery"
 | |
|     local html head start startcl endcl end
 | |
|     __generate_html
 | |
|     __before_write_html
 | |
|     __write_html
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function generate_javadoc_package() {
 | |
|     local file="$1"
 | |
|     local mode=html
 | |
| 
 | |
|     local titlehl="${titlehl:-h2}"
 | |
|     local title="$title"
 | |
|     __update_title
 | |
|     # title doit se terminer par un point
 | |
|     [ "${title:$((-1)):1}" == / ] || title="$title."
 | |
|     # Mettre un préfixe au titre
 | |
|     title="Package: $title"
 | |
| 
 | |
|     local doctype="$doctype"
 | |
|     local csslib bootstrap jquery html head start startcl endcl end
 | |
|     __generate_html
 | |
|     __before_write_html
 | |
|     __write_html
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function generate_javadoc_overview() {
 | |
|     local file="$1"
 | |
|     local mode=html
 | |
| 
 | |
|     local titlehl="${titlehl:-h2}"
 | |
|     local title="$title"
 | |
|     __update_title
 | |
|     # title doit se terminer par un point
 | |
|     [ "${title:$((-1)):1}" == / ] || title="$title."
 | |
|     # Mettre un préfixe au titre
 | |
|     title="Projet: $title"
 | |
| 
 | |
|     local doctype="$doctype"
 | |
|     local csslib bootstrap jquery html head start startcl endcl end
 | |
|     __generate_html
 | |
|     __before_write_html
 | |
|     __write_html
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function generate_php() {
 | |
|     local file="$1"
 | |
|     local mode=php
 | |
| 
 | |
|     local titlehl="${titlehl:-h1}"
 | |
|     local title="$title"
 | |
|     __update_title
 | |
| 
 | |
|     local doctype="$doctype"
 | |
|     local csslib="$csslib"
 | |
|     local jquery="$jquery"
 | |
|     local html head start startcl endcl end
 | |
|     __generate_html
 | |
|     doctype="<?php # -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=2:sts=2:et:ai:si:sta:fenc=$encoding
 | |
| ?>${doctype:+$doctype
 | |
| }"
 | |
|     __write_html
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function generate_cakephp_ctp() {
 | |
|     local file="$1"
 | |
|     local mode=php
 | |
| 
 | |
|     check_overwrite "$1" || return
 | |
|     estep "$(ppath "$file")"
 | |
|     echo >"$file" "<?php # -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=2:sts=2:et:ai:si:sta:fenc=$encoding"
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function generate_css() {
 | |
|     local file="$1"
 | |
|     local mode=css
 | |
| 
 | |
|     check_overwrite "$1" || return
 | |
|     estep "$(ppath "$file")"
 | |
|     echo >"$file" "@CHARSET \"$encoding\"; /* -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=4:sts=4:et:ai:si:sta:fenc=$encoding */"
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| function generate_javascript() {
 | |
|     local file="$1"
 | |
|     local mode=javascript
 | |
| 
 | |
|     check_overwrite "$1" || return
 | |
|     estep "$(ppath "$file")"
 | |
|     echo >"$file" "/* -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=4:sts=4:et:ai:si:sta:fenc=$encoding
 | |
| */"
 | |
| 
 | |
|     [ -n "$2" ] && array_add "$2" "$file"
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| template=
 | |
| edit=1
 | |
| overwrite=
 | |
| encoding=
 | |
| doctype=auto
 | |
| baseurl=/
 | |
| clpath=
 | |
| csslib=auto
 | |
| jquery=auto
 | |
| titlehl=
 | |
| title=
 | |
| head_title=
 | |
| parse_opts "${PRETTYOPTS[@]}" \
 | |
|     --help '$exit_with display_help' \
 | |
|     -t:,--template: template= \
 | |
|     -e,--edit edit=1 \
 | |
|     -g,--no-edit edit= \
 | |
|     -f,--overwrite overwrite=1 \
 | |
|     -E:,--encoding: encoding= \
 | |
|     --doctype: doctype= \
 | |
|     -4,--html4 doctype=html4 \
 | |
|     -5,--html5 doctype=html5 \
 | |
|     -b:,--baseurl: baseurl= \
 | |
|     -B:,--bspath:,--bppath: clpath= \
 | |
|     -s,--bootstrap,--bs csslib=bootstrap \
 | |
|     -p,--blueprint,--bp csslib=blueprint \
 | |
|     -n,--no-bootstrap,--nobootstrap,--nobs,--no-blueprint,--noblueprint,--nobp csslib= \
 | |
|     -j,--jquery jquery=1 \
 | |
|     -k,--no-jquery,--nojquery jquery= \
 | |
|     --titlehl:,--hl: titlehl= \
 | |
|     -T:,--title: title= \
 | |
|     --head-title: head_title= \
 | |
|     @ args -- "$@" && set -- "${args[@]}" || die "$args"
 | |
| 
 | |
| [ -n "$encoding" ] || encoding=utf-8
 | |
| [ -z "$baseurl" -o "${baseurl:$((-1)):1}" == / ] || baseurl="$baseurl/"
 | |
| 
 | |
| files2edit=()
 | |
| r=0
 | |
| for file in "$@"; do
 | |
|     t="$template"
 | |
|     if [ -z "$t" ]; then
 | |
|         dir="$(dirname "$file")"
 | |
|         name="$(basename "$file")"
 | |
|         # Si template n'est pas spécifié, le déterminer le cas échéant à partir
 | |
|         # du nom de fichier. Rajouter ici le code approprié
 | |
|         case "$name" in
 | |
|         overview.html) t=javadoc-overview;;
 | |
|         package.html) t=javadoc-package;;
 | |
|         esac
 | |
|     fi
 | |
| 
 | |
|     case "$t" in
 | |
|     html|htm) generate_html "$file" files2edit || r=$?;;
 | |
|     javadoc-package|jdp) generate_javadoc_package "$file" files2edit || r=$?;;
 | |
|     jadadoc-overview|jdo) generate_javadoc_overview "$file" files2edit || r=$?;;
 | |
|     php|phps) generate_php "$file" files2edit || r=$?;;
 | |
|     cakephp-ctp|ctp) generate_cakephp_ctp "$file" files2edit || r=$?;;
 | |
|     css) generate_css "$file" files2edit || r=$?;;
 | |
|     javascript|js) generate_javascript "$file" files2edit || r=$?;;
 | |
|     *) die "$NAME: template invalide: $t";;
 | |
|     esac
 | |
| done
 | |
| 
 | |
| if [ -n "$edit" -a "${#files2edit[*]}" -gt 0 ]; then
 | |
|     "${EDITOR:-vi}" "${files2edit[@]}"
 | |
| fi
 | |
| 
 | |
| exit $r
 |