रिश्तेदार फ़ाइल पथ को लागू करने के लिए कैसे करें


3

जब PNG रेखापुंज ग्राफिक्स से लिंक करना इंकस्केप एसवीजी दस्तावेज़, ऐसा लगता है कि Inkscape हमेशा फ़ाइल के लिए PNG ग्राफ़िक के लिए निरपेक्ष पथ लिखने पर जोर देता है। इसके कई नुकसान हैं (जो, जाहिर तौर पर, प्रत्येक सेव के बाद टेक्स्ट एडिटर में SVG फाइल को मैन्युअल रूप से एडिट करके कम किया जा सकता है, लेकिन यह एक आलेखीय संपादक जैसे Inkscape के पीछे का विचार नहीं हो सकता है):

  • मैं SVG को तोड़े बिना अपने ग्राफिक्स के साथ निर्देशिका को स्थानांतरित नहीं कर सकता।
  • मैं अपने ग्राफिक्स के साथ निर्देशिका को विभिन्न कंप्यूटरों से काम करने के लिए पोर्टेबल मेमोरी पर स्टोर नहीं कर सकता, क्योंकि पोर्टेबल डिवाइस को विभिन्न ड्राइव अक्षर सौंपे जाएंगे।
  • मैं अपने ग्राफिक्स को विभिन्न ऑपरेटिंग सिस्टम से संपादित नहीं कर सकता, क्योंकि वे विभाजन को माउंट कर सकते हैं जो विभिन्न माउंट बिंदुओं पर एसवीजी फ़ाइलों और पीएनजी ग्राफिक्स को संग्रहीत करता है।
  • मैं अपने ग्राफिक्स के साथ निर्देशिका को एक नेटवर्क साझा पर सहयोगियों को प्रदान नहीं कर सकता, जहां से वे इसे कॉपी कर सकते हैं, क्योंकि रास्ते मेल नहीं खाएंगे।
  • फ़ाइलों को सीधे संस्करण नियंत्रण प्रणाली जैसे कि साझा नहीं किया जा सकता है SVN या Git एक ही कारण के लिए। बहुत कम से कम, हर बार जब कोई बदले हुए फ़ाइल को लागू करता है, तो पूर्ण पथ वाले लाइनों को VCS द्वारा परिवर्तन के रूप में निरर्थक रूप से पंजीकृत किया जाएगा।
  • उपयोगकर्ता के होम निर्देशिका में अक्सर संग्रहीत फ़ाइलों के साथ, यह निर्माता के उपयोगकर्ता नाम (काम सेटिंग्स में, अक्सर वास्तविक नाम), या निर्माता की फाइल सिस्टम के बारे में अन्य जानकारी देकर गोपनीयता जोखिम का भी परिचय देता है।

अब भी, वह इनक्सस्केप सापेक्ष पथों का उपयोग करने लगता है और अतिरिक्त विशेषता में पूर्ण पथ जोड़ देता है ( sodipodi:absref ), उपरोक्त मुद्दों में से कई हैं फिर भी आसपास (विशेष रूप से, गोपनीयता की चिंता अपरिवर्तित है, और इसलिए वीसीएस मुद्दा है)।

ध्यान दें कि मैं करता हूँ नहीं चाहना एम्बेड विभिन्न कारणों से इनकैप दस्तावेजों में पीएनजी डेटा, जिनमें से दो हैं:

  • ग्राफिक्स बाद में बदल सकते हैं, और PNG फ़ाइल को एक अलग PNG फ़ाइल के रूप में रखना अधिक लचीला है, जहां मैं इसे संपादित कर सकता हूं (और Inkscape को फिर से खोलते समय इसे स्वचालित रूप से अपडेट किया जाएगा), बजाय SVG में PNG डेटा एम्बेड किए , फिर भी इसे एक अतिरिक्त फ़ाइल के रूप में सहेजना (इसलिए मैं बाद में पीएनजी छवि को संपादित कर सकता हूं) और हर बार जब मैं पीएनजी बदल देता हूं; Inkscape में फिर से नए संस्करण को एम्बेड करना, पिछले संस्करण से मिलान करने के लिए मैन्युअल रूप से अपनी स्थिति और आकार को अपनाना और फिर पिछले संस्करण को निकालना।
  • SVG दस्तावेज़ों की भीड़ में PNG की कई छवियां (लोगो या अन्य कॉर्पोरेट-पहचान-संबंधित ग्राफिक्स का उपयोग किया जाता है), इसलिए यह एक ऐसी छवि को प्रत्येक एकल SVG दस्तावेज़ में एम्बेड करने के लिए जगह की बर्बादी होगी, बजाय इसे संग्रहीत करने के बस एक बार और प्रत्येक एसवीजी दस्तावेज़ से उस मूल पीएनजी ग्राफिक का जिक्र। (और निश्चित रूप से, पिछले आइटम से प्रयास हर एसवीजी दस्तावेज़ के साथ गुणा करता है मैं एक दिए गए संशोधित रेखापुंज ग्राफ़िक का उपयोग करता हूं।)

वर्कअराउंड के रूप में, मैंने एक स्क्रिप्ट लिखने के बारे में सोचा है जिसे सेव करने के बाद एसवीजी फाइलों पर चलाया जाना है XSLT , या कुछ पारंपरिक भाषा के साथ जो एसवीजी लोड कर सकते हैं। संभवतः, यह पूर्वोक्त संस्करण नियंत्रण प्रणालियों के लिए पूर्व-प्रतिबद्ध-हुक के रूप में भी स्थापित किया जा सकता है। हालांकि, ऐसा करना मेरे लिए पर्याप्त रूप से थकाऊ है, इसलिए मैं केवल उन लंबाई में जाना चाहता हूं अगर वास्तव में कोई दूसरा रास्ता नहीं है।

क्या एसवीजी फ़ाइल में लिंक की गई छवियों के लिए केवल सापेक्ष पथ लिखने के लिए इंक्सस्केप को मजबूर करने का एक तरीका है? (यदि संभव हो तो हाल ही में उपयोग किए गए बिटमैप निर्यात पथ के लिए भी।)

जवाबों:


1

यह एक महान प्रश्न है, और मैं चाहता हूं कि मेरे पास वास्तव में अच्छा समाधान हो। सभी मैं निम्नलिखित हैकिश स्क्रिप्ट के साथ आने में सक्षम हूं:

#!/usr/bin/perl

use strict;

# usage:
#   relativise_svg.pl foo.svg
# Looks for absolute links in svg file and makes them relative.
# Also checks whether files linked to exist.

use File::Spec; 
use File::Basename;
use Cwd 'abs_path';
my $svg = $ARGV[0];

-e $svg or err("file $svg doesn't exist");
-w $svg or err("file $svg not writeable");

local $/; # slurp whole file

open(F,"<$svg");
my $xml = <F>;
close F;

# Absolute links look like this:
#   xlink:href="file:///home/bcrowell/Documents/writing/books/physics/share/..."
# After we relativise them, they look like this:
#   xlink:href="foo/bar.jpg"

my $cwd = Cwd::getcwd();
my $svg_dir = File::Basename::dirname(abs_path($svg));
my $original_xml = $xml;

my @changes = ();
while ($xml=~m@(file://(/[^'"]*))@g) {
  my $whole = $1;
  my $path = $2;
  my $rel = relativise($path,$svg_dir,$cwd);
  print "changing absolute path in $svg to $rel\n";
  push @changes,[$whole,$rel];
}
foreach my $change(@changes) {
  my $from = quotemeta($change->[0]);
  my $to = $change->[1];
  $xml =~ s/$from/$to/g;
}

while ($xml=~m@xlink:href\s*=\s*"([^'"]*)@g) {
  my $rel = $1;
  if ($rel=~/\.(png|jpg)$/ && !($rel=~/\A#/ || $rel=~/\Adata:;/)) {
    my $abs = File::Spec->rel2abs($rel,$svg_dir);
    -e $abs or err("file $rel doesn't exist, resolved to absolute path $abs");
  }
}

if ($xml ne $original_xml) {
  open(F,">$svg");
  print F $xml;
  close F;
}

sub err {
  my $message = shift;
  print "relativise_svg.pl, working on $svg, ",$message,"\n";
  exit(-1);
}

sub relativise {
  my ($abs,$rel_to,$within) = @_;
  my $rel = File::Spec->abs2rel($abs,$rel_to);
  if (File::Spec->abs2rel($rel,$within)=~/\.\./) {
    err("result, $rel, would have been outside $within");
  }
  return $rel;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.