Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/10/2016, à 14:47

jovial

Modifier proprement un svg(xml) en bash

Bonjour

J'ai par exemple un fichier rect_bleu.svg dont je veux changer une couleur et l'enregister >rect_rose.svg
Je veux modifier la couleur de "stop-color:#0068ff" par #ff00b0  dans le fichier ci- dessous. Je connais pas forcement la couleur d'origine donc c'est la proprété que je souhaite changer.
Comment le faire proprement avec une fonction dédiée xml en bashscript ?

Jluc


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   
  <defs
     id="defs4">
    <linearGradient
       osb:paint="solid"
       id="linearGradient4156">
      <stop
         id="stop4158"
         offset="0"
         style="stop-color:#0068ff;stop-opacity:1;" />   <!--  - - - - - - -  COULEUR A MODIFIER  - - - - - - - -  -->
    <linearGradient
       gradientTransform="translate(0,-3.9998797)"
       gradientUnits="userSpaceOnUse"
       y2="1042.3622"
       x2="49.999992"
       y1="1042.3622"
       x1="0"
       id="linearGradient4160"
       xlink:href="#linearGradient4156" />
    <linearGradient
       gradientTransform="translate(0,-25.999877)"
       y2="1042.3622"
       x2="49.999992"
       y1="1042.3622"
       x1="0"
       gradientUnits="userSpaceOnUse"
       id="linearGradient4164"
       xlink:href="#linearGradient4156" />
  </defs>
  <metadata
     id="metadata7">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     transform="translate(0,-1002.3622)"
     id="layer1">
    <rect
       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4160);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="rect4154"
       width="49.999985"
       height="19.999996"
       x="0"
       y="1028.3622" />
    <rect
       y="1006.3622"
       x="0"
       height="19.999996"
       width="49.999985"
       id="rect4162"
       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
  </g>
</svg>

Dernière modification par jovial (Le 04/10/2016, à 14:55)


Ubuntu 22.04: Dell Optiplex 7040, I7-6700 16Gio Ssd240, Radeon pro wx4100 & Dell Latitude E7270  i5-6300U 8Gio Ssd240

Hors ligne

#2 Le 04/10/2016, à 17:17

pingouinux

Re : Modifier proprement un svg(xml) en bash

Bonjour,
Ce n'est pas une fonction dédiée xml, mais tu peux essayer ceci :

sed -r 's/(stop-color:#)[0-9a-f]{6};/\1ff00b0;/g' rect_bleu.svg >rect_rose.svg

Ajouté :
Autre façon de faire

couleur=#ff00b0; nom_couleur=rose
sed -r "s/(stop-color:)#[0-9a-f]{6};/\1$couleur;/g" rect_bleu.svg >rect_$nom_couleur.svg

Dernière modification par pingouinux (Le 05/10/2016, à 07:43)

Hors ligne

#3 Le 04/10/2016, à 23:21

claudius01

Re : Modifier proprement un svg(xml) en bash

Bonsoir,

Peut-être que Module xpath from libxml2 pourrait t'aider car appelable directement d'un script bash comme indiqué (en autre) dans Linux Bash XMLLINT with XPATH...

Hors ligne

#4 Le 07/10/2016, à 13:52

jovial

Re : Modifier proprement un svg(xml) en bash

sed -r 's/(stop-color:#)[0-9a-f]{6};/\1ff00b0;/g' rect_bleu.svg >rect_rose.svg

Fait le job dans l'exemple que j'ai donné maintenant si j'ajoute un autre objet avec un autre stop-color cela me le change aussi voir fichier fourni ci-dessous.

Dans inkscape 0.91  j'utilise pour le remplissage du fond "Echantillon(swach en anglais)" voir dialog qui s'ajoute dans une palette interne au svg de style couleur. si je bouge ma couleur d'échantillon cela modifie la couleur de tous les objets qui l'utilisent
Dans  mon svg ma couleur est définie dans une balise id= stop4156 avec l'élément et sa valeur stop-color:#0068ff
Dans inkscape c'est structuré comme un degradé avec une seule couleur(stop-color)  qui est défini  avec le code suivant:

      <stop id="stop4158" offset="0" style="stop-color:#0068ff;stop-opacity:1;" />

Vue editeur xml

Pour xpath et xbxml2 je suis connais pas assez  bash pour l'exploité,  j'ai  trouvés que des exemple qui récupérent une valeur mais pas qui la mofifie.

Donc  si j'avais un ex d'un  fonction xml qui permet de faire cela que je puise appeler à partir de bash ce serai top.
Sinon c'est de créer un script de ce style

#!/bin/bash
echo "start  set_svg_val.sh()......................."
	
svg=$1
id=$2
element=$3
val=$4

	echo "file=" $svg " id=" $id " element=" $element " color=" $val

#	Code pour modifier le svg ....


# pour mon ex appel du script: ./set_svg_val1.sh "file1.svg" "stop4158" "stop-color" "#ff00b0" > file2.svg

Pour xpath et xbxml2 je suis connais pas assez le bash pour l'exploité,  j'ai  trouvés que des exemple qui récupérent une valeur mais pas qui la mofifie.

Donc le but final c'est modifier la couleur d'un objet dans une centaine fichier svg, je peux le faire bêtement en remplacant :#0068ff" par #ff00b0 mais je souhaiterai apprendre à utiliser le potentiel du xml pour modifier par exemple la taille d'un objet...

Merci à ceux qui ont répondus

Le svg à modifier la couleur 0068ff se trouve à la lign 29

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   width="50"
   height="50"
   viewBox="0 0 49.999997 49.999997"
   id="svg2"
   version="1.1">
  <defs
     id="defs4">
    <linearGradient
       osb:paint="solid"
       id="linearGradient4146">
      <stop
         id="stop4148"
         offset="0"
         style="stop-color:#6bd500;stop-opacity:1;" />
    </linearGradient>
    <linearGradient
       id="linearGradient4156"
       osb:paint="solid">
      <stop
         style="stop-color:#0068ff;stop-opacity:1;"
         offset="0"
         id="stop4158" />
    </linearGradient>
    <linearGradient
       xlink:href="#linearGradient4156"
       id="linearGradient4160"
       x1="0"
       y1="1042.3622"
       x2="49.999992"
       y2="1042.3622"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(0.67088602,0,0,0.90521995,7.769255,-907.6785)" />
    <linearGradient
       xlink:href="#linearGradient4156"
       id="linearGradient4164"
       gradientUnits="userSpaceOnUse"
       x1="0"
       y1="1042.3622"
       x2="49.999992"
       y2="1042.3622"
       gradientTransform="matrix(0.67088602,0,0,0.89137867,7.8389824,-914.53064)" />
  </defs>
  <metadata
     id="metadata7">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <rect
     y="0.36439335"
     x="-0.21186441"
     height="49.661007"
     width="25.847445"
     id="rect4142"
     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ebe9e7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
  <rect
     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4160);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
     id="rect4154"
     width="33.544289"
     height="18.104395"
     x="7.7692547"
     y="26.836262" />
  <rect
     y="5.6948972"
     x="7.8389816"
     height="17.82757"
     width="33.544289"
     id="rect4162"
     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</svg>

Dernière modification par jovial (Le 07/10/2016, à 15:22)


Ubuntu 22.04: Dell Optiplex 7040, I7-6700 16Gio Ssd240, Radeon pro wx4100 & Dell Latitude E7270  i5-6300U 8Gio Ssd240

Hors ligne