├── .gitignore ├── README.md └── spip_statique.sh /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spip_statique 2 | Transformer un site SPIP en site statique (HTML/CSS/JS). 3 | 4 | Ce projet a déménagé sur https://git.spip.net/booz/spip_statique 5 | 6 | ## Usage 7 | 8 | Choisir dans le terminal un répertoire où copier un site. 9 | ``` 10 | cd ~/Sites/mon_site 11 | ``` 12 | Lancer `spip_statique`. 13 | ``` 14 | spip_statique http://localhost/mon_site/ 15 | ``` 16 | Le site http://localhost/mon_site/ est copié en HTML dans ~/Sites/mon_site. 17 | 18 | Usage alternatif : 19 | ``` 20 | spip_statique http://localhost/mon_site/ repertoire_cible 21 | ``` 22 | 23 | 24 | ## Installation 25 | Installer `spip_statique` la première fois. 26 | ``` 27 | cd ~/scripts 28 | ``` 29 | Copier dans le terminal 30 | ``` 31 | git clone https://github.com/BoOz/spip_statique.git 32 | cd spip_statique 33 | chmod +x spip_statique.sh 34 | ``` 35 | et valider. 36 | 37 | Le script `spip_statique.sh` fonctionne. 38 | ``` 39 | ~/scripts/spip_statique/spip_statique.sh http://localhost/mon_site/ 40 | ``` 41 | 42 | ### Un alias dans le terminal 43 | Ajouter un alias dans `~/.bash_profile`. 44 | ``` 45 | vim ~/.bash_profile 46 | ``` 47 | Taper `i` puis ajouter 48 | ``` 49 | alias spip_statique="~/scripts/spip_statique/spip_statique.sh" 50 | ``` 51 | Taper `esc` puis `:wq` et valider. 52 | 53 | Relancer le terminal. 54 | ``` 55 | . ~/.bash_profile 56 | ``` 57 | 58 | # Mise à jour 59 | ``` 60 | cd la/ou/est/spip_statique 61 | git pull 62 | ``` 63 | 64 | -------------------------------------------------------------------------------- /spip_statique.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # ./spip_statique.sh http://localhost/mon_site/ 3 | 4 | # Exemples d'usage : 5 | # spip_statique http://localhost/mon_site/ma_page.html 6 | # spip_statique http://localhost/mon_site/ 7 | # spip_statique http://localhost/mon_site/ dans/un/repertoire 8 | 9 | source="$1" 10 | dest="${2:-}" 11 | 12 | # check user input 13 | if [ -z $source ]; then 14 | echo "usage: $0 URL " 15 | exit 16 | fi 17 | 18 | # Eventuel repertoire cible en second parametre 19 | if [[ $dest != "" ]] ; then 20 | echo "$source > $dest" 21 | if [ ! -d "$dest" ] 22 | then 23 | echo "\nErreur : créer un répertoire \`$dest\`. mkdir -p $dest ; ls\n" 24 | ls 25 | echo "" 26 | exit 27 | else 28 | cd "$dest" 29 | fi 30 | fi 31 | 32 | # Fichier log pour les transformations des pages. 33 | [ -f aspilog.txt ] && rm aspilog.txt 34 | 35 | # ou sommes nous ? 36 | # s'assurer qu'on a bien un / à la fin 37 | source=$(echo "$source/" | sed -e 's`//$`/`g') 38 | racine=$(echo ${source%/*} | sed -e 's,http://,,g' | sed -e 's,https://,,g' ) 39 | echo "$source > $racine" 40 | 41 | # aspirer les pages 42 | # http://www.thegeekstuff.com/2009/09/the-ultimate-wget-download-guide-with-15-awesome-examples 43 | # 44 | 45 | 46 | command -v wget >/dev/null 2>&1 || { echo >&2 "\nErreur. Installer wget pour faire fonctionner spip_statique. brew install wget\n"; exit 1; } 47 | 48 | wget -m -l5 --tries=5 -N -p -e robots=off --adjust-extension --no-check-certificate "$source" 49 | 50 | # exit 51 | 52 | # recaler les polices malencontreusement passées par --adjust-extension 53 | for type in eot ttf woff woff2 ; do 54 | echo "$type.html > $type" 55 | find . -iname "*.$type.html" | while read f ; do 56 | vrai_nom=${f/$type.html/$type} 57 | echo "$f => $vrai_nom" 58 | mv "$f" "$vrai_nom" 59 | done 60 | done 61 | 62 | # recaler les css malencontreusement passées par --adjust-extension 63 | for type in css ; do 64 | find . -type f -regex ".*?[0-9][0-9]*\.css$" | while read f ; do 65 | css_propre=$(echo $f | sed -e 's/[0-9][0-9]*\.css$//g' -e 's/?//g') 66 | echo "$f => $css_propre" 67 | mv "$f" "$css_propre" 68 | done 69 | done 70 | 71 | # nettoyer un peu 72 | # virer les hash. jquery.colorbox.js?1494445576 -> jquery.colorbox.js 73 | # local/cache-vignettes/L400xH282/ChampsExtras2-3ce9f.png?1484461418 74 | find . -type f -regex ".*?[0-9][0-9]*$" | while read f ; do 75 | fichier_propre=$(echo $f | sed -e 's/[0-9][0-9]*$//g' -e 's/?//g') 76 | mv "$f" "$fichier_propre" 77 | emplacement_actuel=$(echo ${f/$racine\//} | sed -e 's:\./::g') 78 | nouvel_emplacement=$(echo ${fichier_propre/$racine\//} | sed -e 's:\./::g') 79 | echo "$emplacement_actuel $nouvel_emplacement" >> aspilog.txt 80 | done 81 | 82 | # renommer fichiers spip.php?page=XXX -> XXX.html 83 | find . -iname "spip.php?page=*" | while read f ; do 84 | dirname=${f%/*} 85 | basename=${f##*/} 86 | fichier=$(echo $dirname/$basename | sed -e 's/spip.php?page=//g' ) 87 | mv "$f" "$fichier" 88 | # emplacement actuel et nouvel emplacement 89 | #(( ${#fichier} > 0 )) && echo "${basename/.html/} ${fichier/${dirname}\//}" 90 | (( ${#fichier} > 0 )) && echo "${basename/.html/} ${fichier/${dirname}\//}" >> aspilog.txt 91 | done 92 | 93 | # renommer fichiers index.html?XXX.html -> XXX.html 94 | find . -iname "index.html?*" | while read f ; do 95 | dirname=${f%/*} 96 | basename=${f##*/} 97 | fichier=$(echo $f | sed -e 's/index.html?//g' -e 's/page=//g') 98 | mv "$f" "$fichier" 99 | # emplacement actuel et nouvel emplacement ?paged= 100 | (( ${#fichier} > 0 )) && echo "?${fichier/${dirname}\//} ${fichier/${dirname}\//}" 101 | #(( ${#fichier} > 0 )) && echo "?${fichier/${dirname}\//} ${fichier/${dirname}\//}" >> aspilog.txt 102 | done 103 | 104 | # renommer fichiers spip.php?XXX.html -> XXX.html 105 | find . -iname "spip.php?*" | while read f ; do 106 | dirname=${f%/*} 107 | basename=${f##*/} 108 | fichier=$(echo $f | sed -e 's/spip.php?//g') 109 | mv "$f" "$fichier" 110 | # emplacement actuel et nouvel emplacement 111 | echo "${basename/.html/} ${fichier##*/}" 112 | 113 | (( ${#fichier} > 0 )) && echo "${basename/.html/} ${fichier##*/}" 114 | (( ${#fichier} > 0 )) && echo "${basename/.html/} ${fichier##*/}" >> aspilog.txt 115 | done 116 | 117 | # mode clean a passer en option 118 | 119 | # ranger les images. 120 | for type in jpg gif png ico; do 121 | echo "$type trouvés" 122 | find . -iname "*.$type" | while read f ; do 123 | basename=${f##*/} 124 | nouvel_emplacement="images/$basename" 125 | [ ! -d "$racine/images" ] && mkdir "$racine/images" 126 | mv "$f" "$racine/$nouvel_emplacement" 127 | emplacement_actuel=$(echo ${f/$racine\//} | sed -e 's:\./::g') 128 | #echo "$emplacement_actuel > $nouvel_emplacement" 129 | echo "$emplacement_actuel $nouvel_emplacement" >> aspilog.txt 130 | done 131 | done 132 | 133 | # ranger les polices. 134 | for type in eot ttf woff woff2 ; do 135 | echo "$type trouvés" 136 | find . -iname "*.$type" | while read f ; do 137 | basename=${f##*/} 138 | nouvel_emplacement="polices/$basename" 139 | [ ! -d "$racine/polices" ] && mkdir "$racine/polices" 140 | mv "$f" "$racine/$nouvel_emplacement" 141 | emplacement_actuel=$(echo ${f/$racine\//} | sed -e 's:\./::g') 142 | # echo "$emplacement_actuel > $nouvel_emplacement" 143 | echo "$emplacement_actuel $nouvel_emplacement" >> aspilog.txt 144 | done 145 | done 146 | 147 | # ranger les css, js. 148 | for type in css js ; do 149 | echo "$type trouvés" 150 | find . -iname "*.$type" | while read f ; do 151 | #echo $f 152 | basename=${f##*/} 153 | nouvel_emplacement="$type/$basename" 154 | [ ! -d "$racine/$type" ] && mkdir "$racine/$type" 155 | mv "$f" "$racine/$nouvel_emplacement" 156 | emplacement_actuel=$(echo ${f/$racine\//} | sed -e 's:\./::g') 157 | #echo "$emplacement_actuel > $nouvel_emplacement" 158 | echo "$emplacement_actuel $nouvel_emplacement" >> aspilog.txt 159 | 160 | # chercher des images déplacées : 161 | # url(../images/icones-partage.png) 162 | for t in jpg png gif; do 163 | grep -Eo "(\(|'|\")[a-zA-Z0-9.+_/?#&-]*\.$t[?#a-zA-Z0-9]*(\)|'|\")" "$racine/$nouvel_emplacement" | while read r ; do 164 | emplacement_actuel=$(echo $r | sed -e "s/'//g" -e 's/"//g' -e "s/(//g" -e "s/)//g") 165 | echo "$emplacement_actuel ../images/${emplacement_actuel##*/}" >> aspilog.txt 166 | done 167 | done 168 | # chercher des polices déplacées : 169 | # url('../polices/walbaumgroteskbookbolditalic.eot') 170 | # voire url('../polices/walbaumgroteskbookitalic.eot?#iefix') 171 | for t in eot ttf woff woff2 ; do 172 | grep -Eo "(\(|'|\")[a-zA-Z0-9.+_/?#&-]*\.$t[?#a-zA-Z0-9]*(\)|'|\")" "$racine/$nouvel_emplacement" | while read r ; do 173 | emplacement_actuel=$(echo $r | sed -e "s/'//g" -e 's/"//g' -e "s/(//g" -e "s/)//g") 174 | echo "$emplacement_actuel ../polices/${emplacement_actuel##*/}" >> aspilog.txt 175 | done 176 | done 177 | 178 | # chercher tout pour vérif en mode debug 179 | #for t in jpg png gif eot ttf woff woff2 ; do 180 | # grep $t "$racine/$nouvel_emplacement" | while read r ; do 181 | # echo $r 182 | # done 183 | #done 184 | 185 | done 186 | done 187 | 188 | # trier (à l'envers a cause des timestamps) , unifier 189 | cat aspilog.txt | sort -r | uniq > aspilog.tmp 190 | mv aspilog.tmp aspilog.txt 191 | 192 | # changer dans les fichiers ce qu'on a déplacé 193 | cat aspilog.txt | while read f ; do 194 | 195 | match=$(echo "$f" | cut -d' ' -f1 ) 196 | replace=$(echo "$f" | cut -d' ' -f2) 197 | echo "\n$match > $replace" 198 | 199 | # grep replace des urls 200 | grep -rl "$match" . | while read fich ; do 201 | [[ $fich == "./aspilog.txt" ]] && continue ; 202 | echo "$fich va etre modifié" 203 | cat "$fich" | sed -e "s:$match:$replace:g" > "$fich.tmp" 204 | mv "$fich.tmp" "$fich" 205 | done 206 | done 207 | 208 | 209 | # effacer les repertoires vides 210 | find . -type f -iname '*DS_Store' -delete 211 | find . -type d -empty -delete 212 | 213 | echo "Copie terminée" 214 | ls 215 | echo "" 216 | exit 217 | --------------------------------------------------------------------------------