3 # Generator - a Inkscape extension to generate end-use files from a model
4 # Copyright (C) 2008 Aurélio A. Heckert
6 # Added CSV parser from
7 # http://fixunix.com/unix/83523-how-do-i-read-split-derive-csv-using-bash-script.html
8 # by Chris F.A. Johnson <cfaj@freeshell.org> http://cfaj.freeshell.org
10 # This program is free software: you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation, either version 3 of the License, or
13 # (at your option) any later version.
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
22 # Collect all args and create local variables:
24 if ( echo -n $arg | grep -q '^--.*=' ); then
25 key="$( echo -n "$arg" |
26 sed 's/^--\([^=]*\)=.*$/\1/; s/[^a-zA-Z0-9]/_/' )"
27 val="$( echo -n "$arg" |
28 sed 's/^--\([^=]*\)=\(.*\)$/\2/' )"
35 if ! zenity --version 2>/dev/null; then
39 zenity "You must to install Zenity to have a better interaction
40 with this script, but it will work anyway."
43 if [ "${data_file:0:1}" != "/" ]; then
44 data_file="$(pwd)/$data_file"
47 if ! test -f "$data_file"; then
48 zenity --error --title="User Information Error" \
49 --text="The CSV file \"$data_file\" was not found.
51 Please, give the right name, or give the full path for the CSV file."
56 # sed 's/^\([^"]*\("[^"]*"[^"]*\)*"[^"]*\),/\1#COMMAHACK#/g' |
57 # sed 's/,/\n/g' | sed "s/\"\"/\"/g; s/^['\"]\|['\"]$//g"
60 function csv_split() { ## USAGE: csv_split CSV_RECORD
61 local record=${1%"${CR}"}
65 while [ -n "$record" ]
69 \"*) right=${record#*\",}
71 values[$vnum]=${value#\"}
73 *) values[$vnum]=${record%%,*}
79 *,*) record=${right} ;;
80 *) record=${record#\"}
81 values[$vnum]=${record%\"}
97 csv_split `head --lines=1 "$data_file"` |
100 if [ "$var_type" == "name" ]; then
101 echo col_name[$col]=$( echo $name | sed "s/[][ \$'\"]/_/g" )
103 echo col_name[$col]=$col
112 echo "$extra_vars" | sed 's/|/\n/g' |
114 key="$( echo "$extra" | sed 's/^.*=>\(.*\)$/\1/g' )"
115 for i in $( seq $tot_col ); do
116 if [ "${col_name[$i]}" = "$key" ]; then
117 echo extracol[$i]="'$( echo "$extra" | sed 's/^\(.*\)=>.*$/\1/g' )'"
123 if [ "$preview" = "true" ]; then
126 for i in $( seq $tot_col ); do
127 txt="$txt\n%VAR_${col_name[$i]}%"
129 for i in $( seq $tot_col ); do
130 [ "${extracol[$i]}" != "" ] && txt="$txt\n${extracol[$i]}"
132 zenity --info --title="Generator Variables" \
133 --text="The replaceable text, based on your configuration and on the CSV are:\n$txt"
136 eval "output=\"$output\""
138 [ "$( dirname "$output" )" != "" ] && mkdir --parents "$( dirname "$output" )"
140 [ "$format" = "" ] && format=PDF
141 format=$( echo $format | tr a-z A-Z )
143 if ! ( echo "$output" | grep -qi "$format\$" ); then
144 if zenity --question --text="
145 Your output pattern has a file extension diferent from the export format.
147 Did you want to add the file extension?"; then
148 output="$output.$( echo $format | tr A-Z a-z )"
154 ink_error=$( mktemp )
158 rm $tmp_svg $tmp_png $ink_error
162 function ink-generate {
163 f="$( echo "$1" | sed 's/^[^=]*=\(.*\)$/\1/' )"
165 ( inkscape --without-gui \
166 "$1" --export-dpi="$dpi" \
167 $tmp_svg 2>&1 ) > $ink_error
168 if ! test -f "$f"; then
169 zenity --error --title="Inkscape Converting Error" \
170 --text="$(cat $ink_error |
171 sed 's/&/&/g; s/</</g; s/>/>/g' )"
177 function show_preview {
180 ( inkview "$1" || inkscape "$1" ) 2>/dev/null ||
181 echo 'There is no visualizator for SVG' >&2 ;;
183 ( evince "$1" || kpdf "$1" || xpdf "$1" || gs "$1" ) 2>/dev/null ||
184 echo 'There is no visualizator for PDF' >&2 ;;
186 ( evince "$1" || gs "$1" ) 2>/dev/null ||
187 echo 'There is no visualizator for PS' >&2 ;;
189 ( evince "$1" || gs "$1" ) 2>/dev/null ||
190 echo 'There is no visualizator for EPS' >&2 ;;
192 ( eog "$1" || kview "$1" || display "$1" ) 2>/dev/null ||
193 echo 'There is no visualizator for PNG' >&2 ;;
195 ( eog "$1" || kview "$1" || display "$1" ) 2>/dev/null ||
196 echo 'There is no visualizator for JPG' >&2 ;;
202 tot_lines=$( wc --lines "$data_file" | sed 's/^\([0-9]\+\).*/\1/' )
203 if [ "$var_type" == "name" ]; then
210 [ "$var_type" == "name" ] && read cut_frist_line
217 echo -n "s/%VAR_${col_name[$col]}%/$(
218 echo "$val" | sed "s/\//\\\\\//g; s/'/\´/g"
219 )/g; " | sed 's/#COMMAHACK#/,/g'
220 if [ "${extracol[$col]}" != "" ]; then
221 echo -n "s/${extracol[$col]}/$(
222 echo "$val" | sed "s/\//\\\\\//g; s/'/\´/g"
223 )/g; " | sed 's/#COMMAHACK#/,/g'
227 eval "sed '$replace' '$svg_file' > $tmp_svg"
228 out_file="$( echo "$output" | sed "$replace" )"
229 #echo "Gerando $out_file ..."
232 cp "$tmp_svg" "$out_file" ;;
234 ink-generate --export-pdf="$out_file" ;;
236 ink-generate --export-ps="$out_file" ;;
238 ink-generate --export-eps="$out_file" ;;
240 ink-generate --export-png="$out_file" ;;
242 ink-generate --export-png="$tmp_png"
243 if ! ( echo "$output" | grep -qi '.jpe\?g$' ); then
246 convert $tmp_png "$out_file" ;;
249 echo $(( ( $cur_line * 100 ) / $tot_lines ))
250 [ "$preview" = "true" ] && show_preview "$out_file" && exit 0
252 zenity --progress --title="Generator" \
253 --text="Generating..." --auto-close --width=400
256 [ "$preview" = "true" ] && exit 0