170 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| ## Fonctions pour gérer les modelines dans les fichiers
 | |
| ##@cooked nocomments
 | |
| ##@require base
 | |
| uprovide modeline
 | |
| urequire base
 | |
| 
 | |
| MODELINE="@prefix@-*- coding: utf-8 @mode@-*- vim:sw=@tabsize@:sts=@tabsize@:et:ai:si:sta:fenc=utf-8"
 | |
| 
 | |
| # modèles de modes à copier dans les fonctions __ml_* ci-dessous
 | |
| #CSS=.css|css
 | |
| #JS=.js|js|javascript
 | |
| #JAVA=.java|java
 | |
| #HTML=.html|.htm|html|html4|html5
 | |
| #XML=.xml|xml
 | |
| #PHP=.php|.phps|php|php4|php5
 | |
| #SH=.sh|sh|shell
 | |
| #PYTHON=.py|.pyw|py|python
 | |
| #TEXT=.txt|txt|text
 | |
| #CONF=.conf|conf
 | |
| #MARKDOWN=.mdt|.mdwn|.md|.text|.twp|markdown
 | |
| #PUML=.puml|puml|plantuml
 | |
| #IUML=.iuml|iuml|plantumlinc
 | |
| #SQL=.sql|sql
 | |
| 
 | |
| function __ml_getprefix() {
 | |
|     case "$1" in
 | |
|     .css|css|.js|js|javascript|.java|java) echo "/* ";;
 | |
|     .html|.htm|html|html4|html5) echo "<!-- ";;
 | |
|     .php|.phps|php|php4|php5) echo "<?php # ";;
 | |
|     .sh|sh|shell|.py|.pyw|py|python|.txt|txt|text|.conf|conf) echo "# ";;
 | |
|     .mdt|.mdwn|.md|.text|.twp|markdown|.puml|puml|plantuml) echo "# ";;
 | |
|     .iuml|iuml|plantumlinc) echo "'' ";;
 | |
|     .sql|sql) echo "-- ";;
 | |
|     *)  # par défaut, utiliser le préfixe '# ', même si ce n'est pas forcément
 | |
|         # approprié
 | |
|         echo "# "
 | |
|         ;;
 | |
|     esac
 | |
| }
 | |
| function __ml_getmode() {
 | |
|     case "$1" in
 | |
|     .html|.htm|html|html4|html5) echo html;;
 | |
|     .php|.phps|php|php5) echo php;;
 | |
|     .sh|sh|shell) echo sh;;
 | |
|     .py|.pyw|py|python) echo python;;
 | |
|     .txt|txt|text) echo text;;
 | |
|     .conf|conf) echo conf;;
 | |
|     .mdt|.mdwn|.md|.text|.twp|markdown) echo markdown;;
 | |
|     .puml|puml|plantuml|.iuml|iuml|plantumlinc) echo text;;
 | |
|     .sql|sql) echo sql;;
 | |
|     esac
 | |
| }
 | |
| function __ml_gettabsize() {
 | |
|     case "$1" in
 | |
|     .php|.phps|php|php5) echo 2;;
 | |
|     *) echo 4;;
 | |
|     esac
 | |
| }
 | |
| function __ml_getmodeline() {
 | |
|     local prefix="$(__ml_getprefix "$1")"
 | |
|     local mode="$(__ml_getmode "$1")"
 | |
|     local tabsize="$(__ml_gettabsize "$1")"
 | |
|     [ -n "$mode" ] && mode="mode: $mode "
 | |
|     local modeline="$MODELINE"
 | |
|     modeline="${modeline//@prefix@/$prefix}"
 | |
|     modeline="${modeline//@mode@/$mode}"
 | |
|     modeline="${modeline//@tabsize@/$tabsize}"
 | |
|     echo "$modeline"
 | |
| }
 | |
| function __ml_getsuffix() {
 | |
|     case "$1" in
 | |
|     .css|css|.js|js|javascript|.java|java) echo "*/";;
 | |
|     .html|.htm|html|html4|html5) echo "-->";;
 | |
|     .php|.phps|php|php4|php5) echo "?>";;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| function printml() {
 | |
|     local atype=auto
 | |
|     parse_opts "${PRETTYOPTS[@]}" \
 | |
|         --help '$exit_with display_help' \
 | |
|         -t:,--type: atype= \
 | |
|         @ args -- "$@" && set -- "${args[@]}" || die "$args"
 | |
| 
 | |
|     local mode modeline suffix type
 | |
|     if [ "$atype" == "auto" ]; then
 | |
|         local basename ext
 | |
|         splitname "$(basename "$1")" basename ext
 | |
|         type="${ext:+.$ext}"
 | |
|         type="${type:-shell}"
 | |
|     else
 | |
|         type="$atype"
 | |
|     fi
 | |
|     modeline="$(__ml_getmodeline "$type")"
 | |
|     suffix="$(__ml_getsuffix "$type")"
 | |
| 
 | |
|     echo "$modeline${suffix:+
 | |
| $suffix}"
 | |
| }
 | |
| 
 | |
| function addml() {
 | |
|     local atype=auto
 | |
|     local edit=auto
 | |
|     parse_opts "${PRETTYOPTS[@]}" \
 | |
|         --help '$exit_with display_help' \
 | |
|         -t:,--type: atype= \
 | |
|         -e,--edit edit=1 \
 | |
|         -n,--noedit edit= \
 | |
|         @ args -- "$@" && set -- "${args[@]}" || die "$args"
 | |
| 
 | |
|     if [ "$edit" == "auto" ]; then
 | |
|         [ $# -eq 1 ] && edit=1 || edit=
 | |
|     fi
 | |
| 
 | |
|     local mode modeline suffix type
 | |
|     local -a edits
 | |
|     for file in "$@"; do
 | |
|         if [ "$atype" == "auto" ]; then
 | |
|             local basename ext
 | |
|             splitname "$(basename "$file")" basename ext
 | |
|             type="${ext:+.$ext}"
 | |
|             type="${type:-shell}"
 | |
|         else
 | |
|             type="$atype"
 | |
|         fi
 | |
|         mode="$(__ml_getmode "$type")"
 | |
|         modeline="$(__ml_getmodeline "$type")"
 | |
|         suffix="$(__ml_getsuffix "$type")"
 | |
| 
 | |
|         if [ ! -e "$file" ]; then
 | |
|             ask_yesno "Le fichier $file n'existe pas. Faut-il le créer?" O || continue
 | |
|             touch "$file"
 | |
|         fi
 | |
|         array_add edits "$file"
 | |
|         doinplacef "$file" awkrun mode="$mode" modeline="$modeline" suffix="$suffix" '
 | |
| BEGIN { run = 1; done = 0; nextline = 0 }
 | |
| run == 1 {
 | |
|   if (substr($0, length($0) - length(modeline) + 1) == modeline) {
 | |
|     run = 0; done = 1; nextline = 0
 | |
|   } else if (nextline) {
 | |
|     print modeline
 | |
|     if (suffix != "") print suffix
 | |
|     run = 0; done = 1; nextline = 0
 | |
|   } else if (mode == "shell" && $0 ~ /^#!/) {
 | |
|     nextline = 1
 | |
|   } else if (mode == "shell" && $0 ~ /^#/) {
 | |
|     print modeline
 | |
|     if (suffix != "") print suffix
 | |
|     done = 1; run = 0
 | |
|   } else if (!done) {
 | |
|     print modeline
 | |
|     if (suffix != "") print suffix
 | |
|     done = 1; run = 0
 | |
|   } else {
 | |
|     run = 0
 | |
|   }
 | |
| }
 | |
| { print }
 | |
| END {
 | |
|   if (run || nextline) {
 | |
|     print modeline
 | |
|     if (suffix != "") print suffix
 | |
|   }
 | |
| }
 | |
| '
 | |
|     done
 | |
|     [ -n "$edit" ] && "${EDITOR:-vi}" "${edits[@]}"
 | |
| }
 |