#!/bin/bash
#
# render_getIdentityDefs.sh -- This function provides shared variables
# re-definition for all rendition actions inside centos-art.sh script.
#
# Copyright (C) 2009-2011 Alain Reguera Delgado
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.
#
# ----------------------------------------------------------------------
# $Id$
# ----------------------------------------------------------------------
function render_getIdentityDefs {
# Define the translation file absolute path. Only if we have a
# .png.sh extension at file's end we can consider that file as a
# translation file. Otherwise there is not translation file.
if [[ $TRANSLATIONPATH != '' ]];then
TRANSLATION=${FILE}
else
TRANSLATION=`gettext "None"`
fi
# Check translation file existence. This may seem unnecessary
# because we already built the file list using existent files.
# But what happen if any of the files already loaded are removed
# after being loaded? well, just skip it.
if [[ "$TRANSLATION" == `gettext "None"` ]];then
cli_printMessage "`gettext "None"`" "AsTranslationLine"
else
cli_checkFiles "$TRANSLATION" 'fh'
cli_printMessage "$TRANSLATION" 'AsTranslationLine'
fi
# Define the design template absolute path. This definition is
# done by interpreting the matching list and translation path
# information. This defintion needs to be coherent with those
# defined in render_getFilesList function.
if [[ "${MATCHINGLIST}" != "" ]] \
&& [[ "${TRANSLATIONPATH}" == "" ]];then
# Remove the template (`Tpl/') string from FILE for those
# images based on design templates. This avoids the creation
# of an extra `Tpl' directory under Img. We want to save
# primary PNG file structure directly under Img/ not Img/Tpl/.
FILE=$(echo ${FILE} | sed -r "s!^${SVG}/!!")
# In this case just one primary image is rendered.
# Template points to the value passed in the template
# argument.
TEMPLATE=${MATCHINGLIST}
elif [[ "${MATCHINGLIST}" == "" ]] \
&& [[ "${TRANSLATIONPATH}" == "" ]];then
# Remove the template (`Tpl/') string from FILE for those
# images based on design templates. This avoids the creation
# of an extra `Tpl' directory under Img. We want to save
# primary PNG file structure directly under Img/ not Img/Tpl/.
FILE=$(echo ${FILE} | sed -r "s!^${SVG}/!!")
# In this case one primary image is rendered for each
# design template. Template absolute path points to a
# design template (see LOCATION's definition).
TEMPLATE=${FILE}
elif [[ "${MATCHINGLIST}" == "" ]] \
&& [[ "${TRANSLATIONPATH}" != "" ]];then
# In this case translation files are applied to design
# templates with the same name (without extension). One
# primary image is rendered for each translation file
# matching. Template and translation files use the same path
# and name relative to their PARENTDIR. Translations use
# .png.sh extension and templates .svg extension.
TEMPLATE=$(echo ${FILE} | sed -r "s!.*/${PARENTDIR}/(.*)!\1!" \
| sed -r "s/\.${EXTENSION}$/.svg/")
elif [[ "${MATCHINGLIST}" != "" ]] \
&& [[ "${TRANSLATIONPATH}" != "" ]];then
# Create a template and translation matching list. With this
# configuration we can optimize the rendition process for
# artworks like Anaconda progress slides and installation
# media, where many translation files apply one unique design
# template file.
#
# Previous to this feature, there was one (repeated) design
# template for each design holding the same design in all
# cases, basically a raw copy. This structure is very hard to
# maintain so it was reduced and optimized as we described
# above.
#
# The idea is to create a link and customizable relation
# between translation files and design template files in
# pre-rendition configuration scripts and then interpret it
# here.
#
# This way we pretend to eliminate duplicated design templates
# saying something like translation 1.png.sh, 2.png.sh,
# 3.png.sh, 4.png.sh, and 5.png.sh apply to the single design
# template A.svg. Or, 1.png.sh, 3.png.sh, 4.png.sh to A.svg
# and 2.png.sh and 5.png.sh to B.svg.
#
# Possible configuration 1: In this first case,
# translation files and design templates share a common
# portion of the path. Sometimes, we call this common
# portion of path the ``bond path''. This configuration is
# strictly used under the following situations:
#
# 1. There are too many translation files to apply to a
# single design template. This is the case of Brands
# artworks (see: trunk/Identity/Brands) rendition, where it
# is very difficult to maintain the relation list of design
# templates and translation files. E.g.:
#
# bond/path/template.svg: \
# bond/path/translation1.png.sh \
# bond/path/translation2.png.sh
#
# 2. Translation files are under a directory with the same
# name of that used in the design template. All translation
# files inside this directory will be applied to the single
# design template that has the same name of the directory
# containing the translation files. E.g.:
#
# bond/path/green.svg: \
# bond/path/green/translation1.png.sh \
# bond/path/green/translation2.png.sh
#
BOND=$(echo $TRANSLATION \
| sed -r "s/^.*\/$PARENTDIR\/(.+)\/.*\.${EXTENSION}$/\1/")
# If there is no template at this point, start reducing the
# bond path and try to use the result as template. This is
# needed in those cases where you have a directory structure
# with various levels of translations inside it and want to
# apply the last available design template that match to all
# translation files in the directory structure.
if [[ ! -f "$SVG/${BOND}.svg" ]];then
until [[ -f "$SVG/${BOND}.svg" ]] ;do
[[ $BOND =~ '^(\.|/)$' ]] && break
BOND=$(dirname "$BOND")
done
fi
# Possible configuration 2: If no template is found using the
# previous bond paths reduction, then lets look using design
# template and translation file base name bond only. Use this
# configuration as much as possible. Note that it is much
# more flexible than possible configuration 1.
#
# In this configuration, the pre-rendition configuration takes
# the following form:
#
# template.svg: \
# translation1.png.sh \
# translation2.png.sh
#
if [[ ! -f "$SVG/${BOND}.svg" ]];then
BOND=$(basename "$TRANSLATION")
fi
# Possible configuration 2.1: If not design template was found
# with the .svg extension, lets try design template without
# extension. This configuration is useful to render plain text
# files that doesn't use an extension (e.g., see inside
# `trunk/Identity/Release' directory structure).
#
# template: \
# translation1.png.sh \
# translation2.png.sh
#
if [[ ! -f "$SVG/${BOND}.svg" ]] \
&& [[ ! -f $SVG/{$BOND} ]];then
BOND=$(basename "$TRANSLATION")
fi
# Define design template applying bond filtering.
TEMPLATE=$(echo "${MATCHINGLIST}" \
| egrep "$BOND" \
| cut -d: -f1 \
| sort )
# Sometimes one BOND pattern can match more than one design
# template (i.e. 2c-tm pattern match in: 2c-tm, 2c-tmd,
# 2c-tmdr). It makes no sence to apply one translation file
# to many differnt design templates at the same time. This
# way we need to reduce the design templates found to just
# one, the one matching the BOND translation path exactly,
# without .png.sh extension.
if [[ $(echo "$TEMPLATE" | wc -l ) -gt 1 ]];then
# Remove `.png.sh' extension from BOND. This is required
# in order to build the BOND design template correctly.
BOND=$(echo $BOND | sed -r "s/\.${EXTENSION}$//")
# Reduce template designs found to match BOND design
# template. Take into account design templates extensions.
TEMPLATE=$(echo "$TEMPLATE" \
| egrep "${BOND}(\.${EXTENSION})?$")
fi
# Sometimes we need to apply all translation files to a single
# design template. At this point, if there is no design
# template available yet, look inside matching list and use
# its value as design template for all translation files.
if [[ "$TEMPLATE" == '' ]] \
&& [[ "$MATCHINGLIST" =~ '^[[:alnum:][:digit:][:punct:]]+(\.svg|\.html|\.htm)?$' ]];then
TEMPLATE="$MATCHINGLIST"
fi
# If there is no template found at this point, we need to
# prevent an empty template from being used. It is a missing
# assignment definition in the pre-rendition script surely.
if [[ "$TEMPLATE" == '' ]];then
cli_printMessage "`eval_gettext "There is no design template defined for \\\`\\\${FILE}'."`" 'AsErrorLine'
cli_printMessage "$(caller)" "AsToKnowMoreLine"
fi
fi
# Remove any release number from design template's path. Release
# directories are used under Translations structure only.
# Removing release numbers from design template path makes
# possible to match many release-specific translations to the same
# design template. There is no need to duplicate the release
# structure inside design template structure.
TEMPLATE=$(echo $TEMPLATE | sed -r "s!^$(cli_getPathComponent '--release-pattern')/!!")
# Remove any language from design template's path. Language
# code directories are used under Translation structure only.
# Removing language code directories from design template path
# makes possible to match many language translations to the
# same design templates. There is no need to duplicate
# language code directories inside design template structure.
if [[ $TEMPLATE =~ '^[[:alpha:]]{2}(_[[:alpha:]]{2}){,1}/' ]];then
# It seems like the first directory referes to a language
# code. At this point we check if that value is a valid
# language code.
if [[ "$(cli_getLangCodes $(echo $TEMPLATE | cut -d/ -f1))" != '' ]];then
# The value is a valid language code. Remove it from path
# so design template path can be built correctly.
TEMPLATE=$(echo $TEMPLATE | sed "s!$(echo $TEMPLATE | cut -d/ -f1)/!!")
fi
fi
# Redefine design template using absolute path.
if [[ -f $SVG/$(basename "$TEMPLATE") ]];then
# Generally, template files are stored one level inside
# Tpl/ directory.
TEMPLATE=$SVG/$(basename "$TEMPLATE")
else
# Others, template designs may be stored some levels inside
# the template structure. At this point, we look deeper inside
# template's directory structure and redefine template path.
# Avoid using duplicated names inside template directory
# structure. If there are duplicate names, the first one in
# the list is used and the rest is discarded.
TEMPLATE=$(find $SVG -regextype posix-egrep -regex \
".*/${TEMPLATE}" | sort | head -n 1)
fi
# Check existence of TEMPLATE file. If design template doesn't
# exist we cannot render it; in such case, stop working for it and
# try the next one in the list.
cli_checkFiles "$TEMPLATE" 'f'
cli_printMessage "$TEMPLATE" 'AsDesignLine'
# Get relative path to file. The path string (stored in FILE) has
# two parts: 1. the variable path and 2. the common path. The
# variable path is before the common point in the path string. The
# common path is after the common point in the path string. The
# common point is the name of the parent directory (stored in
# PARENTDIR).
#
# trunk/Script/Bas.../Config/Firstboot/3/splash-small.png.sh
# -------------------------^| the |^------------^
# variable path | common | common path
# -------------------------v| point | v------------v
# trunk/Identity/Themes/M.../Firstboot/Img/3/splash-small.png
#
# What we do here is remove the varibale path, the common point,
# and the file extension parts in the string holding the path
# retrived from translations structure. Then we use the common
# path as relative path to the image file.
#
# The file extension is removed from the common path. Instead we
# set the extension when we create the final file.
#
# When we render using renderImage function, the structure of
# files under Img/ directory will be the same of that used after
# the common point in its related Translations or Template
# directory depending in which one was taken as reference when
# LOCATION variable was defined.
FILE=$(echo ${FILE} \
| sed -r "s!.*${PARENTDIR}/!!" \
| sed -r "s/\.${EXTENSION}$//")
# Re-define directory absolute path of final output directory. As
# convenction, when we produce content in English language, we do
# not add a laguage directory to organize content. However, when
# we produce content in a language different from English we do
# use language-specific directory to organize content.
if [[ $(cli_getCurrentLocale) =~ '^en' ]];then
DIRNAME=$IMG/$(dirname "${FILE}")
else
DIRNAME=$IMG/$(dirname "${FILE}")/$(cli_getCurrentLocale)
fi
# Remove leading `/.' string from directory path. This is required
# in order to define the final file absolute path.
DIRNAME=$(echo $DIRNAME | sed -r 's!/\.!!')
# Check existence of output image directory.
if [[ ! -d $DIRNAME ]];then
mkdir -p $DIRNAME
fi
# Define absolute path to file.
FILE=$(echo $DIRNAME/$(basename "${FILE}"))
# Define instance name.
INSTANCE=$(cli_getTemporalFile $TEMPLATE)
# Remove template instance if it is already present.
if [[ -a $INSTANCE ]];then
rm $INSTANCE
fi
# Create the design template instance.
cat $TEMPLATE > $INSTANCE
# Replace translation markers with appropriate information.
render_doIdentityTMarkers
}