]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' into lilypond/translation
authorFrancisco Vila <francisco.vila@hispalinux.es>
Wed, 10 Mar 2010 09:57:54 +0000 (10:57 +0100)
committerFrancisco Vila <francisco.vila@hispalinux.es>
Wed, 10 Mar 2010 09:57:54 +0000 (10:57 +0100)
Documentation/lilypond-texi2html.init
input/regression/display-lily-tests.ly
input/regression/tuplet-properties.ly
lily/tuplet-bracket.cc
scm/font.scm
scm/output-lib.scm
scm/stencil.scm
scripts/build/website_post.py

index 92c48b970c9e94b11e40e3b737a748046af1ef02..42181c655f3f52646365f8049be0acc504b894d2 100644 (file)
@@ -831,7 +831,7 @@ sub lilypond_element_file_name($$$)
       $$element{doc_nr} = $docnr;
       $lastfilename = $filename;
     }
-    print STDERR "Output file name: $filename\n";
+    #print STDERR "Output file name: $filename\n";
     $filename = lc_last($filename);
     return $filename;
 
index 5c128d1654069320671195ad608ba7649dbdcbb7..35e18c7aee3c4a039819e1dc3c3cbcde4f529c74 100644 (file)
@@ -146,6 +146,7 @@ stderr of this run."
 \test "" ##[ \breathe #]
 \test "" ##[ { c \[ c \] } #]                  % LigatureEvent
 \test "" ##[ \~ #]                                     % PesOrFlexaEvent
+\test "" ##[ { c-\bendAfter #3  } #] % BendAfterEvent
 
 \test "" ##[ \break #]
 \test "" ##[ \noBreak #]
index 06681150f5861690ab2cf09b59309c439bfb3e28..99c79f43e77d2518126d95b959fbf7a9b842280a 100644 (file)
@@ -1,3 +1,4 @@
+\version "2.12.0"
 
 \header {
   texidoc = "Tuplet bracket formatting supports numerous options,
@@ -5,40 +6,33 @@ for instance, bracketed (B) and non-bracketed (NB).
 "
 }
 
-
-\version "2.12.0"
-
-
-
 \context Voice \relative c'' {
 
   \times 2/3 { c'8 c,, c }
   \times 2/3 { c'8 c'' c,, }
 
-  
-  \times 2/3 {  c8[^"NB" c c]  }
-  
-  \times 2/3 { c8^"B"  c[ c]  }
+  \times 2/3 { c8[^"NB" c c] }
+
+  \times 2/3 { c8^"B"  c[ c] }
   \times 2/4 { r8_"B"  c,[ c'] r8 }
-  
-  \override TupletBracket  #'bracket-visibility = #'if-no-beam  
-  \times 2/3 {  c8[ c c]  }
-  
+
+  \override TupletBracket #'bracket-visibility = #'if-no-beam  
+  \times 2/3 { c8[ c c] }
+
   \tupletUp
-  \override TupletNumber #'transparent = ##t
-  \times 2/3 { c8^""^""^"up, no digit"  c[ c]  }
-  \revert TupletNumber #'transparent
+  \override TupletNumber #'stencil = ##f
+  \times 2/3 { c8^""^""^"up, no digit" c[ c] }
+  \revert TupletNumber #'stencil
 
-  \override TupletBracket  #'bracket-visibility = ##t
-  \override TupletBracket  #'shorten-pair = #'(2.0 . 2.0)
+  \override TupletBracket #'bracket-visibility = ##t
+  \override TupletBracket #'edge-height = #'(0 . 0)
+  \override TupletBracket #'shorten-pair = #'(2.0 . 2.0)
   \times 4/6 { c_"shorter, no edges" f b  b f c}       
   \revert TupletBracket #'edge-height
   \revert TupletBracket #'shorten-pair
-  \override TupletBracket  #'bracket-flare = #'(0.5 . 0.5)
+
+  \override TupletBracket #'bracket-flare = #'(0.5 . 0.5)
   \times 2/3 { b^""^""^"angled edges" b b }
   \tupletNeutral
   \times 2/3 { b b b }
-
 }
-
-
index f525ef90f43e698512b06f0f3f9ca1706bee459b..abc559ab051b3942c941988e9cae856fc2bc94da 100644 (file)
@@ -40,7 +40,6 @@
   todo: handle breaking elegantly.
 */
 
-
 #include "tuplet-bracket.hh"
 #include "line-interface.hh"
 #include "beam.hh"
@@ -71,7 +70,6 @@ get_x_bound_item (Grob *me_grob, Direction hdir, Direction my_dir)
   return g;
 }
 
-
 void
 flatten_number_pair_property (Grob *me, Direction xdir, SCM sym)
 {
@@ -83,12 +81,11 @@ flatten_number_pair_property (Grob *me, Direction xdir, SCM sym)
   me->set_property (sym, ly_interval2scm (pair));
 }
 
-
 /*
   Return beam that encompasses the span of the tuplet bracket.
 */
 Grob *
-Tuplet_bracket::parallel_beam (Grob *me_grob, vector<Grob*> const &cols,
+Tuplet_bracket::parallel_beam (Grob *me_grob, vector<Grob *> const &cols,
                               bool *equally_long)
 {
   Spanner *me = dynamic_cast<Spanner *> (me_grob);
@@ -98,22 +95,22 @@ Tuplet_bracket::parallel_beam (Grob *me_grob, vector<Grob*> const &cols,
     return 0;
 
   Drul_array<Grob *> stems (Note_column::get_stem (cols[0]),
-                          Note_column::get_stem (cols.back ()));
+                           Note_column::get_stem (cols.back ()));
 
   if (!stems[RIGHT]
       || !stems[LEFT]
-      || (dynamic_cast<Item*> (stems[RIGHT])->get_column ()
+      || (dynamic_cast<Item *> (stems[RIGHT])->get_column ()
          != me->get_bound (RIGHT)->get_column ()))
     return 0;
 
   Drul_array<Grob *> beams;
   Direction d = LEFT;
-  do {
+  do
     beams[d] = stems[d] ? Stem::get_beam (stems[d]) : 0;
-  while (flip (&d) != LEFT);
+  while (flip (&d) != LEFT);
 
   *equally_long = false;
-  if (!(beams[LEFT] && (beams[LEFT] == beams[RIGHT]) && !me->is_broken ()))
+  if (! (beams[LEFT] && (beams[LEFT] == beams[RIGHT]) && !me->is_broken ()))
     return 0;
 
   extract_grob_set (beams[LEFT], "stems", beam_stems);
@@ -124,13 +121,12 @@ Tuplet_bracket::parallel_beam (Grob *me_grob, vector<Grob*> const &cols,
       return 0;
     }
 
-  *equally_long =
-    (beam_stems[0] == stems[LEFT]
-     && beam_stems.back () == stems[RIGHT]);
+  *equally_long
+    (beam_stems[0] == stems[LEFT]
+       && beam_stems.back () == stems[RIGHT]);
   return beams[LEFT];
 }
 
-
 MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_connect_to_neighbors, 1);
 SCM
 Tuplet_bracket::calc_connect_to_neighbors (SCM smob)
@@ -165,7 +161,6 @@ Tuplet_bracket::calc_connect_to_neighbors (SCM smob)
     }
   while (flip (&d) != LEFT);
 
-
   if (connect_to_other[LEFT] || connect_to_other[RIGHT])
     return scm_cons (scm_from_bool (connect_to_other[LEFT]),
                     scm_from_bool (connect_to_other[RIGHT]));
@@ -210,9 +205,9 @@ Tuplet_bracket::calc_control_points (SCM smob)
   bounds[LEFT] = get_x_bound_item (me, LEFT, dir);
   bounds[RIGHT] = get_x_bound_item (me, RIGHT, dir);
 
-  Drul_array<bool> connect_to_other =
-    robust_scm2booldrul (me->get_property ("connect-to-neighbor"),
-                        Drul_array<bool> (false, false));
+  Drul_array<bool> connect_to_other
+    robust_scm2booldrul (me->get_property ("connect-to-neighbor"),
+                          Drul_array<bool> (false, false));
 
   Interval x_span;
   Direction d = LEFT;
@@ -242,15 +237,15 @@ Tuplet_bracket::calc_control_points (SCM smob)
            We're connecting to a column, for the last bit of a broken
            fullLength bracket.
          */
-         Real padding =
-           robust_scm2double(me->get_property("full-length-padding"), 1.0);
+         Real padding
+           = robust_scm2double (me->get_property ("full-length-padding"), 1.0);
 
          if (bounds[d]->break_status_dir ())
            padding = 0.0;
 
-         Real coord = bounds[d]->relative_coordinate(commonx, X_AXIS);
+         Real coord = bounds[d]->relative_coordinate (commonx, X_AXIS);
          if (to_boolean (me->get_property ("full-length-to-extent")))
-           coord = robust_relative_extent(bounds[d], commonx, X_AXIS)[LEFT];
+           coord = robust_relative_extent (bounds[d], commonx, X_AXIS)[LEFT];
 
          coord = max (coord, x_span[LEFT]);
 
@@ -259,7 +254,6 @@ Tuplet_bracket::calc_control_points (SCM smob)
     }
   while (flip (&d) != LEFT);
 
-
   x_span -= me->get_bound (LEFT)->relative_coordinate (commonx, X_AXIS);
   return scm_list_2 (ly_offset2scm (Offset (x_span[LEFT], positions[LEFT])),
                     ly_offset2scm (Offset (x_span[RIGHT], positions[RIGHT])));
@@ -282,15 +276,15 @@ Tuplet_bracket::print (SCM smob)
   bool equally_long = false;
   Grob *par_beam = parallel_beam (me, columns, &equally_long);
 
-  bool bracket_visibility = !(par_beam && equally_long);          // Flag, print/don't print tuplet bracket.
+  bool bracket_visibility = ! (par_beam && equally_long); // Flag, print/don't print tuplet bracket.
   /*
     FIXME: The type of this prop is sucky.
   */
   SCM bracket_vis_prop = me->get_property ("bracket-visibility");
-  bool bracket_prop = ly_scm2bool (bracket_vis_prop);             // Flag, user has set bracket-visibility prop.
+  bool bracket_prop = to_boolean (bracket_vis_prop); // Flag, user has set bracket-visibility prop.
   bool bracket = (bracket_vis_prop == ly_symbol2scm ("if-no-beam"));
-  if (scm_is_bool (bracket_vis_prop))
-    bracket_visibility = bracket_prop;
+  if (bracket_prop)
+    bracket_visibility = true;
   else if (bracket)
     bracket_visibility = !par_beam;
 
@@ -308,14 +302,11 @@ Tuplet_bracket::print (SCM smob)
       the bracket, but still let the number be displayed.
       Only do this if the user has not explicitly specified bracket-visibility = #t.
   */
-  if (!bracket_prop)
-  {
-      if (robust_scm2moment (me->get_bound (LEFT)->get_column ()->get_property ("when"), Moment (0))
-         == robust_scm2moment (me->get_bound (RIGHT)->get_column ()->get_property ("when"), Moment (0)))
-      {
-         bracket_visibility = false;
-      }
-  }
+  if (!bracket_prop
+      && (robust_scm2moment (me->get_bound (LEFT)->get_column ()->get_property ("when"), Moment (0))
+         == robust_scm2moment (me->get_bound (RIGHT)->get_column ()->get_property ("when"), Moment (0))))
+    bracket_visibility = false;
+
   Drul_array<Offset> points;
   points[LEFT] = ly_scm2offset (scm_car (cpoints));
   points[RIGHT] = ly_scm2offset (scm_cadr (cpoints));
@@ -331,7 +322,7 @@ Tuplet_bracket::print (SCM smob)
     Don't print the bracket when it would be smaller than the number.
     ...Unless the user has coded bracket-visibility = #t, that is.
   */
-  Real gap = 0.;
+  Real gap = 0.0;
   if (bracket_visibility && number_grob)
     {
       Interval ext = number_grob->extent (number_grob, X_AXIS);
@@ -362,9 +353,9 @@ Tuplet_bracket::print (SCM smob)
       scale_drul (&flare, ss);
       scale_drul (&shorten, ss);
 
-      Drul_array<bool> connect_to_other =
-       robust_scm2booldrul (me->get_property ("connect-to-neighbor"),
-                            Drul_array<bool> (false, false));
+      Drul_array<bool> connect_to_other
+       robust_scm2booldrul (me->get_property ("connect-to-neighbor"),
+                              Drul_array<bool> (false, false));
 
       Direction d = LEFT;
       do
@@ -495,7 +486,7 @@ Tuplet_bracket::get_bounds (Grob *me, Grob **left, Grob **right)
     l++;
 
   vsize r = columns.size ();
-  while (r > l && Note_column::has_rests (columns[r-1]))
+  while (r > l && Note_column::has_rests (columns[r - 1]))
     r--;
 
   *left = *right = 0;
@@ -503,13 +494,14 @@ Tuplet_bracket::get_bounds (Grob *me, Grob **left, Grob **right)
   if (l < r)
     {
       *left = columns[l];
-      *right = columns[r-1];
+      *right = columns[r - 1];
     }
 }
 
 /*
   use first -> last note for slope, and then correct for disturbing
-  notes in between.  */
+  notes in between.
+*/
 void
 Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
 {
@@ -530,13 +522,15 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
   Interval staff;
   Grob *st = Staff_symbol_referencer::get_staff_symbol (me);
 
-  /* staff-padding doesn't work correctly on cross-staff tuplets
-     because it only considers one staff symbol. Until this works,
-     disable it. */
+  /*
+    staff-padding doesn't work correctly on cross-staff tuplets
+    because it only considers one staff symbol. Until this works,
+    disable it.
+  */
   if (st && !to_boolean (me->get_property ("cross-staff")))
     {
       Real pad = robust_scm2double (me->get_property ("staff-padding"), -1.0);
-      if  (pad >= 0.0)
+      if (pad >= 0.0)
        {
          staff = st->extent (commony, Y_AXIS) - my_offset;
          staff.widen (pad);
@@ -564,7 +558,7 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
     {
       /*
        trigger set_stem_ends
-       */
+      */
       (void) par_beam->get_property ("quantized-positions");
 
       Drul_array<Grob *> stems (Note_column::get_stem (columns[0]),
@@ -572,9 +566,9 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
 
       Real ss = 0.5 * Staff_symbol_referencer::staff_space (me);
       Real lp = ss * robust_scm2double (stems[LEFT]->get_property ("stem-end-position"), 0.0)
-        + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
+       + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
       Real rp = ss * robust_scm2double (stems[RIGHT]->get_property ("stem-end-position"), 0.0)
-        + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
+       + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
 
       *dy = rp - lp;
       points.push_back (Offset (stems[LEFT]->relative_coordinate (commonx, X_AXIS) - x0, lp));
@@ -630,7 +624,7 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
     }
 
   /*
-    This is a slight hack. We compute two encompass points from the
+    This is a slight hack.  We compute two encompass points from the
     bbox of the smaller tuplets.
 
     We assume that the smaller bracket is 1.0 space high.
index f7b71e53f8129a8653654d865856b786d840b2c0..662f655a8d5c1045ea12ad710d82ac8da07c16d0 100644 (file)
 ;; Each size family is a vector of fonts, loaded with a delay.  The
 ;; vector should be sorted according to ascending design size.
 (define-public (add-music-fonts node name family design-size-alist factor)
-  "Setup music fonts.
+  "Set up music fonts.
 
 Arguments:
  NODE the font tree to modify.
  NAME is the basename for the music font. NAME-DESIGNSIZE.otf should be the music font,
   NAME-brace.otf should have piano braces.
  DESIGN-SIZE-ALIST is a list of (ROUNDED . DESIGN-SIZE).  ROUNDED is
-   as suffix for font filenames, while DESIGN-SIZE should be the actual
+   a suffix for font filenames, while DESIGN-SIZE should be the actual
    design size.  The latter is used for text fonts loaded through
    pango/fontconfig 
- FACTOR is size factor relative to default size that is being used.
+ FACTOR is a size factor relative to the default size that is being used.
   This is used to select the proper design size for the text fonts.
 "
   (for-each
index 67b325ea95bfdf21cfe85d56dfe259c62d7a8d6b..8e17401477a79435adc2c47ead1db86c86faf8fc 100644 (file)
@@ -464,6 +464,7 @@ and duration-log @var{log}."
          (half-thickness 0.05) ; should it be a property?
          (width 0.5) ; should it be a property?
          (angularity 1.5)  ; makes angle brackets
+         (white-padding 0.1) ; should it be a property?
         (lp (ly:stencil-aligned-to
                  (ly:stencil-aligned-to
                    (make-parenthesis-stencil y-extent
@@ -472,6 +473,8 @@ and duration-log @var{log}."
                                              angularity)
                    Y CENTER)
                  X RIGHT))
+         (lp-x-extent
+           (interval-widen (ly:stencil-extent lp X) white-padding))
         (rp (ly:stencil-aligned-to
                  (ly:stencil-aligned-to
                    (make-parenthesis-stencil y-extent
@@ -479,8 +482,15 @@ and duration-log @var{log}."
                                              width
                                              angularity)
                    Y CENTER)
-                 X LEFT)))
-
+                 X LEFT))
+          (rp-x-extent
+            (interval-widen (ly:stencil-extent rp X) white-padding)))
+    (set! lp (ly:make-stencil (ly:stencil-expr lp)
+                              lp-x-extent
+                              (ly:stencil-extent lp Y)))
+    (set! rp (ly:make-stencil (ly:stencil-expr rp)
+                              rp-x-extent
+                              (ly:stencil-extent rp Y)))
     (list (stencil-whiteout lp)
           (stencil-whiteout rp))))
 
index 84206422dcda99264a9f0f1e416a838f1d4d3ade..ce544ef66b3c4efab15e298b28331ad77f1ddd7a 100644 (file)
@@ -95,6 +95,10 @@ the more angular the shape of the parenthesis."
          (if (< width 0)
              (- width)
              0))
+         ;; X value farthest from baseline on outside  of curve
+         (outer-x (+ base-x width))
+         ;; X extent of bezier sandwich centerline curves
+         (x-extent (ordered-cons base-x outer-x))
         (bottom-y (interval-start y-extent))
         (top-y (interval-end y-extent))
 
@@ -106,7 +110,6 @@ the more angular the shape of the parenthesis."
                             (if (< width 0)
                                 half-thickness
                                 (- half-thickness))))
-        (x-extent (ordered-cons base-x outer-control-x))
 
         ;; Vertical distance between a control point
         ;; and the end point it connects to.
index 14905a85488130f213b44d5f7538b581fc8dd45f..619693c4926389ac5c552f780afe7b75eb0d1ee8 100644 (file)
 #!@PYTHON@
 #-*- coding: utf-8 -*-
 
-## This is web_post.py. This script deals with translations
-## in the "make website" target.
+##### This is web_post.py. This script deals with translations
+##### in the "make website" target.
 
 import sys
 import os
 import glob
+import re
 
-#### Translation data
+###### Translation data
 lang_lookup = {
-  'fr': 'français',
-  'es': 'español',
-  '': 'english'
+    'fr': 'français',
+    'es': 'español',
+    '': 'english'
 }
 
 lang_other_langs = {
-  'es': 'Otros idiomas: ',
-  'fr': 'Autres langues : ',
-  '': 'Other languages: '
+    'es': 'Otros idiomas: ',
+    'fr': 'Autres langues : ',
+    '': 'Other languages: '
 }
 
+exclude_pages = [
+    'music-glossary',
+    'snippets',
+    'internals',
+    'contributor'
+]
 
-#### Actual program
+###### Actual program
 
-#indir, outdir = sys.argv[1:]
-
-# FIXME: looks dangerous!
-indir = sys.argv[1]
-outdir=indir
-
-os.chdir(indir)
+dir = sys.argv[1]
 
+os.chdir(dir)
 html_files = glob.glob( '*.html' )
 
-# messy way to get all languages
+
+### messy way to get all languages
 langs_set = set()
 for file in html_files:
-       file_split = file.split('.')
-       if (len(file_split) == 2):
-               # it's English
-               lang = ''
-       else:
-               # it's a translation
-               lang = file_split[1]
-       # make sure it's a real language
-       if (not (lang == "en")):
-               langs_set.add(lang)
+    file_split = file.split('.')
+    if (len(file_split) == 2):
+        # it's English
+        lang = ''
+    elif (len(file_split) == 3):
+        # it's a translation
+        lang = file_split[1]
+    # make sure it's a translated language
+    if (not (lang == "en")):
+        langs_set.add(lang)
 langs = list(langs_set)
 langs.sort()
 
-def makeFooter(currentLang, currentPage):
-       text = "<p id=\"languages\">\n"
-       text += lang_other_langs[currentLang]
-       for i in range(len(langs)):
-               l = langs[i]
-               if (l == currentLang):
-                       continue
-               text += "<a href=\""
-               text += currentPage
-               if (not (l=="")):
-                       text += "." + l
-               text += ".html\">"
-               text += lang_lookup[l]
-               text += "</a>"
-               if (i < len(langs)-2):
-                       text += ", "
-               else:
-                       text += ".\n"
-       # TODO: add link to automatic language selection?
-       # still need to include this page in the new webpages somewhere
-       text += "</p>\n"
-       return text
-
 
+### helper functions
+def addLangExt(filename, lang, ext):
+    text = filename
+    if (not (lang=="")):
+        text += "." + lang
+    text += "." + ext
+    return text
+
+def makeFooter(filename, currentLang):
+    text = "<p id=\"languages\">\n"
+    text += lang_other_langs[currentLang]
+    for i in range(len(langs)):
+        lang = langs[i]
+        if (lang == currentLang):
+            continue
+        text += "<a href=\""
+       text += addLangExt(filename, lang, "html")
+        text += "\">"
+        text += lang_lookup[lang]
+        text += "</a>"
+        if (i < len(langs)-2):
+            text += ", "
+        else:
+            text += ".\n"
+    # TODO: add link to automatic language selection?
+    # still need to include this page in the new webpages somewhere
+    text += "</p>\n"
+    return text
+
+def getLocalHref(line):
+    match = re.search(r'href=[\'"]?([^\'" >]+)', line)
+    if match:
+        url = match.group(0)[6:]
+        if (url[0:7] == "http://"):
+            url = ''
+        # strip any '#'
+        omit = url.find('#')
+        if (omit >= 0):
+            url = url[0:omit]
+    else:
+        url = ''
+    return url
+
+
+
+
+### main loop
 for file in html_files:
-       file_split = file.split('.')
-       # we want to strip the .html
-       out_filename = os.path.basename(file_split[0])
-       if (len(file_split) == 2):
-               # it's English
-               lang = ''
-               # possibly necessary for automatic language selection
-               file_symlink =file.replace(".html", ".en.html")
-               if (not (os.path.exists(file_symlink))):
-                       os.symlink (file, file_symlink)
-       else:
-               # it's a translation
-               lang = file_split[1]
-       # it's a symlink
-       if (lang == "en"):
-               continue
-       out_filename += '.'+lang
-
-# I can't get the previous name to work
-       out_filename = os.path.basename(file)
-
-       # translation links should point to translations
-       lines = open(file).readlines()
-       # ick
-       os.remove(file)
-
-       # ick
-       lang_footer = makeFooter(lang, out_filename.split('.')[0])
-       
-       outfile = open( out_filename, 'w')
-       for line in lines:
-               # avoid external links
-               if ((line.find("href") >= 0) and (line.find("http")==-1)):
-# eventually we want to do this, but I can't get it to work.
-# waiting for help with apache (?)
-#                      line = line.replace(".html", "."+lang)
-                       text = ""
-                       if (not (lang=="")):
-                               text += "." + lang
-                       text += ".html"
-                       line = line.replace(".html", text)
-               if ((line.find("href") >= 0) and
-                   (line.find("http")==-1) and
-                   (line.find("pdf") >= 0)):
-                       text = ""
-                       if (not (lang=="")):
-                               text += "." + lang
-                       text += ".pdf"
-                       line = line.replace(".pdf", text)
-
-
-               if (line.find("<!-- FOOTER -->") >= 0):
-                       outfile.write( lang_footer )
-               outfile.write(line)
-       outfile.close()
+    ### we want to strip the .html and get the lang
+    file_split = file.split('.')
+    file_base = os.path.basename( file_split[0] )
+    if (len(file_split) == 2):
+        # it's English
+        lang = ''
+        # possibly necessary for automatic language selection
+        file_symlink = file.replace(".html", ".en.html")
+        if (not (os.path.exists(file_symlink))):
+            os.symlink (file, file_symlink)
+    elif (len(file_split) == 3):
+        # it's a translation
+        lang = file_split[1]
+        if (lang == "en"):
+            # it's a symlink
+            continue
+    else:
+        # it's a mess
+        print "is a mess"
+        continue
+
+    ### we need to replace parts of the file
+    lines = open(file).readlines()
+    os.remove(file)
+    outfile = open(file, 'w')
+
+    lang_footer = makeFooter(file_base, lang)
+
+
+    ### alter file
+    for line in lines:
+        ### alter links as appropriate
+        link = getLocalHref(line)
+        if (link != ""):
+            link_base = link.split('.')[0]
+            if (link.endswith(".html")):
+               langlink = addLangExt(link_base, lang, "html")
+                line = line.replace(link, langlink)
+            if (link.endswith(".pdf")):
+               langlink = addLangExt(link_base, lang, "pdf")
+                line = line.replace(link, langlink)
+        ### add language selection footer
+        if (line.find("<!-- FOOTER -->") >= 0):
+            outfile.write( lang_footer )
+        outfile.write(line)
+    outfile.close()