OO Writer - Styles différents entre un document et un modèle?

Sauf erreur de ma part lorsque l’on charge les styles d’un modèles dans un document l’opération peut (par choix) écraser les styles de même noms mais l’opération n’efface pas les styles qui n’existent pas dans le modèles.
J’aimerais connaître (avoir la liste) de ces styles afin que mon document ne contienne que les styles du modèle.
Un lecteur a-t-il une solution?
Merci d’avance.

salut
pas très beau, mais :

nom="/tmp/bb/fdfd.odt" ; i=$(date +%N) ; 7z x "$nom" -O/tmp/tmp_$i; cat /tmp/tmp_$i/content.xml |grep style-name|sed 's#style-name="\([^"]*\)"#\nstyle-name=\1\n#g'|grep "style-name="

j’utilise le fait que un .odt est un fichier compressé ( un « zip ») et que le texte est dans content.xml ( mais il faut vérifier , j’ai juste fait un test pour toi sur un seul fichier )

1 J'aime

MERCI bien pour le script, je vérifierai plus tard.

Je ne sais pas si tu as beaucoup de styles ajoutés, car c’est surtout ça qui va jouer.
personnellement, quand j’ajoute des styles à un modèle existant, j’utilise un système de notation qui me permet de distinguer ce que j’ai ajouté de ce qui existait.

par contre, j’utilise toujours un style de base, et si je lui ajoute des styles, soit je crée une nouvelle feuille de style soit je met à jour la nouvelle. Mais je le détermine dès le début du document.

Bonne pratique.

En ce qui me concerne je n’ai que 3 modèles, mais j’ai des fichiers anciens ou dont je ne suis pas à l’origine et quand je souhaite, pour certains, les mettre à ma sauce (suivant l’un de mes modèles) OO écrase bien les styles de même noms mais garde dans le fichier d’origine les autres que je ne souhaite pas conserver. Idéalement il me faudrait une fonction qui vire tous les styles avant d’apporter ceux du modèles.

Beau travail @dindoun

La seule amélioration qu’il faudra apporter* et de détecter également les nouveaux styles non utilisés qui ne se trouvent pas dans content.xml mais uniquement dans styles.xml.

*je devrais m’en sortir seul maintenant :slight_smile:

1 J'aime

Et voilà le script qui me convient (a priori), merci à @dindoun pour m’avoir fourni le coeur.

cat oow_diff_style.bash

#!/bin/bash
#240126 oow_diff_style.bash
set -euo pipefail
#-----------------------------------------------------------------------#
function aide() {
echo "
  usage : ./oow_diff_style.bash cde file
  	cde = i 	info about file
	      l		list styles of file
      	      d		display diff styles from file and it model
	doc = full path of a .odt file	      
";
exit
} # End of aide
#-----------------------------------------------------------------------#
function oowDiff() {
	local _doc=$1
	local _ftmp=$2
	local _ftmp2=$_ftmp-m
	# echo _ftmp2=$_ftmp2
	list false doc $_doc $_ftmp
	local _model=$(getModel $_ftmp)
	# echo "oowDiff _model = $_model"
	list false model "$_model" $_ftmp2
	diff /tmp/$prefix-doc.lst /tmp/$prefix-model.lst
} # End of oowDiff
#-----------------------------------------------------------------------#
function extract() {
	local _doc=$1
	local _ftmp=$2
	# Extract, if not already done, files form oow file (.odt or .ott)
	# echo "extract _doc = $_doc"
	# echo "extract _ftmp = $_ftmp"
	[[ -d $_ftmp ]] || 7z x "$_doc" -O$_ftmp > /dev/null;
} # End of extract
#-----------------------------------------------------------------------#
function getModel() {
	local _ftmp=$1
	# Extract model associated to document, empty if none
	local _c=`cat $_ftmp/meta.xml`
	local _model=''
	[[ $_c =~ xlink:href=\"..\/..([^\"]+) ]] && _model=${BASH_REMATCH[1]}
	echo "$_model"
} # End of getModel
#-----------------------------------------------------------------------#
function info() {
	local _doc=$1
	local _ftmp=$2
	# Display some info about document
	extract $_doc $_ftmp 
	local _model=$(getModel $_ftmp)
	# echo "Model = $_model"
} # End of info
#-----------------------------------------------------------------------#
function list() {
	local _print=$1
	local _type=$2
	local _doc=$3
	local _ftmp=$4
	# List styles of document
	# echo "list _ftmp = $_ftmp"
	extract "$_doc" $_ftmp 
	cat $_ftmp/content.xml | grep style-name | sed 's#style-name="\([^"]*\)"#\nstyle-name=\1\n#g' | grep "style-name=" > /tmp/$prefix-$_type.lst
	$_print && cat /tmp/$prefix-$_type.lst || true
} # End of list
#-----------------------------------------------------------------------#
i=$(date +%N)
prefix=oow_$i					# for files in /tmp
ftmp=/tmp/$prefix				# temp directory - extract .odt documeny
# Start
[[ 1 -gt $# ]] && { aide; exit; }
cde=$1
[[ 2 -le $# ]] && p1=$2 || p1=""		# Parametre eventuel de la commande
doc=$p1
[[ -f $doc ]] || { echo "$doc not found"; exit 1; }
if [[ d == $cde ]]; then oowDiff $doc $ftmp;
elif [[ i == $cde ]]; then info $doc $ftmp;
elif [[ l == $cde ]]; then list true doc $doc $ftmp;
else {
	echo "cde ($cde) inconnue"; exit 1;
} fi

merci :slight_smile:
tu peux commenter UN PEU ton script ?

Les commentaires sont présents dans l’aide et après la déclaration des variables dans chaque fonction.

Je viens d’intégrer ma remarque pour tenir compte des styles non utilisés, et donc la nouvelle version est ci-dessous.

cat oow_diff_style.bash

#!/bin/bash
#240127 oow_diff_style.bash - created 26/01/24
#
# To display differnces between a .odt document and its model
# 
set -euo pipefail
#-----------------------------------------------------------------------#
function aide() {
echo "
  usage : ./oow_diff_style.bash cde file
        cde = i 	info about file (model & extract temp directory)
	      la	list all styles of file
	      lu	list used styles of file
      	      da	display all diff styles from file and its model
      	      du	display used diff styles from file and its model
	file  = full path of a .odt file	      
";
exit
} # End of aide
#-----------------------------------------------------------------------#
function oowDiff() {
	local _opt=$1
	local _doc=$2
	local _ftmp=$3
	local _ftmp2=$_ftmp-m
	# Print differences between document and model styles
	#  opt =~ .a	all the styles
	#      =~ .u	used styles  
	# echo _ftmp2=$_ftmp2
	list false $_opt $_doc $_ftmp
	local _model=$(getModel $_ftmp)
	# echo "oowDiff _model = $_model"
	list false mu "$_model" $_ftmp2
	diff /tmp/$prefix-doc.lst /tmp/$prefix-model.lst
} # End of oowDiff
#-----------------------------------------------------------------------#
function extract() {
	local _doc=$1
	local _ftmp=$2
	# Extract, if not already done, files form oow file (.odt or .ott)
	# echo "extract _doc = $_doc"
	# echo "extract _ftmp = $_ftmp"
	[[ -d $_ftmp ]] || 7z x "$_doc" -O$_ftmp > /dev/null;
} # End of extract
#-----------------------------------------------------------------------#
function getModel() {
	local _ftmp=$1
	# Extract model associated to document, empty if none
	local _c=`cat $_ftmp/meta.xml`
	local _model=''
	[[ $_c =~ xlink:href=\"..\/..([^\"]+) ]] && _model=${BASH_REMATCH[1]}
	echo "$_model"
} # End of getModel
#-----------------------------------------------------------------------#
function info() {
	local _doc=$1
	local _ftmp=$2
	# Display some info about document
	extract $_doc $_ftmp 
	local _model=$(getModel $_ftmp)
	echo "Tmp dir = $_ftmp"
	echo "Model = $_model"
} # End of info
#-----------------------------------------------------------------------#
function list() {
	local _print=$1
	local _opt=$2			# da (document all) du (document used) ma (model all) mu (model used)
	local _ori='';[[ $_opt =~ a ]] && _ori=styles.xml || _ori=content.xml
	local _doc=$3
	local _ftmp=$4
	# List styles of document
	# echo "list _ftmp = $_ftmp"
	extract "$_doc" $_ftmp 
	cat $_ftmp/$_ori | grep style-name | sed 's#style-name="\([^"]*\)"#\nstyle-name=\1\n#g' | grep "style-name=" > /tmp/$prefix-$_opt.lst
	$_print && cat /tmp/$prefix-$_opt.lst || true
} # End of list
#-----------------------------------------------------------------------#
i=$(date +%N)
prefix=oow_$i					# for files in /tmp
ftmp=/tmp/$prefix				# temp directory - extract .odt documeny
# Start
[[ 1 -gt $# ]] && { aide; exit; }
cde=$1
[[ 2 -le $# ]] && p1=$2 || p1=""		# Parametre eventuel de la commande
doc=$p1
[[ -f $doc ]] || { echo "$doc not found"; exit 1; }
if [[ da == $cde ]]; then oowDiff da $doc $ftmp;
elif [[ du == $cde ]]; then oowDiff du $doc $ftmp;
elif [[ i == $cde ]]; then info $doc $ftmp;
elif [[ la == $cde ]]; then list true da $doc $ftmp;
elif [[ lu == $cde ]]; then list true du $doc $ftmp;
else {
	echo "cde ($cde) inconnue"; exit 1;
} fi

Ligne 4 (avec erreur de frappe à corriger à la prochaine version) et fonction aide …