$$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;
\test "" ##[ \breathe #]
\test "" ##[ { c \[ c \] } #] % LigatureEvent
\test "" ##[ \~ #] % PesOrFlexaEvent
+\test "" ##[ { c-\bendAfter #3 } #] % BendAfterEvent
\test "" ##[ \break #]
\test "" ##[ \noBreak #]
+\version "2.12.0"
\header {
texidoc = "Tuplet bracket formatting supports numerous options,
"
}
-
-\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 }
-
}
-
-
todo: handle breaking elegantly.
*/
-
#include "tuplet-bracket.hh"
#include "line-interface.hh"
#include "beam.hh"
return g;
}
-
void
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);
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);
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)
}
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]));
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;
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]);
}
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])));
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;
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));
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);
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
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;
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)
{
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);
{
/*
trigger set_stem_ends
- */
+ */
(void) par_beam->get_property ("quantized-positions");
Drul_array<Grob *> stems (Note_column::get_stem (columns[0]),
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));
}
/*
- 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.
;; 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
(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
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
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))))
(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))
(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.
#!@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()