]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' of carldsorensen@git.sv.gnu.org:/srv/git/lilypond into fret...
authorCarl Sorensen <c_sorensen@byu.edu>
Fri, 9 Jan 2009 04:37:59 +0000 (21:37 -0700)
committerCarl Sorensen <c_sorensen@byu.edu>
Fri, 9 Jan 2009 04:37:59 +0000 (21:37 -0700)
1068 files changed:
Documentation/GNUmakefile
Documentation/SConscript [deleted file]
Documentation/TRANSLATION
Documentation/bibliography/GNUmakefile
Documentation/bibliography/SConscript [deleted file]
Documentation/de/translations.html.in
Documentation/de/user/changing-defaults.itely
Documentation/de/user/cheatsheet.itely
Documentation/de/user/chords.itely
Documentation/de/user/converters.itely
Documentation/de/user/dedication.itely
Documentation/de/user/editorial.itely
Documentation/de/user/expressive.itely
Documentation/de/user/fretted-strings.itely
Documentation/de/user/fundamental.itely
Documentation/de/user/input.itely
Documentation/de/user/install.itely
Documentation/de/user/introduction.itely
Documentation/de/user/keyboards.itely
Documentation/de/user/lilypond-book.itely
Documentation/de/user/lilypond-learning.tely
Documentation/de/user/lilypond-program.tely
Documentation/de/user/lilypond.tely
Documentation/de/user/literature.itely
Documentation/de/user/notation-appendices.itely
Documentation/de/user/notation.itely
Documentation/de/user/percussion.itely
Documentation/de/user/pitches.itely
Documentation/de/user/preface.itely
Documentation/de/user/programming-interface.itely
Documentation/de/user/repeats.itely
Documentation/de/user/rhythms.itely
Documentation/de/user/running.itely
Documentation/de/user/setup.itely
Documentation/de/user/simultaneous.itely
Documentation/de/user/spacing.itely
Documentation/de/user/specialist.itely
Documentation/de/user/staff.itely
Documentation/de/user/templates.itely
Documentation/de/user/text.itely
Documentation/de/user/tutorial.itely
Documentation/de/user/tweaks.itely
Documentation/de/user/unfretted-strings.itely
Documentation/de/user/vocal.itely
Documentation/de/user/wind.itely
Documentation/de/user/working.itely
Documentation/de/user/world.itely
Documentation/es/translations.html.in
Documentation/es/user/editorial.itely
Documentation/es/user/input.itely
Documentation/es/user/lilypond-learning.tely
Documentation/es/user/lilypond-program.tely
Documentation/es/user/lilypond.tely
Documentation/es/user/world.itely
Documentation/fr/translations.html.in
Documentation/fr/user/ancient.itely
Documentation/fr/user/converters.itely
Documentation/fr/user/editorial.itely
Documentation/fr/user/introduction.itely
Documentation/fr/user/lilypond-learning.tely
Documentation/fr/user/lilypond-program.tely
Documentation/fr/user/lilypond.tely
Documentation/fr/user/preface.itely
Documentation/fr/user/setup.itely
Documentation/pictures/GNUmakefile
Documentation/po/fr.po
Documentation/topdocs/NEWS.tely
Documentation/topdocs/SConscript [deleted file]
Documentation/translations.html.in
Documentation/user/SConscript [deleted file]
Documentation/user/editorial.itely
Documentation/user/expressive.itely
Documentation/user/fretted-strings.itely
Documentation/user/fundamental.itely
Documentation/user/input.itely
Documentation/user/install.itely
Documentation/user/lilypond-book.itely
Documentation/user/lilypond-learning.tely
Documentation/user/lilypond-program.tely
Documentation/user/lilypond.tely
Documentation/user/music-glossary.tely
Documentation/user/rhythms.itely
Documentation/user/tweaks.itely
GNUmakefile.in
ROADMAP
SConstruct [deleted file]
THANKS
VERSION
buildscripts/GNUmakefile [deleted file]
buildscripts/SConscript [deleted file]
buildscripts/bib2html.py [deleted file]
buildscripts/build-coverage.sh [deleted file]
buildscripts/build-profile.sh [deleted file]
buildscripts/builder.py [deleted file]
buildscripts/buildlib.py [deleted file]
buildscripts/catmidi.py [deleted file]
buildscripts/check_texi_refs.py [deleted file]
buildscripts/check_translation.py [deleted file]
buildscripts/coverage.py [deleted file]
buildscripts/extract_texi_filenames.py [deleted file]
buildscripts/find-superfluous-includes.py [deleted file]
buildscripts/fixcc.py [deleted file]
buildscripts/gen-emmentaler-scripts.py [deleted file]
buildscripts/genicon.py [deleted file]
buildscripts/git-update-changelog.py [deleted file]
buildscripts/grand-replace.sh [deleted file]
buildscripts/help2man.pl [deleted file]
buildscripts/html-gettext.py [deleted file]
buildscripts/install-info-html.sh [deleted file]
buildscripts/lilypond-words.py [deleted file]
buildscripts/lys-to-tely.py [deleted file]
buildscripts/makelsr.py [deleted file]
buildscripts/manuals_definitions.py [deleted file]
buildscripts/mass-link.py [deleted file]
buildscripts/mf-to-table.py [deleted file]
buildscripts/mf2pt1.pl [deleted file]
buildscripts/mirrortree.py [deleted file]
buildscripts/musicxml_generate_intervals.py [deleted file]
buildscripts/musicxml_generate_keys.py [deleted file]
buildscripts/musicxml_generate_timesignatures.py [deleted file]
buildscripts/mutopia-index.py [deleted file]
buildscripts/output-distance.py [deleted file]
buildscripts/pfx2ttf.fontforge [deleted file]
buildscripts/postprocess_html.py [deleted file]
buildscripts/pytt.py [deleted file]
buildscripts/readlink.py [deleted file]
buildscripts/tely-gettext.py [deleted file]
buildscripts/texi-gettext.py [deleted file]
buildscripts/texi-langutils.py [deleted file]
buildscripts/texi-skeleton-update.py [deleted file]
buildscripts/texi2omf.py [deleted file]
buildscripts/translations-status.py [deleted file]
buildscripts/update-snippets.py [deleted file]
buildscripts/www_post.py [deleted file]
configure.in
elisp/GNUmakefile
elisp/SConscript [deleted file]
elisp/lilypond-mode.el
flower/SConscript [deleted file]
flower/cpu-timer.cc
flower/file-name.cc
flower/file-path.cc
flower/getopt-long.cc
flower/include/arithmetic-operator.hh
flower/include/axis.hh
flower/include/compare.hh
flower/include/cpu-timer.hh
flower/include/direction.hh
flower/include/drul-array.hh
flower/include/file-name.hh
flower/include/file-path.hh
flower/include/flower-proto.hh
flower/include/guile-compatibility.hh
flower/include/international.hh
flower/include/interval.hh
flower/include/interval.tcc
flower/include/libc-extension.hh
flower/include/matrix.hh
flower/include/memory-stream.hh
flower/include/offset.hh
flower/include/parray.hh
flower/include/polynomial.hh
flower/include/pqueue.hh
flower/include/rational.hh
flower/include/real.hh
flower/include/std-string.hh
flower/include/std-vector.hh
flower/include/tuple.hh
flower/include/virtual-methods.hh
flower/include/warn.hh
flower/international.cc
flower/interval.cc
flower/libc-extension.cc
flower/memory-stream.cc
flower/offset.cc
flower/polynomial.cc
flower/rational.cc
flower/std-string.cc
flower/warn.cc
input/SConscript [deleted file]
input/lsr/GNUmakefile
input/lsr/README
input/lsr/SConscript [deleted file]
input/lsr/adding-a-figured-bass-above-or-below-the-notes.ly
input/lsr/adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rythms..ly
input/lsr/adding-drum-parts.ly
input/lsr/adding-fingerings-to-tablatures.ly
input/lsr/adding-parentheses-around-an-expressive-mark-or-chordal-note.ly
input/lsr/adding-the-current-date-to-a-score.ly
input/lsr/adjusting-lyrics-vertical-spacing.ly
input/lsr/ambitus.ly
input/lsr/ancient-fonts.ly
input/lsr/ancient-notation-template----modern-transcription-of-mensural-music.ly
input/lsr/applying-note-head-styles-depending-on-the-step-of-the-scale.ly
input/lsr/automatic-beam-subdivisions.ly
input/lsr/automatic-beams-two-per-two-in-4-4-or-2-2-time-signature.ly
input/lsr/avoiding-collisions-of-chord-fingering-with-beams.ly [deleted file]
input/lsr/avoiding-collisions-with-chord-fingerings.ly [new file with mode: 0644]
input/lsr/changing--flageolet-mark-size.ly
input/lsr/changing-the-tuplet-number.ly
input/lsr/chant-or-psalms-notation.ly
input/lsr/chords.snippet-list
input/lsr/creating-a-delayed-turn.ly
input/lsr/creating-a-sequence-of-notes-on-various-pitches.ly
input/lsr/creating-slurs-across-voices.ly
input/lsr/dodecaphonic-style-accidentals-for-each-note-including-naturals.ly
input/lsr/editorial-annotations.snippet-list
input/lsr/expressive-marks.snippet-list
input/lsr/flat-flags-and-beam-nibs.ly
input/lsr/forcing-rehearsal-marks-to-start-from-a-given-letter-or-number.ly
input/lsr/grouping-beats.ly
input/lsr/guitar-strum-rhythms.ly
input/lsr/incipit.ly
input/lsr/making-an-object-invisible-with-the-transparent-property.ly
input/lsr/manually-controlling-beam-positions.ly
input/lsr/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly
input/lsr/merging-multi-measure-rests-in-a-polyphonic-part.ly
input/lsr/non-traditional-key-signatures.ly
input/lsr/ottava-text.ly
input/lsr/permitting-line-breaks-within-beamed-tuplets.ly
input/lsr/positioning-text-markups-inside-slurs.ly [new file with mode: 0644]
input/lsr/printing-music-with-different-time-signatures.ly
input/lsr/rhythmic-slashes.ly
input/lsr/rhythms.snippet-list
input/lsr/specifying-context-with-beatgrouping.ly
input/lsr/three-sided-box.ly
input/lsr/transposing-pitches-with-minimum-accidentals-smart-transpose.ly
input/lsr/tweaking-clef-properties.ly
input/lsr/tweaks-and-overrides.snippet-list
input/lsr/using-postscript-to-generate-special-note-head-shapes.ly
input/manual/SConscript [deleted file]
input/mutopia/E.Satie/SConscript [deleted file]
input/mutopia/F.Schubert/SConscript [deleted file]
input/mutopia/J.S.Bach/SConscript [deleted file]
input/mutopia/R.Schumann/SConscript [deleted file]
input/mutopia/SConscript [deleted file]
input/mutopia/W.A.Mozart/SConscript [deleted file]
input/new/SConscript [deleted file]
input/new/creating-a-delayed-turn.ly
input/new/dodecaphonic-style-accidentals-for-each-note-including-naturals.ly
input/new/guitar-strum-rhythms.ly
input/new/incipit.ly
input/new/making-an-object-invisible-with-the-transparent-property.ly
input/new/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly
input/new/ottava-text.ly [new file with mode: 0644]
input/new/specifying-context-with-beatgrouping.ly
input/new/transposing-pitches-with-minimum-accidentals-smart-transpose.ly
input/regression/SConscript [deleted file]
input/regression/auto-beam.ly
input/regression/beam-auto.ly
input/texidocs/adding-a-figured-bass-above-or-below-the-notes.texidoc
input/texidocs/adding-drum-parts.texidoc
input/texidocs/adding-fingerings-to-tablatures.texidoc [new file with mode: 0644]
input/texidocs/adding-the-current-date-to-a-score.texidoc
input/texidocs/adjusting-lyrics-vertical-spacing.texidoc
input/texidocs/ancient-fonts.texidoc
input/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc
input/texidocs/avoiding-collisions-of-chord-fingering-with-beams.texidoc
input/texidocs/using-postscript-to-generate-special-note-head-shapes.texidoc [new file with mode: 0644]
lily/SConscript [deleted file]
lily/accidental-engraver.cc
lily/accidental-placement.cc
lily/accidental.cc
lily/align-interface.cc
lily/all-font-metrics-scheme.cc
lily/all-font-metrics.cc
lily/ambitus-engraver.cc
lily/ambitus.cc
lily/apply-context-iterator.cc
lily/arpeggio-engraver.cc
lily/arpeggio.cc
lily/audio-column.cc
lily/audio-element-info.cc
lily/audio-element.cc
lily/audio-item.cc
lily/audio-staff.cc
lily/auto-beam-engraver.cc
lily/auto-change-iterator.cc
lily/axis-group-engraver.cc
lily/axis-group-interface-scheme.cc
lily/axis-group-interface.cc
lily/balloon-engraver.cc
lily/balloon.cc
lily/bar-check-iterator.cc
lily/bar-engraver.cc
lily/bar-line.cc
lily/bar-number-engraver.cc
lily/beam-engraver.cc
lily/beam-performer.cc
lily/beam-quanting.cc
lily/beam.cc
lily/beaming-pattern.cc
lily/bend-engraver.cc
lily/bezier-bow.cc
lily/bezier.cc
lily/book-scheme.cc
lily/book.cc
lily/box.cc
lily/break-align-engraver.cc
lily/break-alignment-interface.cc
lily/break-substitution.cc
lily/breathing-sign-engraver.cc
lily/breathing-sign.cc
lily/change-iterator.cc
lily/chord-name-engraver.cc
lily/chord-name.cc
lily/chord-tremolo-engraver.cc
lily/chord-tremolo-iterator.cc
lily/clef-engraver.cc
lily/clef.cc
lily/cluster-engraver.cc
lily/cluster.cc
lily/coherent-ligature-engraver.cc
lily/collision-engraver.cc
lily/column-x-positions.cc
lily/completion-note-heads-engraver.cc
lily/constrained-breaking.cc
lily/context-def.cc
lily/context-handle.cc
lily/context-property.cc
lily/context-scheme.cc
lily/context-specced-music-iterator.cc
lily/context.cc
lily/custos-engraver.cc
lily/custos.cc
lily/default-bar-line-engraver.cc
lily/dimension-cache.cc
lily/dimensions-scheme.cc
lily/directional-element-interface.cc
lily/dispatcher-scheme.cc
lily/dot-column-engraver.cc
lily/dot-column.cc
lily/dot-configuration.cc
lily/dot-formatting-problem.cc
lily/dots-engraver.cc
lily/dots.cc
lily/drum-note-engraver.cc
lily/drum-note-performer.cc
lily/duration-scheme.cc
lily/duration.cc
lily/dynamic-align-engraver.cc
lily/dynamic-engraver.cc
lily/dynamic-performer.cc
lily/easy-notation.cc
lily/enclosing-bracket.cc
lily/engraver-group.cc
lily/engraver.cc
lily/event-chord-iterator.cc
lily/event-iterator.cc
lily/extender-engraver.cc
lily/figured-bass-continuation.cc
lily/figured-bass-engraver.cc
lily/figured-bass-position-engraver.cc
lily/file-name-map.cc
lily/fingering-engraver.cc
lily/font-config-scheme.cc
lily/font-config.cc
lily/font-interface.cc
lily/font-metric-scheme.cc
lily/font-metric.cc
lily/font-select.cc
lily/font-size-engraver.cc
lily/freetype-error.cc
lily/freetype.cc
lily/function-documentation.cc
lily/general-scheme.cc
lily/glissando-engraver.cc
lily/global-context-scheme.cc
lily/global-context.cc
lily/global-ctor.cc
lily/grace-engraver.cc
lily/grace-iterator.cc
lily/grace-music.cc
lily/grace-spacing-engraver.cc
lily/gregorian-ligature-engraver.cc
lily/gregorian-ligature.cc
lily/grid-line-interface.cc
lily/grid-line-span-engraver.cc
lily/grid-point-engraver.cc
lily/grob-array-scheme.cc
lily/grob-array.cc
lily/grob-info.cc
lily/grob-interface-scheme.cc
lily/grob-interface.cc
lily/grob-pq-engraver.cc
lily/grob-scheme.cc
lily/grob-smob.cc
lily/grob.cc
lily/guile-init.cc
lily/hairpin.cc
lily/hara-kiri-engraver.cc
lily/hara-kiri-group-spanner.cc
lily/horizontal-bracket-engraver.cc
lily/horizontal-bracket.cc
lily/hyphen-engraver.cc
lily/identifier-smob.cc
lily/includable-lexer.cc
lily/include/accidental-interface.hh
lily/include/accidental-placement.hh
lily/include/align-interface.hh
lily/include/all-font-metrics.hh
lily/include/ambitus.hh
lily/include/arpeggio.hh
lily/include/audio-column.hh
lily/include/audio-element-info.hh
lily/include/audio-element.hh
lily/include/audio-item.hh
lily/include/audio-staff.hh
lily/include/axis-group-engraver.hh
lily/include/axis-group-interface.hh
lily/include/bar-line.hh
lily/include/bar.hh
lily/include/beam.hh
lily/include/beaming-pattern.hh
lily/include/bezier.hh
lily/include/book.hh
lily/include/break-align-interface.hh
lily/include/breathing-sign.hh
lily/include/change-iterator.hh
lily/include/chord-name.hh
lily/include/chord-tremolo-iterator.hh
lily/include/clef.hh
lily/include/cluster.hh
lily/include/coherent-ligature-engraver.hh
lily/include/column-x-positions.hh
lily/include/constrained-breaking.hh
lily/include/context-def.hh
lily/include/context-handle.hh
lily/include/context.hh
lily/include/custos.hh
lily/include/dimension-cache.hh
lily/include/directional-element-interface.hh
lily/include/dot-column.hh
lily/include/dot-configuration.hh
lily/include/dots.hh
lily/include/duration.hh
lily/include/engraver-group.hh
lily/include/engraver.hh
lily/include/event-chord-iterator.hh
lily/include/event-iterator.hh
lily/include/file-name-map.hh
lily/include/font-interface.hh
lily/include/font-metric.hh
lily/include/freetype.hh
lily/include/global-context.hh
lily/include/global-ctor.hh
lily/include/grace-fixup.hh
lily/include/grace-iterator.hh
lily/include/gregorian-ligature-engraver.hh
lily/include/gregorian-ligature.hh
lily/include/grid-line-interface.hh
lily/include/grob-array.hh
lily/include/grob-info.hh
lily/include/grob-interface.hh
lily/include/grob.hh
lily/include/group-interface.hh
lily/include/hairpin.hh
lily/include/hara-kiri-group-spanner.hh
lily/include/horizontal-bracket.hh
lily/include/identifier-smob.hh
lily/include/includable-lexer.hh
lily/include/input.hh
lily/include/item.hh
lily/include/keyword.hh
lily/include/least-squares.hh
lily/include/ligature-engraver.hh
lily/include/lily-guile-macros.hh
lily/include/lily-guile.hh
lily/include/lily-lexer.hh
lily/include/lily-parser.hh
lily/include/lily-proto.hh
lily/include/lily-version.hh
lily/include/lilypond-version.hh
lily/include/line-interface.hh
lily/include/lookup.hh
lily/include/ly-module.hh
lily/include/ly-smobs.icc
lily/include/lyric-extender.hh
lily/include/lyric-hyphen.hh
lily/include/main.hh
lily/include/measure-grouping-spanner.hh
lily/include/melody-spanner.hh
lily/include/mensural-ligature.hh
lily/include/midi-chunk.hh
lily/include/midi-item.hh
lily/include/midi-stream.hh
lily/include/midi-walker.hh
lily/include/mingw-compatibility.hh
lily/include/minimal-page-breaking.hh
lily/include/misc.hh
lily/include/modified-font-metric.hh
lily/include/moment.hh
lily/include/multi-measure-rest.hh
lily/include/music-function.hh
lily/include/music-iterator.hh
lily/include/music-output.hh
lily/include/music-sequence.hh
lily/include/music-wrapper-iterator.hh
lily/include/music-wrapper.hh
lily/include/music.hh
lily/include/note-collision.hh
lily/include/note-column.hh
lily/include/note-head.hh
lily/include/note-spacing.hh
lily/include/open-type-font.hh
lily/include/optimal-page-breaking.hh
lily/include/output-def.hh
lily/include/page-breaking.hh
lily/include/page-marker.hh
lily/include/page-spacing-result.hh
lily/include/page-spacing.hh
lily/include/page-turn-page-breaking.hh
lily/include/pango-font.hh
lily/include/paper-book.hh
lily/include/paper-column-engraver.hh
lily/include/paper-column.hh
lily/include/paper-outputter.hh
lily/include/paper-score.hh
lily/include/paper-system.hh
lily/include/parse-scm.hh
lily/include/percent-repeat-item.hh
lily/include/performance.hh
lily/include/performer-group.hh
lily/include/performer.hh
lily/include/pitch-interval.hh
lily/include/pitch.hh
lily/include/pointer-group-interface.hh
lily/include/prob.hh
lily/include/profile.hh
lily/include/program-option.hh
lily/include/property-iterator.hh
lily/include/protected-scm.hh
lily/include/relocate.hh
lily/include/repeated-music.hh
lily/include/rest-collision.hh
lily/include/rest.hh
lily/include/rhythmic-head.hh
lily/include/rod.hh
lily/include/scale.hh
lily/include/scheme-listener.hh
lily/include/scm-hash.hh
lily/include/score-engraver.hh
lily/include/score-performer.hh
lily/include/score.hh
lily/include/script-column.hh
lily/include/script-interface.hh
lily/include/self-alignment-interface.hh
lily/include/semi-tie-column.hh
lily/include/semi-tie.hh
lily/include/separation-item.hh
lily/include/sequential-iterator.hh
lily/include/side-position-interface.hh
lily/include/simple-closure.hh
lily/include/simple-music-iterator.hh
lily/include/simple-spacer.hh
lily/include/simultaneous-music-iterator.hh
lily/include/skyline-pair.hh
lily/include/skyline.hh
lily/include/slur-configuration.hh
lily/include/slur-score-parameters.hh
lily/include/slur-scoring.hh
lily/include/slur.hh
lily/include/smobs.hh
lily/include/source-file.hh
lily/include/sources.hh
lily/include/spaceable-grob.hh
lily/include/spacing-interface.hh
lily/include/spacing-options.hh
lily/include/spacing-spanner.hh
lily/include/span-bar.hh
lily/include/spanner.hh
lily/include/spring.hh
lily/include/staff-spacing.hh
lily/include/staff-symbol-referencer.hh
lily/include/staff-symbol.hh
lily/include/stem-info.hh
lily/include/stem-tremolo.hh
lily/include/stem.hh
lily/include/stencil.hh
lily/include/stream.hh
lily/include/system-start-delimiter.hh
lily/include/system.hh
lily/include/text-interface.hh
lily/include/tie-column-format.hh
lily/include/tie-column.hh
lily/include/tie-configuration.hh
lily/include/tie-details.hh
lily/include/tie-formatting-problem.hh
lily/include/tie-specification.hh
lily/include/tie.hh
lily/include/time-scaled-music-iterator.hh
lily/include/time-signature.hh
lily/include/timing-translator.hh
lily/include/translator-dispatch-list.hh
lily/include/translator-group.hh
lily/include/translator.hh
lily/include/translator.icc
lily/include/tuplet-bracket.hh
lily/include/type-swallow-translator.hh
lily/include/vaticana-ligature.hh
lily/include/volta-bracket.hh
lily/input-scheme.cc
lily/input-smob.cc
lily/input.cc
lily/instrument-name-engraver.cc
lily/instrument-switch-engraver.cc
lily/item-scheme.cc
lily/item.cc
lily/key-engraver.cc
lily/key-performer.cc
lily/key-signature-interface.cc
lily/laissez-vibrer-engraver.cc
lily/least-squares.cc
lily/ledger-line-engraver.cc
lily/ledger-line-spanner.cc
lily/lexer.ll
lily/ligature-bracket-engraver.cc
lily/ligature-engraver.cc
lily/lily-guile.cc
lily/lily-lexer-scheme.cc
lily/lily-lexer.cc
lily/lily-parser-scheme.cc
lily/lily-parser.cc
lily/lily-version.cc
lily/lilypond-version.cc
lily/lilypond.rc.in
lily/line-interface.cc
lily/line-spanner.cc
lily/lookup.cc
lily/ly-module.cc
lily/lyric-combine-music-iterator.cc
lily/lyric-combine-music.cc
lily/lyric-engraver.cc
lily/lyric-extender.cc
lily/lyric-hyphen.cc
lily/lyric-performer.cc
lily/main.cc
lily/mark-engraver.cc
lily/measure-grouping-engraver.cc
lily/measure-grouping-spanner.cc
lily/melody-engraver.cc
lily/melody-spanner.cc
lily/mensural-ligature-engraver.cc
lily/mensural-ligature.cc
lily/metronome-engraver.cc
lily/midi-chunk.cc
lily/midi-item.cc
lily/midi-stream.cc
lily/midi-walker.cc
lily/minimal-page-breaking.cc
lily/misc.cc
lily/modified-font-metric.cc
lily/module-scheme.cc
lily/moment-scheme.cc
lily/moment.cc
lily/multi-measure-rest-engraver.cc
lily/multi-measure-rest.cc
lily/music-function.cc
lily/music-iterator.cc
lily/music-output.cc
lily/music-scheme.cc
lily/music-sequence.cc
lily/music-wrapper-iterator.cc
lily/music-wrapper.cc
lily/music.cc
lily/new-dynamic-engraver.cc
lily/new-fingering-engraver.cc
lily/note-collision.cc
lily/note-column.cc
lily/note-head-line-engraver.cc
lily/note-head-scheme.cc
lily/note-head.cc
lily/note-heads-engraver.cc
lily/note-name-engraver.cc
lily/note-performer.cc
lily/note-spacing-engraver.cc
lily/note-spacing.cc
lily/open-type-font-scheme.cc
lily/open-type-font.cc
lily/optimal-page-breaking.cc
lily/ottava-bracket.cc
lily/ottava-engraver.cc
lily/output-def-scheme.cc
lily/output-def.cc
lily/output-property-engraver.cc
lily/page-breaking-scheme.cc
lily/page-breaking.cc
lily/page-marker-scheme.cc
lily/page-marker.cc
lily/page-spacing-result.cc
lily/page-spacing.cc
lily/page-turn-engraver.cc
lily/page-turn-page-breaking.cc
lily/pango-font-scheme.cc
lily/pango-font.cc
lily/pango-select-scheme.cc
lily/pango-select.cc
lily/paper-book-scheme.cc
lily/paper-book.cc
lily/paper-column-engraver.cc
lily/paper-column.cc
lily/paper-def.cc
lily/paper-outputter-scheme.cc
lily/paper-outputter.cc
lily/paper-score-scheme.cc
lily/paper-score.cc
lily/paper-system-scheme.cc
lily/paper-system.cc
lily/parenthesis-engraver.cc
lily/parse-scm.cc
lily/parser.yy
lily/part-combine-engraver.cc
lily/part-combine-iterator.cc
lily/percent-repeat-engraver.cc
lily/percent-repeat-item.cc
lily/percent-repeat-iterator.cc
lily/performance-scheme.cc
lily/performance.cc
lily/performer-group.cc
lily/performer.cc
lily/pfb.cc
lily/phrasing-slur-engraver.cc
lily/piano-pedal-align-engraver.cc
lily/piano-pedal-bracket.cc
lily/piano-pedal-engraver.cc
lily/piano-pedal-performer.cc
lily/pitch-interval.cc
lily/pitch-scheme.cc
lily/pitch-squash-engraver.cc
lily/pitch.cc
lily/pitched-trill-engraver.cc
lily/pointer-group-interface.cc
lily/prob-scheme.cc
lily/prob.cc
lily/profile.cc
lily/program-option-scheme.cc
lily/program-option.cc
lily/property-iterator.cc
lily/protected-scm.cc
lily/quote-iterator.cc
lily/relative-octave-check.cc
lily/relative-octave-music.cc
lily/relocate.cc
lily/repeat-acknowledge-engraver.cc
lily/repeat-tie-engraver.cc
lily/repeated-music.cc
lily/rest-collision-engraver.cc
lily/rest-collision.cc
lily/rest-engraver.cc
lily/rest.cc
lily/rhythmic-column-engraver.cc
lily/rhythmic-head.cc
lily/rod.cc
lily/scale.cc
lily/scheme-listener-scheme.cc
lily/scheme-listener.cc
lily/scm-hash.cc
lily/score-engraver.cc
lily/score-performer.cc
lily/score-scheme.cc
lily/score.cc
lily/script-column-engraver.cc
lily/script-column.cc
lily/script-engraver.cc
lily/script-interface.cc
lily/script-row-engraver.cc
lily/self-aligment-interface.cc
lily/semi-tie-column.cc
lily/semi-tie.cc
lily/separating-line-group-engraver.cc
lily/separation-item.cc
lily/sequential-iterator.cc
lily/side-position-interface.cc
lily/simple-closure.cc
lily/simple-music-iterator.cc
lily/simple-spacer-scheme.cc
lily/simple-spacer.cc
lily/simultaneous-music-iterator.cc
lily/skyline-pair.cc
lily/skyline.cc
lily/slash-repeat-engraver.cc
lily/slur-configuration.cc
lily/slur-engraver.cc
lily/slur-performer.cc
lily/slur-score-parameters.cc
lily/slur-scoring.cc
lily/slur.cc
lily/smobs.cc
lily/source-file.cc
lily/sources.cc
lily/spaceable-grob.cc
lily/spacing-basic.cc
lily/spacing-determine-loose-columns.cc
lily/spacing-engraver.cc
lily/spacing-interface.cc
lily/spacing-loose-columns.cc
lily/spacing-options.cc
lily/spacing-spanner.cc
lily/span-arpeggio-engraver.cc
lily/span-bar-engraver.cc
lily/span-bar.cc
lily/spanner-break-forbid-engraver.cc
lily/spanner-scheme.cc
lily/spanner.cc
lily/spring-smob.cc
lily/spring.cc
lily/staff-collecting-engraver.cc
lily/staff-performer.cc
lily/staff-spacing.cc
lily/staff-symbol-engraver.cc
lily/staff-symbol-referencer-scheme.cc
lily/staff-symbol-referencer.cc
lily/staff-symbol.cc
lily/stanza-number-align-engraver.cc
lily/stanza-number-engraver.cc
lily/stem-engraver.cc
lily/stem-tremolo.cc
lily/stem.cc
lily/stencil-expression.cc
lily/stencil-interpret.cc
lily/stencil-scheme.cc
lily/stencil.cc
lily/stream-event-scheme.cc
lily/string-number-engraver.cc
lily/sustain-pedal.cc
lily/swallow-engraver.cc
lily/swallow-perf.cc
lily/system-scheme.cc
lily/system-start-delimiter-engraver.cc
lily/system-start-delimiter.cc
lily/system-start-text.cc
lily/system.cc
lily/tab-harmonic-engraver.cc
lily/tab-note-heads-engraver.cc
lily/tab-staff-symbol-engraver.cc
lily/template5.cc
lily/tempo-performer.cc
lily/text-engraver.cc
lily/text-interface.cc
lily/text-spanner-engraver.cc
lily/tie-column.cc
lily/tie-configuration.cc
lily/tie-details.cc
lily/tie-engraver.cc
lily/tie-formatting-problem.cc
lily/tie-performer.cc
lily/tie.cc
lily/time-scaled-music-iterator.cc
lily/time-signature-engraver.cc
lily/time-signature-performer.cc
lily/time-signature.cc
lily/timing-translator.cc
lily/translator-ctors.cc
lily/translator-dispatch-list.cc
lily/translator-group-ctors.cc
lily/translator-group.cc
lily/translator-scheme.cc
lily/translator.cc
lily/trill-spanner-engraver.cc
lily/ttf.cc
lily/tuplet-bracket.cc
lily/tuplet-engraver.cc
lily/tuplet-number.cc
lily/tweak-engraver.cc
lily/type-swallow-translator.cc
lily/unfolded-repeat-iterator.cc
lily/vaticana-ligature-engraver.cc
lily/vaticana-ligature.cc
lily/vertical-align-engraver.cc
lily/vertically-spaced-context-engraver.cc
lily/volta-bracket.cc
lily/volta-engraver.cc
lily/volta-repeat-iterator.cc
ly/SConscript [deleted file]
ly/engraver-init.ly
ly/predefined-fretboards-init.ly
ly/predefined-guitar-fretboards.ly
ly/predefined-guitar-ninth-fretboards.ly
make/doc-i18n-root-targets.make
make/doc-i18n-user-rules.make
make/doc-i18n-user-targets.make
make/generic-vars.make
make/lilypond-vars.make
make/lysdoc-rules.make
make/substitute.make
mf/GNUmakefile
mf/SConscript [deleted file]
mf/feta-accordion.mf
mf/feta-arrow.mf
mf/feta-autometric.mf
mf/feta-banier.mf
mf/feta-beugel.mf
mf/feta-bolletjes.mf
mf/feta-braces-a.mf
mf/feta-braces-b.mf
mf/feta-braces-c.mf
mf/feta-braces-d.mf
mf/feta-braces-e.mf
mf/feta-braces-f.mf
mf/feta-braces-g.mf
mf/feta-braces-h.mf
mf/feta-braces-i.mf
mf/feta-din-code.mf
mf/feta-eindelijk.mf
mf/feta-generic.mf
mf/feta-haak.mf
mf/feta-klef.mf
mf/feta-macros.mf
mf/feta-nummer-code.mf
mf/feta-params.mf
mf/feta-pendaal.mf
mf/feta-puntje.mf
mf/feta-schrift.mf
mf/feta-slag.mf
mf/feta-timesig.mf
mf/feta-toevallig.mf
mf/parmesan-accidentals.mf
mf/parmesan-clefs.mf
mf/parmesan-custodes.mf
mf/parmesan-dots.mf
mf/parmesan-flags.mf
mf/parmesan-generic.mf
mf/parmesan-heads.mf
mf/parmesan-macros.mf
mf/parmesan-rests.mf
mf/parmesan-scripts.mf
mf/parmesan-timesig.mf
po/SConscript [deleted file]
po/TODO
po/de.po
po/es.po
po/fr.po
po/lilypond.pot
po/uk.po
po/vi.po
ps/SConscript [deleted file]
python/GNUmakefile
python/SConscript [deleted file]
python/auxiliar/GNUmakefile [new file with mode: 0644]
python/auxiliar/buildlib.py [new file with mode: 0644]
python/auxiliar/manuals_definitions.py [new file with mode: 0644]
python/auxiliar/mirrortree.py [new file with mode: 0644]
python/auxiliar/postprocess_html.py [new file with mode: 0644]
python/convertrules.py
python/lilylib.py
python/midi.c
scm/SConscript [deleted file]
scm/auto-beam.scm
scm/backend-library.scm
scm/c++.scm
scm/chord-entry.scm
scm/chord-generic-names.scm
scm/chord-ignatzek-names.scm
scm/chord-name.scm
scm/define-context-properties.scm
scm/define-grob-interfaces.scm
scm/define-grob-properties.scm
scm/define-grobs.scm
scm/define-markup-commands.scm
scm/define-music-display-methods.scm
scm/define-music-properties.scm
scm/define-music-types.scm
scm/define-stencil-commands.scm
scm/display-lily.scm
scm/document-backend.scm
scm/document-functions.scm
scm/document-markup.scm
scm/document-music.scm
scm/document-translation.scm
scm/documentation-generate.scm
scm/documentation-lib.scm
scm/editor.scm
scm/encoding.scm
scm/file-cache.scm
scm/font.scm
scm/framework-eps.scm
scm/framework-ps.scm
scm/framework-svg.scm
scm/fret-diagrams.scm
scm/graphviz.scm
scm/harp-pedals.scm
scm/kpathsea.scm
scm/layout-beam.scm
scm/layout-page-layout.scm
scm/layout-slur.scm
scm/lily-library.scm
scm/lily.scm
scm/markup.scm
scm/midi.scm
scm/music-functions.scm
scm/output-lib.scm
scm/output-ps.scm
scm/output-svg.scm
scm/paper.scm
scm/parser-clef.scm
scm/parser-ly-from-scheme.scm
scm/part-combiner.scm
scm/predefined-fretboards.scm
scm/ps-to-png.scm
scm/safe-lily.scm
scm/script.scm
scm/standalone.scm
scm/stencil.scm
scm/titling.scm
scm/to-xml.scm
scm/translation-functions.scm
scm/x11-color.scm
scripts/GNUmakefile
scripts/SConscript [deleted file]
scripts/auxiliar/GNUmakefile [new file with mode: 0644]
scripts/auxiliar/build-coverage.sh [new file with mode: 0755]
scripts/auxiliar/build-profile.sh [new file with mode: 0755]
scripts/auxiliar/check_texi_refs.py [new file with mode: 0755]
scripts/auxiliar/check_translation.py [new file with mode: 0755]
scripts/auxiliar/coverage.py [new file with mode: 0755]
scripts/auxiliar/find-superfluous-includes.py [new file with mode: 0755]
scripts/auxiliar/fixcc.py [new file with mode: 0755]
scripts/auxiliar/makelsr.py [new file with mode: 0755]
scripts/auxiliar/musicxml_generate_intervals.py [new file with mode: 0755]
scripts/auxiliar/musicxml_generate_keys.py [new file with mode: 0755]
scripts/auxiliar/musicxml_generate_timesignatures.py [new file with mode: 0755]
scripts/auxiliar/pfx2ttf.fontforge [new file with mode: 0644]
scripts/auxiliar/readlink.py [new file with mode: 0755]
scripts/auxiliar/tely-gettext.py [new file with mode: 0755]
scripts/auxiliar/texi-langutils.py [new file with mode: 0755]
scripts/auxiliar/texi-skeleton-update.py [new file with mode: 0755]
scripts/auxiliar/translations-status.py [new file with mode: 0755]
scripts/auxiliar/update-snippets.py [new file with mode: 0755]
scripts/build/GNUmakefile [new file with mode: 0644]
scripts/build/bib2html.py [new file with mode: 0644]
scripts/build/catmidi.py [new file with mode: 0644]
scripts/build/extract_texi_filenames.py [new file with mode: 0644]
scripts/build/gen-emmentaler-scripts.py [new file with mode: 0644]
scripts/build/genicon.py [new file with mode: 0644]
scripts/build/grand-replace.py [new file with mode: 0644]
scripts/build/help2man.pl [new file with mode: 0644]
scripts/build/html-gettext.py [new file with mode: 0644]
scripts/build/install-info-html.sh [new file with mode: 0644]
scripts/build/lilypond-words.py [new file with mode: 0644]
scripts/build/lys-to-tely.py [new file with mode: 0644]
scripts/build/mass-link.py [new file with mode: 0644]
scripts/build/mf-to-table.py [new file with mode: 0644]
scripts/build/mf2pt1.pl [new file with mode: 0644]
scripts/build/mutopia-index.py [new file with mode: 0644]
scripts/build/output-distance.py [new file with mode: 0644]
scripts/build/pytt.py [new file with mode: 0755]
scripts/build/texi-gettext.py [new file with mode: 0644]
scripts/build/texi2omf.py [new file with mode: 0644]
scripts/build/www_post.py [new file with mode: 0644]
scripts/convert-ly.py
scripts/etf2ly.py
scripts/lilymidi.py
scripts/lilypond-book.py
scripts/lilypond-invoke-editor.scm
scripts/lilysong.py
scripts/midi2ly.py
scripts/musicxml2ly.py
stepmake/stepmake/help2man-rules.make
stepmake/stepmake/metafont-rules.make
stepmake/stepmake/metapost-rules.make [deleted file]
stepmake/stepmake/metapost-targets.make [deleted file]
stepmake/stepmake/metapost-vars.make [deleted file]
stepmake/stepmake/texinfo-rules.make
stepmake/stepmake/texinfo-vars.make
tex/GNUmakefile
tex/SConscript [deleted file]
vim/GNUmakefile
vim/SConscript [deleted file]

index 2f99e82fd77c0ac53a88e1a3a1c00a818ddce9d8..790b0460479ce4a976d511a7a1d91228fc4ce460 100644 (file)
@@ -36,12 +36,19 @@ $(OUT_HTML_FILES): $(OUT_CSS_FILES)
 $(outdir)/%.css: %.css
        ln -f $< $@
 
+
+### Translations maintenance targets
+
 po-update:
        make -C po po-update
 
 all-translations-update: po-update translation-status
        $(foreach lang, $(LANGS), make ISOLANG=$(lang) skeleton-update snippet-update &&) true
 
+ifneq ($(NO_COLOR),)
+CHECK_TRANSLATION_FLAGS = --no-color
+endif
+
 ifneq ($(ISOLANG),)
 new-lang:
        @if (( $$(file -b $(ISOLANG)) == directory )) 2>/dev/null; \
@@ -52,7 +59,7 @@ new-lang:
        cp fr/GNUmakefile $(ISOLANG)
        cp fr/user/GNUmakefile $(ISOLANG)/user
        sed -i -e 's/ISOLANG *= *fr/ISOLANG = $(ISOLANG)/' $(ISOLANG)/GNUmakefile $(ISOLANG)/user/GNUmakefile
-       $(PYTHON) $(buildscript-dir)/texi-langutils.py -d $(outdir) -l $(ISOLANG) -o doc.pot --skeleton --gettext ../user/lilypond-learning.tely
+       $(auxscript-dir)/texi-langutils.py -d $(outdir) -l $(ISOLANG) -o doc.pot --skeleton --gettext ../user/lilypond-learning.tely
        mv $(outdir)/*.*tely $(ISOLANG)/user
        msgmerge -U po/lilypond-doc.pot $(outdir)/doc.pot
        cp po/lilypond-doc.pot po/$(ISOLANG).po
@@ -60,17 +67,13 @@ new-lang:
 
 CHECKED_FILES = $(ISOLANG)/index.html.in $(shell find $(ISOLANG)/user/ -maxdepth 1 -name '*.*te??')
 
-ifneq ($(NO_COLOR),)
-CHECK_TRANSLATION_FLAGS = --no-color
-endif
-
 TELY_FILES = $(call src-wildcard,$(ISOLANG)/user/*.tely)
 skeleton-update:
-       $(PYTHON) $(buildscript-dir)/texi-langutils.py -d $(outdir) -l $(ISOLANG) --skeleton $(TELY_FILES:$(ISOLANG)/user/%.tely=../user/%.tely)
-       $(PYTHON) $(buildscript-dir)/texi-skeleton-update.py $(ISOLANG)/user $(outdir)
+       $(auxscript-dir)/texi-langutils.py -d $(outdir) -l $(ISOLANG) --skeleton $(TELY_FILES:$(ISOLANG)/user/%.tely=../user/%.tely)
+       $(auxscript-dir)/texi-skeleton-update.py $(ISOLANG)/user $(outdir)
 
 snippet-update:
-       $(PYTHON) $(buildscript-dir)/update-snippets.py user $(ISOLANG)/user '*.itely'
+       $(auxscript-dir)/update-snippets.py user $(ISOLANG)/user '*.itely'
 
 DOCUMENTS_INCLUDES:=-I $(ISOLANG)/user \
 -I $(top-build-dir)/Documentation/$(ISOLANG)/user/out-www \
@@ -88,22 +91,22 @@ DOCUMENTS_INCLUDES:=-I user \
 endif # ISOLANG
 
 check-xrefs:
-       $(PYTHON) $(buildscript-dir)/check_texi_refs.py --batch \
-       $(DOCUMENTS_INCLUDES) $(buildscript-dir)/manuals_definitions.py
+       $(auxscript-dir)/check_texi_refs.py --batch \
+       $(DOCUMENTS_INCLUDES) $(auxpython-dir)/manuals_definitions.py
 
 fix-xrefs:
-       $(PYTHON) $(buildscript-dir)/check_texi_refs.py --auto-fix \
-       $(DOCUMENTS_INCLUDES) $(buildscript-dir)/manuals_definitions.py
+       $(auxscript-dir)/check_texi_refs.py --auto-fix \
+       $(DOCUMENTS_INCLUDES) $(auxpython-dir)/manuals_definitions.py
 
 check-translation:
-       $(PYTHON) $(buildscript-dir)/check_translation.py $(CHECK_TRANSLATION_FLAGS) $(CHECKED_FILES)
+       $(auxscript-dir)/check_translation.py $(CHECK_TRANSLATION_FLAGS) $(CHECKED_FILES)
 
 update-translation:
-       $(PYTHON) $(buildscript-dir)/check_translation.py --update $(CHECK_TRANSLATION_FLAGS) $(CHECKED_FILES)
+       $(auxscript-dir)/check_translation.py --update $(CHECK_TRANSLATION_FLAGS) $(CHECKED_FILES)
 
 translation-status:
        make -C po out=www messages
-       $(PYTHON) $(buildscript-dir)/translations-status.py
+       $(auxscript-dir)/translations-status.py
 
 local-help: extra-local-help
 
diff --git a/Documentation/SConscript b/Documentation/SConscript
deleted file mode 100644 (file)
index 5813e91..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*-python-*-
-
-Import ('env')
-env.AT_COPY ('index.html.in')
-
index a5119569ae0757b11c2ec854034f72984c2815e0..82798c5d45106c3436d46e8ef32b3522d0995dfa 100644 (file)
@@ -93,7 +93,7 @@ Cd into Documentation and run:
 where <MY-LANGUAGE> is the ISO 639 language code.
 
 Add a language definition for your language in
-buildscripts/langdefs.py.
+python/langdefs.py.
 
 See next section about what files to translate and the following
 detailed instructions after the next section.
@@ -128,27 +128,27 @@ Word counts (excluding lilypond snippets) are given for each file.
 411   user/preface.itely
 3855  user/introduction.itely
 407   user/lilypond-program.tely
-1930  user/install.itely (partial translation)
+1928  user/install.itely (partial translation)
 1149  user/setup.itely
 2827  user/running.itely
-10579 total
+10577 total
 
 -3- Learning manual
 10318 user/fundamental.itely -- Fundamental concepts
-14647 user/tweaks.itely -- Tweaking output
+14775 user/tweaks.itely -- Tweaking output
 3007  user/working.itely -- Working on LilyPond files
 483   user/templates.itely -- Templates
-28455 total
+28583 total
 
 -4- Notation reference
 695   user/lilypond.tely
 91    user/notation.itely -- Musical notation
 3123  user/pitches.itely
-5013  user/rhythms.itely
+5236  user/rhythms.itely
 1146  user/expressive.itely
 555   user/repeats.itely
 1455  user/simultaneous.itely
-1635  user/staff.itely
+1701  user/staff.itely
 895   user/editorial.itely
 2286  user/text.itely
 76    user/specialist.itely -- Specialist notation
@@ -160,14 +160,14 @@ Word counts (excluding lilypond snippets) are given for each file.
 66    user/strings.itely
 242   user/bagpipes.itely
 4487  user/ancient.itely
-5805  user/input.itely -- Input syntax
+5873  user/input.itely -- Input syntax
 2164  user/non-music.itely -- Non-musical notation
 8451  user/spacing.itely -- Spacing issues
 11391 user/changing-defaults.itely -- Changing defaults
 5202  user/programming-interface.itely -- Interfaces for programmers
 1190  user/notation-appendices.itely -- Notation manual tables
 250   user/cheatsheet.itely -- Cheat sheet
-62690 total
+63047 total
 
 -5- Application usage
 3248  user/lilypond-book.itely -- LilyPond-book
@@ -670,25 +670,38 @@ which works regardless of the branch checked out.
 TECHNICAL BACKGROUND
 
 A number of Python scripts handle a part of the documentation
-translation process.  All are located in buildscripts/, except
-langdefs.py which is in python/
+translation process.
+All scripts used to maintain the translations
+are located in scripts/auxiliar/:
 
-* buildlib.py -- module containing common functions (read piped output
-of a shell command, use Git)
-* langdefs.py  -- language definitions module
 * check_translation.py  -- show diff to update a translation
 * texi-langutils.py  -- quickly and dirtily parse Texinfo files to
 make message catalogs and Texinfo skeleton files
 * texi-skeleton-update.py -- update Texinfo skeleton files
+* update-snippets.py -- synchronize ly snippets with those from
+English docs
+* translations-status.py -- update translations status pages and word
+counts in the file you are reading.
+* tely-gettext.py -- gettext node names, section titles and references
+in the sources; WARNING only use this script when support for
+"makeinfo --html" has been dropped.
+
+Other scripts are used in the build process, in scripts/build/:
 * html-gettext.py -- translate node names, section titles and cross
 references in HTML files generated by makeinfo
-* add_html_footer.py (module imported by www_post.py) -- add footer and
-tweak links in HTML pages
 * texi-gettext.py -- gettext node names, section titles and references
 before calling texi2pdf
 * mass-link.py -- link or symlink files between English documentation
 and documentation in other languages
-* update-snippets.py -- synchronize ly snippets with those from
-English docs
-* translations-status.py -- update translations status pages and word
-counts in the file you are reading.
+
+Python modules used by scripts in scripts/auxiliar/ or scripts/build/ (but
+not by installed Python scripts) are located in python/auxiliar/:
+* manuals_definitions.py -- define manual names and name of
+cross-reference Texinfo macros
+* buildlib.py -- common functions (read piped output
+of a shell command, use Git)
+* postprocess_html.py (module imported by www_post.py) -- add footer and
+tweak links in HTML pages
+
+And finally
+* python/langdefs.py  -- language definitions module
index 89eb2d0bcbdde74bedc256b49a832e3edb5bbebd..798dad58a65c482e0aaede203dc9cc78dacccd79 100644 (file)
@@ -27,7 +27,7 @@ $(outdir)/%.bib: %.bib
        ln -f $< $@
 
 $(outdir)/%.html: %.bib
-       BSTINPUTS=$(src-dir) $(PYTHON) $(buildscript-dir)/bib2html.py -o $@ $<
+       BSTINPUTS=$(src-dir) $(buildscript-dir)/bib2html -o $@ $<
 
 local-clean:
        rm -f fonts.aux fonts.log feta*.tfm feta*.*pk
diff --git a/Documentation/bibliography/SConscript b/Documentation/bibliography/SConscript
deleted file mode 100644 (file)
index 538cfbd..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'src_glob')
-bib = src_glob ('*.bib')
-env.AT_COPY ('index.html.in')
-
-# todo: must make html-long.bst as source too.
-#  make as source?
-
-map (env.BIB2HTML, bib)
-env.Alias ('doc', bib)
-
index b5abe693f82ac507efa52e8a36422e78776c60e8..4ca8d9499ba503e42a8ab2e5831110589f7e5920 100644 (file)
@@ -1,4 +1,4 @@
-·<p><i>Zuletzt aktualisiert am·Sun Dec 28 01:18:10 UTC 2008
+·<p><i>Zuletzt aktualisiert am·Mon Jan  5 10:30:39 UTC 2009
 </i></p>
 <html>
 <!-- This page is automatically generated by translation-status.py from
@@ -100,7 +100,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>vor-GDP</td>
  </tr>
  <tr align="left">
-  <td>4 Die Ausgabe verändern<br>(14647)</td>
+  <td>4 Die Ausgabe verändern<br>(14775)</td>
   <td>Till Rettig</td>
   <td></td>
   <td><span style="background-color: #1fff1f">ja</span></td>
@@ -151,7 +151,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>vor-GDP</td>
  </tr>
  <tr align="left">
-  <td>1 Installieren<br>(1930)</td>
+  <td>1 Installieren<br>(1928)</td>
   <td>Till Rettig<br>
    Reinhold Kainhofer</td>
   <td></td>
@@ -229,11 +229,11 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>vor-GDP</td>
  </tr>
  <tr align="left">
-  <td>1.2 Rhythmus<br>(5013)</td>
+  <td>1.2 Rhythmus<br>(5236)</td>
   <td>Till Rettig</td>
   <td></td>
   <td><span style="background-color: #1fff1f">ja</span></td>
-  <td><span style="background-color: #1fff1f">ja</span></td>
+  <td><span style="background-color: #47ff24">teilweise</span></td>
   <td>vor-GDP</td>
  </tr>
  <tr align="left">
@@ -261,7 +261,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>vor-GDP</td>
  </tr>
  <tr align="left">
-  <td>1.6 Notation auf Systemen<br>(1635)</td>
+  <td>1.6 Notation auf Systemen<br>(1701)</td>
   <td>Till Rettig</td>
   <td></td>
   <td><span style="background-color: #1fff1f">ja</span></td>
@@ -365,7 +365,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>vor-GDP</td>
  </tr>
  <tr align="left">
-  <td>3 Allgemeine Eingabe und Ausgabe<br>(5805)</td>
+  <td>3 Allgemeine Eingabe und Ausgabe<br>(5873)</td>
   <td>Till Rettig</td>
   <td></td>
   <td><span style="background-color: #1fff1f">ja</span></td>
index 49a1315f7038b39d371126044ec99bee91e5e42a..4313e125eddda1ddb8578143f97caa3f995e1901 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 8405b88e6c1aac6c44e6064dd7b8b1674d6e7abd
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 0e16382a3cf4b7a7c369a2387021f5425b9b6a98..d6f085706862525229fc14e0baf1ef3184bc7083 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 3b206bb7a4d11038e09068f6b0e00380c4b65112..0d4044480d3341f0a7559ec856d53ad6c52948ca 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 412a857026b034d071a18ba170a657b1b3842bf4..6dc9f62837220a4b084a74e784add81061d1553d 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index ce1f095de1d0ce825c7a3872a54db4c9b3b4491b..9028181cd3f5c03d1f1424c070e575c6876be125 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 3a8542af9f54c99b53374328af0d5d87005ca49e
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 70ab0a586a5f1232e8b4e7753d7230fb4eca933f..dbc2f1914a733454e8b7f2156e32bca2bad54878 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 4770e4e71ebff6104cad46bd2d889c3ff6ba3875
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -196,7 +196,7 @@ Fingersatzanweisungen können manuell oberhalb des Systems gesetzt werden, siehe
 {allowing-fingerings-to-be-printed-inside-the-staff.ly}
 
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
-{avoiding-collisions-of-chord-fingering-with-beams.ly}
+{avoiding-collisions-with-chord-fingerings.ly}
 
 @seealso
 Notationsreferenz:
index d23147517c4967bfa7eeb40de6836a8621798d21..4b57cd57c9243e644222b7ed6c7903bbd838b894 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -121,6 +121,9 @@ definiert.  Artikulationszeichen und Onrnamente können manuell
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
 {controlling-the-vertical-ordering-of-scripts.ly}
 
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{creating-a-delayed-turn.ly}
+
 
 @seealso
 Glossar:
@@ -588,6 +591,9 @@ g4( e c2)
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
 {using-double-slurs-for-legato-chords.ly}
 
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{positioning-text-markups-inside-slurs.ly}
+
 
 @seealso
 Glossar:
index 7e5f6b464bb60eb994716e6abc177d97a4b81dd0..7fd0f77691f572f3de40838d380f10fd8c9ccfac 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -69,6 +69,9 @@ Bögen zwischen Arpeggios und Tremolos sind beschrieben in
 @item Hinweise, wie mehrere Stimmen gesetzt werden können, finden sich in
 @ref{Collision resolution}.
 
+@item Instructions for indicating harmonics can be found in
+@ref{Harmonics}.
+
 @end itemize
 
 
index dd15fc0bdf6fd41ccaeb7b5d3f4114924395cd60..8037890ee4d07e921d768f9b4ba5890d2ba0a075 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond-learning.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 179e4623cb53d583f88fcd394404bb73e6a47c2a..15c0dc43a7811d57e891dd27ec2cbf782c60c8a0 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -915,7 +915,14 @@ Dateien, die eingebunden werden sollen, können selber auch wiederum
 ein @code{\include} enthalten.  Diese Einbindung zweiter Ebene
 werden erst interpretiert, wenn sie sich in der Hauptdatei befinden,
 sodass die Pfadangaben hier nicht relativ zur eingebundenen Datei,
-sondern relativ zur Hauptdatei gesetzt werden müssen.
+sondern relativ zur Hauptdatei gesetzt werden müssen.  Dieses Verhalten
+kann jedoch auch verändert werden, indem man lilypond die Option
+@code{-drelative-includes} auf der Kommandozeile zuweist (oder indem
+man den Befehl @code{#(ly:set-option 'relative-includes #t)} an den
+Beginn der Quelldatei schreibt).  Mit @code{relative-includes} wird
+der Pfad jedes @code{\include}-Befehls als relativ zu der Datei angenommen,
+in der sich der Befehl befindet.  Dieses Verhalten wird empfohlen und wird
+in zukünftigen Versionen von LilyPond den Standard darstellen.
 
 Dateien können auch aus einem Verzeichnis eingebunden werden,
 dass im Suchpfad von LilyPond liegt.  Hierzu muss auf der
@@ -1314,7 +1321,7 @@ im Gesangstext und als normaler Text außerhalb der Partitur.
   }
   \addlyrics { O \markup { \concat{ Ph \char ##x0153 be! } } }
 }
-\markup { "Copyright 2008" \char ##x00A9 }
+\markup { "Copyright 2008--2009" \char ##x00A9 }
 @end lilypond
 
 Um das Copyright-Zeichen zu notieren, kann folgender Code eingesetzt werden:
index 9e89826b302c902ba17cd36fb98fd86ebe6dd62f..5ddf37b49981597da81c553d85f8983f5edac55a 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index eddb09755aa30a5189f6cba6b5c29a09c108ef61..69d5f5862398af3d1a468d7c1b4800e4d593a15a 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 4770e4e71ebff6104cad46bd2d889c3ff6ba3875
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index d470b87bffb709d90afe63c9188a3246c47d5255..c8c268241a8709df867ba77c477a69cf2ceafc45 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index e0e08202093ef22038ec63e903d2c7637bfffb5d..9b950b801ff85c22fb6e8d1de5193066cd787029 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 4770e4e71ebff6104cad46bd2d889c3ff6ba3875
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -270,7 +270,7 @@ Befehls angeben kann.
 Jedes Musikbeispiele ruft die folgenden Makros auf, wenn sie vom Benutzer
 definiert wurden:
 
-@itemize
+@itemize @bullet
 @item @code{\preLilyPondExample} -- wird vor der Musik aufgerufen,
 
 @item @code{\postLilyPondExample} -- wird nach der Musik aufgerufen,
index 6515c58de0bb4f1002c37490d39a902dfdfec8dd..794e3beeeb2a0270ae3030174757db91f9926ce8 100644 (file)
@@ -60,7 +60,7 @@ verfügbar.
 @author Das LilyPond-Entwicklerteam
 
 
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -94,7 +94,7 @@ Für LilyPond Version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -126,7 +126,7 @@ Free Documentation License''.
 @ifnottex
 Diese Datei dokumentiert die Erlernung des Programmes GNU LilyPond.
 
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
index 763930cb5ed3c2285b1976d705b6ba019c6e3a10..7284c65f784d6f422c3ccd1d9fd9f4daa8805f13 100644 (file)
@@ -60,7 +60,7 @@ verfügbar.
 @author Das LilyPond-Entwicklerteam
 
 
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -95,7 +95,7 @@ Für LilyPond Version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -128,7 +128,7 @@ Free Documentation License''.
 @ifnottex
 Diese Datei dokumentiert die Programmbenutzung von GNU LilyPond.
 
-Copyright 1999--2008 bei den Autoren
+Copyright 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
index bbeffc6aafc818e4b9305916e9c6c7d4e221dfb7..48b00a2153c7a4b28d3c23a5e9bfb1263b6a810b 100644 (file)
@@ -95,7 +95,7 @@ verfügbar.
 @titlefont{Benutzerhandbuch}
 @author Das LilyPond-Entwicklerteam
 
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -130,7 +130,7 @@ Für LilyPond Version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 bei den Autoren
+Copyright @copyright{} 1999--2009 bei den Autoren
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -163,7 +163,7 @@ Free Documentation License''.
 @ifnottex
 Diese Datei dokumentiert GNU LilyPond.
 
-Copyright 1999--2008 bei den Autoren.
+Copyright 1999--2009 bei den Autoren.
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
index fd1f6edaeb52f7a615235eabdf7f75db0629ea0f..ef0d2dbb1331e3727c58b9c27d1e4024a8534a19 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 0108aac334dfb30a284c229a332096b142b89bf9..a8f41f52f67081029befbd888780fb549ac50cf9 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 2a47870a7af406d02c1ef495bb480bb1b8f949ca..3e03b133864e123273f10813764297eb64795808 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index b61d75e7410d9df882e2047e8b2dc855b2226574..64115295ca8cbde7d1b47b452b34898cb8f6258a 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 7bc3039b21f5ffa1d15f05be53953cbbc14c7a7f..f8166f97899d4fc84e9350a6a4b0cc1aab753895 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 90557d631074ca3c5d25da6e91545fb72c0e915d..ea608c796a9988477d3305512e5ee47d6050c12a 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index f3c546adbb2c90a36217eca79c90dbc12dc62478..4611b98ecc610028c139b0027b066a85959571f5 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 8405b88e6c1aac6c44e6064dd7b8b1674d6e7abd
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 5a22d40bedb94a232bd19810443d27fb9119623e..750c67ccca7c96642eefe63f44cc46c91db37a7c 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 5839692232449444ec33597c62fdaa40913d1f8e..4bca7dfade2df2f79f5b243c05c9fec9b799128a 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -52,6 +52,8 @@ Zum Beispiel wird eine Viertelnote mit @code{4} notiert (weil sie eine
 Noten, die länger als eine Ganze sind, müssen mit @code{\longa} 
 (für die Longa, also vier Ganze) und 
 @code{\breve} (für die Brevis, auch Doppelganze genannt) notiert werden.
+Notendauern bis hin zu 128steln sind unterstützt. Kürzere Notenwerte können
+auch notiert werden, können allerdings nur als Noten mit Balken auftreten.
 
 @c Two 64th notes are needed to obtain beams
 @lilypond[quote,ragged-right,verbatim,fragment,relative=2]
@@ -1503,7 +1505,9 @@ Bebalkung von drei Kontext-Eigenschaften kontrolliert:
 @code{measureLength}, @code{beatLength} und @code{beatGrouping}.
 Diese Eigenschaften können in den @code{Score}, @code{Staff} oder
 @code{Voice}-Kontexten gesetzt werden, um ihre Wirkungsweise zu
-begrenzen.
+begrenzen.  Die Standardwerte werden gesetzt, wenn der @code{\time}-Befehl
+gelesen wird, sodass alle @code{\set}-Befehle nach den @code{\time}-Befehlen
+geschrieben werden müssen.
 
 Durch sie werden die Balken wie folgt bestimmt:
 
index 684be21e972c9cab07032b0d88f83c9fff7e3451..4592fccd00d7bc73b8351274947abca251570360 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 4770e4e71ebff6104cad46bd2d889c3ff6ba3875
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 603b685cd9da0ee8eafe6c5f1e14bb379c2f2d09..b467ad2cfdb9e5844600fbe43b29f18ddc57ffb3 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 4666d5e71e5dab20c7fb630ae9321c1c30c81e95..739e4bd7749888196813dc0718aa9370fd1dd32c 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index f503633684d73dabdaf15a97b23d6d6ebbdc0912..b89df69c4ca7eab916ae63c15e9a21028ddecdc8 100644 (file)
@@ -1,12 +1,13 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
 @end ignore
 
+@c \version "2.12.0"
 
 @node Spacing issues
 @chapter Spacing issues
index d4f258d1b40073df4f0d25b401a1569d6f02a2c6..726894174d7afda9406a320b3ec32968b81a39cf 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 9a9ec4a60b642ccff38bba8d7d76f659f2a966a9..4895c2e9049bb8fbd2b30cc15f4612fd68bad24e 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -50,6 +50,9 @@ Gruppen von Systemen zu erstellen.
 @cindex Gregorianischer Choral, Transkription
 @cindex neues Notensystem
 
+@funindex \drummode
+@funindex drummode
+
 @notation{Notensysteme} (engl. @notation{staff}, Pl. @notation{staves})
 werden mit dem @code{\new} oder @code{\context}-Befehl erstellt.  Zu
 Einzelheiten siehe
@@ -357,6 +360,8 @@ beenden sowie eine Methode, Ossia-Systeme zu erstellen.
 @cindex Notenlinien, Anzahl
 @cindex Notenlinien, Dicke
 @cindex Notenlinien, Einstellungen
+@cindex Staff symbol, Erstellen
+@cindex Notenlinien, Erstellen
 @cindex Dicke der Notenlinien einstellen
 @cindex Anzahl der Notenlinien einstellen
 @cindex Zahl der Notenlinien einstellen
@@ -425,8 +430,18 @@ Einstellung wirkt sich auch auf den Abstand der Hilfslinien aus.
 Weitere Einzelheiten zu den Eigenschaften von @code{StaffSymbol} 
 findet sich in @rinternals{staff-symbol-interface}.
 
+@cindex Notenlinien, beginnen
+@cindex Notenlinien, beenden
+@cindex Beenden von Notenlinien
+@cindex Beginnen von Notenlinien
+@cindex Beenden eines Systems
+@cindex System, beenden
+@cindex Notensystem, beenden
+
 @funindex \startStaff
 @funindex \stopStaff
+@funindex startStaff
+@funindex stopStaff
 
 Veränderungen der Eigenschaften eines Notensystems mitten in einer
 Partitur können zwischen die Befehle @code{\stopStaff} und
@@ -444,10 +459,6 @@ b2 b
 a2 a
 @end lilypond
 
-@cindex Beenden eines Systems
-@cindex System, beenden
-@cindex Notensystem, beenden
-
 @noindent
 Die Befehle @code{\startStaff} und @code{\stopStaff} können
 benutzt werden, um ein Notensystem irgendwo zu beenden oder zu
@@ -509,6 +520,11 @@ Systems gleichgroß sein.
 @cindex Notensystem, Größe verändern
 @cindex Größe von Notensystem verändern
 
+@funindex \startStaff
+@funindex \stopStaff
+@funindex startStaff
+@funindex stopStaff
+
 @notation{Ossia}-Systeme können gesetzt werden, indem zwei
 gleichzeitige Notensysteme an der entsprechenden Position
 erstellt werden:
@@ -677,6 +693,9 @@ Referenz der Interna:
 @cindex Systeme, leere
 @cindex Verschwinden von leeren Systemen
 
+@funindex \RemoveEmptyStaffContext
+@funindex RemoveEmptyStaffContext
+
 Die Notenlinien können entfernt werden, indem der
 @code{Staff_symbol_engraver} aus dem @code{Staff}-Kontext
 entfernt wird.  Alternativ kann auch @code{\stopStaff} 
@@ -689,8 +708,6 @@ eingesetzt werden.
 \relative c''' { a8 f e16 d c b a2 }
 @end lilypond
 
-@funindex \RemoveEmptyStaffContext
-
 Leere Systeme können versteckt werden, wenn der
 @code{\RemoveEmptyStaffContext}-Befehl im @code{\layout}-Abschnitt
 benutzt wird.  In großen Orchesterpartituren wird dies oft
@@ -732,8 +749,13 @@ um Ossiaabschnitte zu erstellen.  Zu Einzelheiten, siehe
 
 @cindex Verstecken von Systemen der Alten Musik
 @cindex Verstecken von Rhythmus-Systemen
+
+@funindex \RemoveEmptyStaffContext
+@funindex RemoveEmptyStaffContext
 @funindex \AncientRemoveEmptyStaffContext
 @funindex \RemoveEmptyRhythmicStaffContext
+@funindex AncientRemoveEmptyStaffContext
+@funindex RemoveEmptyRhythmicStaffContext
 
 Der @code{\AncientRemoveEmptyStaffContext}-Befehl kann
 benutzt werden, um leere Takte in Notation der Alten Musik
@@ -814,6 +836,8 @@ formatieren.
 @cindex Metronombezeichnung
 @cindex Tempobezeichnung
 @cindex Aufführungsanweisung: Tempo
+
+@funindex tempo
 @funindex \tempo
 
 Eine Metronomanweisung wird wie folgt erstellt:
@@ -945,8 +969,9 @@ mehrzeilige Instrumentenbezeichnungen zentriert zu setzen, muss
 @end lilypond
 
 @cindex Einzug
-@cindex indent
-@cindex short-indent
+
+@funindex indent
+@funindex short-indent
 
 Wenn die Instrumentenbezeichnung zu lang ist, kann es vorkommen,
 dass die Bezeichnungen in einer Gruppe nicht zentriert werden.
@@ -1003,6 +1028,11 @@ c1 c c c \break
 @cindex Instrumentenwechsel
 @cindex Wechsel von Instrument
 
+@funindex \addInstrumentDefinition
+@funindex addInstrumentDefinition
+@funindex \instrumentSwitch
+@funindex instrumentSwitch
+
 Wenn das Instrument gewechselt werden soll, kann der Befehl
 @code{\addInstrumentDefinition} in Begleitung von
 @code{\instrumentSwitch} benutzt werden, um eine detaillierte
@@ -1061,6 +1091,13 @@ Referenz der Interna:
 @cindex Fragmente
 @cindex Stimmen, zitieren
 
+@funindex \addQuote
+@funindex addQuote
+@funindex \quoteDuring
+@funindex quoteDuring
+@funindex \transposition
+@funindex transposition
+
 Es kommt sehr oft vor, dass eine Orchesterstimme die gleichen
 Noten wie eine andere spielt.  So können etwa die ersten und
 zweiten Geigen für eine Passage die gleichen Noten haben.  In
@@ -1151,6 +1188,7 @@ vorgestellt in
 @cindex articulation-event
 @cindex dynamic-event
 @cindex rest-event
+
 @funindex quotedEventTypes
 
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
@@ -1198,6 +1236,9 @@ In früheren LilyPond-Versionen (vor 2.11) wurde der Befehl
 @cindex andere Stimmen zitieren
 @cindex Zitieren von anderen Stimmen
 
+@funindex \cueDuring
+@funindex cueDuring
+
 Der vorige Abschnitt zeigt, wie man Zitate erstellt.  Der
 @code{\cueDuring}-Befehl (engl. cue note = Stichnote)
 ist eine spezialisierte Form des
@@ -1256,6 +1297,14 @@ oboe = \relative c''' {
 >>
 @end lilypond
 
+@cindex Entfernen von Stichnoten
+@cindex Stichnoten, entfernen
+
+@funindex \killCues
+@funindex killCues
+@funindex \transposedCueDuring
+@funindex transposedCueDuring
+
 Zusätzlich zu der Instrumentenbezeichnung kann auch die
 Bezeichnung des Originalinstruments ausgegeben werden, und alle
 Änderungen, die für die Stichnoten gemacht wurden, müssen
index 15a7c01e6d39126027e8f133f7e9cf872645202b..dfb362915275411a923532810a594d172d05eca7 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond-learning.tely
 @ignore
-    Translation of GIT committish: 3a8542af9f54c99b53374328af0d5d87005ca49e
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 3ab6da3bfd94683a8ab606d08f52b3d06ed8dbd4..54cf2646e2f11aa7138afd1e66b32cafd8365646 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 4770e4e71ebff6104cad46bd2d889c3ff6ba3875
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 21b9c6b51350793eca78966d399015d70bf9c845..7a9ac2851f1467732ac03834d5c52951493f45c4 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index f862bdb3c5e5e724735db335f472fdac3254e8e8..ace2c67eca6e0f9bb877ac66763474a575341adc 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond-learning.tely
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -2244,6 +2244,32 @@ c\ff c \stopTextSpan
 c, c c c
 @end lilypond
 
+@cindex Legatobögen und outside-staff-priority
+@cindex Legatobögen und Artikulationszeichen
+@cindex Artikulationszeichen und Legatobögen
+
+Legatobögen werden als Innersystem-Objekte klassifiziert, aber
+sie erscheinen oft auch über dem System, wenn die Noten, an die
+sie verbunden sind, sehr hoch im System notiert sind.  Dadurch
+können Außersystem-Objekte, wie Artikulationszeichen, zu hoch
+gerückt werden.  Die @code{avoid-slur}-Eigenschaft hat nur
+eine Auswirkung, wenn auch die @code{outside-staff-priority}
+auf @code{#f} gesetzt ist.  Alternativ kann die
+@code{outside-staff-priority}  des Legatobogens auf einen
+numerischen Wert gesetzt werden, sodass er mit anderen
+Außersystem-Objekten anhand dieses Wertes gesetzt wird.
+Hier ein Beispiel, das die beiden Möglichkeiten veranschaulicht:
+
+@lilypond[quote,verbatim,relative=2]
+c4( c^\markup\tiny\sharp d4.) c8
+c4(
+\once \override TextScript #'avoid-slur = #'inside
+\once \override TextScript #'outside-staff-priority = ##f
+c^\markup\tiny\sharp d4.) c8
+\once \override Slur #'outside-staff-priority = #500
+c4( c^\markup\tiny\sharp d4.) c8
+@end lilypond
+
 Eine Änderung der @code{outside-staff-priority} kann auch dazu
 benutzt werden, die vertikale Plazierung von individuellen Objekten
 zu kontrollieren, auch wenn das Ergebnis nicht immer optimal
index 5ee018ec7ea115d325bb457db8552f2472f9f045..f3b3ca33ccffd975710a14c3c00454c59b066efa 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 4770e4e71ebff6104cad46bd2d889c3ff6ba3875
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 5154b599291677e741712e4acfa07bd9fa259f2c..eda4095bace81169c9a6fdd46a406964dcb531cd 100644 (file)
@@ -1,6 +1,6 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @ignore
-    Translation of GIT committish: 23342b5b9f69f3a82751052f79f3fede0bb40ded
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 4c9dc0fef7f5120edc9b73e574a752146fc67382..9ec26a833c9a324988e745546e274fbb81b4a5e1 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index fef131bffa5528658ff3060032858c4aafd29dd3..07c503d27230cdecdbeccecc04a7d124593961af 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 0abdb16625b109591d362297dd7b9559776f0be3..f4982e82afff723a1dbe006cf3675222fe2d453c 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
 @c This file is part of lilypond.tely
 @ignore
-    Translation of GIT committish: 2c00bdbfaf62dd90863331c4713e6b29e32c9322
+    Translation of GIT committish: 499a511d4166feaada31114e097f86b5e0c56421
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
@@ -9,6 +9,7 @@
 
 @c Translators: Till Rettig
 
+@c \version "2.12.0"
 
 @node World music
 @section World music
index c303cb891d1077714b63d88d49490711908c0a40..2e1ae469543a4aebd8b9551df1b7ac4bc3dc0410 100644 (file)
@@ -1,4 +1,4 @@
- <p><i>Actualizado en Sun Dec 28 01:18:10 UTC 2008
+ <p><i>Actualizado en Mon Jan  5 10:30:39 UTC 2009
 </i></p>
 <html>
 <!-- This page is automatically generated by translation-status.py from
@@ -94,7 +94,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
-  <td>4 Trucar la salida<br>(14647)</td>
+  <td>4 Trucar la salida<br>(14775)</td>
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #1fff1f">sí</span></td>
@@ -145,7 +145,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
-  <td>1 Instalación<br>(1930)</td>
+  <td>1 Instalación<br>(1928)</td>
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #dfef77">parcialmente (11 %)</span></td>
@@ -208,7 +208,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #1fff1f">sí</span></td>
-  <td><span style="background-color: #1fff1f">sí</span></td>
+  <td><span style="background-color: #2cff20">parcialmente</span></td>
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
@@ -220,11 +220,11 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
-  <td>1.2 Duraciones<br>(5013)</td>
+  <td>1.2 Duraciones<br>(5236)</td>
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #1fff1f">sí</span></td>
-  <td><span style="background-color: #1fff1f">sí</span></td>
+  <td><span style="background-color: #47ff24">parcialmente</span></td>
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
@@ -252,11 +252,11 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>post-GDP</td>
  </tr>
  <tr align="left">
-  <td>1.6 Notación de los pentagramas<br>(1635)</td>
+  <td>1.6 Notación de los pentagramas<br>(1701)</td>
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #1fff1f">sí</span></td>
-  <td><span style="background-color: #1fff1f">sí</span></td>
+  <td><span style="background-color: #25fe1f">parcialmente</span></td>
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
@@ -280,7 +280,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #1fff1f">sí</span></td>
-  <td><span style="background-color: #1fff1f">sí</span></td>
+  <td><span style="background-color: #2cff20">parcialmente</span></td>
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
@@ -356,11 +356,11 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
-  <td>3 Entrada y salida generales<br>(5805)</td>
+  <td>3 Entrada y salida generales<br>(5873)</td>
   <td>Francisco Vila</td>
   <td></td>
   <td><span style="background-color: #1fff1f">sí</span></td>
-  <td><span style="background-color: #1fff1f">sí</span></td>
+  <td><span style="background-color: #25fe1f">parcialmente</span></td>
   <td>pre-GDP</td>
  </tr>
  <tr align="left">
index 5daefd4b89b55cf5d7343f6476f8b85b3d8e7f9c..6d6b581b94f7f0288d1622892dc0a5cea794aacf 100644 (file)
@@ -200,7 +200,7 @@ and placement}.
 {allowing-fingerings-to-be-printed-inside-the-staff.ly}
 
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
-{avoiding-collisions-of-chord-fingering-with-beams.ly}
+{avoiding-collisions-with-chord-fingerings.ly}
 
 
 @seealso
index 5e17569b347451535c6cbde6891c7480da68204f..17c2546996d0e3ce62e9be5faf3b07ee58f6667d 100644 (file)
@@ -1281,7 +1281,7 @@ partitura:
   }
   \addlyrics { O \markup { \concat{ Ph \char ##x0153 be! } } }
 }
-\markup { "Copyright 2008" \char ##x00A9 }
+\markup { "Copyright 2008--2009" \char ##x00A9 }
 @end lilypond
 
 Para escribir el símbolo de copyright en la nota de créditos, utilice:
index 38a509801732a17ac5d8af3c52b0f929f44024d2..10863d3db9a5fe39b0372e1ae035600e3b926005 100644 (file)
@@ -57,7 +57,7 @@ Este documento también está disponible en formato
 @author El equipo de desarrollo de LilyPond
 
 
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
@@ -91,7 +91,7 @@ Para LilyPond versión @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
@@ -124,7 +124,7 @@ Free Documentation License''.
 @ifnottex
 Este archivo es la documentación de GNU LilyPond orientada a quienes empiezan con el programa.
 
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
index d4608eca6ad252565881bea02cc4fafae305ba83..d3cce583ba8b8cb0aa554b5e78d1a0b814e1832a 100644 (file)
@@ -60,7 +60,7 @@ Este documento también está disponible en formato
 @author El equipo de desarrollo de LilyPond
 
 
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
@@ -95,7 +95,7 @@ Para LilyPond versión @version{}
 
 
 @copying
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
@@ -127,7 +127,7 @@ Free Documentation License''.
 @ifnottex
 Este archivo es la documentación de la utilización del programa GNU LilyPond.
 
-Copyright 1999--2008 por los autores
+Copyright 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
index e6e58ed965e49c789a9baf612ba25042edc274b2..e47f08d3b71c35017f771c68ae262589875c3499 100644 (file)
@@ -96,7 +96,7 @@ Este documento también está disponible en formato
 @titlefont{Manual de referencia de la notación}
 @author El equipo de desarrollo de LilyPond
 
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
@@ -130,7 +130,7 @@ Para LilyPond versión @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 por los autores
+Copyright @copyright{} 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
@@ -162,7 +162,7 @@ Free Documentation License''.
 @ifnottex
 Este archivo es la documentación de GNU LilyPond.
 
-Copyright 1999--2008 por los autores
+Copyright 1999--2009 por los autores
 
 @emph{La traducción de la siguiente nota de copyright se ofrece como
 cortesía para las personas de habla no inglesa, pero únicamente la
index d7579c086938c96e8f23c36532740ec4dc62c494..64c9c2801a79933cc7eb4e8d9ef09eafe4fb7086 100644 (file)
@@ -7,6 +7,7 @@
     version that you are working on.  See TRANSLATION for details.
 @end ignore
 
+@c \version "2.12.0"
 
 @node World music
 @section World music
index c529d083cb0e6ac4f0bb44c339df4439a0f097c7..14970da048602af546a8e8f362e1ddee3b5a1f25 100644 (file)
@@ -1,4 +1,4 @@
- <p><i>Dernière mise à jour Sun Dec 28 01:18:10 UTC 2008
+ <p><i>Dernière mise à jour Mon Jan  5 10:30:39 UTC 2009
 </i></p>
 <html>
 <!-- This page is automatically generated by translation-status.py from
@@ -64,7 +64,8 @@ translations.template.html.in; DO NOT EDIT !-->
  <tr align="left">
   <td>Préface<br>(411)</td>
   <td>Valentin Villenave</td>
-  <td>Ludovic Sardain</td>
+  <td>Ludovic Sardain<br>
+   Damien Heurtebise</td>
   <td><span style="background-color: #1fff1f">oui</span></td>
   <td><span style="background-color: #1fff1f">oui</span></td>
   <td>pré-GDP</td>
@@ -74,7 +75,8 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>Ludovic Sardain<br>
    John Mandereau</td>
   <td>Jean-Charles Malahieude<br>
-   Jean-Yves Baudais</td>
+   Jean-Yves Baudais<br>
+   Damien Heurtebise</td>
   <td><span style="background-color: #1fff1f">oui</span></td>
   <td><span style="background-color: #40fe23">partiellement</span></td>
   <td>post-GDP</td>
@@ -101,14 +103,14 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>post-GDP</td>
  </tr>
  <tr align="left">
-  <td>4 Retouche de partition<br>(14647)</td>
+  <td>4 Retouche de partition<br>(14775)</td>
   <td>Valentin Villenave<br>
    Nicolas Klutchnikoff<br>
    Damien Heurtebise</td>
   <td>Jean-Charles Malahieude<br>
    John Mandereau</td>
   <td><span style="background-color: #1fff1f">oui</span></td>
-  <td><span style="background-color: #1fff1f">oui</span></td>
+  <td><span style="background-color: #25fe1f">partiellement</span></td>
   <td>post-GDP</td>
  </tr>
  <tr align="left">
@@ -143,7 +145,7 @@ translations.template.html.in; DO NOT EDIT !-->
 
 <table align="center" border="2">
  <tr align="center">
-  <th>GNU LilyPond --- Utilisation des programmes</th>  <th>Traducteurs</th>
+  <th>GNU LilyPond --- Utilisation du programme</th>  <th>Traducteurs</th>
   <th>Relecteurs</th>
   <th>Traduit</th>
   <th>À jour</th>
@@ -159,7 +161,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
-  <td>1 Installation<br>(1930)</td>
+  <td>1 Installation<br>(1928)</td>
   <td>John Mandereau</td>
   <td></td>
   <td><span style="background-color: #dfef77">partiellement (11 %)</span></td>
@@ -171,7 +173,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>Jean-Charles Malahieude</td>
   <td></td>
   <td><span style="background-color: #1fff1f">oui</span></td>
-  <td><span style="background-color: #d587ff">N/A</span></td>
+  <td><span style="background-color: #1fff1f">oui</span></td>
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
@@ -195,7 +197,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>Jean-Charles Malahieude</td>
   <td></td>
   <td><span style="background-color: #1fff1f">oui</span></td>
-  <td><span style="background-color: #d587ff">N/A</span></td>
+  <td><span style="background-color: #1fff1f">oui</span></td>
   <td>pré-GDP</td>
  </tr>
 </table>
@@ -203,7 +205,7 @@ translations.template.html.in; DO NOT EDIT !-->
 
 <table align="center" border="2">
  <tr align="center">
-  <th>GNU LilyPond --- Manuel de notation</th>  <th>Traducteurs</th>
+  <th>GNU LilyPond --- Manuel d'initiation</th>  <th>Traducteurs</th>
   <th>Relecteurs</th>
   <th>Traduit</th>
   <th>À jour</th>
@@ -224,7 +226,7 @@ translations.template.html.in; DO NOT EDIT !-->
    Jean-Charles Malahieude</td>
   <td></td>
   <td><span style="background-color: #1fff1f">oui</span></td>
-  <td><span style="background-color: #1fff1f">oui</span></td>
+  <td><span style="background-color: #2cff20">partiellement</span></td>
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
@@ -237,7 +239,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
-  <td>1.2 Rythme<br>(5013)</td>
+  <td>1.2 Rythme<br>(5236)</td>
   <td>Frédéric Chiasson</td>
   <td>Valentin Villenave<br>
    Jean-Charles Malahieude</td>
@@ -274,11 +276,11 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
-  <td>1.6 Notation sur la portée<br>(1635)</td>
+  <td>1.6 Notation sur la portée<br>(1701)</td>
   <td>Valentin Villenave<br>
    Jean-Charles Malahieude</td>
   <td>John Mandereau</td>
-  <td><span style="background-color: #dfef77">partiellement (70 %)</span></td>
+  <td><span style="background-color: #dfef77">partiellement (69 %)</span></td>
   <td><span style="background-color: #ff6f57">partiellement</span></td>
   <td>pré-GDP</td>
  </tr>
@@ -305,7 +307,7 @@ translations.template.html.in; DO NOT EDIT !-->
    Jean-Charles Malahieude</td>
   <td></td>
   <td><span style="background-color: #1fff1f">oui</span></td>
-  <td><span style="background-color: #1fff1f">oui</span></td>
+  <td><span style="background-color: #2cff20">partiellement</span></td>
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
@@ -375,7 +377,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>John Mandereau<br>
    Jean-Charles Malahieude</td>
   <td></td>
-  <td><span style="background-color: #dfef77">partiellement (79 %)</span></td>
+  <td><span style="background-color: #dfef77">partiellement (82 %)</span></td>
   <td><span style="background-color: #ff6d58">partiellement</span></td>
   <td>pré-GDP</td>
  </tr>
@@ -388,7 +390,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>pré-GDP</td>
  </tr>
  <tr align="left">
-  <td>3 Généralités en matière d'entrée et sortie<br>(5805)</td>
+  <td>3 Généralités en matière d'entrée et sortie<br>(5873)</td>
   <td>Jean-Charles Malahieude<br>
    Valentin Villenave</td>
   <td></td>
index b7c2fb747941d3740c8dbee316ee365c17a2e38d..bb89e3dfdb989f29ea4e9f70a6445ff07de46756 100644 (file)
@@ -8,12 +8,11 @@
 @end ignore
 
 
+@c \version "2.12.0"
+
 @node Ancient notation
 @section Ancient notation
 
-@untranslated
-
-
 @menu
 * Introduction to ancient notation::  
 * Alternative note signs::      
index 73785eb99fe47af388f6f0c638e55c38f2ed804d..58fa6f00fd8649c15f395dbcf3071ca45c3ae0df 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 1e2013ba299c3640143448cbd5ea72f2aa61e380
+    Translation of GIT committish: e2070eadd7d3d7a87450aab195a48945ee0b144a
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 85c32f5ef57e0b2edec5b451c585f490245691cc..a473c00e3db7f5310f46a1fd28f0935dfb3625df 100644 (file)
@@ -153,6 +153,11 @@ d'indiquer des doigtés très proches des têtes de notes.
 <es'-2>4
 @end lilypond
 
+@snippets
+
+@lilypondfile[verbatim,lilyquote,texidoc,doctitle]
+{avoiding-collisions-with-chord-fingerings.ly}
+
 
 @seealso
 Référence du programme : @rinternals{Fingering}.
index b5a65490587b3adb1d133fc24567b672ea1d532f..5d49a6f9def29a8b18c80d4b69e7590c2627c710 100644 (file)
@@ -10,7 +10,7 @@
 @c \version "2.12.0"
 
 @c Translators: Ludovic Sardain, John Mandereau
-@c Translation checkers: Jean-Charles Malahieude, Jean-Yves Baudais
+@c Translation checkers: Jean-Charles Malahieude, Jean-Yves Baudais, Damien Heurtebise
 @c Translation status: post-GDP
 
 
@@ -44,6 +44,7 @@ architecture.
 @node Engraving
 @unnumberedsubsec Engraving
 
+
 @cindex gravure
 @cindex typographie musicale
 @cindex musique et typographie
@@ -56,7 +57,7 @@ Cette plaque était ensuite encrée, les dépressions créées par les
 creux et les bosses retenant l'encre.  Une image était formée en
 pressant du papier sur la plaque.  La découpe et l'embossage étaient
 entièrement faits à la main.  Il était pénible d'appliquer une
-correction, quand celle-ci n'était pas impossible, la gravure devait
+correction, quand celle-ci n'était pas impossible ; la gravure devait
 donc être parfaite du premier coup.  La gravure demandait une
 qualification hautement spécialisée : un artisan devait accomplir
 environ cinq ans de formation avant de mériter le titre de maître
@@ -65,7 +66,7 @@ pour devenir vraiment habile.
 
 De nos jours, toutes les partitions récentes sont produites avec des
 ordinateurs.  Ceci a des avantages évidents : le coût des impressions
-a diminué, et le travail d'éditeur peut être envoyé par courriel.
+a diminué, et le travail d'édition peut être envoyé par courriel.
 Malheureusement, l'utilisation dominante des ordinateurs a également
 diminué la qualité graphique des partitions.  L'impression
 informatisée leur donne un aspect fade et mécanique qui les rend
@@ -249,13 +250,12 @@ meilleure interprétation.
 
 Ces exemples démontrent que la typographie musicale est un art subtil
 et complexe, et que la produire demande une expertise considérable,
-que les musiciens n'ont généralement pas.  LilyPond représente notre
-effort pour apporter l'excellence graphique de la gravure à la main à
-l'ère de l'ordinateur, et la rendre accessible à tous les musiciens.
-Nous avons conçu nos algorithmes, fontes et paramètres de programme
-pour retrouver la qualité d'édition des anciennes partitions que nous
-aimons tant lire et jouer.
-
+que les musiciens ne possèdent généralement pas.  LilyPond est le
+fruit de nos efforts pour restaurer l'excellence graphique de la
+gravure à la main à l'ère de l'ordinateur, et la rendre accessible à
+tous les musiciens.  Nous avons conçu nos algorithmes, fontes et
+paramètres de programme pour retrouver la qualité d'édition des
+anciennes partitions que nous aimons tant lire et jouer.
 
 
 @node Automated engraving
@@ -271,9 +271,9 @@ faire leur travail ?
 
 La réponse est : nous ne le pouvons pas.  La typographie se base sur
 le jugement visuel humain, donc les humains ne peuvent pas être
-complètement remplacés.  Si LilyPond arrive à résoudre la plupart des
+complètement remplacés.  Si LilyPond arrive à traiter la plupart des
 situations correctement, ce sera déjà une grande avancée sur les
-logiciels existants.  Les autres situations peuvent être résolues à la
+logiciels existants.  Les problèmes restants peuvent être résolus à la
 main.  Au fil des ans, le logiciel peut être affiné pour faire de plus
 en plus de choses automatiquement, pour que les ajustements manuels
 soient de moins en moins nécessaires.
@@ -299,16 +299,16 @@ définitions du modèle typographique doivent également être accessibles
 à l'utilisateur.
 
 @item Enfin, nous affinons continuellement les algorithmes de formatage,
-donc nous avons besoin d'une approche souple des règles.  Le language
+donc nous avons besoin d'une approche souple des règles.  Le langage
 C++ oblige à une certaine méthode de groupage des règles qui ne
 convient pas bien au fonctionnement de la notation musicale.
-
 @end itemize
 
 @cindex langage de programmation Scheme
 
 Ces problèmes ont été résolus en intégrant un interpréteur pour le
-language de programmation Scheme, et en réécrivant des parties de
+langage de programmation Scheme, et en réécrivant des parties de
 LilyPond en Scheme.  L'architecture actuelle de formatage est
 construite autour de la notion d'objets graphiques, décrits par des
 fonctions et des variables Scheme.  Cette architecture comprend les
@@ -430,7 +430,7 @@ notation utiliser.
 La notation musicale usuelle est un système d'écriture qui a évolué à
 travers les dix derniers siècles.  La forme qui est aujourd'hui
 communément utilisée date du début de la Renaissance.  Bien que la forme
-basique --- les têtes de notes sur une portée de cinq lignes --- n'a pas
+basique --- les têtes de notes sur une portée de cinq lignes --- n'ait pas
 changé, les détails continuent d'évoluer pour exprimer les innovations
 de la notation contemporaine.  Par conséquent, elle comprend quelque 500
 ans de musique, avec des applications allant des mélodies monodiques à
@@ -572,7 +572,7 @@ et le graveur de hampes (@code{Stem_engraver}) ajoute les hampes :
 @end lilypond
 
 @noindent
-Le graveur de hampe est notifié de chaque tête de note qui survient.
+Le graveur de hampe est informé de chaque tête de note qui survient.
 Chaque fois qu'une tête de note --- plusieurs pour un accord --- est
 rencontrée, un objet hampe est créé et connecté à la tête de note.  En
 ajoutant des graveurs pour les barres de ligature, les liaisons, les
@@ -635,7 +635,7 @@ Référence du programme: @rinternals{Contexts}.
 Idéalement, le format d'entrée pour n'importe quel système de
 formatage est une description abstraite du contenu.  Dans ce cas-ci,
 ce serait la musique elle-même.  Cela pose un formidable problème :
-comment pouvons-nous définir ce que la musique est réellement ? Plutôt
+comment pouvons-nous définir ce qu'est réellement la musique ? Plutôt
 que d'essayer de trouver une réponse, nous avons renversé la question.
 Nous écrivons un logiciel capable de produire de la musique écrite, et
 adaptons le format pour atteindre la plus grande concision possible.
@@ -643,7 +643,7 @@ Quand le format ne peut plus être simplifé, il nous reste par
 définition le contenu lui-même.  Notre logiciel sert de définition
 formelle d'un document de musique.
 
-La syntaxe est également l'interface utilisateur pour LilyPond, par
+Pour LilyPond, la syntaxe est également l'interface utilisateur ; par
 conséquent il est facile de saisir
 
 @example
@@ -653,7 +653,7 @@ c'4 d'8
 @end example
 
 @noindent
-c'est-à-dire un do central noire et, juste au-dessus un ré croche
+c'est-à-dire un do central noire et, juste au-dessus, un ré croche
 
 @lilypond[quote]
 {
@@ -662,7 +662,7 @@ c'est-à-dire un do central noire et, juste au-dessus un ré croche
 @end lilypond
 
 Sur une échelle microscopique, une telle syntaxe est facile à
-utiliser.  A plus grande échelle, la syntaxe a besoin aussi de
+utiliser.  À plus grande échelle, la syntaxe a besoin aussi de
 structure.  Comment serait-il possible autrement de rentrer des
 pièces complexes comme des symphonies ou des opéras ? La structure
 est formée par le concept d'expression musicale : en combinant
@@ -686,7 +686,7 @@ des notes.
 @end lilypond
 
 @noindent
-Cette expression est mise dans une séquence grace à l'encadrement par
+On met cette expression dans une séquence en l'encadrant par
 des accolades @code{@{@tie{}@dots{}@tie{}@}}
 
 @example
@@ -699,7 +699,7 @@ des accolades @code{@{@tie{}@dots{}@tie{}@}}
 
 @noindent
 Ceci est également une expression, et peut donc encore une fois
-être combinée avec d'autres expressions simultanées (une blanche)
+être combiné avec d'autres expressions simultanées (une blanche)
 en utilisant <<, @code{\\}, et >>
 
 @example
@@ -712,7 +712,7 @@ en utilisant <<, @code{\\}, et >>
 
 De telles structures récursives peuvent être spécifiées formellement
 et de manière ordonnée dans une grammaire indépendante de tout
-contexte.  Le code d'analyse est aussi générée à partir de cette
+contexte.  Le code d'analyse est aussi généré à partir de cette
 grammaire.  Autrement dit, la syntaxe de LilyPond est définie
 clairement et sans ambiguité.
 
@@ -930,7 +930,7 @@ un fichier, ajoutez les notes, et c'est prêt !
 @ref{Scheme tutorial} : courte introduction à Scheme, le langage de
 programmation utilisé dans les fonctions de musique.  Ces quelques
 lignes vous aideront à construire des retouches avancées ; nombre
-d'utilisateurs n'ont jamais touché à Scheme.
+d'utilisateurs ne touchent jamais à Scheme.
 
 @end itemize
 
@@ -944,7 +944,7 @@ d'utilisateurs n'ont jamais touché à Scheme.
 @cindex langues étrangères
 @cindex langue
 @cindex langage
+
 @rglosnamed{Top,Glossaire musical} : ce document explique en anglais
 des termes musicaux, et donne leur traduction dans diverses langues.
 Si vous n'êtes pas familier avec la notation et la terminologie
@@ -996,7 +996,7 @@ différentes formes de retouches, qui permettent d'obtenir de Lilypond
 (presque) tout ce que vous désirez.
 
 @item
-@ruser{Interfaces for programmers} :.création de fonctions de musique
+@ruser{Interfaces for programmers} : création de fonctions de musique
 à l'aide de Scheme.
 
 @end itemize
index 8b30c5f83ee9cab379f4e35bb131eaf19a97db0c..0acb5e735ebc8ec9e9dd4c3320ca4df666dc5ca1 100644 (file)
@@ -67,7 +67,7 @@ séparées}.
 @author L'équipe de développement de LilyPond
 
 
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -100,7 +100,7 @@ Pour LilyPond version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -131,7 +131,7 @@ Free Documentation License''.
 @ifnottex
 Ce fichier documente GNU LilyPond.
 
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
index a36c8cc8f4d48eeb6541a37b7cbe5036f3731cd4..edd4081cc81ac94c404b07eb61042d38759d41a5 100644 (file)
@@ -66,7 +66,7 @@ séparées}.
 @author L'équipe de développement de LilyPond
 
 
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -102,7 +102,7 @@ Pour LilyPond version @version{}
 @ifnottex
 Ce fichier documente GNU LilyPond.
 
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
index 4615ab8c4527a5ea7d5c6a4d25d20704f33e38c5..6d20b1f6a7723405cdd893c42c8246c6b2e779c4 100644 (file)
@@ -69,7 +69,7 @@ séparées}.
 @author L'équipe de développement de LilyPond
 
 
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
@@ -105,7 +105,7 @@ Pour LilyPond version @version{}
 @ifnottex
 Ce fichier documente GNU LilyPond.
 
-Copyright @copyright{} 1999--2008 par les auteurs
+Copyright @copyright{} 1999--2009 par les auteurs
 
 @emph{The translation of the following copyright notice is provided
 for courtesy to non-English speakers, but only the notice in English
index bb5b3ddccfaba4db02a8d36bca9ecc438a53e974..fa3c3e5d73c5ab61583fd49723732f8c59968261 100644 (file)
@@ -10,7 +10,7 @@
 @c \version "2.12.0"
 
 @c Translators: Valentin Villenave
-@c Translation checkers: Ludovic Sardain
+@c Translation checkers: Ludovic Sardain, Damien Heurtebise
 
 @node Preface
 @unnumbered Preface
@@ -36,18 +36,17 @@ gammes, les études deviennent vite ennuyeuses, et peuvent, si l'on
 n'est pas encouragé par d'autres --- professeurs, chefs ou public ---
 en décourager plus d'un.  Pourtant, pour peu que l'on persévère,
 l'instrument devient progressivement une partie de notre vie.  Si
-certains jours en jouer semble naturel, c'est un vrai bonheur.  Et si
-d'autres jours on ne peut tout simplement rien en tirer, on continue
-quand même à travailler, jour après jour.
+certains jours il semble naturel d'en jouer, c'est un vrai bonheur.
+Et si d'autres jours on ne peut tout simplement rien en tirer, on
+continue quand même à travailler, coûte que coûte.
 
 De même, développer LilyPond peut être une tâche harassante.  Certains
 jours, c'est un monceau de bugs duquel il faut se dépêtrer.  Pourtant,
-il fait maintenant partie de notre vie, et nous nous accrochons. 
-Notre principale motivation est sans doute que notre logiciel est
-véritablement utile aux gens.  En flânant sur Internet, nous trouvons
-beaucoup de gens qui se servent de LilyPond, et réalisent des
-partitions très impressionnantes : c'est incroyable, mais en même
-temps très flatteur.
+il fait maintenant partie de notre vie, et nous nous accrochons.
+Notre principale motivation vient sans doute de l'utilité réelle de
+notre logiciel.  En flânant sur Internet, nous trouvons beaucoup de
+gens qui utilisent LilyPond pour réaliser d'impressionnantes
+partitions : c'est incroyable, mais en même temps très flatteur.
 
 Les utilisateurs ne se contentent pas de nous encourager en utilisant
 notre logiciel ; nombre d'entre eux nous aident aussi en faisant des
index b920b2124640c5028e14516ee441e825d345000e..3927176944f52870866e60358c3e3039c52145d6 100644 (file)
@@ -1,7 +1,7 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
 @c This file is part of lilypond-program.tely
 @ignore
-    Translation of GIT committish: 1e2013ba299c3640143448cbd5ea72f2aa61e380
+    Translation of GIT committish: e2070eadd7d3d7a87450aab195a48945ee0b144a
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  See TRANSLATION for details.
index 438389f944b8e088354abf71a7cd64f126b7b8d6..35ef738ae4158c785557192665c1f94c84338ea9 100644 (file)
@@ -12,7 +12,7 @@ include $(depth)/make/stepmake.make
 ifeq ($(PLATFORM_WINDOWS),yes)
 
 $(outdir)/%.ico: %.xpm
-       $(PYTHON) $(buildscript-dir)/genicon.py $< $@
+       $(buildscript-dir)/genicon $< $@
 
 default: $(lilypond-icon) $(ly-icon)
 
index 55d88bcb08c1239d758f3a5487effe8c00f43e44..a1f98d0a9cb3fd2494160b8a1f4175f813708b8a 100644 (file)
@@ -1,5 +1,4 @@
-# translation of fr.po to Français
-# translation of LilyPond documentation
+# translation of LilyPond documentation to French
 # Copyright (C) 2006 Han-Wen Nienhuys, Jan Nieuwenhuizen
 # This file is distributed under the same license as the lilypond package.
 #
@@ -10,7 +9,7 @@ msgstr ""
 "Project-Id-Version: fr\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2008-12-25 12:33+0100\n"
-"PO-Revision-Date: 2008-12-29 20:31+0100\n"
+"PO-Revision-Date: 2008-12-31 19:59+0100\n"
 "Last-Translator: Jean-Charles Malahieude <lolyfan-AT-wanadoo-DOT-fr>\n"
 "Language-Team: Français <lilypond-user-fr@gnu.org>\n"
 "MIME-Version: 1.0\n"
@@ -9001,7 +9000,6 @@ msgstr "Utilisation des procédures @code{centered-on-parent}"
 #. @unnumberedsubsubsec in Documentation/user/changing-defaults.itely
 #. @node in Documentation/es/user/changing-defaults.itely
 #. @unnumberedsubsubsec in Documentation/es/user/changing-defaults.itely
-#, fuzzy
 msgid "Using the @code{break-alignable-interface}"
 msgstr "Utilisation de @code{break-aligned-interface}"
 
@@ -10018,11 +10016,11 @@ msgstr "la ligne suivante n'est plus nécessaire à partir de la version 2.11.x"
 
 #. input/lsr/adding-drum-parts.ly:32 (variable)
 msgid "drh"
-msgstr ""
+msgstr "tomh"
 
 #. input/lsr/adding-drum-parts.ly:33 (variable)
 msgid "drl"
-msgstr ""
+msgstr "tomb"
 
 #. input/lsr/adding-drum-parts.ly:34 (variable)
 msgid "timb"
@@ -10066,10 +10064,9 @@ msgstr "Mise en forme par défaut :"
 
 #. input/lsr/adjusting-lyrics-vertical-spacing.ly:31 (comment)
 msgid "Reducing the minimum space below the staff and above the lyrics:"
-msgstr ""
+msgstr "Réduction au minimum de l'espace au-dessous de la portée et au-dessus des paroles :"
 
 #. input/lsr/aligning-marks-with-various-notation-objects.ly:54 (comment)
-#, fuzzy
 msgid "the RehearsalMark will be centered above the KeySignature"
 msgstr "Pour centrer le repère au-dessus de l'armure"
 
@@ -10134,9 +10131,8 @@ msgstr ""
 
 #. input/lsr/ancient-fonts.ly:123 (variable)
 #. input/lsr/ancient-fonts.ly:123 (context id)
-#, fuzzy
 msgid "lowerStaff"
-msgstr "porteeInferieure"
+msgstr "PorteeInferieure"
 
 #. input/lsr/ancient-fonts.ly:133 (comment)
 msgid "\\break % 2 (16*1)"
@@ -12341,7 +12337,6 @@ msgid "No auto-beaming is defined for 12/16"
 msgstr ""
 
 #. input/lsr/using-beatlength-and-beatgrouping.ly:43 (comment)
-#, fuzzy
 msgid "Change time signature symbol, but retain underlying 3/4 beaming"
 msgstr "la métrique change mais on garde les règles de ligatures en 3/4"
 
@@ -12378,17 +12373,16 @@ msgid "3+4+2+3=12, and 12*1/16=3/4, so beatGrouping applies"
 msgstr ""
 
 #. input/lsr/using-postscript-to-generate-special-note-head-shapes.ly:17 (variable)
-#, fuzzy
 msgid "parallelogram"
 msgstr "parallelogramme"
 
 #. input/lsr/using-postscript-to-generate-special-note-head-shapes.ly:32 (variable)
 msgid "myNoteHeads"
-msgstr ""
+msgstr "tetePersonnalisee"
 
 #. input/lsr/using-postscript-to-generate-special-note-head-shapes.ly:33 (variable)
 msgid "normalNoteHeads"
-msgstr ""
+msgstr "teteNormale"
 
 #. input/lsr/utf-8.ly:34 (comment)
 msgid "end verbatim - this comment is a hack to prevent texinfo.tex"
@@ -12400,15 +12394,15 @@ msgstr ""
 
 #. input/lsr/utf-8.ly:36 (comment)
 msgid "Cyrillic font"
-msgstr ""
+msgstr "Caractères cyrilliques"
 
 #. input/lsr/utf-8.ly:37 (variable)
 msgid "bulgarian"
-msgstr ""
+msgstr "bulgare"
 
 #. input/lsr/utf-8.ly:41 (variable)
 msgid "hebrew"
-msgstr ""
+msgstr "hébreux"
 
 #. input/lsr/utf-8.ly:45 (variable)
 msgid "japanese"
@@ -12416,7 +12410,7 @@ msgstr "japonais"
 
 #. input/lsr/utf-8.ly:52 (comment)
 msgid "\\\"a legal song to you\\\""
-msgstr ""
+msgstr "\\\"a legal song to you\\\""
 
 #. input/lsr/utf-8.ly:53 (variable)
 msgid "portuguese"
index ae2e4f409ba3395708b41b0f5e9df86807b23151..e095f2541d036664322f8f304b94eb6ac339415d 100644 (file)
@@ -33,7 +33,7 @@ See user manual, \NAME\
 @finalout
 
 @node Top
-@top New features in 2.11 since 2.10
+@top New features in 2.12 since 2.10
 
 @ifhtml
 This document is also available in @uref{NEWS.pdf,PDF}. It is part of
@@ -64,16 +64,45 @@ which scares away people.
 
 @item
 Unbeamed 128th notes are now supported:
-@lilypond
+@lilypond[quote]
 \relative c'' {
   g128
 }
 @end lilypond
 
+@item
+Extending LilyPond's existing support for microtones, there are
+now arrowed accidentals for the notation of microtonal alterations.
+To use them, redefine the @code{glyph-name-alist} property of
+@code{Accidental} as in the following example which uses quartertones
+to typeset arrowed accidentals. Alternatively, it is possible to
+define separate names for all notes with arrowed accidentals (see
+@code{ly/makam.ly} for boilerplate code).
+
+@lilypond[quote]
+microAccs = #'((0 . "accidentals.natural")
+               (-1/2 . "accidentals.flat")
+               (1/2 . "accidentals.sharp")
+
+               (1 . "accidentals.doublesharp")
+               (-1 . "accidentals.flatflat")
+
+               (3/4 . "accidentals.sharp.arrowup")
+               (1/4 . "accidentals.sharp.arrowdown")
+               (-1/4 . "accidentals.flat.arrowup")
+               (-3/4 . "accidentals.flat.arrowdown"))
+
+\relative c'' {
+  #(set-accidental-style 'modern)
+  \override Accidental #'glyph-name-alist = #microAccs
+  geseh geh aih aisih
+}
+@end lilypond
+
 @item
 Straight flags (used in old scores of e.g. Bach, but also in different form in 
 modern scores of e.g. Stockhausen) are now implemented:
-@lilypond
+@lilypond[quote]
 \relative c'' {
   \override Stem #'flag = #modern-straight-flag
   c,16 \acciaccatura {c'8} d4 d32 
@@ -109,7 +138,7 @@ different @code{\paper} settings in different parts.
 @item
 Nested contexts of the same type are now allowed.
 This deprecates @code{InnerStaffGroup} and @code{InnerChoirStaff}.
-@lilypond[relative=1]
+@lilypond[quote,relative=1]
 \new StaffGroup <<
   \new Staff { c1 }
   \new StaffGroup <<
@@ -122,11 +151,11 @@ This deprecates @code{InnerStaffGroup} and @code{InnerChoirStaff}.
 @item
 Percent repeat counters can be shown at regular intervals using the
 context property @code{repeatCountVisibility}.
-@lilypond[relative=1]
+@lilypond[quote,relative=1]
 {
   \set countPercentRepeats = ##t
   \set repeatCountVisibility = #(every-nth-repeat-count-visible 2)
-  \repeat percent 8 { c4 d e f }
+  \repeat percent 6 { c4 d e f }
 }
 @end lilypond
 
@@ -134,7 +163,7 @@ context property @code{repeatCountVisibility}.
 In addition to the already existing @code{showLastLength} property,
 @code{showFirstLength} can now be set as well, rendering only the first
 measures of a piece.  Both properties may be set at the same time:
-@lilypond[]
+@lilypond[quote]
 showFirstLength = R1*2
 showLastLength = R1*3
 \relative c' { c1 d e f g a b c }
@@ -147,7 +176,7 @@ extension has been changed to @code{.mid}.
 
 @item
 Two variations on the default double repeat bar line are now available.
-@lilypond[]
+@lilypond[quote]
 {
   \set Score.doubleRepeatType = #":|.:"
   \repeat volta 2 {
@@ -165,7 +194,7 @@ Two variations on the default double repeat bar line are now available.
 Four automatic accidentals rules have been added: @code{neo-modern},
 @code{neo-modern-cautionary}, @code{dodecaphonic} and @code{teaching}.
 The following example illustrates @code{neo-modern} rule.
-@lilypond[]
+@lilypond[quote]
 notes = {
   <<
     \relative c' {
@@ -189,7 +218,7 @@ notes = {
 @item
 Flags can now be generated with Scheme-code using the @code{'flag}
 @code{Stem} grob property.  Existing scores will work without change.
-@lilypond[]
+@lilypond[quote]
 testnotes = {
   \autoBeamOff
   c'8 d'16 c''8 d''16
@@ -231,14 +260,14 @@ testnotes = {
 @item
 Harp pedalling diagrams were added:
 
-@lilypond[]
+@lilypond[quote]
 \markup { \harp-pedal #"^v-|vv-o^" }
 @end lilypond
 
 @item
 Predefined, user-configurable, transposable fret diagrams
 are now available in the @code{FretBoards} context:
-@lilypond[]
+@lilypond[quote]
 \include "predefined-guitar-fretboards.ly"
 <<
   \new ChordNames {
@@ -312,7 +341,7 @@ text strings.
 Metronome marks can now also contain a textual description.  The
 duration and count (if given) are shown in parentheses after the text.
 
-@lilypond[]
+@lilypond[quote]
 {
   \tempo "Fast"
   c'4 c' c' c'
@@ -333,14 +362,14 @@ duration and count (if given) are shown in parentheses after the text.
 In figured bass you can now also use a backslash through a number to
 indicate a raised 6th step.
 
-@lilypond[]
+@lilypond[quote]
 \new FiguredBass \figuremode { < 6\\ 5\\ > < 6/ > }
 @end lilypond
 
 @item
 Arpeggios may now use ``parenthesis'' style brackets:
 
-@lilypond[relative=1]
+@lilypond[quote,relative=1]
 \override Arpeggio #'stencil = #ly:arpeggio::brew-chord-slur
 
 % Note: does not work for cross-staff arpeggios.
@@ -421,7 +450,7 @@ their end points.  This includes glissando, voice followers, text
 crescendos and other text spanners.  The old syntax for setting
 text on line spanners is no longer valid.
 
-@lilypond[]
+@lilypond[quote]
 \relative c'' {
   \override Glissando #'(bound-details right text) = \markup { \center-align \bold down }
   \override Glissando #'(bound-details right Y) = #-4
@@ -446,7 +475,7 @@ The environment variable @code{LILYPONDPREFIX} has been renamed
 Notes or rests, such as a typical end note, that fill an entire
 measure are preceded by some more space.
 
-@lilypond[relative=1]
+@lilypond[quote,relative=1]
 \time 4/4
 s1
 c2. c4
@@ -464,7 +493,7 @@ Alterations (such as a sharp or flat) may now be arbitrary
 fractions.  This allows some forms of microtonal music.  For example,
 Turkish makam music uses 1/9th tone alterations.
 
-@lilypondfile{makam-example.ly}
+@lilypondfile[quote]{makam-example.ly}
 
 @item
 Tie directions may be set with @code{^~} and @code{_~}.
@@ -472,7 +501,7 @@ Tie directions may be set with @code{^~} and @code{_~}.
 @item
 Tablature now supports harmonics and slides:
 
-@lilypond[relative=1]
+@lilypond[quote,relative=1]
 \new TabVoice {
   <c g'\harmonic>4 d\2\glissando e2\2
 }
@@ -484,7 +513,7 @@ This feature was sponsored by Mike Amundsen
 Horizontal spacing now follows object outlines more accurately.
 This allows tighter horizontal spacing.
 
-@lilypond[]
+@lilypond[quote]
 {
   \stemUp
   c''4... ceses'! s16
@@ -495,7 +524,7 @@ This allows tighter horizontal spacing.
 Objects that belong outside of the staff are now positioned
 automatically to avoid collisions.
 
-@lilypond[relative=1]
+@lilypond[quote,relative=1]
 c''4
 \once \override TextScript #'self-alignment-X = #CENTER
 a,4^"this doesn't collide with the c"
@@ -508,7 +537,7 @@ a8\f
 Staves are spaced vertically using a skyline algorithm.  This helps
 prevent uneven vertical spacing.
 
-@lilypond[ragged-right]
+@lilypond[quote,ragged-right]
 
 %% todo: fix 'landscape PDF.
 #(set-default-paper-size "a6")
diff --git a/Documentation/topdocs/SConscript b/Documentation/topdocs/SConscript
deleted file mode 100644 (file)
index 7ef165c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'src_glob', 'install')
-
-tely = src_glob ('*.tely')
-texi = src_glob ('*.texi') + map (env.TEXI, tely)
-
-txt = map (env.TXT, texi)
-html = map (env.HTML, texi)
-
-env.Alias ('doc', txt)
-env.Alias ('doc', html)
-
-install (txt, env['sharedir_doc_package'])
index 9be5c023c37b811dd7640b7851e0ae5db028270d..22047d6fd67afbc47bcfb8f3aef26d1853d6c2ea 100644 (file)
@@ -38,7 +38,7 @@ translations.template.html.in; DO NOT EDIT !-->
   is finished.
 </p>
 
- <p><i>Last updated Sun Dec 28 01:18:10 UTC 2008
+ <p><i>Last updated Mon Jan  5 10:30:39 UTC 2009
 </i></p>
 <table align="center" border="2">
  <tr align="center">
@@ -65,7 +65,8 @@ translations.template.html.in; DO NOT EDIT !-->
  <tr align="left">
   <td>Preface<br>(411)</td>
   <td>Valentin Villenave<br>
-   <small>Ludovic Sardain</small><br>
+   <small>Ludovic Sardain<br>
+   Damien Heurtebise</small><br>
    <span style="background-color: #1fff1f">translated</span><br>
    <span style="background-color: #1fff1f">up to date</span><br>
   </td>
@@ -83,7 +84,8 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>Ludovic Sardain<br>
    John Mandereau<br>
    <small>Jean-Charles Malahieude<br>
-   Jean-Yves Baudais</small><br>
+   Jean-Yves Baudais<br>
+   Damien Heurtebise</small><br>
    <span style="background-color: #1fff1f">translated</span><br>
    <span style="background-color: #40fe23">partially up to date</span><br>
   </td>
@@ -136,14 +138,14 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
  </tr>
  <tr align="left">
-  <td>4 Tweaking output<br>(14647)</td>
+  <td>4 Tweaking output<br>(14775)</td>
   <td>Valentin Villenave<br>
    Nicolas Klutchnikoff<br>
    Damien Heurtebise<br>
    <small>Jean-Charles Malahieude<br>
    John Mandereau</small><br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #25fe1f">partially up to date</span><br>
   </td>
   <td>Till Rettig<br>
    <span style="background-color: #1fff1f">translated</span><br>
@@ -225,7 +227,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
  </tr>
  <tr align="left">
-  <td>1 Install<br>(1930)</td>
+  <td>1 Install<br>(1928)</td>
   <td>John Mandereau<br>
    <span style="background-color: #dfef77">partially translated (11 %)</span><br>
    <span style="background-color: #1fff1f">up to date</span><br>
@@ -244,7 +246,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>2 Setup<br>(1149)</td>
   <td>Jean-Charles Malahieude<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #d587ff"></span><br>
+   <span style="background-color: #1fff1f">up to date</span><br>
   </td>
   <td>Till Rettig<br>
    Reinhold Kainhofer<br>
@@ -288,7 +290,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>5 Converting from other formats<br>(1171)</td>
   <td>Jean-Charles Malahieude<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #d587ff"></span><br>
+   <span style="background-color: #1fff1f">up to date</span><br>
   </td>
   <td>Reinhold Kainhofer<br>
    <small>Till Rettig</small><br>
@@ -330,7 +332,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>John Mandereau<br>
    Jean-Charles Malahieude<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #2cff20">partially up to date</span><br>
   </td>
   <td>Till Rettig<br>
    <span style="background-color: #1fff1f">translated</span><br>
@@ -338,7 +340,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
   <td>Francisco Vila<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #2cff20">partially up to date</span><br>
   </td>
  </tr>
  <tr align="left">
@@ -359,7 +361,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
  </tr>
  <tr align="left">
-  <td>1.2 Rhythms<br>(5013)</td>
+  <td>1.2 Rhythms<br>(5236)</td>
   <td>Frédéric Chiasson<br>
    <small>Valentin Villenave<br>
    Jean-Charles Malahieude</small><br>
@@ -368,11 +370,11 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
   <td>Till Rettig<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #47ff24">partially up to date</span><br>
   </td>
   <td>Francisco Vila<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #47ff24">partially up to date</span><br>
   </td>
  </tr>
  <tr align="left">
@@ -428,11 +430,11 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
  </tr>
  <tr align="left">
-  <td>1.6 Staff notation<br>(1635)</td>
+  <td>1.6 Staff notation<br>(1701)</td>
   <td>Valentin Villenave<br>
    Jean-Charles Malahieude<br>
    <small>John Mandereau</small><br>
-   <span style="background-color: #dfef77">partially translated (70 %)</span><br>
+   <span style="background-color: #dfef77">partially translated (69 %)</span><br>
    <span style="background-color: #ff6f57">partially up to date</span><br>
   </td>
   <td>Till Rettig<br>
@@ -441,7 +443,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
   <td>Francisco Vila<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #25fe1f">partially up to date</span><br>
   </td>
  </tr>
  <tr align="left">
@@ -481,7 +483,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>John Mandereau<br>
    Jean-Charles Malahieude<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #2cff20">partially up to date</span><br>
   </td>
   <td>Till Rettig<br>
    <span style="background-color: #1fff1f">translated</span><br>
@@ -489,7 +491,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
   <td>Francisco Vila<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #2cff20">partially up to date</span><br>
   </td>
  </tr>
  <tr align="left">
@@ -614,7 +616,7 @@ translations.template.html.in; DO NOT EDIT !-->
   <td>2.8 Ancient notation<br>(4487)</td>
   <td>John Mandereau<br>
    Jean-Charles Malahieude<br>
-   <span style="background-color: #dfef77">partially translated (79 %)</span><br>
+   <span style="background-color: #dfef77">partially translated (82 %)</span><br>
    <span style="background-color: #ff6d58">partially up to date</span><br>
   </td>
   <td>Till Rettig<br>
@@ -640,7 +642,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
  </tr>
  <tr align="left">
-  <td>3 General input and output<br>(5805)</td>
+  <td>3 General input and output<br>(5873)</td>
   <td>Jean-Charles Malahieude<br>
    Valentin Villenave<br>
    <span style="background-color: #dfef77">partially translated (5 %)</span><br>
@@ -652,7 +654,7 @@ translations.template.html.in; DO NOT EDIT !-->
   </td>
   <td>Francisco Vila<br>
    <span style="background-color: #1fff1f">translated</span><br>
-   <span style="background-color: #1fff1f">up to date</span><br>
+   <span style="background-color: #25fe1f">partially up to date</span><br>
   </td>
  </tr>
  <tr align="left">
diff --git a/Documentation/user/SConscript b/Documentation/user/SConscript
deleted file mode 100644 (file)
index 5ef1efd..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-# -*-python-*-
-
-import os
-import string
-
-Import ('env', 'base_glob', 'src_glob')
-tely = base_glob ('*.tely')
-png = src_glob ('*.png') + map (env.EPS2PNG, base_glob ('*.eps'))
-
-# We need lily and mf to build these.
-env.Depends ('lilypond.texi', ['#/lily', '#/mf', '#/python'])
-env.Depends ('music-glossary.texi', ['#/lily', '#/mf', '#/python'])
-
-env.Depends ('lilypond.texi', 'lilypond-internals.texi')
-
-eps = src_glob ('*.eps') + map (env.PNG2EPS, base_glob ('*.png'))
-env.Depends ('lilypond.texi', eps + png)
-
-lilypond_book_flags = '''--format=$LILYPOND_BOOK_FORMAT --process="lilypond -I$srcdir/input/manual/ $__verbose --backend=eps --formats=ps,png --header=texidoc -dcheck-internal-types -ddump-signatures -danti-alias-factor=2 -dgs-load-fonts" '''
-e = env.Copy (
-#      LILYPOND_BOOK_FLAGS = '''--process="lilypond --backend=eps --formats=ps,png --header=texidoc -I#/input/manual -e '(ly:set-option (quote internal-type-checking) \#t)'"''',
-       LILYPOND_BOOK_FLAGS = lilypond_book_flags,
-       __verbose = ' --verbose',
-       GENERATE_DOCUMENTATION = '$srcdir/ly/generate-documentation',
-       ## TEXI2DVI_FLAGS = ['-I#Documentation/user'],
-       )
-
-e.Command ('lilypond-internals.texi', ['#/lily', '#/mf', '#/python'],
-          'cd ${TARGET.dir} && $LILYPOND $GENERATE_DOCUMENTATION')
-
-## FIXME: implicit steps from [TE]LY -> PDF
-texi = map (env.TEXI, tely)
-dvi = map (env.TEXIDVI, tely)
-ps = map (env.DVIPS, tely) ###map (lambda x: x + '.dvi', tely))
-dvipdf = map (env.DVIPDF, tely)
-pdf = map (env.PSPDF, dvipdf)
-
-# FIXME: install
-info = map (env.INFO, tely)
-
-def file_subst (file_name, find, subst):
-       s = open (file_name).read ()
-       t = string.replace (s, find, subst)
-       if s != t:
-               os.rename (file_name, file_name + '~')
-               h = open (file_name, "w")
-               h.write (t)
-               h.close ()
-
-e['usersrc'] = Dir ('.').srcnode ().abspath
-e['userout'] = Dir ('.').abspath
-
-a = ['$MAKEINFO -I$usersrc -I${SOURCE.dir} --html \
-     --css-include=$srcdir/Documentation/texinfo.css $__verbose \
-     --output=${TARGET.dir} $SOURCE',
-     'ln -f ${SOURCE.dir}/*.png ${SOURCE.dir}/*.ly ${TARGET.dir}/',]
-
-e.Command ('lilypond/index.html', 'lilypond.texi', a)
-e.Command ('lilypond-internals/index.html', 'lilypond-internals.texi', a)
-e.Command ('music-glossary/index.html', 'music-glossary.texi', a)
-
-a = ['$MAKEINFO -I$usersrc -I${SOURCE.dir} --html \
-     --no-split --no-headers \
-     --css-include=$srcdir/Documentation/texinfo.css $__verbose \
-     --output=$TARGET $SOURCE']
-
-e.Command ('lilypond.html', 'lilypond.texi', a)
-e.Command ('lilypond-internals.html', 'lilypond-internals.texi', a)
-e.Command ('music-glossary.html', 'music-glossary.texi', a)
-
-#Hmm -- why not just mv ./Documentation/{*,*/*} ./doc :-)
-env.Alias ('doc', texi)
-env.Alias ('doc', dvi)
-env.Alias ('doc', ps)
-env.Alias ('doc', pdf)
-
-env.Alias ('doc', 'lilypond/index.html')
-env.Alias ('doc', 'lilypond-internals/index.html')
-env.Alias ('doc', 'lilypond.html')
-env.Alias ('doc', 'lilypond-internals.html')
-
-# install ('lilypond/*', env['sharedir_doc_package'] + '/html')
-# install ('lilypond-user/*', env['sharedir_doc_package'] + '/html')
index 1e2773553622ea4f4a3d26335f4bc2d98bbcd59f..ec0748740e926c53154ec8e73e98f3ce2bba9f21 100644 (file)
@@ -195,7 +195,7 @@ staff, see @ref{Direction and placement}.
 {allowing-fingerings-to-be-printed-inside-the-staff.ly}
 
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
-{avoiding-collisions-of-chord-fingering-with-beams.ly}
+{avoiding-collisions-with-chord-fingerings.ly}
 
 
 @seealso
index 86dd7e4dff6da657222ccca8cd9dca3516b8d53c..e0003fc452866dbd7a4c957083ff0cdf0448d11c 100644 (file)
@@ -585,11 +585,8 @@ g4( e c2)
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
 {using-double-slurs-for-legato-chords.ly}
 
-@c TODO remove ignores after LSR update
-@ignore
 @lilypondfile[verbatim,lilyquote,texidoc,doctitle]
-{positioning-text-markups-inside-slurs}
-@end ignore
+{positioning-text-markups-inside-slurs.ly}
 
 @seealso
 Music Glossary:
index 251df4f3f1f6c267150be54071862d464fb73c6f..2ca609be5800857257ddf75a5f0e5581e6611d46 100644 (file)
@@ -59,15 +59,18 @@ Some other elements pertinent to fretted string instruments
 are covered elsewhere:
 
 @itemize
-@item Fingerings are indicated with @ref{Fingering instructions}.
+@item Fingerings are indicated as shown in @ref{Fingering instructions}.
 
 @item Instructions for @notation{Laissez vibrer} ties
-as well as ties on arpeggios and tremolos is described in
+as well as ties on arpeggios and tremolos can be found in
 @ref{Ties}.
 
-@item Instructions on handling multiple voices is described
+@item Instructions for handling multiple voices can be found
 in @ref{Collision resolution}.
 
+@item Instructions for indicating harmonics can be found in
+@ref{Harmonics}.
+
 @end itemize
 
 
index 355a3387461f6e0daa370bf2b4688eef3992c973..4c58135bae6a5a463b6116ae44c7a64d8f9c35d6 100644 (file)
@@ -2008,7 +2008,7 @@ should be enclosed in double quotation signs, as above, although we
 shall see later that text can actually be specified in a much more
 general way by using the very powerful @code{markup} command.
 
-@unnumberedsubsubsec Setting context properties with @code{\with}
+@subsubheading Setting context properties with @code{\with}
 
 @funindex \with
 @funindex with
@@ -2054,7 +2054,7 @@ value of the font size.  If it is later changed with @code{\set},
 this new default value may be restored with the
 @code{\unset fontSize} command.
 
-@unnumberedsubsubsec Setting context properties with @code{\context}
+@subsubheading Setting context properties with @code{\context}
 
 @cindex context properties, setting with \context
 @funindex \context
index c990b3ba4e3f4053ec02837f13d911effb575a1e..f290a3370ea920edaf490c524d935f1a0e6ec64c 100644 (file)
@@ -849,11 +849,19 @@ subdirectory called @file{parts} within the current directory, use
 @end example
 
 Files which are to be included can also contain @code{\include}
-statements of their own.  These second-level
+statements of their own.  By default, these second-level
 @code{\include} statements are not interpreted until they have
 been brought into the main file, so the file names they specify
 must all be relative to the directory containing the main file,
-not the directory containing the included file.
+not the directory containing the included file. However,
+this behavior can be changed by passing the option
+@code{-drelative-includes} option at the command line
+(or by adding @code{#(ly:set-option 'relative-includes #t)}
+at the top of the main input file). With @code{relative-includes}
+set, the path for each @code{\include} command will be taken
+relative to the file containing that command. This behavior is
+recommended and it will become the default behavior in a future
+version of lilypond.
 
 Files can also be included from a directory in a search path
 specified as an option when invoking LilyPond from the command
@@ -876,19 +884,21 @@ and in main.ly write
 
 Files which are to be included in many scores may be placed in
 the LilyPond directory @file{../ly}.  (The location of this
-directory is installation-dependent - see @rlearning{Other sources
-of information}).  These files can then be included simply by
-naming them on an @code{\include} statement.  This is how the
-language-dependent files like @file{english.ly} are included.
+directory is installation-dependent - see
+@rlearning{Other sources of information}).  These files can then
+be included simply by naming them on an @code{\include} statement.
+This is how the language-dependent files like @file{english.ly} are
+included.
 
 LilyPond includes a number of files by default when you start
 the program.  These includes are not apparent to the user, but the
 files may be identified by running @code{lilypond --verbose} from
 the command line.  This will display a list of paths and files that
 LilyPond uses, along with much other information.  Alternatively,
-the more important of these files are discussed in @rlearning{Other
-sources of information}.  These files may be edited, but changes to
-them will be lost on installing a new version of LilyPond.
+the more important of these files are discussed in
+@rlearning{Other sources of information}.  These files may be
+edited, but changes to them will be lost on installing a new
+version of LilyPond.
 
 Some simple examples of using @code{\include} are shown in
 @rlearning{Scores and parts}.
@@ -1230,7 +1240,7 @@ and as stand-alone text below the score:
   }
   \addlyrics { O \markup { \concat{ Ph \char ##x0153 be! } } }
 }
-\markup { "Copyright 2008" \char ##x00A9 }
+\markup { "Copyright 2008--2009" \char ##x00A9 }
 @end lilypond
 
 To enter the copyright sign in the copyright notice use:
@@ -1594,7 +1604,7 @@ The following items of notation are reflected in the MIDI output:
 
 @itemize
 @item Pitches
-@item Quarter tones (See @ref{Accidentals}. Rendering needs a
+@item Microtones (See @ref{Accidentals}. Rendering needs a
 player that supports pitch bend.)
 @item Chords entered as chord names
 @item Rhythms entered as note durations, including tuplets
@@ -1620,6 +1630,7 @@ The following items of notation have no effect on the MIDI output:
 @item Crescendi, decrescendi over a single note
 @item Tremolos entered with @q{@code{:}[@var{number}]}
 @item Figured bass
+@item Microtonal chords
 @end itemize
 
 
index 1b2f4df6ef293e379008871b3ed942c487702f63..d9e4d4396cb9fa8918ba12705b914e1b244954bd 100644 (file)
@@ -479,11 +479,11 @@ CVS; especially the following patch:
 For checking the coverage of the test suite, do the following
 
 @example
-./buildscripts/build-coverage.sh
+./scripts/auxiliar/build-coverage.sh
 @emph{# uncovered files, least covered first}
-python ./buildscripts/coverage.py  --summary out-cov/*.cc
+./scripts/auxiliar/coverage.py  --summary out-cov/*.cc
 @emph{# consecutive uncovered lines, longest first}
-python ./buildscripts/coverage.py  --uncovered out-cov/*.cc
+./scripts/auxiliar/coverage.py  --uncovered out-cov/*.cc
 @end example
 
 
index 5d9a1f859304980ebeff64387f63a6327085873b..64d635307e3c9454ee6d0d3b818d9edbcfbb93cb 100644 (file)
@@ -255,7 +255,7 @@ use the @code{line-width} music fragment option.
 Each snippet will call the following macros if they have been defined by
 the user:
 
-@itemize bullet
+@itemize @bullet
 @item @code{\preLilyPondExample} called before the music,
 
 @item @code{\postLilyPondExample} called after the music,
index a5a785ddc1b35846ac105ba427c8d097b698625b..cb0c89f1fccba85d76b04cc8998d4ddb239ff7a7 100644 (file)
@@ -58,7 +58,7 @@ This document is also available as a
 @author The LilyPond development team
 
 
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -75,7 +75,7 @@ For LilyPond version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -90,7 +90,7 @@ Free Documentation License''.
 @ifnottex
 This file documents GNU LilyPond for beginners.
 
-Copyright 1999--2008 by the authors
+Copyright 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
index b8ea62bd2b8537b850c3fe0bbad165afccfb1e0f..ba1722c39f5422485b26b95e1d3b04256fdf8564 100644 (file)
@@ -60,7 +60,7 @@ This document is also available as a
 @author The LilyPond development team
 
 
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -77,7 +77,7 @@ For LilyPond version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -92,7 +92,7 @@ Free Documentation License''.
 @ifnottex
 This file documents GNU LilyPond program usage.
 
-Copyright 1999--2008 by the authors
+Copyright 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
index e7681c56ba2b7a2e2885989c3871f4cba0050ec6..b0fd4ff3364f641346c860053546f9ab71b9f4b4 100644 (file)
@@ -94,7 +94,7 @@ This document is also available as a
 @titlefont{Notation Reference}
 @author The LilyPond development team
 
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -111,7 +111,7 @@ For LilyPond version @version{}
 @end titlepage
 
 @copying
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -126,7 +126,7 @@ Free Documentation License''.
 @ifnottex
 This file documents GNU LilyPond.
 
-Copyright 1999--2008 by the authors
+Copyright 1999--2009 by the authors
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
index 6e779da344fa7e4c63bcc796d68ec35cd327b559..4c70e2f6a16da5f84d4de1bf89509bc163b9b37e 100644 (file)
@@ -33,7 +33,7 @@
 @c Fixes by Jean-Pierre Coulon and `Dirk', alphabetized by last name, KK, 10/07
 @c Updates to the German translation by Till Rettig, 12/07
 
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
   Permission is granted to copy, distribute and/or modify this document
   under the terms of the GNU Free Documentation License, Version 1.1
@@ -163,7 +163,7 @@ The list is rather long ...
 @end ignore
 
 @*
-Copyright 1999--2008 by the authors
+Copyright 1999--2009 by the authors
 
   Permission is granted to copy, distribute and/or modify this document
   under the terms of the GNU Free Documentation License, Version 1.1
@@ -227,6 +227,7 @@ Languages in this order.
 * accidental::
 * adagio::
 * al niente::
+* alla breve::
 * allegro::
 * alteration::
 * alto::
@@ -290,6 +291,7 @@ Languages in this order.
 * crescendo::
 * cue-notes::
 * custos::
+* cut time::
 * D::
 * da capo::
 * dal niente::
@@ -394,6 +396,7 @@ Languages in this order.
 * lyrics::
 * major::
 * major interval::
+* maxima::
 * meantone temperament::
 * measure::
 * measure repeat::
@@ -402,6 +405,7 @@ Languages in this order.
 * melisma line::
 * melodic cadence::
 * mensural notation::
+* mensuration sign::
 * meter::
 * metronome::
 * metronome mark::
@@ -472,6 +476,7 @@ Languages in this order.
 * scordatura::
 * score::
 * second::
+* semibreve::
 * semitone::
 * seventh::
 * sextolet::
@@ -561,7 +566,6 @@ Languages in this order.
 @item FI: A, a
 @end itemize
 
-
 @seealso
 @ref{Pitch names}.
 
@@ -578,13 +582,13 @@ DK: ?,
 S: ?,
 FI: kahdelle.
 
-Abbreviated @notation{a2} or @notation{a 2}.
+Abbreviated @notation{a2} or @notation{a 2}.  In orchestral scores, @notation{a
+due} indicates that:
 
 @enumerate
 
-@item An indication in orchestral scores that a single part notated on a single
-staff that normally carries parts for two players (e.g. first and second oboes)
-is to be played by both players.
+@item A single part notated on a single staff that normally carries parts for
+two players (e.g. first and second oboes) is to be played by both players.
 
 @item Or conversely, that two pitches or parts notated on a staff that normally
 carries a single part (e.g. first violin) are to be played by different players,
@@ -592,9 +596,8 @@ or groups of players (@q{desks}).
 
 @end enumerate
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node accelerando
@@ -609,13 +612,12 @@ DK: accelerando,
 S: accelerando,
 FI: accelerando, kiihdyttäen.
 
-[Italian: @q{speed up, accelerate}.]
+[Italian: @q{speed up, accelerate}]
 
 Increase tempo
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node accent
@@ -632,9 +634,8 @@ FI: aksentti, korostus.
 
 The stress of one tone over others.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node accessory
@@ -647,12 +648,20 @@ None yet.
 @node acciaccatura
 @section acciaccatura
 
+ES: ?,
+I: acciaccatura,
+F: ?,
+D: ?,
+NL: ?,
+DK: ?,
+S: ?,
+FI: ?.
+
 A grace note which takes its time from the rest or note preceding the
 principal note to which it is attached. The acciaccatura is drawn as a
 small eighth note (quaver) with a line drawn through the flag and
 stem.
 
-
 @seealso
 @ref{appoggiatura}, @ref{grace notes}, @ref{ornament}.
 
@@ -675,17 +684,17 @@ An accidental alters a note by:
 
 @item Raising its pitch:
 @itemize
-@item A @notation{double sharp}, by two semitones (a whole tone)
-@item A @notation{sharp}, by one semitone
+@item By two semitones (a whole tone)—@notation{double sharp}
+@item By one semitone—@notation{sharp}
 @end itemize
 
 @item Lowering its pitch:
 @itemize
-@item A @notation{flat}, by one semitone
-@item A @notation{double flat}, by two semitones (a whole tone)
+@item By one semitone—@notation{flat}
+@item By two semitones (a whole tone)—@notation{double flat}
 @end itemize
 
-@item Canceling the effects of the key signature or previous accidentals.
+@item Or canceling the effects of the key signature or previous accidentals.
 @end itemize
 
 @lilypond[quote,notime]
@@ -717,7 +726,6 @@ An accidental alters a note by:
 }
 @end lilypond
 
-
 @seealso
 @ref{alteration}, @ref{semitone}, @ref{whole tone}.
 
@@ -734,7 +742,7 @@ DK: adagio,
 S: adagio,
 FI: adagio, hitaasti.
 
-[Italian: @q{comfortable, easy}.]
+[Italian: @q{comfortable, easy}]
 
 @itemize
 
@@ -746,7 +754,6 @@ of sonatas, symphonies, etc.
 
 @end itemize
 
-
 @seealso
 @ref{andante}, @ref{largo}, @ref{sonata}.
 
@@ -763,7 +770,7 @@ DK: ?,
 S: ?,
 FI: häviten olemattomiin.
 
-[Italian: @q{to nothing}.]  Used with @notation{decrescendo} to indicate
+[Italian: @q{to nothing}]  Used with @notation{decrescendo} to indicate
 that the sound should fade away to nothing.
 
 @notation{Al niente} is indicated by circling the tip of the hairpin:
@@ -790,9 +797,37 @@ Since one does not crescendo @emph{to} nothing, it is not correct to use
 @notation{al niente} with @notation{crescendo}.  Instead, one should use
 @emph{dal niente} (@notation{@b{from} nothing}).
 
+@seealso
+@ref{crescendo}, @ref{dal niente}, @ref{decrescendo}, @ref{hairpin}.
+
+
+@node alla breve
+@section alla breve
+
+ES: ?,
+I: ?,
+F: alla breve,
+D: ?,
+NL: ?,
+DK: ?,
+S: ?,
+FI: ?.
+
+[Italian: @q{on the breve}]  Twice as fast as the notation indicates.
+
+Also called @notation{in cut-time}.  The name derives from mensural notation,
+where the @notation{tactus} (or beat) is counted on the semibreve (the modern
+whole note).  Counting @q{on the breve} shifts the tactus to the next longest
+note value, which (in modern usage) effectively halves all note values.
+
+(In mensural notation, breves and semibreves can have a ternary relationship, in
+which case @notation{alla breve} means thrice (not twice) as fast.  In practice,
+this complication may not have mattered, since Gaffurius's system of multiplex
+proportions makes it easy to explicitly state which proportion is needed.)
 
 @seealso
-@ref{crescendo}, @ref{decrescendo}, @ref{hairpin}.
+@ref{breve}, @ref{hemiola}, @ref{mensural notation}, @ref{note value},
+@ref{proportion}, @ref{whole note}.
 
 
 @node allegro
@@ -807,9 +842,8 @@ DK: allegro,
 S: allegro,
 FI: allegro, nopeasti.
 
-[Italian: @q{cheerful}.]  Quick tempo.  Also used as a title for pieces in a quick
-tempo, especially the first and last movements of a sonata.
-
+[Italian: @q{cheerful}]  Quick tempo.  Also used as a title for pieces in a
+quick tempo, especially the first and last movements of a sonata.
 
 @seealso
 @ref{sonata}.
@@ -830,6 +864,7 @@ FI: muunnettu.
 An alteration is the modification, raising or lowering, of a note's
 pitch.  It is established by an accidental.
 
+@c TODO: add second meaning from mensural notation
 
 @seealso
 @ref{accidental}.
@@ -852,7 +887,6 @@ was a high male voice (hence the name), which by the use of falsetto
 reached the height of the female voice.  This type of voice is also
 known as countertenor.
 
-
 @seealso
 @ref{countertenor}.
 
@@ -871,7 +905,6 @@ FI: alttoavain.
 
 C clef setting middle C on the middle line of the staff.
 
-
 @seealso
 @ref{C clef}.
 
@@ -893,9 +926,8 @@ Denotes a range of pitches for a given voice in a part of music.  It may
 also denote the pitch range that a musical instrument is capable of playing.
 Sometimes anglicized to @emph{ambit} (pl. @emph{ambits}).
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node anacrusis
@@ -911,7 +943,7 @@ S: upptakt,
 FI: kohotahti.
 
 An anacrusis (also known as pickup or upbeat) is an incomplete measure
-of music before a section of music.  It also refers to the initial
+of music before a section of music. It also refers to the initial
 note(s) of a melody occurring in that incomplete measure.
 
 @lilypond[quote,relative=1]
@@ -924,7 +956,6 @@ bes4. a8 bes4 c
 f,2. \bar "||"
 @end lilypond
 
-
 @seealso
 @ref{measure}, @ref{meter}.
 
@@ -964,13 +995,12 @@ DK: andante,
 S: andante,
 FI: andante, käyden.
 
-[Italian: present participle of @emph{andare}, @q{to walk}.]
+[Italian: present participle of @emph{andare}, @q{to walk}]
 
 Walking tempo/character.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node appoggiatura
@@ -1031,9 +1061,8 @@ An appoggiatura may have more notes preceding the main note.
 >>
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node arpeggio
@@ -1048,7 +1077,7 @@ DK: arpeggio, akkordbrydning,
 S: arpeggio,
 FI: arpeggio, murtosointu.
 
-[Italian: @q{harp-like, played like a harp}.]
+[Italian: @q{harp-like, played like a harp}]
 
 @lilypond[quote,line-width=13\cm]
 \new PianoStaff <<
@@ -1081,9 +1110,8 @@ FI: arpeggio, murtosointu.
 >>
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node articulation
@@ -1102,9 +1130,8 @@ Articulation refers to notation which indicates how a note or notes
 should be played.  Slurs, accents, staccato, and legato are all
 examples of articulation.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node ascending interval
@@ -1121,9 +1148,8 @@ FI: nouseva intervalli.
 
 A distance between a starting lower note and a higher ending note.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node augmented interval
@@ -1138,7 +1164,6 @@ DK: forstørret interval,
 S: överstigande intervall,
 FI: ylinouseva intervalli.
 
-
 @seealso
 @ref{interval}.
 
@@ -1159,7 +1184,6 @@ FI: aika-arvojen pidentäminen.
 
 This is a placeholder for augmentation (wrt mensural notation).
 
-
 @seealso
 @ref{diminution}, @ref{mensural notation}.
 
@@ -1186,9 +1210,8 @@ emulate engraving. This required more skill than did engraving.
 
 @end itemize
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node B
@@ -1205,7 +1228,6 @@ None yet.
 @item FI: H, h
 @end itemize
 
-
 @seealso
 @ref{H}, @ref{Pitch names}
 
@@ -1213,7 +1235,6 @@ None yet.
 @node backfall
 @section backfall
 
-
 @seealso
 @ref{appoggiatura}.
 
@@ -1221,7 +1242,6 @@ None yet.
 @node bar
 @section bar
 
-
 @seealso
 @ref{measure}.
 
@@ -1243,7 +1263,6 @@ separates measures.  Used very infrequently during the Renaissance (mostly
 in secular music, or in sacred music to indicate congruences between parts
 in otherwise-unmetered music).
 
-
 @seealso
 @ref{measure}.
 
@@ -1264,7 +1283,6 @@ The male voice intermediate in pitch between the bass and the tenor.
 
 @c F: clef de troisième ligne dropped
 
-
 @seealso
 @ref{bass}, @ref{tenor}.
 
@@ -1283,7 +1301,6 @@ FI: baritoniavain.
 
 C or F clef setting middle C on the upper staff line.
 
-
 @seealso
 @ref{C clef}, @ref{F clef}.
 
@@ -1309,7 +1326,6 @@ double bass.
 
 @end itemize
 
-
 @seealso
 @ref{strings}.
 
@@ -1328,7 +1344,6 @@ FI: bassoavain.
 
 A clef setting with middle C on the first top ledger line.
 
-
 @seealso
 @ref{F clef}.
 
@@ -1355,7 +1370,6 @@ g32-"1/32"[ s g s g s g] s16
 g64-"1/64"[ s32 g64 s32 g64 s32 g64] s32
 @end lilypond
 
-
 @seealso
 @ref{feathered beam}.
 
@@ -1384,7 +1398,6 @@ g4 c b a | g1 \bar "||"
 g8 d' c | b c a | g4. \bar "||"
 @end lilypond
 
-
 @seealso
 @ref{time signature}.
 
@@ -1392,7 +1405,6 @@ g8 d' c | b c a | g4. \bar "||"
 @node beat repeat
 @section beat repeat
 
-
 @seealso
 @ref{percent repeat}.
 
@@ -1400,7 +1412,6 @@ g8 d' c | b c a | g4. \bar "||"
 @node bind
 @section bind
 
-
 @seealso
 @ref{tie}.
 
@@ -1461,9 +1472,8 @@ Angular brackets for connecting parts in an orchestral or choral score:
 >>
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node bracket
@@ -1478,7 +1488,6 @@ DK: ?,
 S: ?,
 FI: sulkumerkki.
 
-
 @seealso
 @ref{brace}
 
@@ -1499,9 +1508,8 @@ A family of blown musical instruments made of brass, all using a cup
 formed mouth piece.  The brass instruments commonly used in a symphony
 orchestra are trumpet, trombone, french horn, and tuba.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node breath mark
@@ -1518,7 +1526,6 @@ FI: hengitysmerkki.
 
 Indication of where to breathe in vocal and wind instrument parts.
 
-
 @seealso
 @ref{caesura}.
 
@@ -1527,28 +1534,29 @@ Indication of where to breathe in vocal and wind instrument parts.
 @section breve
 
 @itemize
-@item US: breve, double-whole note,
-@item ES: cuadrada, breve,
-@item I: breve,
-@item F: brève,
-@item D: Brevis,
-@item NL: brevis,
-@item DK: brevis,
-@item S: brevis,
-@item FI: brevis, kaksoiskokonuotti.
+@item US: breve, double-whole note
+@item ES: cuadrada, breve
+@item I: breve
+@item F: brève
+@item D: Brevis
+@item NL: brevis
+@item DK: brevis
+@item S: brevis
+@item FI: brevis, kaksoiskokonuotti
 @end itemize
 
-Note value twice as long as a whole note.  Mainly used in pre-1650 music. 
-The shortest note value generally used in white mensural notation, hence the
-name, which originally meant @q{of short duration}.
+Note value: twice the length of a @notation{whole note} (@notation{semibreve}).
+
+Mainly used in music from before 1650.  In mensural notation, it was a note
+of fairly short duration—hence the name, which is Latin for @q{short} or
+@q{of short duration}.
 
 @lilypond[quote,notime,relative=2]
 g\breve
 @end lilypond
 
-
 @seealso
-@ref{mensural notation}, @ref{note value}.
+@ref{mensural notation}, @ref{note value}, @ref{semibreve}.
 
 
 @node C
@@ -1565,7 +1573,6 @@ g\breve
 @item FI: C, c
 @end itemize
 
-
 @seealso
 @ref{Pitch names}.
 
@@ -1600,9 +1607,8 @@ lines.
 }
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node cadence
@@ -1617,7 +1623,6 @@ DK: kadence,
 S: kadens,
 FI: kadenssi, lopuke.
 
-
 @seealso
 @ref{harmonic cadence}, @ref{functional harmony}.
 
@@ -1640,9 +1645,8 @@ chance to exhibit their technical skill and -- not last -- their
 ability to improvise.  Since the middle of the 19th century, however,
 most cadenzas have been written down by the composer.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node caesura
@@ -1657,12 +1661,11 @@ DK: ?,
 S: ?,
 FI: välimerkki.
 
-[Latin: from the supine of @emph{caedere} @q{to cut down}.]
+[Latin: from the supine of @emph{caedere} @q{to cut down}]
 
 The break between two musical phrases, sometimes (but not always) marked by a
 rest or a breath mark.
 
-
 @seealso
 @ref{breath mark}.
 
@@ -1679,7 +1682,6 @@ DK: kanon,
 S: kanon,
 FI: kaanon, tarkka jäljittely.
 
-
 @seealso
 @ref{counterpoint}.
 
@@ -1700,7 +1702,6 @@ viritysjärjestelmässä.
 Logarithmic unit of measurement.  1@tie{}cent is 1/1200 of an octave
 (1/100 of an equally tempered semitone).
 
-
 @seealso
 @ref{equal temperament}, @ref{semitone}.
 
@@ -1708,7 +1709,6 @@ Logarithmic unit of measurement.  1@tie{}cent is 1/1200 of an octave
 @node central C
 @section central C
 
-
 @seealso
 @ref{middle C}.
 
@@ -1726,9 +1726,9 @@ S: ackord,
 FI: sointu.
 
 Three or more tones sounding simultaneously.  In traditional European music
-the base chord is a @emph{triad} consisting of two thirds.  @emph{Major}
+the base chord is a @emph{triad} consisting of two thirds. @emph{Major}
 (major + minor third) as well as @emph{minor} (minor + major third) chords
-may be extended with more thirds.  Four-tone @emph{seventh chords} and
+may be extended with more thirds. Four-tone @emph{seventh chords} and
 five-tone @emph{ninth} major chords are most often used as dominants
 (functional harmony).  Chords having no third above the lower notes to
 define their mood are a special case called @q{open chords}.  The lack of
@@ -1759,7 +1759,6 @@ minor.
 >>
 @end lilypond
 
-
 @seealso
 @ref{functional harmony}, @ref{interval}, @ref{inversion}, @ref{quality},
 @ref{third}.
@@ -1783,7 +1782,6 @@ A scale consisting of all 12 semitones.
 c1 cis d dis e f fis g gis a ais b c
 @end lilypond
 
-
 @seealso
 @ref{semitone}.
 
@@ -1802,7 +1800,6 @@ FI: kromatiikka.
 
 Using tones extraneous to a diatonic scale (minor, major).
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -1819,7 +1816,6 @@ DK: kirketoneart,
 S: kyrkotonart,
 FI: moodi, kirkkosävellaji.
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -1855,7 +1851,7 @@ pitches.  The three clef symbols in common use are:
     \musicglyph #"clefs.F"
     \strut
     \musicglyph #"clefs.C"
 }
+ }
 }
 @end lilypond
 
@@ -2043,7 +2039,6 @@ major chord.
 }
 @end lilypond
 
-
 @seealso
 @ref{C clef}, @ref{F clef}, @ref{G clef}.
 
@@ -2086,9 +2081,8 @@ pitch contained in the cluster would be notated as an ordinary note.
 \makeClusters { <c e>4 <b f'> <b g'> <c g>8 <f e> }
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node comma
@@ -2106,7 +2100,6 @@ FI: komma, korvinkuultava ero äänenkorkeudessa.
 Difference in pitch between a note derived from pure tuning and the
 same note derived from some other tuning method.
 
-
 @seealso
 @ref{didymic comma}, @ref{Pythagorean comma}, @ref{syntonic comma},
 @ref{temperament}.
@@ -2136,7 +2129,6 @@ FI: C-merkintä.
 4/4 time.  The symbol, which resembles a capital letter C, comes from
 mensural notation.
 
-
 @seealso
 @ref{mensural notation}, @ref{meter}.
 
@@ -2153,7 +2145,6 @@ DK: komplementærinterval,
 S: komplementärintervall (?),
 FI: täydentävä intervalli.
 
-
 @seealso
 @ref{inverted interval}.
 
@@ -2172,7 +2163,6 @@ FI: oktaavia laajempi intervalli.
 
 Intervals larger than an octave.
 
-
 @seealso
 @ref{interval}.
 
@@ -2192,7 +2182,6 @@ FI: kolmijakoinen tahtilaji.
 A meter that includes a triplet subdivision within the beat, such as
 6/8, 9/8, 12/8.
 
-
 @seealso
 @ref{meter}, @ref{simple meter}.
 
@@ -2248,7 +2237,6 @@ A time signature that additively combines two or more unequal meters, e.g.,
 }
 @end lilypond
 
-
 @seealso
 @ref{compound meter}, @ref{meter}, @ref{polymetric time signature}.
 
@@ -2317,7 +2305,6 @@ are, technically speaking, @emph{transposing instruments}:
 
 @end itemize
 
-
 @seealso
 @ref{transposing instrument}.
 
@@ -2343,7 +2330,6 @@ Progressing melodically by intervals of a second, as contrasted with
 g4 g g a | b2 a | g4 b a a | g1 \bar "||"
 @end lilypond
 
-
 @seealso
 @ref{disjunct movement}.
 
@@ -2360,7 +2346,6 @@ DK: konsonans,
 S: konsonans,
 FI: konsonanssi, sopusointi.
 
-
 @seealso
 @ref{harmony}.
 
@@ -2377,7 +2362,6 @@ DK: alt,
 S: alt,
 FI: kontra-altto.
 
-
 @seealso
 @ref{alto}.
 
@@ -2393,9 +2377,8 @@ music typesetters.
 
 @c Copying music required more skill than engraving.  Flagged for NPOV
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node counterpoint
@@ -2454,9 +2437,8 @@ has been one of the most popular polyphonic composition methods.
 >>
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node countertenor
@@ -2471,7 +2453,6 @@ DK: kontratenor,
 S: kontratenor, counter tenor,
 FI: kontratenori.
 
-
 @seealso
 @ref{contralto}.
 
@@ -2497,7 +2478,6 @@ Increasing volume.  Indicated by a rightwards opening horizontal wedge
 g4\< a b c | d1\! \bar "|."
 @end lilypond
 
-
 @seealso
 @ref{decrescendo}, @ref{hairpin}.
 
@@ -2517,9 +2497,8 @@ FI: vihjenuotit.
 In a separate part notes belonging to another part with the purpose of
 hinting when to start playing.  Usually printed in a smaller type.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node custos
@@ -2562,9 +2541,15 @@ they have survived only in special forms of musical notation such as the
 }
 @end lilypond
 
+@seealso
+No cross-references.
+
+
+@node cut time
+@section cut time
 
 @seealso
-None yet.
+@ref{alla breve}.
 
 
 @node D
@@ -2581,7 +2566,6 @@ None yet.
 @item FI: D, d
 @end itemize
 
-
 @seealso
 @ref{Pitch names}
 
@@ -2601,9 +2585,8 @@ FI: da capo, alusta.
 Abbreviated @notation{D.C.}.  Indicates that the piece is to be repeated from
 the beginning to the end or to a certain place marked @emph{fine}.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node dal niente
@@ -2618,10 +2601,9 @@ DK: ?,
 S: ?,
 FI: tyhjästä ilmaantuen.
 
-[Italian: @q{from nothing}.]  Used with @notation{crescendo} to indicate
+[Italian: @q{from nothing}]  Used with @notation{crescendo} to indicate
 that the sound should gradually increase from nothing.
 
-
 @seealso
 @ref{al niente}.
 
@@ -2655,9 +2637,8 @@ b4 a g2-\markup {
 \bar "|."
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node decrescendo
@@ -2680,7 +2661,6 @@ wedge (hairpin) or the abbreviation @notation{decresc.}.
 d4\> c b a | g1 \! \bar "|."
 @end lilypond
 
-
 @seealso
 @ref{crescendo}, @ref{diminuendo}, @ref{hairpin}.
 
@@ -2699,9 +2679,8 @@ FI: laskeva intervalli.
 
 A distance between a starting higher note and a lower ending note.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node diatonic scale
@@ -2716,7 +2695,7 @@ DK: diatonisk skala,
 S: diatonisk skala,
 FI: diatoninen asteikko.
 
-A scale consisting of 5@w{ }whole tones and 2@w{ }semitones (S).  Scales
+A scale consisting of 5@w{ }whole tones and 2@w{ }semitones (S). Scales
 played on the white keys of a piano keybord are diatonic.  These scales
 are sometimes called, somewhat inaccurately, @q{church modes}).
 
@@ -2816,7 +2795,7 @@ the 6th and 7th tone.
     c1 d
     e^"~~ S" f g a b^"~~ S" c
   }
 \lyrics {
+ \lyrics {
     Major
   }
 >>
@@ -2828,7 +2807,7 @@ the 6th and 7th tone.
     a1
     b^"~~ S" c d e^"~~ S" f g a
   }
 \lyrics {
+ \lyrics {
     "Ancient (or Natural) minor"
   }
 >>
@@ -2852,7 +2831,7 @@ the 6th and 7th tone.
     a1
     b^"~~ S" c d e fis gis^"~~ S" a
   }
-  \lyrics {
+   \lyrics {
     "Melodic minor ascending"
   }
 >>
@@ -2864,13 +2843,12 @@ the 6th and 7th tone.
     a1
     g! f!^"~~ S" e d c^"~~ S" b a
   }
-  \lyrics {
+   \lyrics {
     "Melodic minor descending"
   }
 >>
 @end lilypond
 
-
 @seealso
 @ref{semitone}, @ref{whole tone}.
 
@@ -2878,7 +2856,6 @@ the 6th and 7th tone.
 @node didymic comma
 @section didymic comma
 
-
 @seealso
 @ref{syntonic comma}.
 
@@ -2895,7 +2872,6 @@ DK: formindsket interval,
 S: förminskat intervall,
 FI: vähennetty intervalli.
 
-
 @seealso
 @ref{interval}.
 
@@ -2912,7 +2888,6 @@ DK: diminuendo,
 S: diminuendo,
 FI: diminuendo, hiljentyen.
 
-
 @seealso
 @ref{decrescendo}.
 
@@ -2931,7 +2906,6 @@ FI: aika-arvojen tihennys.
 
 This is a stub for diminution (@emph{wrt} mensural notation).
 
-
 @seealso
 @ref{augmentation}, @ref{mensural notation}.
 
@@ -2948,7 +2922,6 @@ DK: ?,
 S: ?,
 FI: suora.
 
-
 @seealso
 @ref{custos}.
 
@@ -2970,14 +2943,13 @@ with conjunct movement.
 
 @lilypond[quote,relative=1]
 \key a \major
-\time 4/4
-\partial 8 e8 |
-a4. gis8 b a e cis |
-fis2 d4.
-\bar "||"
+\time 4/4 {
+  \partial 8 e8 |
+  a4. gis8 b a e cis |
+  fis2 d4.
+  \bar "||" }
 @end lilypond
 
-
 @seealso
 @ref{conjunct movement}.
 
@@ -2987,7 +2959,6 @@ fis2 d4.
 
 Another name for @ref{dissonant interval}.
 
-
 @seealso
 @ref{dissonant interval}, @ref{harmony}.
 
@@ -3004,7 +2975,6 @@ DK: dissonerende interval, dissonans,
 S: dissonans,
 FI: dissonanssi, dissonoiva intervalli, riitasointi.
 
-
 @seealso
 @ref{harmony}.
 
@@ -3040,9 +3010,8 @@ section in a long antiphonal or responsorial chant.
 
 TODO: musical example here?
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node doit
@@ -3060,7 +3029,6 @@ FI: nousu.
 Indicator for a indeterminately rising pitch bend.  Compare with
 @emph{glissando}, which has determinate starting and ending pitches.
 
-
 @seealso
 @ref{fall}, @ref{glissando}.
 
@@ -3079,7 +3047,6 @@ FI: dominantti, huippusointu.
 
 The fifth @emph{scale degree} in @emph{functional harmony}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}.
 
@@ -3096,7 +3063,6 @@ DK: dominantnoneakkord,
 S: dominantnonackord,
 FI: dominanttinoonisointu.
 
-
 @seealso
 @ref{chord}, @ref{functional harmony}.
 
@@ -3113,7 +3079,6 @@ DK: dominantseptimakkord,
 S: dominantseptimackord,
 FI: dominanttiseptimisointu.
 
-
 @seealso
 @ref{chord}, @ref{functional harmony}.
 
@@ -3130,7 +3095,6 @@ DK: dorisk skala,
 S: dorisk tonart,
 FI: doorinen moodi.
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -3147,7 +3111,6 @@ DK: punkt,
 S: punkt,
 FI: piste.
 
-
 @seealso
 @ref{dotted note}, @ref{note value}.
 
@@ -3164,7 +3127,6 @@ DK: punkteret node,
 S: punkterad not,
 FI: pisteellinen nuotti.
 
-
 @seealso
 @ref{note value}.
 
@@ -3181,7 +3143,6 @@ DK: dobbelt forslag,
 S: dubbelslag,
 FI: kaksoisappogiatura, kaksoisetuhele.
 
-
 @seealso
 @ref{appoggiatura}.
 
@@ -3200,9 +3161,8 @@ FI: kaksoistahtiviiva.
 
 Indicates the end of a section within a movement.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node double dotted note
@@ -3217,7 +3177,6 @@ DK: dob@-belt@-punk@-te@-ret node,
 S: dub@-bel@-punk@-te@-rad not,
 FI: kaksoispisteellinen nuotti.
 
-
 @seealso
 @ref{note value}.
 
@@ -3234,7 +3193,6 @@ DK: dob@-belt-b,
 S: dubbelbe,
 FI: kaksoisalennusmerkki.
 
-
 @seealso
 @ref{accidental}.
 
@@ -3251,7 +3209,6 @@ DK: dob@-belt@-kryds,
 S: dubbelkors,
 FI: kaksoisylennysmerkki.
 
-
 @seealso
 @ref{accidental}.
 
@@ -3268,7 +3225,6 @@ DK: ?,
 S: ?,
 FI: kaksois-aika-arvomerkintä.
 
-
 @seealso
 @ref{polymetric time signature}.
 
@@ -3287,9 +3243,8 @@ FI: kaksoistrilli.
 
 A simultaneous trill on two notes, usually in the distance of a third.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node duple meter
@@ -3304,7 +3259,6 @@ DK: todelt takt,
 S: tvåtakt,
 FI: kaksoistempo.
 
-
 @seealso
 @ref{meter}.
 
@@ -3321,7 +3275,6 @@ DK: duol,
 S: duol,
 FI: duoli.
 
-
 @seealso
 @ref{note value}.
 
@@ -3338,7 +3291,6 @@ DK: varighed,
 S: tonlängd,
 FI: kesto, aika-arvo.
 
-
 @seealso
 @ref{note value}.
 
@@ -3359,7 +3311,6 @@ The aspect of music relating to degrees of loudness, or changes from
 one degree to another.  The terms, abbreviations, and symbols used to
 indicate this information are called dynamic marks.
 
-
 @seealso
 @ref{piano}, @ref{forte}, @ref{crescendo}, @ref{decrescendo},
 @ref{diminuendo}.
@@ -3379,7 +3330,6 @@ indicate this information are called dynamic marks.
 @item FI: E, e
 @end itemize
 
-
 @seealso
 @ref{Pitch names}
 
@@ -3387,7 +3337,6 @@ indicate this information are called dynamic marks.
 @node ecclesiastical mode
 @section ecclesiastical mode
 
-
 @seealso
 @ref{church mode}, @ref{diatonic scale}.
 
@@ -3407,7 +3356,6 @@ indicate this information are called dynamic marks.
 @item FI: kahdeksasosanuotti
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -3427,7 +3375,6 @@ indicate this information are called dynamic marks.
 @item FI: kahdeksasosatauko
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -3453,7 +3400,6 @@ The singing of several syllables on a single note.  Elision may be indicated
 by a lyric tie, which looks like (and serves the same function) as a musical
 tie.
 
-
 @seealso
 @ref{lyric tie}.
 
@@ -3461,7 +3407,6 @@ tie.
 @node embellishment
 @section embellishment
 
-
 @seealso
 @ref{ornament}.
 
@@ -3485,9 +3430,8 @@ drafting or engineering drawing, using similar tools.
 The traditional process of music printing is done through cutting in a
 plate of metal.  Now also the term for the art of music typesetting.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node enharmonic
@@ -3518,9 +3462,8 @@ names but equal pitch.
 >>
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node equal temperament
@@ -3538,7 +3481,6 @@ FI: tasavireinen.
 A tuning system that divides the octave into 12 equal semitones (each of
 which is precisely equal to 100 cents).
 
-
 @seealso
 @ref{cent}, @ref{semitone}, @ref{temperament}.
 
@@ -3566,7 +3508,6 @@ Performance indications concerning:
 
 @end itemize
 
-
 @seealso
 @ref{allegro}, @ref{andante}, @ref{crescendo}, @ref{forte}.
 
@@ -3621,7 +3562,6 @@ by the given number of octaves.
 
 @end itemize
 
-
 @seealso
 @ref{melisma}, @ref{sul G}, @ref{thorough bass}, @ref{octave mark},
 @ref{octave marking}.
@@ -3641,7 +3581,6 @@ by the given number of octaves.
 @item FI: F, f
 @end itemize
 
-
 @seealso
 @ref{Pitch names}
 
@@ -3690,7 +3629,6 @@ Double Bass).
 >>
 @end lilypond
 
-
 @seealso
 @ref{baritone clef}, @ref{strings}.
 
@@ -3710,7 +3648,6 @@ FI: lasku.
 Indicator for a indeterminately falling pitch bend.  Compare with
 @emph{glissando}, which has determinate starting and ending pitches.
 
-
 @seealso
 @ref{doit}, @ref{glissando}.
 
@@ -3732,7 +3669,6 @@ played at an increasing or decreasing tempo -- depending on the
 direction of @q{feathering} -- but without changing the overall tempo
 of the piece.
 
-
 @seealso
 Internals Reference: @ruser{Manual beams}
 
@@ -3759,9 +3695,8 @@ a4 b c2^\fermata
 \bar "|."
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node fifth
@@ -3776,7 +3711,6 @@ DK: kvint,
 S: kvint,
 FI: kvintti.
 
-
 @seealso
 @ref{interval}.
 
@@ -3833,7 +3767,6 @@ played above the bass notes.
 >>
 @end lilypond
 
-
 @seealso
 @ref{chord}, @ref{interval}.
 
@@ -3853,9 +3786,8 @@ FI: sormitus.
 Figures to the side or above the note that methodically indicate which
 fingers to use while playing a passage.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node flag
@@ -3880,7 +3812,6 @@ g32-"32nd" s8
 g64-"64th" s8
 @end lilypond
 
-
 @seealso
 @ref{note value}.
 
@@ -3910,7 +3841,6 @@ Also:
 
 @end itemize
 
-
 @seealso
 @ref{articulation}, @ref{harmonics}.
 
@@ -3927,7 +3857,6 @@ DK: b,
 S: beförtecken,
 FI: alennusmerkki.
 
-
 @seealso
 @ref{accidental}.
 
@@ -3935,7 +3864,6 @@ FI: alennusmerkki.
 @node forefall
 @section forefall
 
-
 @seealso
 @ref{appoggiatura}.
 
@@ -3952,7 +3880,7 @@ DK: forte,
 S: forte,
 FI: forte, voimakkaasti.
 
-[Italian: @q{loud}.]
+[Italian: @q{loud}]
 
 Abbreviated @notation{@b{f}}.  Variants include:
 
@@ -3961,9 +3889,8 @@ Abbreviated @notation{@b{f}}.  Variants include:
 @item @emph{fortissimo}, very loud (notated @notation{@b{ff}}).
 @end itemize
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node fourth
@@ -3978,7 +3905,6 @@ DK: kvart,
 S: kvart,
 FI: kvartti.
 
-
 @seealso
 @ref{interval}.
 
@@ -4004,7 +3930,6 @@ The specific rules for @q{frenching} a score differ from publisher to publisher.
 If you are producing scores for eventual publication by a commercial publisher,
 you may wish to procure a copy of their style manual.
 
-
 @seealso
 @ref{Frenched staff}.
 
@@ -4025,7 +3950,6 @@ FI: karsittu nuotinnus.
 Frenched staff has unneeded measures or sections removed.  This is useful
 for producing, for example, an @emph{ossia} staff.
 
-
 @seealso
 @ref{ossia}.
 
@@ -4048,7 +3972,6 @@ DK: fuga,
 S: fuga,
 FI: fuuga.
 
-
 @seealso
 @ref{counterpoint}.
 
@@ -4088,9 +4011,8 @@ TODO: what does the @q{p} mean in Sp, Dp, Tp?
 >>
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node G
@@ -4107,7 +4029,6 @@ None yet.
 @item FI: G, g
 @end itemize
 
-
 @seealso
 @ref{Pitch names}
 
@@ -4133,27 +4054,26 @@ part in modern choral scores).
 @lilypond[quote,notime]
 \relative c'' {
   \override Staff.Clef #'full-size-change = ##t
-  \set Score.proportionalNotationDuration = #(ly:make-moment 1 8)
-  \clef french
-  g1
-  \clef treble
-  g1
-  \clef "G^8"
-  g1
-  \clef "G_8"
-  g1
+    \set Score.proportionalNotationDuration = #(ly:make-moment 1 8)
+    \clef french
+    g1
+    \clef treble
+    g1
+    \clef "G^8"
+    g1
+    \clef "G_8"
+    g1
 }
 \addlyrics {
-  "french violin clef"
-  "violin clef"
-  "octave up"
-  "octave down"
-}
+    "french violin clef"
+    "violin clef"
+    "octave up"
+    "octave down"
+  }
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node glissando
@@ -4170,9 +4090,8 @@ FI: glissando, liukuen.
 
 Letting the pitch slide fluently from one note to the other.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node grace notes
@@ -4190,7 +4109,6 @@ FI: korunuotit.
 Notes printed in small types to indicate that their time values are not
 counted in the rhythm of the bar.
 
-
 @seealso
 @ref{acciaccatura}, @ref{appoggiatura}, @ref{grace notes},
 @ref{ornament}.
@@ -4210,7 +4128,6 @@ FI: kaksoisnuottiviivasto.
 
 A combination of two staves with a brace.  Usually used for piano music.
 
-
 @seealso
 @ref{brace}.
 
@@ -4229,15 +4146,13 @@ FI: grave, raskaasti.
 
 [Italian] Slow, solemn.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node gruppetto
 @section gruppetto
 
-
 @seealso
 @ref{turn}.
 
@@ -4260,7 +4175,6 @@ Letter name used for @notation{B natural} in German and Scandinavian
 usage.  In the standard usage of these countries, @notation{B} means
 @notation{B flat}.
 
-
 @seealso
 @ref{Pitch names}, @ref{B}.
 
@@ -4277,7 +4191,6 @@ c2\> c\<
 c1\!
 @end lilypond
 
-
 @seealso
 @ref{crescendo}, @ref{decrescendo}.
 
@@ -4297,7 +4210,6 @@ c1\!
 @item FI: puolinuotti.
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -4317,7 +4229,6 @@ c1\!
 @item FI: puolitauko.
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -4386,9 +4297,8 @@ For instruments of the violin family, there are two types of harmonics:
 natural harmonics, which are those played on the open string; and
 artificial harmonics, which are produced on stopped strings.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node harmony
@@ -4409,26 +4319,25 @@ categories @emph{consonances} and @emph{dissonances}.
 Consonances:
 
 @lilypond[quote,notime,relative=2,line-width=13.0\cm]
-<g g>1_"unison  " s
-<g b>_"third  " s
-<g c>_"fourth  " s
-<g d'>_"fifth  " s
-<g e'>_"sixth  " s
-<g g'>_"octave  " s
-<g b'>_"tenth" s s
+  <g g>1_"unison  " s
+  <g b>_"third  " s
+  <g c>_"fourth  " s
+  <g d'>_"fifth  " s
+  <g e'>_"sixth  " s
+  <g g'>_"octave  " s
+  <g b'>_"tenth" s s
 @end lilypond
 
 Dissonances:
 
 @lilypond[quote,notime,relative=2,line-width=13.0\cm]
-<g a>1_"second  " s s
-<g f'>_"seventh  " s s
-<g a'>_"ninth" s s
+  <g a>1_"second  " s s
+  <g f'>_"seventh  " s s
+  <g a'>_"ninth" s s
 @end lilypond
 
 For harmony that uses three or more notes, see @ref{chord}.
 
-
 @seealso
 @ref{chord}.
 
@@ -4475,7 +4384,6 @@ c1. \bar "||"
 
 and is therefore a polymeter (second definition) of considerable antiquity.
 
-
 @seealso
 @ref{mensural notation}, @ref{meter}, @ref{polymeter}, @ref{proportion}.
 
@@ -4495,10 +4403,10 @@ FI: homofonia, yksiäänisyys.
 Music in which one voice leads melodically supported by the other voices in
 the same rhythm (more or less).  In contrast to @emph{polyphony}.
 
-
 @seealso
 @ref{polyphony}.
 
+
 @node hymn meter
 @section hymn meter
 
@@ -4536,9 +4444,8 @@ easier reading, a hymn with a meter of 87.87.87.87 is usually written
 @item 88.88.88.88 is Double Long Meter (DLM or D.L.M.)
 @end itemize
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node interval
@@ -4553,70 +4460,64 @@ DK: interval,
 S: intervall,
 FI: intervalli, kahden sävelen korkeusero.
 
-Difference in pitch between two notes.  Intervals may be perfect, minor,
-major, diminished, or augmented.  The augmented fourth and the diminished
-fifth are identical (or @emph{enharmonic}) and are called @emph{tritonus}
-because they consist of three whole tones.  The addition of such two
-intervals forms an octave.
-
-@lilypond[quote,notime,line-width=13.0\cm]
-<<
-  \context Voice \relative c'' {
-    < g g >1
-    < g as >^"minor"
-    < g a! >
-    < g ais >^"augm"
-    < gis bes >^"dimin"
-    < g! bes >^"minor"
-    < g b! >^"major"
-    < g bis >^"augm"
-  }
-  \context Lyrics \lyrics {
-    "unison " "second " "second " "second "
-    "third  " "third " "third " "third"
-  }
->>
-@end lilypond
-
-@lilypond[quote,notime,line-width=13.0\cm]
-<<
-  \context Staff \relative c'' {
-    <g c >1^"perfect"
-    <g cis>^"aug"
-    <g d'>^"perfect"
-    <g des'> ^"dim"
-    <gis es'>^"dim"
-    <g! es'>^"minor"
-    <g e'!>^"major"
-    <g eis'>^"aug"
-  }
-   \lyrics {
-    "fourth  " "fourth  " "fifth  " "fifth  "
-    "sixth  " "sixth  " "sixth  " "sixth"
-  }
->>
-@end lilypond
+Difference in pitch between two notes.  Intervals may be diminished, minor,
+perfect, major, or augmented.  The augmented fourth and the diminished fifth are
+identical (or @emph{enharmonic}) and are called @emph{tritonus} because they
+consist of three whole tones.  The addition of such two intervals forms an
+octave.
 
 @lilypond[quote,notime,line-width=13.0\cm]
 <<
-  \context Staff \relative c'' {
-    <gis f'!>1^"dimin"
-    <g! f'!>^"minor"
-    <g fis'>^"major"
-    <g g'>
-    <g as'>^"minor"
-    <g a'!>^"major"
-    <g bes'>^"minor"
-    <g b'!>^"major"
-  }
-  \context Lyrics \lyrics {
-    "seventh " "seventh " "seventh " "octave "
-    "ninth " "ninth " "tenth " "tenth"
-  }
+\context Voice \relative c'' {
+% Prime or unison
+  < g g >1 
+  < g gis >^"aug"
+% Second
+  < gis as >^"dim"
+  < g! as >^"min" 
+  < g a! >^"maj"
+  < g ais >^"aug" 
+% Third
+  < gis bes >^"dim" 
+  < g! bes >^"min" 
+  < g b! >^"maj" 
+  < g bis >^"aug" 
+% Fourth
+  < g ces >^"dim" 
+  < g c! >^"per" 
+  < g cis >^"aug" 
+% Fifth
+  < g des' >^"dim"
+  < g d' >^"per"
+  < g dis >^"aug"
+% Sixth
+  < gis es' >^"dim"
+  < g! es' >^"min"
+  < g e'! >^"maj"
+  < g eis' >^"aug"
+% Seventh
+  < gis f'! >^"dim" 
+  < g! f'! >^"min" 
+  < g fis' >^"maj" 
+  < g fisis' >^"aug"
+% Octave
+  < g ges' >^"dim"
+  < g g' >^"per"
+  < g gis' >^"aug"
+}
+\context Lyrics \lyrics {
+  "unison " "unison "
+  "second " "second " "second " "second "
+  "third  " "third  " "third  " "third  "
+  "fourth " "fourth " "fourth "
+  "fifth  " "fifth  " "fifth  "
+  "sixth  " "sixth  " "sixth  " "sixth  "
+  "seventh" "seventh" "seventh" "seventh"
+  "octave " "octave " "octave "
+}
 >>
 @end lilypond
 
-
 @seealso
 @ref{enharmonic}, @ref{whole tone}.
 
@@ -4659,9 +4560,8 @@ marked as @notation{I6/4} or @notation{Ic}. Second inversion is the most
 unstable chord position.
 @end table
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node inverted interval
@@ -4684,9 +4584,8 @@ The difference between an interval and an octave.
 <g, c>_"fourth  " s s <g' c,>_"fifth  " s s \bar "||"
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node just intonation
@@ -4704,7 +4603,6 @@ FI: puhdas viritys.
 Tuning system in which the notes are obtained by adding and subtracting
 natural fifths and thirds.
 
-
 @seealso
 @ref{temperament}.
 
@@ -4724,7 +4622,6 @@ FI: tonaliteetti.
 According to the 12@w{ }tones of the @emph{chromatic scale} there are
 12@w{ }keys, one on@w{ }c, one on c-sharp, etc.
 
-
 @seealso
 @ref{chromatic scale}, @ref{key signature}.
 
@@ -4744,7 +4641,6 @@ FI: sävellajiosoitus.
 The sharps or flats appearing at the beginning of each staff indicating the
 key of the music.
 
-
 @seealso
 @ref{accidental}.
 
@@ -4761,12 +4657,11 @@ DK: ?,
 S: ?,
 FI: antaa väristä.
 
-[French: @q{Let vibrate}.]  Most frequently associated with harp
+[French: @q{Let vibrate}]  Most frequently associated with harp
 parts. Marked @notation{l.v.} in the score.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node largo
@@ -4801,7 +4696,6 @@ The seventh @emph{scale degree}, a @emph{semitone} below the tonic; so
 called because of its strong tendency to @q{lead up} (resolve upwards)
 to the tonic scale degree.
 
-
 @seealso
 @ref{scale degree}, @ref{semitone}.
 
@@ -4826,9 +4720,8 @@ s1
 c''1
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node legato
@@ -4864,7 +4757,6 @@ notes, unlike (b) @notation{leggiero} or @notation{non-legato}, (c)
 >>
 @end lilypond
 
-
 @seealso
 @ref{staccato}.
 
@@ -4872,7 +4764,6 @@ notes, unlike (b) @notation{leggiero} or @notation{non-legato}, (c)
 @node legato curve
 @section legato curve
 
-
 @seealso
 @ref{slur}, @ref{legato}.
 
@@ -4880,7 +4771,6 @@ notes, unlike (b) @notation{leggiero} or @notation{non-legato}, (c)
 @node leger line
 @section leger line
 
-
 @seealso
 @ref{ledger line}.
 
@@ -4906,7 +4796,6 @@ performance in the sense of articulation.  With the invention of the metric
 system of the white mensural notation, the need for ligatures to denote such
 patterns disappeared.
 
-
 @seealso
 @ref{mensural notation}.
 
@@ -4928,9 +4817,8 @@ A pond with lilies floating in it.
 
 Also, the name of a music typesetting program.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node line
@@ -4945,7 +4833,6 @@ DK: nodelinie,
 S: notlinje,
 FI: viiva, nuottiviiva.
 
-
 @seealso
 @ref{staff}.
 
@@ -4962,10 +4849,9 @@ DK: ?,
 S: ?,
 FI: kirjoitetussa äänenkorkeudessa.
 
-[Italian: @q{place}.]  Instruction to play the following passage at the
+[Italian: @q{place}]  Instruction to play the following passage at the
 written pitch.  Cancels octave mark (q.v.).
 
-
 @seealso
 @ref{octave mark}, @ref{octave marking}.
 
@@ -4982,7 +4868,6 @@ DK: langt forslag,
 S: långt förslag,
 FI: pitkä appoggiatura, pitkä etuhele.
 
-
 @seealso
 @ref{appoggiatura}.
 
@@ -5002,14 +4887,13 @@ FI: pitkä appoggiatura, pitkä etuhele.
 @item FI: longa.
 @end itemize
 
-Note value: double length of @notation{breve}.
+Note value: twice the length of a @notation{breve}.
 
 @lilypond[quote,notime,relative=2]
 \override NoteHead #'style = #'mensural
 g\longa g\breve
 @end lilypond
 
-
 @seealso
 @ref{breve}, @ref{note value}.
 
@@ -5028,7 +4912,6 @@ FI: sidonta sanoituksessa.
 
 @c TODO: add languages
 
-
 @seealso
 @ref{elision}.
 
@@ -5047,9 +4930,8 @@ FI: sanoitus.
 
 @c Definition?
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node major
@@ -5064,7 +4946,6 @@ DK: dur,
 S: dur,
 FI: duuri.
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -5081,11 +4962,34 @@ DK: stort interval,
 S: stort intervall,
 FI: suuri intervalli.
 
-
 @seealso
 @ref{interval}.
 
 
+@node maxima
+@section maxima
+
+ES: ?,
+I: ?,
+F: ?,
+D: ?,
+NL: ?,
+DK: ?,
+S: ?,
+FI: ?.
+
+Note value: twice the length of a @notation{longa}.
+
+The maxima is the largest duration in use during the 15th and 16th centuries.
+Like the longa, the maxima can be either two or three times as long as the
+@notation{longa} (called @notation{binary} and @notation{ternary},
+respectively).  By the late 15th century, most composers used the smaller
+proportion by default.
+
+@seealso
+@ref{Duration names notes and rests}, @ref{longa}, @ref{note value}.
+
+
 @node meantone temperament
 @section meantone temperament
 
@@ -5103,7 +5007,6 @@ fifth by 16@w{ }cents.  Due to the non-circular character of this
 temperament only a limited set of keys are playable.  Used for tuning
 keyboard instruments for performance of pre-1650 music.
 
-
 @seealso
 @ref{cent}, @ref{temperament}.
 
@@ -5124,7 +5027,6 @@ A group of beats (units of musical time) the first of which bears an accent.
 Such groups in numbers of two or more recur consistently throughout the
 composition and are separated from each other by bar lines.
 
-
 @seealso
 @ref{bar line}, @ref{beat}, @ref{meter}.
 
@@ -5132,7 +5034,6 @@ composition and are separated from each other by bar lines.
 @node measure repeat
 @section measure repeat
 
-
 @seealso
 @ref{percent repeat}.
 
@@ -5159,7 +5060,6 @@ mediant (variant tonic).
 
 @end itemize
 
-
 @seealso
 @ref{chord}, @ref{functional harmony}, @ref{relative key}.
 
@@ -5179,9 +5079,8 @@ FI: melisma, laulettavan tavun sävelkuvio.
 A melisma (Greek: plural @emph{melismata}) is a group of notes or tones sung
 on one syllable, especially as applied to liturgical chant.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node melisma line
@@ -5198,7 +5097,6 @@ DK: ?,
 S: ?,
 FI: melismaviiva.
 
-
 @seealso
 @ref{extender line}.
 
@@ -5206,7 +5104,6 @@ FI: melismaviiva.
 @node melodic cadence
 @section melodic cadence
 
-
 @seealso
 @ref{cadenza}.
 
@@ -5253,12 +5150,126 @@ colored) notes in the earlier notation.  ...
 
 TODO: add to definition (including summary info on proportional notation)
 
-
 @seealso
 @ref{augmentation}, @ref{diminution}, @ref{ligature}, @ref{proportion}.
 @c TODO: more cross-references?
 
 
+@node mensuration sign
+@section mensuration sign
+
+@c TODO: add languages
+
+ES: ?,
+I: ?,
+F: ?,
+D: ?,
+NL: ?,
+DK: ?,
+S: ?,
+FI: ?.
+
+The ancestor of the time signature, mensuration signs were used to indicate the
+relationship between two sets of note durations—specifically, the ratio of
+breves to semibreves (called @notation{tempus}), and of semibreves to minims
+(called @notation{prolatio}).
+
+Each ratio was represented with a single single sign, and was either
+three-to-one (ternary) or two-to-one (binary), as in modern music notation.
+Unlike modern music notation, the @emph{ternary} ratio was the preferred
+one—applied to the @emph{tempus}, it was called @emph{perfect}, and was
+represented by a complete circle; applied to the @emph{prolatio}, it was called
+@emph{major} and was represented by a dot in the middle of the sign.  The binary
+ratio applied to the @emph{tempus} was called @emph{imperfect}, and was
+represented by an incomplete circle; applied to @emph{prolatio}, it was called
+@emph{minor} and was represented by the lack of an internal dot.  There are four
+possible combinations, which can be represented in modern time signatures with
+and without reduction of note values.  (These signs are hard-coded in LilyPond
+with reduction.)
+
+@table @dfn
+@item perfect @emph{tempus} with major @emph{prolatio}
+Indicated by a complete circle with an internal dot.  In modern time signatures,
+this equals:
+@itemize
+@item 9/4, with reduction or
+@item 9/2, without reduction
+@end itemize
+
+@item perfect @emph{tempus} and minor @emph{prolatio}
+Indicated by a complete circle without an internal dot.  In modern time
+signatures, this equals:
+@itemize
+@item 3/2, with reduction or
+@item 3/1, without reduction
+@end itemize
+
+@item imperfect @emph{tempus} and major @emph{prolatio}
+Indicated by an incomplete circle with an internal dot.  In modern time
+signatures, this equals:
+@itemize
+@item 6/4, with reduction or
+@item 6/2, without reduction
+@end itemize
+
+@item imperfect @emph{tempus} and minor @emph{prolatio}
+Indicated by an incomplete circle without an internal dot.  In modern time
+signatures, this equals:
+@itemize
+@item 4/4, with reduction or
+@item 2/1, without reduction
+@end itemize
+@end table
+
+The last mensuration sign @emph{looks} like common-time because it @emph{is},
+with note values reduced from the original semibreve to a modern quarter note.
+Being doubly imperfect, this sign represented the (theoretically)
+least-preferred mensuration, but it was actually used fairly often.
+
+This system extended to the ratio of longer note values to each other:
+
+@itemize
+
+  @item maxima to longa, called:
+
+    @itemize
+
+      @item @notation{modus maximorum},
+      @item @notation{modus major}, or
+      @item @notation{maximodus})
+
+    @end itemize
+
+  @item longa to breve, called:
+
+    @itemize
+
+      @item @notation{modus longarum},
+      @item @notation{modus minor}, or
+      @item @notation{modus}
+
+    @end itemize
+
+@end itemize
+
+In the absence of any other indication, these modes were assumed to be
+binary.  The mensuration signs only indicated tempus and prolatio, so
+composers needed another way to indicate these longer ratios (called modes.
+Around the middle of the 15th century started to use groups of rests at the
+beginning of the staff, preceding the mensuration sign.
+
+
+Two mensuration signs have survived to the present day: the C-shaped sign,
+which originally designated @notation{tempus imperfectum} and
+@notation{prolatio minor} now stands for @notation{common time}; and the
+slashed C, which designated the same with @notation{diminution} now stands
+for @notation{cut-time} (essentially, it has not lost its original meaning).
+
+@seealso
+@ref{diminution}, @ref{proportion}, @ref{time signature}.
+@c TODO: more cross-references?
+
+
 @node meter
 @section meter
 
@@ -5373,7 +5384,6 @@ Simple quintuple meter (B. Marcello, 1686-1739):
 the source, with sharps in the accompaniment where the voice has flats and
 @emph{vice versa}.)
 
-
 Compound duple meter (unknown):
 
 @lilypond[quote,line-width=13.0\cm]
@@ -5411,7 +5421,6 @@ Compound quadruple meter (P. Yon, 1886-1943):
 
 TODO: add information from discussion on lilypond-user related to polymeter.
 
-
 @seealso
 @ref{accent}, @ref{hemiola}, @ref{note value}, @ref{time signature}
 
@@ -5436,7 +5445,6 @@ divisions, and patented it as a @q{metronome}.  The inevitable lawsuit that
 followed acknowledged Winkler as the creator, but by then Mälzel had already
 sold many of them, and people had taken to calling it a Mälzel Metronome.
 
-
 @seealso
 @ref{metronome mark}.
 
@@ -5457,7 +5465,6 @@ Exact tempo indication (in beats per minute).  Abbreviated @notation{M.M.} or
 @notation{MM}, which is short for Mälzels Metronom (or Mälzel's Mark,
 @emph{anglice}).
 
-
 @seealso
 @ref{metronome}
 
@@ -5465,7 +5472,6 @@ Exact tempo indication (in beats per minute).  Abbreviated @notation{M.M.} or
 @node metronomic indication
 @section metronomic indication
 
-
 @seealso
 @ref{metronome mark}
 
@@ -5482,7 +5488,7 @@ DK: ?,
 S: ?,
 FI: kohtalaisen, melko.
 
-[Italian: @q{medium}.]
+[Italian: @q{medium}]
 
 Used to qualify other indications, such as:
 
@@ -5504,9 +5510,8 @@ Used to qualify other indications, such as:
 
 @end itemize
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node mezzo-soprano
@@ -5523,7 +5528,6 @@ FI: mezzosopraano.
 
 The female voice between soprano and contralto.
 
-
 @seealso
 @ref{soprano}, @ref{contralto}.
 
@@ -5544,14 +5548,13 @@ First C below the 440 Hz A.
 
 @lilypond[quote,notime,relative=1]
 \override Staff.Clef #'full-size-change = ##t
-\clef bass c1 s
-\clef alto c s
-\clef treble c s
+  \clef bass c1 s
+  \clef alto c s
+  \clef treble c s
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node minor
@@ -5566,7 +5569,6 @@ DK: mol,
 S: moll,
 FI: molli.
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -5583,7 +5585,6 @@ DK: lille interval,
 S: litet intervall,
 FI: pieni intervalli.
 
-
 @seealso
 @ref{interval}.
 
@@ -5591,7 +5592,6 @@ FI: pieni intervalli.
 @node mixolydian mode
 @section mixolydian mode
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -5608,7 +5608,6 @@ DK: skala,
 S: modus, skala,
 FI: moodi, kirkkosävelasteikko.
 
-
 @seealso
 @ref{church mode}, @ref{diatonic scale}.
 
@@ -5629,9 +5628,8 @@ Moving from one @ref{key} to another.  For example, the second subject
 of a @ref{sonata form} movement modulates to the dominant key if the
 key is major and to the @ref{relative key} if the key is minor.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node mordent
@@ -5645,7 +5643,6 @@ DK: mordent,
 S: mordent,
 FI: mordent, korukuvio.
 
-
 @seealso
 @ref{ornament}.
 
@@ -5653,7 +5650,6 @@ FI: mordent, korukuvio.
 @node motif
 @section motif
 
-
 @seealso
 @ref{motive}.
 
@@ -5691,9 +5687,8 @@ theme or subject.
 }
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node movement
@@ -5708,13 +5703,11 @@ DK: sats,
 S: sats,
 FI: osa.
 
-Greater musical works like @ref{symphony} and @ref{sonata} most often
-consist of several -- more or less -- independent pieces called
-movements.
-
+Greater musical works like @ref{symphony} and @ref{sonata} most often consist of
+several -- more or less -- independent pieces called movements.
 
 @seealso
-None yet.
+No cross-references.
 
 
 @node multi-measure rest
@@ -5745,7 +5738,6 @@ R1*122
 a1
 @end lilypond
 
-
 @seealso
 @ref{longa}, @ref{breve}.
 
@@ -5762,7 +5754,6 @@ DK: op@-løsningstegn,
 S: återställningstecken,
 FI: palautusmerkki.
 
-
 @seealso
 @ref{accidental}.
 
@@ -5770,7 +5761,6 @@ FI: palautusmerkki.
 @node neighbor tones
 @section neighbor tones
 
-
 @seealso
 @ref{acciaccatura}, @ref{appoggiatura}, @ref{grace notes},
 @ref{ornament}.
@@ -5788,7 +5778,6 @@ DK: none,
 S: nona,
 FI: nooni.
 
-
 @seealso
 @ref{interval}.
 
@@ -5796,7 +5785,6 @@ FI: nooni.
 @node non-legato
 @section non-legato
 
-
 @seealso
 @ref{legato}.
 
@@ -5819,9 +5807,8 @@ which produces the sound.  However, a clear distinction between the terms tone
 and @ref{note} is strongly recommended.  Briefly, one sees a note,
 and hears a tone.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node note head
@@ -5842,7 +5829,6 @@ hollow or black heads with or without @notation{stems}, @notation{flags}, etc.
 For percussion instruments (often having no defined pitch) the note head may
 indicate the instrument.
 
-
 @seealso
 @ref{clef}, @ref{flag}, @ref{staff}, @ref{stem}.
 
@@ -5850,7 +5836,6 @@ indicate the instrument.
 @node note names
 @section note names
 
-
 @seealso
 @ref{Pitch names}
 
@@ -5867,11 +5852,17 @@ DK nodeværdi,
 S: notvärde,
 FI: nuotin aika-arvo.
 
-Note values (durations) are measured as fractions -- normally half -- of the
-next higher note value.  The longest duration in current use is the
-@emph{breve}, but sometimes (especially music from the Baroque or earlier) the
-double-length note value @emph{longa} or the quadruple-length note value
-@emph{maxima} are used.
+Note values (durations) are measured as fractions—in modern usage, one-half—of
+the next higher note value.  The longest duration in current use is the
+@notation{breve} (equal to two whole notes), but sometimes (especially in music
+dating from the Baroque era or earlier) the @notation{longa} (four whole notes)
+or @notation{maxima} (eight whole notes) may be found.
+
+As used in mensural notation, this fraction was more flexible: it could also
+be one-third the higher note value.  Composers indicated which proportions
+to use with various signs—two of which survive to the present day: the
+C-shaped sign for @notation{common time}, and the slashed C for
+@notation{alla breve} or @notation{cut-time}.
 
 @c TODO -- add maxima to this example, in a way that doesn't break it.
 
@@ -5893,8 +5884,10 @@ double-length note value @emph{longa} or the quadruple-length note value
   r16_"1/16" s16 r32_"1/32" s16 r64_"1/64" s32 }
 @end lilypond
 
-An augmentation dot after a note multiplies the duration by one and a
-half.  Another dot adds yet a fourth of the duration.
+An augmentation dot after a note increases its duration by half; a second dot
+increases it by half of the first addition (that is, by a fourth of the original
+duration).  More dots can be used to add further halved fractions of the
+original note value (1/8, 1/16, etc.), but they are not frequently encountered.
 
 @lilypond[quote,line-width=13.0\cm]
 \relative c'' {
@@ -5926,15 +5919,13 @@ dotted notes are also frequently used.
 }
 @end lilypond
 
-
 @seealso
-None yet.
+@ref{common time}.
 
 
 @node octavation
 @section octavation
 
-
 @seealso
 @ref{octave marking}.
 
@@ -5956,7 +5947,6 @@ The interval of an octave, sometimes abbreviated @notation{8ve}.
 For uses like @notation{all'ottava} or @notation{8va} with an extender line or
 bracket, or @notation{loco} see octave marking.
 
-
 @seealso
 @ref{interval}, @ref{octave marking}.
 
@@ -6008,11 +5998,10 @@ To parallel the list above:
 In the phrases above, @notation{quindicesima} is sometimes replaced with
 @notation{quindecima}, which is Latin.
 
-Finally, the music on an entire staff can be marked to be played in a
-different octave by putting a small 8 or 15 above or below the clef at the
-beginning.  This octave mark can be applied to any clef, but it is most
-frequently used with the G and F clefs.
-
+The music on an entire staff can be marked to be played in a different octave by
+putting a small 8 or 15 above or below the clef at the beginning.  This octave
+mark can be applied to any clef, but it is most frequently used with the G and F
+clefs.
 
 @seealso
 @ref{F clef}, @ref{G clef}, @ref{loco}, @ref{octave marking}.
@@ -6037,7 +6026,6 @@ octave.
 
 For a list of the specific marks used, see @ref{octave mark}.
 
-
 @seealso
 @ref{interval}, @ref{loco}, @ref{octave}, @ref{octave mark}.
 
@@ -6045,7 +6033,6 @@ For a list of the specific marks used, see @ref{octave mark}.
 @node octave sign
 @section octave sign
 
-
 @seealso
 @ref{octave mark}.
 
@@ -6104,7 +6091,6 @@ the
 >>
 @end lilypond
 
-
 @seealso
 @ref{acciaccatura}, @ref{appoggiatura}, @ref{grace notes}.
 
@@ -6125,9 +6111,8 @@ Ossia (otherwise) marks an alternative.  It is an added staff or piano
 score, usually only a few measures long, which presents another version
 of the music, for example for small hands.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node part
@@ -6152,7 +6137,6 @@ web.
 
 @end itemize
 
-
 @seealso
 @ref{counterpoint}
 
@@ -6160,7 +6144,6 @@ web.
 @node pause
 @section pause
 
-
 @seealso
 @ref{fermata}.
 
@@ -6168,7 +6151,6 @@ web.
 @node pennant
 @section pennant
 
-
 @seealso
 @ref{flag}.
 
@@ -6192,12 +6174,11 @@ pattern to one or more measures.  There are other names for this symbol:
 
 @lilypond[quote,relative=2,line-width=13.0\cm]
 \time 4/4
-\repeat percent 4 { c4_"Beat (or slash) repeat" }
-\repeat percent 2 { c4 e g b_"Measure repeat" }
-\repeat percent 2 { c,2 es | f4 fis g c_"Multi-measure repeat" | }
+  \repeat percent 4 { c4_"Beat (or slash) repeat" }
+  \repeat percent 2 { c4 e g b_"Measure repeat" }
+  \repeat percent 2 { c,2 es | f4 fis g c_"Multi-measure repeat" | }
 @end lilypond
 
-
 @seealso
 @ref{repeat},
 @uref{http://www.music.vt.edu/musicdictionary/textr/Repeat.html,University of
@@ -6222,9 +6203,8 @@ kettledrums (I: @emph{timpani}, D: @emph{Pauken}), snare drum, bass drum,
 tambourine, cymbals, chinese gong (tam-tam), triangle, celesta, glockenspiel,
 and xylophone.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node perfect interval
@@ -6239,7 +6219,6 @@ DK: rent interval,
 S: rent intervall,
 FI: puhdas intervalli.
 
-
 @seealso
 @ref{interval}.
 
@@ -6258,7 +6237,6 @@ FI: fraasi, lause.
 
 A natural division of the melodic line, comparable to a sentence of speech.
 
-
 @seealso
 @ref{caesura}.
 
@@ -6278,7 +6256,6 @@ FI: fraseeraus, jäsentäminen.
 The clear rendering in musical performance of the @notation{phrases} of the
 melody.  Phrasing may be indicated by a @notation{slur}.
 
-
 @seealso
 @ref{phrase}, @ref{slur}.
 
@@ -6298,9 +6275,8 @@ FI, piano, hiljaa.
 @emph{piano} (@b{p}) soft, @emph{pianissimo} (@b{pp}) very soft,
 @emph{mezzo piano} (@b{mp}) medium soft.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node pickup
@@ -6315,7 +6291,6 @@ DK: optakt,
 S: upptakt,
 FI: kohotahti.
 
-
 @seealso
 @ref{anacrusis}.
 
@@ -6345,7 +6320,6 @@ association of a particular frequency with a particular pitch name, e.g., c' =
 
 @end enumerate
 
-
 @seealso
 @ref{Pitch names}.
 
@@ -6365,9 +6339,8 @@ FI: pizzicato, näppäillen.
 A technique for stringed instruments, abbr. @emph{pizz}.  To play by plucking
 the strings.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node polymeter
@@ -6391,7 +6364,6 @@ parts.
 
 @end itemize 
 
-
 @seealso
 @ref{polymetric} (adj.)
 
@@ -6411,7 +6383,6 @@ FI: monia tahtiosoituksia yhtäaikaa tai peräkkäin sisältävä.
 Characterized by @emph{polymeter}: using two or more metric frameworks
 simultaneously or in alternation.
 
-
 @seealso
 @ref{polymeter} (noun)
 
@@ -6430,7 +6401,6 @@ FI: vaihtelevan tahtiosoitusmerkintä.
 
 A time signature that indicates regularly alternating polymetric time.
 
-
 @seealso
 @ref{polymetric}.
 
@@ -6450,7 +6420,6 @@ FI: polyfonia, moniäänisyys.
 Music written in a combination of several simultaneous voices (parts)
 of a more or less pronounced individuality.
 
-
 @seealso
 @ref{counterpoint}.
 
@@ -6464,7 +6433,6 @@ A stroke in which each of several notes is separated slightly within a slur,
 without changing the bow's direction. It is used for passages of a
 @notation{cantabile} character.
 
-
 @seealso
 @ref{legato}.
 
@@ -6486,9 +6454,8 @@ FI: presto, hyvin nopeasti.
 Very quick, i.e., quicker than @ref{allegro}; @emph{prestissimo}
 denotes the highest possible degree of speed.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node proportion
@@ -6503,7 +6470,7 @@ DK: ?,
 S: ?,
 FI: suhde.
 
-[Latin: @emph{proportio}.] Described in great detail by Gaffurius, in
+[Latin: @emph{proportio}] Described in great detail by Gaffurius, in
 @emph{Practica musicae} (published in Milan in 1496).  In mensural notation,
 proportion is:
 
@@ -6522,8 +6489,8 @@ The most common proportions are:
 
 @itemize
 @item 2:1 (or simply 2), expressed by a vertical line through the
-mensuration sign (the origin of the @q{cut-time} time signature), or by
-turning the sign backwards
+mensuration sign (the origin of the @notation{alla breve} time signature),
+or by turning the sign backwards
 @item 3:1 (or simply 3)
 @item 3:2 (@emph{sesquialtera})
 @end itemize
@@ -6590,7 +6557,6 @@ another question:
 
 @c TODO: add an example or two.  O => 4/3, and its modern equivalent
 
-
 @seealso
 @ref{mensural notation}.
 
@@ -6616,7 +6582,6 @@ on C eventually circles back to C.  However, this C is 23.5 @ref{cent}s higher
 than the C obtained by adding 7 octaves.  The difference between those two
 pitches is the Pythagorean comma.
 
-
 @seealso
 @ref{cent}, @ref{temperament}.
 
@@ -6633,7 +6598,6 @@ DK: kvartol,
 S: kvartol,
 FI: kvartoli.
 
-
 @seealso
 @ref{note value}.
 
@@ -6683,7 +6647,6 @@ indications are sometimes superscripted and sometimes not (e.g. Dm7, Dm^7,
 and D^m7 are all identical). The last three chords are not commonly used
 except in jazz.
 
-
 @seealso
 @ref{chord}.
 
@@ -6703,7 +6666,6 @@ except in jazz.
 @item FI: neljäsosanuotti
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -6723,7 +6685,6 @@ except in jazz.
 @item FI: neljäsosatauko
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -6742,7 +6703,6 @@ FI: neljännessävelaskel.
 
 An interval equal to half a semitone.
 
-
 @seealso
 @ref{interval}
 
@@ -6759,7 +6719,6 @@ DK: kvintol,
 S: kvintol,
 FI: kvintoli.
 
-
 @seealso
 @ref{note value}.
 
@@ -6778,7 +6737,6 @@ FI: rallerdando, hidastuen.
 
 [Italian] A performance indication, abbreviated "rall.".
 
-
 @seealso
 @ref{ritardando}.
 
@@ -6809,7 +6767,6 @@ c1_"c minor" d es f g a! b! c
 \bar "||"
 @end lilypond
 
-
 @seealso
 @ref{key}, @ref{key signature}, @ref{major}, @ref{minor}.
 
@@ -6837,9 +6794,8 @@ FI: toisto.
 }
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node rest
@@ -6857,7 +6813,6 @@ FI: tauko.
 @c F: 'pause' if you mean a whole rest, 'silence' if you do not want to
 @c     specify the rest's value.
 
-
 @seealso
 @ref{note value}.
 
@@ -6890,9 +6845,8 @@ metrical unit (beat).
 
 @end itemize
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node ritardando
@@ -6909,9 +6863,8 @@ FI: ritardando, hidastuen,
 
 Gradually slackening in speed.  Mostly abbreviated to rit.@: or ritard.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node ritenuto
@@ -6928,9 +6881,8 @@ FI: ritenuto, hidastaen.
 
 Immediate reduction of speed.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node scale
@@ -6945,7 +6897,6 @@ DK: Skala,
 S: skala,
 FI: asteikko, sävelasteikko.
 
-
 @seealso
 @ref{diatonic scale}.
 
@@ -6978,7 +6929,6 @@ scale as roots of chords.  The most important are degrees I = tonic
 >>
 @end lilypond
 
-
 @seealso
 @ref{functional harmony}.
 
@@ -6995,7 +6945,7 @@ DK: ?,
 S: ?,
 FI: epätavallinen viritys.
 
-[Italian: @emph{scordare}, @q{to mistune}.]  Unconventional
+[Italian: @emph{scordare}, @q{to mistune}]  Unconventional
 tuning of stringed instruments, particularly lutes or violins.  Used
 to:
 
@@ -7019,9 +6969,8 @@ available on open strings
 Tunings that could be called @var{scordatura} first appeared early in
 the 16th Century and became commonplace in the 17th.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node score
@@ -7040,9 +6989,8 @@ A copy of orchestral, choral, or chamber music showing what each
 instrument is to play, each voice to sing, having each part arranged
 one underneath the other on different staves @ref{staff}.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node second
@@ -7057,14 +7005,36 @@ DK: sekund,
 S: sekund,
 FI: sekunti.
 
-The @ref{interval} between two neighboring tones of a scale.  A
-@ref{diatonic scale} consists of alternating @ref{semitone}s and
-@ref{whole tone}s, hence the size of a second depends on the scale
-degrees in question.
+The interval between two neighboring tones of a scale.  A diatonic scale
+consists of alternating semitones and whole tones, hence the size of a
+second depends on the scale degrees in question.
+
+@seealso
+@ref{diatonic scale}, @ref{interval}, @ref{semitone}, @ref{whole tone}.
+
+
+@node semibreve
+@section semibreve
+
+@itemize
+@item US: whole note,
+@item ES: redonda,
+@item I: semibreve,
+@item F: ronde,
+@item D: Ganze, ganze Note,
+@item NL: hele noot,
+@item DK: helnode,
+@item S: helnot,
+@item FI: kokonuotti.
+@end itemize
+
+Note value: called @notation{whole note} in the US.
 
+The semibreve is the basis for the @notation{tactus} in mensural notation
+(i.e. music written before ca. 1600).
 
 @seealso
-None yet.
+@ref{mensural notation}, @ref{note value}.
 
 
 @node semitone
@@ -7080,7 +7050,7 @@ S: halvton,
 FI: puolisävel.
 
 The interval of a minor second.  The (usually) smallest interval in European
-composed music.  The interval between two neighbouring tones on the piano
+composed music.  The interval between two neighboring tones on the piano
 keyboard -- including black and white keys -- is a semitone.  An octave may
 be divided into 12@w{ }semitones.
 
@@ -7088,7 +7058,6 @@ be divided into 12@w{ }semitones.
 g1 gis s a bes s b! c
 @end lilypond
 
-
 @seealso
 @ref{interval}, @ref{chromatic scale}.
 
@@ -7105,7 +7074,6 @@ DK: septim,
 S: septim,
 FI: septimi.
 
-
 @seealso
 @ref{interval}.
 
@@ -7113,7 +7081,6 @@ FI: septimi.
 @node sextolet
 @section sextolet
 
-
 @seealso
 @ref{sextuplet}, @ref{note value}.
 
@@ -7130,7 +7097,6 @@ DK: sekstol,
 S: sextol,
 FI: sekstoli.
 
-
 @seealso
 @ref{note value}.
 
@@ -7138,7 +7104,6 @@ FI: sekstoli.
 @node shake
 @section shake
 
-
 @seealso
 @ref{trill}.
 
@@ -7155,7 +7120,6 @@ DK: kryds,
 S: kors@-förtecken,
 FI: korotusmerkki.
 
-
 @seealso
 @ref{accidental}.
 
@@ -7172,11 +7136,10 @@ DK: ?,
 S: ?,
 FI: samoin.
 
-[Italian: @q{in the same manner}.] Performance direction: the music thus marked
+[Italian: @q{in the same manner}] Performance direction: the music thus marked
 is to be played in the same manner (i.e. with the same articulations, dynamics,
 etc.) as the music that precedes it.
 
-
 @seealso
 TODO: Where else could I refer the reader?
 
@@ -7196,7 +7159,6 @@ FI: kaksijakoinen tahtiosoitus.
 A meter in which the basic beat is subdivided in two: that is, a meter
 that does not include triplet subdivision of the beat.
 
-
 @seealso
 @ref{compound meter}, @ref{meter}.
 
@@ -7216,7 +7178,6 @@ that does not include triplet subdivision of the beat.
 @item FI: kuudestoistaosanuotti
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -7236,7 +7197,6 @@ that does not include triplet subdivision of the beat.
 @item FI: kuudestoistaosatauko
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -7253,7 +7213,6 @@ DK: sekst,
 S: sext,
 FI: seksti.
 
-
 @seealso
 @ref{interval}.
 
@@ -7273,7 +7232,6 @@ FI: seksti.
 @item FI: kuudeskymmenesneljäsosanuotti
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -7293,7 +7251,6 @@ FI: seksti.
 @item FI: kuudeskymmenesneljäsosatauko
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -7301,7 +7258,6 @@ FI: seksti.
 @node slash repeat
 @section slash repeat
 
-
 @seealso
 @ref{percent repeat}.
 
@@ -7322,9 +7278,8 @@ A slur above or below a group of notes indicates that they are to be
 played @ref{legato}, e.g., with one stroke of the violin bow or with
 one breath in singing.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node solmization
@@ -7344,7 +7299,6 @@ General term for systems of designating the degrees of the
 @emph{re}, @emph{mi}, @emph{fa}, @emph{sol}, @emph{la}, @emph{si}
 (@emph{ti})).
 
-
 @seealso
 @ref{scale}, @ref{scale degree}.
 
@@ -7366,9 +7320,8 @@ composition for piano or for some other instrument with piano
 accompaniment, which consists of three or four independant pieces,
 called movements.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node sonata form
@@ -7396,7 +7349,6 @@ of these two.  The second theme is in another key, normally in the key of the
 @notation{dominant} if the @notation{tonic} is @notation{major}, and in the
 @notation{relative key} if the tonic is @notation{minor}.
 
-
 @seealso
 @ref{dominant}, @ref{major}, @ref{minor}, @ref{relative key}, @ref{sonata},
 @ref{symphony}, @ref{tonic}.
@@ -7405,7 +7357,6 @@ of these two.  The second theme is in another key, normally in the key of the
 @node song texts
 @section song texts
 
-
 @seealso
 @ref{lyrics}.
 
@@ -7424,9 +7375,8 @@ FI: sopraano, korkea naisääni.
 
 The highest female voice.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node staccato
@@ -7447,15 +7397,14 @@ below the note head.
 @lilypond[quote,relative=2]
 \key d \major
 \time 4/4
-\partial 8 a8 |
-d4-\staccato cis-\staccato b-\staccato cis-\staccato |
-d2.
-\bar "||"
+  \partial 8 a8 |
+  d4-\staccato cis-\staccato b-\staccato cis-\staccato |
+  d2.
+  \bar "||"
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node staff
@@ -7476,15 +7425,13 @@ lines upon and between which the musical notes are written, thus
 indicating (in connection with a @ref{clef}) their pitch.  Staves for
 @ref{percussion} instruments may have fewer lines.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node staves
 @section staves
 
-
 @seealso
 @ref{staff}.
 
@@ -7506,13 +7453,12 @@ whole note.
 
 @lilypond[quote,notime,relative=2]
 \set Score.autoBeaming = ##f
-g2_"1/2" g' s16
-g,4_"1/4" g' s16
-g,8_"1/8" g' s16
-g,16_"1/16" g' s16
+  g2_"1/2" g' s16
+  g,4_"1/4" g' s16
+  g,8_"1/8" g' s16
+  g,16_"1/16" g' s16
 @end lilypond
 
-
 @seealso
 @ref{beam}.
 
@@ -7529,10 +7475,9 @@ DK: ?,
 S: ?,
 FI: kiihdyttäen, nopeuttaen.
 
-[Italian: @q{pressing}.]  Pressing, urging, or hastening the time, as to a
+[Italian: @q{pressing}]  Pressing, urging, or hastening the time, as to a
 climax.
 
-
 @seealso
 @ref{accelerando}.
 
@@ -7553,9 +7498,8 @@ A family of stringed musical instruments played with a bow.  Strings
 commonly used in a symphony orchestra are violin, viola, violoncello,
 and double bass.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node strong beat
@@ -7570,7 +7514,6 @@ D: betonet taktslag,
 S: betonat taktslag,
 FI: tahdin vahva isku.
 
-
 @seealso
 @ref{beat}, @ref{accent}, @ref{measure}, @ref{rhythm}.
 
@@ -7589,7 +7532,6 @@ FI: subdominantti, alidominantti.
 
 The fourth @notation{scale degree}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}.
 
@@ -7608,7 +7550,6 @@ FI: alikeskisävel.
 
 The sixth @notation{scale degree}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}, @ref{superdominant}.
 
@@ -7627,7 +7568,6 @@ FI: subtoonika, alitoonika.
 
 The seventh @ref{scale degree}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}.
 
@@ -7647,9 +7587,8 @@ FI: G-kielellä.
 Indicates that the indicated passage (or note) should be played on the
 G string.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node superdominant
@@ -7666,7 +7605,6 @@ FI: ylidominantti.
 
 The sixth @ref{scale degree}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}, @ref{submediant}.
 
@@ -7685,7 +7623,6 @@ FI: ylitoonika.
 
 The second @ref{scale degree}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}.
 
@@ -7704,7 +7641,6 @@ FI: sinfonia.
 
 A symphony may be defined as a @emph{sonata} for orchestra.
 
-
 @seealso
 @ref{sonata}.
 
@@ -7737,9 +7673,8 @@ e16 c'8 e,16 c'8 e,16 c' ~
 c4
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node syntonic comma
@@ -7764,7 +7699,6 @@ the sum of two octaves plus a major third.  (3:2)^4 - (2:1)^2 + (5:4)
 
 This comma is also known as the comma of Didymus, or didymic comma.
 
-
 @seealso
 @ref{Pythagorean comma}
 
@@ -7784,7 +7718,6 @@ FI: nuottijärjestelmä.
 The collection of staves (@notation{staff}), two or more, as used for writing
 down of keyboard, chamber, choral, or orchestral music.
 
-
 @seealso
 @ref{staff}.
 
@@ -7804,7 +7737,6 @@ FI: viritysjärjestelmä.
 Systems of tuning in which the intervals deviate from the acoustically
 pure intervals.
 
-
 @seealso
 @ref{meantone temperament}, @ref{equal temperament}.
 
@@ -7826,7 +7758,6 @@ slowest to the quickest, as is indicated by tempo marks as @notation{largo},
 @notation{adagio}, @notation{andante}, @notation{allegro}, and
 @notation{presto}.
 
-
 @seealso
 @ref{adagio}, @ref{allegro}, @ref{andante}, @ref{largo}, @ref{presto}.
 
@@ -7846,7 +7777,6 @@ FI: tenori, korkea miesääni.
 
 The highest @q{natural} male voice (apart from @notation{countertenor}).
 
-
 @seealso
 @ref{countertenor}.
 
@@ -7863,7 +7793,6 @@ DK: decim,
 S: decima,
 FI: desimi.
 
-
 @seealso
 @ref{note value}.
 
@@ -7883,9 +7812,8 @@ FI: viiva, tenuto.
 An indication that a particular note should be held for the whole
 length, although this can vary depending on the composer and era.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node third
@@ -7900,7 +7828,6 @@ DK: terts,
 S: ters,
 FI: terssi.
 
-
 @seealso
 @ref{interval}.
 
@@ -7920,7 +7847,6 @@ FI: terssi.
 @item FI: kolmaskymmeneskahdesosanuotti
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -7940,7 +7866,6 @@ FI: terssi.
 @item FI: kolmaskymmeneskahdesosatauko
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -7948,7 +7873,6 @@ FI: terssi.
 @node thorough bass
 @section thorough bass
 
-
 @seealso
 @ref{figured bass}.
 
@@ -7978,7 +7902,6 @@ g2 ~ g4. r8
 @node time
 @section time
 
-
 @seealso
 @ref{meter}.
 
@@ -7999,9 +7922,8 @@ The sign placed at the beginning of a composition to indicate its
 meter.  It most often takes the form of a fraction, but a few signs
 derived from mensural notation and proportions are also employed.
 
-
 @seealso
-@ref{mensural notation}, @ref{meter}.
+@ref{mensural notation}, @ref{mensuration sign}, @ref{meter}.
 
 
 @node tone
@@ -8021,9 +7943,8 @@ Tone is a primary building material of music.
 
 @c Music from the 20th century may be based on atonal sounds. Meh, not so much
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node tonic
@@ -8040,7 +7961,6 @@ FI: toonika.
 
 The first @notation{scale degree}.
 
-
 @seealso
 @ref{functional harmony}, @ref{scale degree}.
 
@@ -8078,7 +7998,6 @@ Not all transposing instruments include the pitch class in their name:
 
 @end itemize
 
-
 @seealso
 @ref{concert pitch}.
 
@@ -8118,9 +8037,8 @@ relative pitches.
 }
 @end lilypond
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node treble clef
@@ -8135,7 +8053,6 @@ DK: diskantnøgle,
 S: diskantklav,
 FI: diskanttiavain.
 
-
 @seealso
 @ref{G clef}.
 
@@ -8165,12 +8082,11 @@ in the distance of a third (@ref{interval}).
 @end enumerate
 
 @lilypond[quote,notime,relative=1]
-e2:32_"a"
-f:32 [ e8:16 f:16 g:16 a:16 ] s4
-\repeat tremolo 8 { e32_"b" g }
+  e2:32_"a"
+  f:32 [ e8:16 f:16 g:16 a:16 ] s4
+  \repeat tremolo 8 { e32_"b" g }
 @end lilypond
 
-
 @seealso
 @ref{strings}
 
@@ -8187,7 +8103,6 @@ DK: treklang,
 S: treklang,
 FI: kolmisointu.
 
-
 @seealso
 @ref{chord}.
 
@@ -8204,7 +8119,6 @@ DK: trille,
 S: drill,
 FI: trilli.
 
-
 @seealso
 @ref{ornament}.
 
@@ -8221,7 +8135,6 @@ DK: tredelt takt,
 S: tretakt,
 FI: kolmijakoinen.
 
-
 @seealso
 @ref{meter}.
 
@@ -8238,7 +8151,6 @@ DK: triol,
 S: triol,
 FI: trioli.
 
-
 @seealso
 @ref{note value}.
 
@@ -8255,7 +8167,6 @@ DK: tritonus,
 S: tritonus,
 FI: tritonus.
 
-
 @seealso
 @ref{interval}.
 
@@ -8276,7 +8187,6 @@ A two-pronged piece of steel used to indicate an absolute pitch, usually for
 @emph{A} above middle C (440 cps/Hz), which is the international tuning
 standard.  Tuning forks for other pitches are available.
 
-
 @seealso
 @ref{middle C}.
 
@@ -8288,7 +8198,6 @@ A non-standard subdivision of a beat or part of a beat, usually
 indicated with a bracket and a number indicating the number of
 subdivisions.
 
-
 @seealso
 @ref{triplet}, @ref{note value}.
 
@@ -8305,7 +8214,6 @@ DK: dobbeltslag,
 S: dubbelslag,
 FI: korukuvio.
 
-
 @seealso
 @ref{ornament}.
 
@@ -8326,9 +8234,8 @@ Playing of the same notes or the same melody by various instruments
 (voices) or by the whole orchestra (choir), either at exactly the same
 pitch or in a different octave.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node upbeat
@@ -8343,7 +8250,6 @@ DK: optakt,
 S: upptakt,
 FI: kohotahti.
 
-
 @seealso
 @ref{anacrusis}
 
@@ -8377,9 +8283,8 @@ FI: ääni, lauluääni.
 
 @end itemize
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node volta
@@ -8394,13 +8299,12 @@ DK: ?,
 S: ?,
 FI: yksi kertauksen maaleista.
 
-[Italian: @q{time} (instance, not duration).]  An ending, such as a first
+[Italian: @q{time} (instance, not duration)]  An ending, such as a first
 or second ending.  LilyPond extends this idea to any number, and allows any text
 (not just a number) -- to serve as the @notation{volta} text.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node weak beat
@@ -8415,7 +8319,6 @@ DK: ubetonet taktslag,
 S: obetonat taktslag,
 FI: tahdin heikko isku.
 
-
 @seealso
 @ref{beat}, @ref{measure}, @ref{rhythm}.
 
@@ -8435,7 +8338,6 @@ FI: tahdin heikko isku.
 @item FI: kokonuotti
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -8455,7 +8357,6 @@ FI: tahdin heikko isku.
 @item FI: kokotauko
 @end itemize
 
-
 @seealso
 @ref{note value}.
 
@@ -8476,7 +8377,6 @@ The interval of a major second.  The interval between two tones
 on the piano keyboard with exactly one key between them -- including
 black and white keys -- is a whole tone.
 
-
 @seealso
 @ref{interval}.
 
@@ -8498,9 +8398,8 @@ instruments are actually made from metal.  The woodwind instruments
 commonly used in a symphony orchestra are flute, oboe, clarinet,
 saxophone, and bassoon.
 
-
 @seealso
-None yet.
+No cross-references.
 
 
 @node Duration names notes and rests
@@ -8862,7 +8761,6 @@ the lilypond-user discussion list.
 
 @end multitable
 
-
 @seealso
 @ref{mensural notation}
 
index 21e1c66f95838f2c046447a579afc7f2cb3f20c2..3b13b80fe845cd9d9a95e10977f41797fc3afb63 100644 (file)
@@ -40,19 +40,23 @@ This section discusses rhythms, rests, durations, beaming and bars.
 
 @cindex durations, of notes
 @cindex note durations
+@cindex length of notes
+@cindex note lengths
 
 @funindex \longa
+@funindex longa
 @funindex \breve
+@funindex breve
 @funindex \maxima
+@funindex maxima
 
-Durations are designated by numbers and dots.
-Durations are entered as their reciprocal values.  For example, a
-quarter note is entered using a @code{4} (since it is a 1/4 note),
-and a half note is entered using a @code{2} (since it is a 1/2
-note).  For notes longer than a whole you must use the
-@code{\longa} (a double breve) and @code{\breve} commands.
-Durations as short as 128th notes may be specified.  Shorter values
-are possible, but only as beamed notes.
+Durations are designated by numbers and dots.  Durations are entered
+as their reciprocal values.  For example, a quarter note is entered
+using a @code{4} (since it is a 1/4 note), and a half note is entered
+using a @code{2} (since it is a 1/2 note).  For notes longer than a
+whole you must use the @code{\longa} (a double breve) and
+@code{\breve} commands.  Durations as short as 128th notes may be
+specified.  Shorter values are possible, but only as beamed notes.
 
 @c Two 64th notes are needed to obtain beams
 @lilypond[quote,verbatim,relative=2]
@@ -87,6 +91,8 @@ a a a2 a a4 a a1 a
 
 @cindex notes, dotted
 @cindex dotted notes
+@cindex notes, double-dotted
+@cindex double-dotted notes
 
 @funindex .
 
@@ -110,8 +116,11 @@ duration.  For details of this and other settings which control
 proportional notation, see @ref{Proportional notation}.
 
 @funindex \dotsUp
+@funindex dotsUp
 @funindex \dotsDown
+@funindex dotsDown
 @funindex \dotsNeutral
+@funindex dotsNeutral
 
 Dots are normally moved up to avoid staff lines, except in
 polyphonic situations.  Predefined commands are available to
@@ -131,6 +140,7 @@ see @ref{Direction and placement}.
 Music Glossary:
 @rglos{breve},
 @rglos{longa},
+@rglos{maxima},
 @rglos{note value},
 @rglos{Duration names notes and rests}.
 
@@ -164,7 +174,9 @@ rests from 128th to maxima (8 x whole) may be printed.
 
 @cindex tuplets
 @cindex triplets
+
 @funindex \times
+@funindex times
 
 Tuplets are made from a music expression by multiplying all the
 durations with a fraction:
@@ -186,8 +198,11 @@ c4 c \times 2/3 { b4 a g }
 @end lilypond
 
 @funindex \tupletUp
+@funindex tupletUp
 @funindex \tupletDown
+@funindex tupletDown
 @funindex \tupletNeutral
+@funindex tupletNeutral
 
 The automatic placement of the tuplet bracket above or below the
 notes may be overridden manually with predefined commands, for
@@ -272,12 +287,12 @@ placed within tuplet brackets.
 @cindex durations, scaling
 
 You can alter the duration of single notes, rests or chords by a
-fraction @code{N/M} by appending @code{*N/M} (or @code{*N} if
-@code{M} is 1) to the duration.
-This will not affect the appearance of the notes or rests
-produced, but the altered duration will be used in calculating the
-position within the measure and setting the duration in the MIDI
-output.  Multiplying factors may be combined such as @code{*L*M/N}.
+fraction @code{N/M} by appending @code{*N/M} (or @code{*N} if @code{M}
+is 1) to the duration.  This will not affect the appearance of the
+notes or rests produced, but the altered duration will be used in
+calculating the position within the measure and setting the duration
+in the MIDI output.  Multiplying factors may be combined such as
+@code{*L*M/N}.
 
 In the following example, the first three notes take up exactly
 two beats, but no triplet bracket is printed.
@@ -299,7 +314,9 @@ a multiplier.  This is useful for skipping many measures, e.g.,
 @code{s1*23}.
 
 @cindex compressing music
+
 @funindex \scaleDurations
+@funindex scaleDurations
 
 Longer stretches of music may be compressed by a fraction in the
 same way, as if every note, chord or rest had the fraction as a
@@ -342,6 +359,7 @@ Snippets:
 @unnumberedsubsubsec Ties
 
 @cindex tie
+
 @funindex ~
 
 A tie connects two adjacent note heads of the same pitch.  The tie
@@ -389,12 +407,14 @@ the chord.
 <c~ e g~ b> <c e g b>
 @end lilypond
 
-@funindex \repeatTie
 @cindex repeating ties
 @cindex ties, repeating
 @cindex volta brackets and ties
 @cindex ties and volta brackets
 
+@funindex \repeatTie
+@funindex repeatTie
+
 When a second alternative of a repeat starts with a tied note, you
 have to specify the repeated tie as follows:
 
@@ -409,7 +429,9 @@ have to specify the repeated tie as follows:
 
 @cindex laissez vibrer
 @cindex ties, laissez vibrer
+
 @funindex \laissezVibrer
+@funindex laissezVibrer
 
 @notation{L.v.} ties (@notation{laissez vibrer}) indicate that
 notes must not be damped at the end.  It is used in notation for
@@ -421,18 +443,30 @@ be entered as follows:
 @end lilypond
 
 @cindex ties, placement
+
 @funindex \tieUp
+@funindex tieUp
 @funindex \tieDown
+@funindex tieDown
 @funindex \tieNeutral
+@funindex tieNeutral
 
 The vertical placement of ties may be controlled, see
 Predefined commands, or for details, see
 @ref{Direction and placement}.
 
 @cindex ties, appearance
+@cindex ties, dotted
+@cindex ties, dashed
+@cindex dashed ties
+@cindex dotted ties
+
 @funindex \tieDotted
+@funindex tieDotted
 @funindex \tieDashed
+@funindex tieDashed
 @funindex \tieSolid
+@funindex tieSolid
 
 Solid, dotted or dashed ties may be specified, see Predefined
 commands.
@@ -484,8 +518,6 @@ well-defined.  In these cases, a slur may be preferable.
 
 
 
-
-
 @node Writing rests
 @subsection Writing rests
 
@@ -501,15 +533,19 @@ Rests are entered as part of the music in music expressions.
 @unnumberedsubsubsec Rests
 @cindex rest
 @cindex rest, entering durations
-@cindex maxima
-@cindex longa
-@cindex breve
+@cindex maxima rest
+@cindex longa rest
+@cindex breve rest
 
 @funindex \rest
+@funindex rest
 @funindex r
 @funindex \maxima
+@funindex maxima
 @funindex \longa
+@funindex longa
 @funindex \breve
+@funindex breve
 
 Rests are entered like notes with the note name @code{r}.
 Durations longer than a whole rest use the predefined
@@ -559,6 +595,11 @@ a4\rest d4\rest
 
 
 @seealso
+Music Glossary:
+@rglos{breve},
+@rglos{longa},
+@rglos{maxima}.
+
 Notation Reference:
 @ref{Full measure rests}.
 
@@ -584,8 +625,11 @@ are rests from 128th to maxima (8 x whole).
 @cindex invisible rest
 @cindex rest, invisible
 @cindex spacer note
+@cindex spacer rest
+
 @funindex s
 @funindex \skip
+@funindex skip
 
 An invisible rest (also called a @q{spacer rest}) can be entered
 like a note with the note name@tie{}@code{s}:
@@ -647,6 +691,8 @@ Internals Reference: @rinternals{SkipMusic}
 @cindex rest, multi-measure
 @cindex rest, full-measure
 @cindex whole rest for a full measure
+@cindex rest, whole for a full measure
+
 @funindex R
 
 Rests for one or more full measures are entered like notes with
@@ -661,10 +707,10 @@ R1*4
 b2^"Tutti" b4 a4
 @end lilypond
 
-The duration of full-measure rests is identical to the duration notation
-used for notes.  The duration in a multi-measure rest must always be an
-integral number of measure-lengths, so augmentation
-dots or fractions must often be used:
+The duration of full-measure rests is identical to the duration
+notation used for notes.  The duration in a multi-measure rest must
+always be an integral number of measure-lengths, so augmentation dots
+or fractions must often be used:
 
 @lilypond[quote,fragment,verbatim]
 \compressFullBarRests
@@ -678,9 +724,8 @@ R1*13/8 | R1*13/8*12 |
 R4*5*4 |
 @end lilypond
 
-A full-measure rest is printed as either a whole
-or breve rest, centered in the measure, depending on the time
-signature.
+A full-measure rest is printed as either a whole or breve rest,
+centered in the measure, depending on the time signature.
 
 @lilypond[quote,verbatim,fragment]
 \time 4/4
@@ -690,16 +735,19 @@ R1*3/2 |
 \time 8/4
 R1*2 |
 @end lilypond
-@funindex \expandFullBarRests
-@funindex \compressFullBarRests
+
 @cindex multi-measure rest, expanding
 @cindex multi-measure rest, contracting
 
-By default a multi-measure rest is expanded in the printed score
-to show all the rest measures explicitly.
-Alternatively, a mult-measure rest can be shown as a single measure
-containing a multi-measure rest symbol, with the number of measures of rest
-printed above the measure:
+@funindex \expandFullBarRests
+@funindex expandFullBarRests
+@funindex \compressFullBarRests
+@funindex compressFullBarRests
+
+By default a multi-measure rest is expanded in the printed score to
+show all the rest measures explicitly.  Alternatively, a multi-measure
+rest can be shown as a single measure containing a multi-measure rest
+symbol, with the number of measures of rest printed above the measure:
 
 @lilypond[quote,fragment,verbatim]
 % Default behavior
@@ -723,6 +771,9 @@ R2.*2 |
 @cindex fermata on multi-measure rest
 @cindex multi-measure rest, attaching fermata
 
+@funindex \fermataMarkup
+@funindex fermataMarkup
+
 Markups can be added to multi-measure rests.
 The predefined command @code{\fermataMarkup}
 is provided for adding fermatas.
@@ -801,6 +852,9 @@ Internals Reference:
 @rinternals{MultiMeasureRestText}.
 
 
+@cindex fingerings and multi-measure rests
+@cindex multi-measure rests and fingerings
+
 @knownissues
 
 If an attempt is made to use fingerings (e.g.,
@@ -835,7 +889,9 @@ Multi-measure rests do not take part in rest collisions.
 
 @cindex time signature
 @cindex meter
+
 @funindex \time
+@funindex time
 
 The time signature is set as follows:
 
@@ -844,7 +900,7 @@ The time signature is set as follows:
 \time 3/4 c2.
 @end lilypond
 
-@cindex Time signature, visibility of
+@cindex time signature, visibility of
 
 Time signatures are printed at the beginning of a piece
 and whenever the time signature changes.  If a change takes place
@@ -862,9 +918,13 @@ c c
 c c c c
 @end lilypond
 
+@cindex time signature style
+@cindex meter style
+
 @funindex \numericTimeSignature
+@funindex numericTimeSignature
 @funindex \defaultTimeSignature
-@cindex time signature style
+@funindex defaultTimeSignature
 
 The time signature symbol that is used in 2/2 and 4/4 time can be
 changed to a numeric style:
@@ -932,7 +992,9 @@ Internals Reference:
 @cindex pickup measure
 @cindex measure, change length
 @cindex measurePosition
+
 @funindex \partial
+@funindex partial
 
 Partial or pick-up measures, such as an anacrusis or upbeat, are
 entered using the @code{\partial} command, with the syntax
@@ -992,13 +1054,16 @@ odd warnings may occur.
 @node Unmetered music
 @unnumberedsubsubsec Unmetered music
 
-@funindex \cadenzaOn
-@funindex \cadenzaOff
 @cindex bar lines, turning off
 @cindex bar numbering, turning off
 @cindex cadenza
 @cindex unmetered music
 
+@funindex \cadenzaOn
+@funindex cadenzaOn
+@funindex \cadenzaOff
+@funindex cadenzaOff
+
 Bar lines and bar numbers are calculated automatically.  For
 unmetered music (some cadenzas, for example), this is not desirable.
 To turn off automatic calculation of bar lines and bar numbers,
@@ -1068,9 +1133,17 @@ to indicate where breaks can occur.
 
 @cindex double time signatures
 @cindex signatures, polymetric
+@cindex time signatures, polymetric
+@cindex time signatures, double
 @cindex polymetric signatures
 @cindex meter, polymetric
 
+@funindex timeSignatureFraction
+@funindex \scaleDurations
+@funindex scaleDurations
+@funindex \times
+@funindex times
+
 Polymetric notation is supported, either explicitly or by modifying
 the visible time signature symbol and scaling the note durations.
 
@@ -1085,6 +1158,9 @@ signature; see @ref{Time signature}.  The scaling is done with
 @code{\times}, but does not create a tuplet bracket; see
 @ref{Scaling durations}.
 
+@cindex beaming in polymetric music
+@cindex beaming in polymetric meter
+
 In this example, music with the time signatures of 3/4, 9/8, and
 10/8 are used in parallel.  In the second staff, shown durations
 are multiplied by 2/3, as 2/3 * 9/8 = 3/4, and in the third
@@ -1202,6 +1278,9 @@ time signatures.
 @cindex notes, splitting
 @cindex splitting notes
 
+@funindex Note_heads_engraver
+@funindex Completion_heads_engraver
+
 Long notes which overrun bar lines can be converted automatically
 to tied notes.  This is done by replacing the
 @code{Note_heads_engraver} with the
@@ -1252,6 +1331,9 @@ split rests.
 @node Showing melody rhythms
 @unnumberedsubsubsec Showing melody rhythms
 
+@cindex melody rhythms, showing
+@cindex rhythms, showing melody
+
 Sometimes you might want to show only the rhythm of a melody.  This
 can be done with the rhythmic staff.  All pitches of notes on such a
 staff are squashed, and the staff itself has a single line
@@ -1275,6 +1357,16 @@ staff are squashed, and the staff itself has a single line
 >>
 @end lilypond
 
+@cindex guitar chord charts
+@cindex strumming rhythms, showing
+@cindex guitar strumming rhythms, showing
+
+@funindex Pitch_squash_engraver
+@funindex \improvisationOn
+@funindex improvisationOn
+@funindex \improvisationOff
+@funindex improvisationOff
+
 Guitar chord charts often show the strumming rhythms.  This can
 be done with the @code{Pitch_squash_engraver} and
 @code{\improvisationOn}.
@@ -1339,6 +1431,16 @@ By default, beams are inserted automatically:
 
 @cindex beams, manual
 @cindex manual beams
+@cindex beams, setting rules for
+@cindex beams, custom rules for
+
+@funindex measureLength
+@funindex beatLength
+@funindex beatGrouping
+@funindex \autoBeamOn
+@funindex autoBeamOn
+@funindex \autoBeamOff
+@funindex autoBeamOff
 
 @lilypond[quote,verbatim,relative=2]
 \time 2/4 c8 c c c
@@ -1356,8 +1458,6 @@ properties, @code{measureLength}, @code{beatLength} and
 @code{beatGrouping}.  Both the beaming rules and the context
 properties can be overridden, see @ref{Setting automatic beam behavior}.
 
-@cindex autoBeamOn
-@cindex autoBeamOff
 
 @warning{If beams are used to indicate melismata in songs, then automatic
 beaming should be switched off with @code{\autoBeamOff} and the beams
@@ -1385,9 +1485,10 @@ c16 c8
 
 @snippets
 
+@cindex line breaks and beams
+@cindex beams and line breaks
+
 @funindex breakable
-@cindex break, line
-@cindex line breaks
 
 @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
 {beams-across-line-breaks.ly}
@@ -1421,10 +1522,6 @@ Beams can collide with note heads and accidentals in other voices
 @node Setting automatic beam behavior
 @unnumberedsubsubsec Setting automatic beam behavior
 
-@funindex autoBeaming
-@funindex autoBeamSettings
-@funindex (end * * * *)
-@funindex (begin * * * *)
 
 @cindex automatic beams, tuning
 @cindex tuning automatic beaming
@@ -1432,6 +1529,17 @@ Beams can collide with note heads and accidentals in other voices
 @cindex autobeam
 @cindex lyrics and beaming
 
+@funindex autoBeaming
+@funindex autoBeamSettings
+@funindex (end * * * *)
+@funindex (begin * * * *)
+@funindex measureLength
+@funindex beatLength
+@funindex beatGrouping
+@funindex \time
+@funindex time
+@funindex \set
+@funindex set
 
 The placement of automatic beams is determined by the rules
 described in @ref{Automatic beams}.  There are two mutually
@@ -1696,15 +1804,20 @@ a a a a
 @lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
 {beam-endings-in-score-context.ly}
 
+@funindex \autoBeamOff
+@funindex autoBeamOff
+@funindex \autoBeamOn
+@funindex autoBeamOn
 
 @predefined
-@funindex \autoBeamOff
 @code{\autoBeamOff},
-@funindex \autoBeamOn
 @code{\autoBeamOn}.
 @endpredefined
 
 
+@cindex beam, last in score
+@cindex beam, last in polyphonic voice
+
 @knownissues
 
 If a score ends while an automatic beam has not been ended and is
@@ -1723,6 +1836,8 @@ Snippets:
 @unnumberedsubsubsec Manual beams
 
 @cindex beams, manual
+@cindex manual beams
+
 @funindex ]
 @funindex [
 
@@ -1740,6 +1855,9 @@ marking the begin and end point with @code{[} and @code{]}
 @end lilypond
 
 
+@funindex \noBeam
+@funindex noBeam
+
 Individual notes may be marked with @code{\noBeam} to prevent them
 from being beamed:
 
@@ -1779,7 +1897,10 @@ g a]
 @unnumberedsubsubsec Feathered beams
 
 @cindex beams, feathered
+
 @funindex \featherDurations
+@funindex featherDurations
+@funindex grow-direction
 
 Feathered beams are used to indicate that a small group of notes
 should be played at an increasing (or decreasing) tempo, without
@@ -1795,11 +1916,10 @@ music expression delimited by braces and preceded by a
 @code{featheredDurations} command which specifies the ratio
 between the durations of the first and last notes in the group.
 
-The square brackets
-show the extent of the beam and the braces show
-which notes are to have their durations modified.  Normally
-these would delimit the same group of notes, but this is not
-required: the two commands are independent.
+The square brackets show the extent of the beam and the braces show
+which notes are to have their durations modified.  Normally these
+would delimit the same group of notes, but this is not required: the
+two commands are independent.
 
 In the following example the eight 16th notes occupy exactly the
 same time as a half note, but the first note is one half as long
@@ -1849,10 +1969,12 @@ Snippets:
 @unnumberedsubsubsec Bar lines
 
 @cindex bar lines
-@funindex \bar
 @cindex measure lines
 @cindex repeat bars
 
+@funindex \bar
+@funindex bar
+
 Bar lines delimit measures, and are also used to indicate
 repeats.  Normally, simple bar lines are automatically inserted
 into the printed output at places based on the current time
@@ -1896,13 +2018,18 @@ force) a line break to occur at this point.  The bar number
 counter is not increased.  To force a line break see
 @ref{Line breaking}.
 
+@cindex manual bar lines
+@cindex manual measure lines
+@cindex bar lines, manual
+@cindex measure lines, manual
+
 This and other special bar lines may be inserted manually at any
-point.  When they coincide with the end of a measure they replace
-the simple bar line which would have been inserted there
-automatically.  When they do not coincide
-with the end of a measure the specified bar line is inserted at that
-point in the printed output.  Such insertions do not affect
-the calculation and placement of subsequent automatic bar lines.
+point.  When they coincide with the end of a measure they replace the
+simple bar line which would have been inserted there automatically.
+When they do not coincide with the end of a measure the specified bar
+line is inserted at that point in the printed output.  Such insertions
+do not affect the calculation and placement of subsequent automatic
+bar lines.
 
 The simple bar line and five types of double bar line are available
 for manual insertion:
@@ -1971,6 +2098,9 @@ connected between different staves of a @code{StaffGroup},
 
 @funindex whichBar
 @funindex defaultBarType
+@funindex \bar
+@funindex bar
+@funindex bartype
 
 The command @code{\bar }@var{bartype} is a shortcut for
 @code{\set Timing.whichBar = }@var{bartype}.  A bar line is
@@ -2002,6 +2132,9 @@ properties).
 
 @cindex bar numbers
 @cindex measure numbers
+@cindex numbers, bar
+@cindex numbers, measure
+
 @funindex currentBarNumber
 
 Bar numbers are typeset by default at the start of every line except
@@ -2019,9 +2152,10 @@ c1 c c c
 
 @snippets
 
-@funindex barNumberVisibility
 @cindex bar numbers, regular spacing
 
+@funindex barNumberVisibility
+
 Bar numbers can be typeset at regular intervals instead of just at
 the beginning of every line.  To do this the default behavior
 must be overridden to permit bar numbers to be printed at places
@@ -2136,6 +2270,9 @@ Snippets:
 Internals Reference: @rinternals{BarNumber}.
 
 
+@cindex bar number collision
+@cindex collision, bar number
+
 @knownissues
 
 Bar numbers may collide with the top of the
@@ -2162,17 +2299,19 @@ c1 c c c
 @unnumberedsubsubsec Bar and bar number checks
 
 @cindex bar check
+@cindex bar number check
+@cindex measure check
+@cindex measure number check
+
 @funindex barCheckSynchronize
 @funindex |
 
-Bar checks help detect errors in the entered durations.
-A bar check may be entered using the bar symbol, @code{|},
-at any place where a bar line is expected to fall.
-If bar check lines are encountered at other places,
-a list of warnings is printed in the log file,
-showing the line numbers and lines
-in which the bar checks failed.  In the next
-example, the second bar check will signal an error.
+Bar checks help detect errors in the entered durations.  A bar check
+may be entered using the bar symbol, @code{|}, at any place where a
+bar line is expected to fall.  If bar check lines are encountered at
+other places, a list of warnings is printed in the log file, showing
+the line numbers and lines in which the bar checks failed.  In the
+next example, the second bar check will signal an error.
 
 @example
 \time 3/4 c2 e4 | g2 |
@@ -2218,6 +2357,9 @@ pipeSymbol = \bar "||"
 }
 @end lilypond
 
+@funindex \barNumberCheck
+@funindex barNumberCheck
+
 When copying large pieces of music, it can be helpful to check
 that the LilyPond bar number corresponds to the original that you
 are entering from.  This can be checked with
@@ -2242,7 +2384,9 @@ Snippets:
 
 @cindex rehearsal marks
 @cindex mark, rehearsal
+
 @funindex \mark
+@funindex mark
 
 To print a rehearsal mark, use the @code{\mark} command
 
@@ -2273,6 +2417,9 @@ mark manually.  The value to use is stored in the property
 @cindex format, rehearsal mark
 @cindex mark, rehearsal, style
 @cindex mark, rehearsal, format
+@cindex rehearsal mark, manual
+@cindex mark, rehearsal, manual
+@cindex custom rehearsal mark
 
 The style is defined by the property @code{markFormatter}.  It is
 a function taking the current mark (an integer) and the current
@@ -2322,6 +2469,12 @@ string.
 @cindex segno
 @cindex coda
 @cindex D.S al Fine
+@cindex fermata
+@cindex music glyphs
+@cindex glyphs, music
+
+@funindex \musicglyph
+@funindex musicglyph
 
 Music glyphs (such as the segno sign) may be printed inside a
 @code{\mark}
@@ -2371,12 +2524,14 @@ Internals Reference: @rinternals{RehearsalMark}.
 @node Grace notes
 @unnumberedsubsubsec Grace notes
 
-@funindex \grace
 @cindex ornaments
 @cindex grace notes
 @cindex appoggiatura
 @cindex acciaccatura
 
+@funindex \grace
+@funindex grace
+
 Grace notes are ornaments that are written out. Grace notes
 are printed in a smaller font and take up no logical time
 in a measure.
@@ -2408,10 +2563,11 @@ notes for every eighth grace note
    \new Staff { c2 \grace { g8[ b] } c2 } >>
 @end lilypond
 
-@funindex \afterGrace
-
 @cindex grace notes, following
 
+@funindex \afterGrace
+@funindex afterGrace
+
 If you want to end a note with a grace, use the @code{\afterGrace}
 command.  It takes two arguments: the main note, and the grace
 notes following the main note.
index b3664180cb451c4e28003ed91a52e36d3577db3b..dd38806ad60c0391b370663f8b2c20debcf52853 100644 (file)
@@ -2049,6 +2049,33 @@ c\ff c \stopTextSpan
 c, c c c
 @end lilypond
 
+@cindex slurs and outside-staff-priority
+@cindex slurs and articulations
+@cindex articulations and slurs
+
+Slurs by default are classed as within-staff objects, but
+they often appear above the staff if the notes to
+which they are attached are high on the staff.  This can push
+outside-staff objects such as articulations too high, as the slur
+will be placed first.  The @code{avoid-slur} property of the
+articulation can be set to @code{'inside} to bring the articulation
+inside the slur, but the @code{avoid-slur} property is effective
+only if the @code{outside-staff-priority} is also set to @code{#f}.
+Alternatively, the @code{outside-staff-priority} of the slur
+can be set to a numerical value to cause it to be placed along with
+other outside-staff objects according to that value.  Here's an
+example showing the effect of the two methods:
+
+@lilypond[quote,verbatim,relative=2]
+c4( c^\markup\tiny\sharp d4.) c8
+c4(
+\once \override TextScript #'avoid-slur = #'inside
+\once \override TextScript #'outside-staff-priority = ##f
+c^\markup\tiny\sharp d4.) c8
+\once \override Slur #'outside-staff-priority = #500
+c4( c^\markup\tiny\sharp d4.) c8
+@end lilypond
+
 Changing the @code{outside-staff-priority} can also be used to
 control the vertical placement of individual objects, although
 the results may not always be desirable.  Suppose we would
index ac2329cf4fa68fd3d314a702cefd35682b7eed9e..f6389fbe3f7a0b4aae02d30ec1b7afc911c6e41a 100644 (file)
@@ -2,7 +2,7 @@
 
 depth = .
 
-SUBDIRS = buildscripts python scripts \
+SUBDIRS = python scripts \
        flower lily \
        mf ly \
        tex ps scm \
@@ -87,11 +87,11 @@ final-install:
 WEB_TARGETS = offline
 
 WWW-post:
-# need UTF8 setting in case this is hosted on a website. 
+# need UTF8 setting in case this is hosted on a website.
        echo -e 'AddDefaultCharset utf-8\nAddCharset utf-8 .html\nAddCharset utf-8 .en\nAddCharset utf-8 .nl\nAddCharset utf-8 .txt\n' > $(top-build-dir)/.htaccess
-       $(PYTHON) $(buildscript-dir)/mutopia-index.py -o $(outdir)/examples.html input/
+       $(buildscript-dir)/mutopia-index -o $(outdir)/examples.html input/
        find $(outdir) -name '*-root' | xargs rm -rf
-       $(PYTHON) $(buildscript-dir)/www_post.py $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) "$(WEB_TARGETS)"
+       $(buildscript-dir)/www_post $(PACKAGE_NAME) $(TOPLEVEL_VERSION) $(outdir) "$(WEB_TARGETS)"
        find $(outdir)/offline-root -type l -delete
 
 
@@ -200,7 +200,8 @@ $(config_h): config.hh.in
        @false
 
 grand-replace:
-       PATH=$(buildscript-dir)/$(outbase):$(PATH) $(BASH) $(buildscript-dir)/grand-replace.sh
+       $(MAKE) -C scripts/build
+       PATH=$(buildscript-dir):$(PATH) $(buildscript-dir)/grand-replace
 
 ################################################################
 # testing
@@ -229,7 +230,7 @@ test-baseline:
 local-check: test
        rm -rf $(RESULT_DIR)
        mkdir -p $(RESULT_DIR)
-       $(PYTHON) $(buildscript-dir)/output-distance.py --create-images --output-dir $(RESULT_DIR) input/regression/out-test-baseline input/regression/out-test/
+       $(buildscript-dir)/output-distance --create-images --output-dir $(RESULT_DIR) input/regression/out-test-baseline input/regression/out-test/
        @find input ly -name '*.ly' -print |grep -v 'out.*/' | xargs grep '\\version' -L | grep -v "standard input" |sed 's/^/**** Missing version: /g' 
 
 
diff --git a/ROADMAP b/ROADMAP
index 4ec2eec4bd5e19185fc4bef1c29e94e059a59637..c027bec55e2bcd89c9761289fa46f54dd1d5fbe3 100644 (file)
--- a/ROADMAP
+++ b/ROADMAP
@@ -20,7 +20,6 @@ source files.
        user/            User manuals
        po/              Translated manual node names
        fr/ es/ de/      Docs translated to French, Spanish, German, resp.
-   buildscripts/        Scripts for the build process
    elisp/               Emacs LilyPond mode and syntax coloring
    flower/              A simple C++ library
    input/               Music input examples
@@ -41,8 +40,13 @@ source files.
    po/                  Translations for binaries and end-user scripts
    ps/                  PostScript library files
    python/              Python modules, MIDI module
+       auxiliar/        Python modules used by maintenance scripts
+                          or in the build process
    scm/                 Scheme sources for LilyPond and subroutine files
    scripts/             End-user scripts
+       auxiliar/        Scripts for maintaining the sources and scripts
+                          for the build process that need not be built
+       build/           Scripts for the build process that must be built
    stepmake/            Generic make subroutine files
    tex/                 TeX and texinfo library files
    vim/                 Vi(M) LilyPond mode and syntax coloring
diff --git a/SConstruct b/SConstruct
deleted file mode 100644 (file)
index 6ec14e2..0000000
+++ /dev/null
@@ -1,967 +0,0 @@
-# -*-python-*-
-
-'''
-Experimental scons (www.scons.org) building.
-
-Usage
-
-    scons TARGET
-
-build from source directory ./TARGET (not recursive)
-
-Configure, build
-
-    scons [config]         # configure
-    scons              # build all
-
-Run from build tree
-
-    run=$(pwd)/out-scons/usr
-    export LOCALE=$run/share/locale
-    export TEXMF='{'$run/share/lilypond,$(kpsexpand '$TEXMF')'}'
-    PATH=$run/bin:$PATH
-
-    #optionally, if you do not use custom.py below
-    #export LILYPOND_DATADIR=$run/share/lilypond/<VERSION>
-
-    lilypond input/simple
-
-Other targets
-    scons mf-essential     # build minimal mf stuff
-
-    scons doc          # build web doc
-    scons config           # reconfigure
-    scons install          # install
-    scons -c           # clean
-    scons -h           # help
-
-    scons /            # build *everything* (including installation)
-
-Options  (see scons -h)
-    scons build=DIR        # clean srcdir build, output below DIR
-    scons out=DIR          # write output for alterative config to DIR
-
-Debugging
-    scons --debug=dtree
-    scons --debug=explain
-    scons verbose=1
-
-Optional custom.py
-
-import os
-out='out-scons'
-optimising=0
-debugging=1
-gui=1
-os.path.join (os.getcwd (), '=install')
-prefix=os.path.join (os.environ['HOME'], 'usr', 'pkg', 'lilypond')
-
-'''
-
-
-# TODO:
-
-#  * reality check:
-#     - too many stages in Environments setup
-#       (see also buildscripts/builders.py)
-#     - Home-brew scons.cach configuration caching
-#     - Home-brew source tarball generating -- [why] isn't that in SCons?
-
-#  * usability and documentation for "./configure; make" users
-
-#  * too much cruft in toplevel SConstruct
-
-#  * (optional) operation without CVS directories, from tarball
-
-#  * more program configure tests, actually use full executable name
-
-#  * install doc
-
-#  * split doc target: doc input examples mutopia?
-
-#  * grep FIXME $(find . -name 'S*t')
-
-#  * drop "fast"
-
-import re
-import glob
-import os
-import string
-import sys
-import stat
-import shutil
-
-# duh, we need 0.95.1
-EnsureSConsVersion (0, 96, 92)
-
-usage = r'''Usage:
-[ENVVAR=VALUE]... scons [OPTION=VALUE]... [TARGET|DIR]...
-
-TARGETS: clean, config, doc, dist, install, mf-essential, po-update,
-     realclean, release, sconsclean, tar, TAGS
-
-ENVVARS: BASH, CCFLAGS, CC, CXX, LIBS, PYTHON, SH...
-     (see SConstruct:config_vars)
-
-OPTIONS:
-'''
-      
-
-config_cache = 'scons.cache'
-if os.path.exists (config_cache) and 'config' in COMMAND_LINE_TARGETS:
-    os.unlink (config_cache)
-
-# All config_vars can be set as ENVVAR, eg:
-#
-#    CXX=g++-4.0 GS=~/usr/pkg/gs/bin/gs scons config
-#
-# append test_program variables automagically?
-config_vars = [
-    'BASH',
-    'BYTEORDER',
-    'CC',
-    'CCFLAGS',
-    'CPPPATH',
-    'CPPDEFINES',
-    'CXX',
-    'CXXFLAGS',
-    'DEFINES',
-    'DVIPS',
-    'FONTFORGE',
-    'GCC',
-    'GXX',
-    'GS',
-    'LIBS',
-    'LINKFLAGS',
-    'MF',
-    'PERL',
-    'PYTHON',
-    'SH',
-    ]
-
-# Put your favourite stuff in custom.py
-opts = Options ([config_cache, 'custom.py'], ARGUMENTS)
-opts.Add ('prefix', 'Install prefix', '/usr/')
-opts.Add ('out', 'Output directory', 'out-scons')
-opts.Add ('build', 'Build directory', '.')
-opts.Add ('DESTDIR', 'DESTDIR prepended to prefix', '')
-opts.AddOptions (
-    BoolOption ('warnings', 'compile with -Wall and similiar',
-           1),
-    BoolOption ('debugging', 'compile with debugging symbols',
-            0),
-    BoolOption ('optimising', 'compile with optimising',
-            1),
-    BoolOption ('shared', 'build shared libraries',
-            0),
-    BoolOption ('static', 'build static libraries',
-            1),
-    BoolOption ('gui', 'build with GNOME backend (EXPERIMENTAL)',
-            0),
-    BoolOption ('verbose', 'run commands with verbose flag',
-            0),
-    BoolOption ('checksums', 'use checksums instead of timestamps',
-            0),
-    BoolOption ('fast', 'use timestamps, implicit cache, prune CPPPATH',
-            0),
-    )
-
-srcdir = Dir ('.').srcnode ().abspath
-#ugh
-sys.path.append (os.path.join (srcdir, 'stepmake', 'bin'))
-
-try:
-    import packagepython
-    packagepython.Package (srcdir)
-    packagepython.version_tuple_to_str (package.version)
-except:
-    print '*** FIXME: no packagepython.  setting version to 1.0'
-    class Package:
-        name = 'lilypond'
-        release_dir = '.'
-    package = Package
-    version = '1.0'
-
-ENV = { 'PYTHONPATH': '' }
-for key in ['GUILE_LOAD_PATH', 'LD_LIBRARY_PATH', 'PATH', 'PKG_CONFIG_PATH',
-            'PYTHONPATH', 'TEXMF']:
-    if os.environ.has_key (key):
-        ENV[key] = os.environ[key]
-
-ENV['PYTHONPATH'] = os.path.join (srcdir, 'python') + ':' + ENV['PYTHONPATH']
-
-env = Environment (
-    ENV = ENV,
-    BYTEORDER = sys.byteorder.upper (),
-    CC = '$GCC',
-    CXX = '$GXX',
-    CPPDEFINES = '-DHAVE_CONFIG_H',
-    MAKEINFO = 'LANG= makeinfo',
-    MF_TO_TABLE_PY = srcdir + '/buildscripts/mf-to-table.py',
-    
-    PKG_CONFIG_PATH = [os.path.join (os.environ['HOME'],
-                     'usr/pkg/gnome/lib'),
-               os.path.join (os.environ['HOME'],
-                     'usr/pkg/pango/lib')],
-    GZIP='-9v',
-    MFMODE = 'ljfour',
-    TOPLEVEL_VERSION = version,
-    )
-
-Help (usage + opts.GenerateHelpText (env))
-
-# Add all config_vars to opts, so that they will be read and saved
-# together with the other configure options.
-map (lambda x: opts.AddOptions ((x,)), config_vars)
-opts.Update (env)
-
-for key in config_vars:
-    if os.environ.has_key (key):
-        env[key] = os.environ[key]
-
-if env['fast']:
-    # Usability switch (Anthony Roach).
-    # See http://www.scons.org/cgi-bin/wiki/GoFastButton
-    # First do: scons realclean .
-    env['checksums'] = 0
-    SetOption ('max_drift', 1)
-    SetOption ('implicit_cache', 1)
-elif env['checksums']:
-    # Always use checksums (makes more sense than timestamps).
-    SetOption ('max_drift', 0)
-    # Using *content* checksums prevents rebuilds after
-    # [re]configure if config.hh has not changed.  Too bad that it
-    # is unusably slow.
-    TargetSignatures ('content')
-
-absbuild = Dir (env['build']).abspath
-outdir = os.path.join (Dir (env['build']).abspath, env['out'])
-run_prefix = os.path.join (absbuild, os.path.join (env['out'], 'usr'))
-
-
-config_hh = os.path.join (outdir, 'config.hh')
-version_hh = os.path.join (outdir, 'version.hh')
-
-env.Alias ('config', config_cache)
-
-cachedir = os.path.join (outdir, 'build-cache')
-
-if not os.path.exists (cachedir):
-    os.makedirs (cachedir)
-
-CacheDir (cachedir)
-
-# No need to set $LILYPOND_DATADIR to run lily, but cannot install...
-if env['debugging'] and not 'install' in COMMAND_LINE_TARGETS:
-    env['prefix'] = run_prefix
-
-prefix = env['prefix']
-bindir = os.path.join (prefix, 'bin')
-sharedir = os.path.join (prefix, 'share')
-libdir = os.path.join (prefix, 'lib')
-libdir_package = os.path.join (libdir, package.name)
-libdir_package_version = os.path.join (libdir_package, version)
-localedir = os.path.join (sharedir, 'locale')
-sharedir_doc_package = os.path.join (sharedir, 'doc', package.name)
-sharedir_package = os.path.join (sharedir, package.name)
-sharedir_package_version = os.path.join (sharedir_package, version)
-lilypondprefix = sharedir_package_version
-
-# junkme
-env.Append (
-    absbuild = absbuild,
-    srcdir = srcdir,
-    )
-
-
-
-def symlink_tree (target, source, env):
-    def mkdirs (dir):
-        def mkdir (dir):
-            if not dir:
-                os.chdir (os.sep)
-                return
-            if not os.path.isdir (dir):
-                if os.path.exists (dir):
-                    os.unlink (dir)
-                os.mkdir (dir)
-            os.chdir (dir)
-        map (mkdir, string.split (dir, os.sep))
-    def symlink (src, dst):
-        os.chdir (absbuild)
-        dir = os.path.dirname (dst)
-        mkdirs (dir)
-        if src[0] == '#':
-            frm = os.path.join (srcdir, src[1:])
-        else:
-            depth = len (string.split (dir, '/'))
-            if src.find ('@') > -1:
-                frm = os.path.join ('../' * depth,
-                            string.replace (src, '@',
-                                    env['out']))
-            else:
-                frm = os.path.join ('../' * depth, src,
-                            env['out'])
-        if src[-1] == '/':
-            frm = os.path.join (frm, os.path.basename (dst))
-        if env['verbose']:
-            print 'ln -s %s -> %s' % (frm, os.path.basename (dst))
-        os.symlink (frm, os.path.basename (dst))
-    shutil.rmtree (run_prefix)
-    prefix = os.path.join (env['out'], 'usr')
-    map (lambda x: symlink (x[0], os.path.join (prefix,
-                            x[1] % {'ver' : version})),
-         # ^# := source dir
-         # @  := out
-         # /$ := add dst file_name
-         (('python',     'lib/lilypond/python'),
-          # ugh
-          ('python',     'share/lilypond/%(ver)s/python'),
-          ('lily/',      'bin/lilypond'),
-          ('scripts/',   'bin/convert-ly'),
-          ('scripts/',   'bin/lilypond-book'),
-          ('scripts/',   'bin/ps2png'),
-          ('mf',     'share/lilypond/%(ver)s/dvips/mf-out'),
-          ('#ps/music-drawing-routines.ps',
-           'share/lilypond/%(ver)s/tex/music-drawing-routines.ps'),
-          ('mf',     'share/lilypond/%(ver)s/otf'),
-          ('mf',     'share/lilypond/%(ver)s/tfm'),
-          ('tex',    'share/lilypond/%(ver)s/tex/enc'),
-          ('#mf',    'share/lilypond/%(ver)s/fonts/mf'),
-          ('mf',     'share/lilypond/%(ver)s/fonts/map'),
-          ('mf',     'share/lilypond/%(ver)s/fonts/otf'),
-          ('mf',     'share/lilypond/%(ver)s/fonts/tfm'),
-          ('mf',     'share/lilypond/%(ver)s/fonts/type1'),
-          ('#tex',       'share/lilypond/%(ver)s/tex/source'),
-          ('tex',    'share/lilypond/%(ver)s/tex/tex-out'),
-          ('mf',     'share/lilypond/%(ver)s/tex/mf-out'),
-          ('#ly',    'share/lilypond/%(ver)s/ly'),
-          ('#scm',       'share/lilypond/%(ver)s/scm'),
-          ('#scripts',   'share/lilypond/%(ver)s/scripts'),
-          ('#ps',    'share/lilypond/%(ver)s/ps'),
-          ('po/@/nl.mo', 'share/locale/nl/LC_MESSAGES/lilypond.mo'),
-          ('elisp',      'share/lilypond/%(ver)s/elisp')))
-
-    print "FIXME: BARF BARF BARF"
-    os.chdir (absbuild)
-    out = env['out']
-    ver = version
-    prefix = os.path.join (env['out'], 'usr/share/lilypond/%(ver)s/fonts'
-                   % vars ())
-    for ext in ('enc', 'map', 'otf', 'svg', 'tfm', 'pfa'):
-        dir = os.path.join (absbuild, prefix, ext)
-        os.system ('rm -f ' + dir)
-        mkdirs (dir)
-        os.chdir (dir)
-        os.system ('ln -s ../../../../../../../mf/%(out)s/*.%(ext)s .'
-               % vars ())
-    os.chdir (srcdir)
-
-def configure (target, source, env):
-    dre = re.compile ('\n(200[0-9]{5})')
-    vre = re.compile ('.*?\n[^-.0-9]*([0-9][0-9]*\.[0-9]([.0-9]*[0-9])*)',
-              re.DOTALL)
-    def get_version (program):
-        command = '(pkg-config --modversion %(program)s || %(program)s --version || %(program)s -V) 2>&1' % vars ()
-        pipe = os.popen (command)
-        output = pipe.read ()
-        if pipe.close ():
-            return None
-        splits = re.sub ('^|\s', '\n', output)
-        date_hack = re.sub (dre, '\n0.0.\\1', splits)
-        m = re.match (vre, date_hack)
-        v = m.group (1)
-        if v[-1] == '\n':
-            v = v[:-1]
-        return string.split (v, '.')
-
-    def test_version (lst, full_name, minimal, description, package):
-        program = os.path.basename (full_name)
-        sys.stdout.write ('Checking %s version... ' % program)
-        actual = get_version (program)
-        if not actual:
-            print 'not found'
-            lst.append ((description, package, minimal, program,
-                     'not installed'))
-            return 0
-        print string.join (actual, '.')
-        if map (string.atoi, actual) \
-           < map (string.atoi, string.split (minimal, '.')):
-            lst.append ((description, package, minimal, program,
-                     string.join (actual, '.')))
-            return 0
-        return 1
-
-    def test_program (lst, program, minimal, description, package):
-        key = program.upper ()
-        if key.find ('+-'):
-            key = re.sub ('\+', 'X', key)
-            key = re.sub ('-', '_', key)
-        sys.stdout.write ('Checking for %s ... ' % program)
-        if env.has_key (key):
-            f = env[key]
-            sys.stdout.write ('(cached) ')
-        else:
-            f = WhereIs (program)
-            env[key] = f
-        if not f:
-            print 'not found'
-            lst.append ((description, package, minimal, program,
-                     'not installed'))
-            return 0
-        print f
-        return test_version (lst, program, minimal, description, package)
-
-    def test_lib (lst, program, minimal, description, package):
-        # FIXME: test for Debian or RPM (or -foo?) based dists
-        # to guess (or get correct!: apt-cache search?)
-        # package name.
-        #if os.system ('pkg-config --atleast-version=0 freetype2'):
-        # barf
-        if test_version (lst, program, minimal, description,
-                 'lib%(package)s-dev or %(package)s-devel'
-                 % vars ()):
-            env.ParseConfig ('pkg-config --cflags --libs %(program)s'
-                     % vars ())
-            return 1
-        return 0
-
-    required = []
-    test_program (required, 'bash', '2.0', 'Bash', 'bash')
-    test_program (required, 'gcc', '4.0', 'GNU C compiler', 'gcc')
-    test_program (required, 'g++', '4.0.5', 'GNU C++ compiler', 'g++')
-    test_program (required, 'guile-config', '1.8', 'GUILE development',
-            'libguile-dev or guile-devel')
-    test_program (required, 'mf', '0.0', 'Metafont', 'tetex-bin')
-    test_program (required, 'python', '2.1', 'Python (www.python.org)',
-              'python')
-    # Silly, and breaks with /bin/sh == dash
-    #test_program (required, 'sh', '0.0', 'Bourne shell', 'sh')
-
-    optional = []
-    # Do not use bison 1.50 and 1.75.
-    #test_program (optional, 'foo', '2.0', 'Foomatic tester', 'bar')
-    test_program (optional, 'bison', '1.25', 'Bison -- parser generator',
-            'bison')
-    test_program (optional, 'fontforge', '0.0.20050624', 'FontForge',
-              'fontforge')
-    test_program (optional, 'flex', '0.0', 'Flex -- lexer generator',
-              'flex')
-    test_program (optional, 'guile', '1.8', 'GUILE scheme', 'guile')
-    test_program (optional, 'gs', '8.15',
-              'Ghostscript PostScript interpreter',
-              'gs or gs-afpl or gs-esp or gs-gpl')
-    test_program (optional, 'makeinfo', '4.8', 'Makeinfo tool', 'texinfo')
-    test_program (optional, 'perl', '4.0',
-              'Perl practical efficient readonly language', 'perl')
-
-    def CheckYYCurrentBuffer (context):
-        context.Message ('Checking for yy_current_buffer... ')
-        ret = conf.TryCompile ("""using namespace std;
-        #include <FlexLexer.h>
-        class yy_flex_lexer: public yyFlexLexer
-        {
-        public:
-        yy_flex_lexer ()
-        {
-        yy_current_buffer = 0;
-        }
-        };""", '.cc')
-        context.Result (ret)
-        return ret
-
-    conf = Configure (env, custom_tests = { 'CheckYYCurrentBuffer'
-                        : CheckYYCurrentBuffer })
-
-    defines = {
-       'DIRSEP' : "'%s'" % os.sep,
-       'PATHSEP' : "'%s'" % os.pathsep,
-       'PACKAGE': '"%s"' % package.name,
-       'DATADIR' : '"%s"' % sharedir,
-       'PACKAGE_DATADIR' : '"%s"' % sharedir_package,
-       'LOCALEDIR' : '"%s"' %localedir,
-    }
-    conf.env.Append (DEFINES = defines)
-
-    command = r"""python -c 'import sys; sys.stdout.write ("%s/include/python%s" % (sys.prefix, sys.version[:3]))'""" #"
-    PYTHON_INCLUDE = os.popen (command).read ()#[:-1]
-    if env['fast']:
-        env.Append (CCFLAGS = ['-I%s' % PYTHON_INCLUDE])
-    else:
-        env.Append (CPPPATH = [PYTHON_INCLUDE])
-
-    headers = ('assert.h', 'grp.h', 'libio.h', 'pwd.h',
-           'sys/stat.h', 'utf8/wchar.h', 'wchar.h', 'Python.h')
-    for i in headers:
-        if conf.CheckCHeader (i):
-            key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
-            conf.env['DEFINES'][key] = 1
-
-    ccheaders = ('sstream',)
-    for i in ccheaders:
-        if conf.CheckCXXHeader (i):
-            key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
-            conf.env['DEFINES'][key] = 1
-
-    functions = ('chroot', 'fopencookie', 'funopen',
-             'gettext', 'isinf',
-             'mbrtowc', 'memmem', 'snprintf', 'vsnprintf', 'wcrtomb')
-    for i in functions:
-        if 0 or conf.CheckFunc (i):
-            key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
-            conf.env['DEFINES'][key] = 1
-
-    if conf.CheckYYCurrentBuffer ():
-        conf.env['DEFINES']['HAVE_FLEXLEXER_YY_CURRENT_BUFFER'] = 1
-
-    if conf.CheckLib ('dl'):
-        pass
-
-    if env['fast']:
-        cpppath = []
-        if env.has_key ('CPPPATH'):
-            cpppath = env['CPPPATH']
-
-    ## FIXME: linkage, check for libguile.h and scm_boot_guile
-    #this could happen after flower...
-    env.ParseConfig ('guile-config compile')
-
-    test_program (required, 'pkg-config', '0.9.0',
-              'pkg-config library compile manager', 'pkg-config')
-    if test_lib (required, 'freetype2', '0.0',
-             'Development files for FreeType 2 font engine',
-             'freetype6'):
-        conf.env['DEFINES']['HAVE_FREETYPE2'] = '1'
-        
-    if test_lib (required, 'pangoft2', '1.6.0',
-             'Development files for pango, with FreeType2',
-             'pango1.0'):
-        conf.env['DEFINES']['HAVE_PANGO_FT2'] = '1'
-
-    if test_lib (optional, 'fontconfig', '2.2.0',
-             'Development files for fontconfig', 'fontconfig1'):
-        conf.env['DEFINES']['HAVE_FONTCONFIG'] = '1'
-    
-    #this could happen only for compiling pango-*
-    if env['gui']:
-        test_lib (required, 'gtk+-2.0', '2.4.0',
-              'Development files for GTK+', 'gtk2.0')
-            
-    if env['fast']:
-        # Using CCFLAGS = -I<system-dir> rather than CPPPATH = [
-        # <system-dir>] speeds up SCons
-        env['CCFLAGS'] += map (lambda x: '-I' + x,
-                       env['CPPPATH'][len (cpppath):])
-        env['CPPPATH'] = cpppath
-
-    if required:
-        print
-        print '********************************'
-        print 'Please install required packages'
-        for i in required:
-            print '%s:      %s-%s or newer (found: %s %s)' % i
-        Exit (1)
-
-    if optional:
-        print
-        print '*************************************'
-        print 'Consider installing optional packages'
-        for i in optional:
-            print '%s:      %s-%s or newer (found: %s %s)' % i
-
-    return conf.Finish ()
-
-def config_header (target, source, env):
-    config = open (str (target[0]), 'w')
-    for i in sorted (env['DEFINES'].keys ()):
-        config.write ('#define %s %s\n' % (i, env['DEFINES'][i]))
-    config.close ()
-env.Command (config_hh, config_cache, config_header)
-
-# hmm?
-def xuniquify (lst):
-    n = []
-    for i in lst:
-        if not i in n:
-            n.append (i)
-    lst = n
-    return lst
-
-def uniquify (lst):
-    d = {}
-    n = len (lst)
-    i = 0
-    while i < n:
-        if not d.has_key (lst[i]):
-            d[lst[i]] = 1
-            i += 1
-        else:
-            del lst[i]
-            n -= 1
-    return lst
-
-def uniquify_config_vars (env):
-    for i in config_vars:
-        if env.has_key (i) and type (env[i]) == type ([]):
-            env[i] = uniquify (env[i])
-
-def save_config_cache (env):
-    ## FIXME: Is this smart, using option cache for saving
-    ## config.cache?  I cannot seem to find the official method.
-    uniquify_config_vars (env)
-    opts.Save (config_cache, env)
-
-    if 'config' in COMMAND_LINE_TARGETS:
-        sys.stdout.write ('\n')
-        sys.stdout.write ('LilyPond configured')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('Now run')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('    scons [TARGET|DIR]...')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('Examples:')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('    scons lily    # build lilypond')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('    scons all     # build everything')
-        sys.stdout.write ('\n')
-        sys.stdout.write ('    scons doc     # build documentation')
-        sys.stdout.write ('\n')
-        ## TODO
-        ## sys.stdout.write ('    scons prefix=/usr DESTDIR=/tmp/pkg all install')
-        ## sys.stdout.write ('\n')
-        Exit (0)
-    elif not env['checksums']:
-        # When using timestams, config.hh is NEW.  The next
-        # build triggers recompilation of everything.  Exiting
-        # here makes SCons use the actual timestamp for config.hh
-        # and prevents recompiling everything the next run.
-        command = sys.argv[0] + ' ' + string.join (COMMAND_LINE_TARGETS)
-        sys.stdout.write ('Running %s ... ' % command)
-        sys.stdout.write ('\n')
-        s = os.system (command)
-        Exit (s)
-
-# WTF?
-# scons: *** Calling Configure from Builders is not supported.
-# env.Command (config_cache, None, configure)
-if not os.path.exists (config_cache) \
-   or (os.stat ('SConstruct')[stat.ST_MTIME]
-       > os.stat (config_cache)[stat.ST_MTIME]):
-    env = configure (None, None, env)
-    save_config_cache (env)
-elif env['checksums']:
-    # just save everything
-    save_config_cache (env)
-
-#urg how does #/ subst work?
-Export ('env')
-SConscript ('buildscripts/builder.py')
-
-env.PrependENVPath ('PATH',
-            os.path.join (env['absbuild'], env['out'], 'usr/bin'))
-
-LILYPOND_DATADIR = os.path.join (run_prefix, 'share/lilypond/', version)
-
-if not os.path.exists (LILYPOND_DATADIR):
-    os.makedirs (LILYPOND_DATADIR)
-
-env.Command (LILYPOND_DATADIR, ['#/SConstruct', '#/VERSION'], symlink_tree)
-env.Depends ('lily', LILYPOND_DATADIR)
-
-env.Append (ENV = {
-    'LILYPOND_DATADIR' : LILYPOND_DATADIR,
-    'TEXMF' : '{$LILYPOND_DATADIR,'
-    + os.popen ('kpsexpand \$TEXMF').read ()[:-1] + '}',
-    })
-
-BUILD_ABC2LY = '${set__x}$PYTHON $srcdir/scripts/abc2ly.py'
-BUILD_LILYPOND = '$absbuild/lily/$out/lilypond ${__verbose}'
-BUILD_LILYPOND_BOOK = '$PYTHON $srcdir/scripts/lilypond-book.py ${__verbose}'
-
-if env['verbose'] and env['verbose'] != '0':
-    env['__verbose'] = ' --verbose'
-    env['set__x'] = 'set -x;'
-
-# post-option environment-update
-env.Append (
-    bindir = bindir,
-    sharedir = sharedir,
-    lilypond_datadir = sharedir_package,
-    localedir = localedir,
-    local_lilypond_datadir = sharedir_package_version,
-    lilypondprefix = lilypondprefix,
-    sharedir_package = sharedir_package,
-    sharedir_doc_package = sharedir_doc_package,
-    sharedir_package_version = sharedir_package_version,
-    libdir_package = libdir_package,
-    libdir_package_version = libdir_package_version,
-
-    LILYPOND = BUILD_LILYPOND,
-    ABC2LY = BUILD_ABC2LY,
-    LILYPOND_BOOK = BUILD_LILYPOND_BOOK,
-    LILYPOND_BOOK_FORMAT = 'texi-html',
-    MAKEINFO_FLAGS = '--css-include=$srcdir/Documentation/texinfo.css',
-    )
-
-env.Append (CCFLAGS = ['-pipe', '-Wno-pmf-conversions'])
-if env['debugging']:
-    env.Append (CCFLAGS = ['-g'])
-if env['optimising']:
-    env.Append (CCFLAGS = '-O2')
-if env['warnings']:
-    env.Append (CCFLAGS = ['-W', '-Wall'])
-    env.Append (CXXFLAGS = ['-Wconversion'])
-
-# ugr,huh?
-env.Append (LINKFLAGS = ['-Wl,--export-dynamic'])
-# FIXME: ParseConfig ignores -L flag?
-env.Append (LINKFLAGS = ['-L/usr/X11R6/lib'])
-
-## Explicit target and dependencies
-
-if 'clean' in COMMAND_LINE_TARGETS:
-    # ugh: prevent reconfigure instead of clean
-    os.system ('touch %s' % config_cache)
-    
-    command = sys.argv[0] + ' -c .'
-    sys.stdout.write ('Running %s ... ' % command)
-    sys.stdout.write ('\n')
-    s = os.system (command)
-    if os.path.exists (config_cache):
-        os.unlink (config_cache)
-    Exit (s)
-
-if 'sconsclean' in COMMAND_LINE_TARGETS:
-    command = 'rm -rf scons.cache $(find . -name ".scon*")'
-    s = os.system (command)
-    if os.path.exists (config_cache):
-        os.unlink (config_cache)
-    Exit (s)
-    
-if 'realclean' in COMMAND_LINE_TARGETS:
-    command = 'rm -rf $(find . -name "out-scons" -o -name ".scon*")'
-    sys.stdout.write ('Running %s ... ' % command)
-    sys.stdout.write ('\n')
-    s = os.system (command)
-    if os.path.exists (config_cache):
-        os.unlink (config_cache)
-    Exit (s)
-
-# Declare SConscript phonies 
-env.Alias ('minimal', config_cache)
-
-if 0:
-    env.Alias ('mf-essential', config_cache)
-    env.Alias ('minimal', ['python', 'lily', 'mf-essential'])
-    env.Alias ('all', ['minimal', 'mf', '.'])
-
-else:
-    env.Alias ('minimal', ['python', 'lily', 'mf'])
-    env.Alias ('all', ['minimal', '.'])
-
-
-# Do we want the doc/web separation?
-env.Alias ('doc',
-       ['minimal',
-        'Documentation',
-        'Documentation/user',
-        'Documentation/topdocs',
-        'Documentation/bibliography',
-        'input'])
-
-# Without target arguments, do minimal build
-if not COMMAND_LINE_TARGETS:
-    env.Default (['minimal'])
-
-# GNU Make rerouting compat:
-env.Alias ('web', 'doc')
-
-
-env.Command (version_hh, '#/VERSION',
-         '$PYTHON ./stepmake/bin/make-version.py VERSION > $TARGET')
-
-# post-config environment update
-env.Append (
-    run_prefix = run_prefix,
-    LILYPOND_DATADIR = LILYPOND_DATADIR,
-
-    # FIXME: move to lily/SConscript?
-    LIBPATH = [os.path.join (absbuild, 'flower', env['out'])],
-    CPPPATH = [outdir, ],
-    LILYPOND_PATH = ['.',
-             '$srcdir/input',
-             '$srcdir/input/regression',
-             '$srcdir/input/test',
-             '$srcdir/input/tutorial',
-             '$srcdir/Documentation/user',
-             '$absbuild/mf/$out',
-#            os.path.join (absbuild, 'Documentation',
-#                      env['out']),
-#            os.path.join (absbuild, 'Documentation/user',
-#                      env['out']),
-             ],
-    MAKEINFO_PATH = ['.', '$srcdir/Documentation/user',
-             '$absbuild/Documentation/user/$out'],
-    )
-
-#### dist, tar
-def plus (a, b):
-    a + b
-
-def cvs_entry_is_dir (line):
-    return line[0] == 'D' and line[-2] == '/'
-
-def cvs_entry_is_file (line):
-    return line[0] == '/' and line[-2] == '/'
-
-def cvs_dirs (dir):
-    entries = os.path.join (dir, 'CVS/Entries')
-    if not os.path.exists (entries):
-        return []
-    entries = open (entries).readlines ()
-    dir_entries = filter (cvs_entry_is_dir, entries)
-    dirs = map (lambda x: os.path.join (dir, x[2:x[2:].index ('/')+3]),
-            dir_entries)
-    return dirs + map (cvs_dirs, dirs)
-
-def cvs_files (dir):
-    entries = os.path.join (dir, 'CVS/Entries')
-    if not os.path.exists (entries):
-        return []
-    entries = open (entries).readlines ()
-    file_entries = filter (cvs_entry_is_file, entries)
-    files = map (lambda x: x[1:x[1:].index ('/')+1], file_entries)
-    return map (lambda x: os.path.join (dir, x), files)
-
-def flatten (tree, lst):
-    if type (tree) == type ([]):
-        for i in tree:
-            if type (i) == type ([]):
-                flatten (i, lst)
-            else:
-                lst.append (i)
-    return lst
-
-if os.path.isdir ('%(srcdir)s/CVS' % vars ()):
-    subdirs = flatten (cvs_dirs ('.'), [])
-else:
-    # ugh
-    command = 'cd %(srcdir)s \
-    && find . -name SConscript | sed s@/SConscript@@' % vars ()
-    subdirs = string.split (os.popen (command).read ())
-
-if env['fast']\
-   and 'all' not in COMMAND_LINE_TARGETS\
-   and 'doc' not in COMMAND_LINE_TARGETS\
-   and 'web' not in COMMAND_LINE_TARGETS\
-   and 'install' not in COMMAND_LINE_TARGETS\
-   and 'clean' not in COMMAND_LINE_TARGETS:
-    subdirs = [ 'python',
-            'lily',
-           'flower',
-           'mf',
-           ]
-
-if os.path.isdir ('%(srcdir)s/CVS' % vars ()):
-    src_files = reduce (lambda x, y: x + y, map (cvs_files, subdirs))
-else:
-    src_files = ['foobar']
-
-readme_files = ['AUTHORS', 'README', 'INSTALL', 'NEWS']
-txt_files = map (lambda x: x + '.txt', readme_files)
-
-
-#
-# speeds up build by +- 5% 
-# 
-if not env['fast']:
-    foo = map (lambda x: env.TXT (x + '.txt',
-                      os.path.join ('Documentation/topdocs', x)),
-           readme_files)
-    tar_base = package.name + '-' + version
-    tar_name = tar_base + '.tar.gz'
-    ball_prefix = os.path.join (outdir, tar_base)
-    tar_ball = os.path.join (outdir, tar_name)
-
-    dist_files = src_files + txt_files
-    ball_files = map (lambda x: os.path.join (ball_prefix, x), dist_files)
-    map (lambda x: env.Depends (tar_ball, x), ball_files)
-    map (lambda x: env.Command (os.path.join (ball_prefix, x), x,
-                    'ln $SOURCE $TARGET'), dist_files)
-    tar = env.Command (tar_ball, src_files,
-               ['rm -f $$(find $TARGET.dir -name .sconsign)',
-                'tar czf $TARGET -C $TARGET.dir %s' % tar_base,])
-    env.Alias ('tar', tar)
-
-    dist_ball = os.path.join (package.release_dir, tar_name)
-    env.Command (dist_ball, tar_ball,
-             'if [ -e $SOURCE -a -e $TARGET ]; then rm $TARGET; fi;' \
-             + 'ln $SOURCE $TARGET')
-    env.Depends ('dist', dist_ball)
-    patch_name = os.path.join (outdir, tar_base + '.diff.gz')
-    patch = env.PATCH (patch_name, tar_ball)
-    env.Depends (patch_name, dist_ball)
-    env.Alias ('release', patch)
-
-#### web
-if not env['fast']:
-    web_base = os.path.join (outdir, 'web')
-    web_ball = web_base + '.tar.gz'
-    env['footify'] = 'MAILADDRESS=bug-lilypond@gnu.org $PYTHON stepmake/bin/add-html-footer.py --name=lilypond --version=$TOPLEVEL_VERSION'
-    web_ext = ['.html', '.ly', '.midi', '.pdf', '.png', '.ps.gz', '.txt',]
-    web_path = '-path "*/$out/*"' + string.join (web_ext, ' -or -path "*/$out/*"') + '-or -type l'
-    env['web_path'] = web_path
-    web_list = os.path.join (outdir, 'weblist')
-    # compatible make heritits
-    # fixme: generate in $outdir is cwd/builddir
-    env.Command (web_list,
-             ## Adding 'doc' dependency is correct, but takes
-             ## > 5min extra if you have a peder :-)
-             #'doc',
-             
-             '#/VERSION',
-             ['$PYTHON buildscripts/mutopia-index.py -o examples.html ./',
-              'cd $absbuild && $footify $$(find . -name "*.html" -print)',
-              'cd $absbuild && rm -f $$(find . -name "*.html~" -print)',
-              'cd $absbuild && find Documentation input $web_path \
-              > $TARGET',
-              '''echo '<META HTTP-EQUIV="refresh" content="0;URL=Documentation/out-www/index.html">' > $absbuild/index.html''',
-              '''echo '<html><body>Redirecting to the documentation index...</body></html>' >> $absbuild/index.html''',
-              'cd $absbuild && ls *.html >> $TARGET',])
-    env.Command (web_ball, web_list,
-             ['cat $SOURCE | tar -C $absbuild -czf $TARGET -T -',])
-    #env.Alias ('web', web_ball)
-    www_base = os.path.join (outdir, 'www')
-    www_ball = www_base + '.tar.gz'
-    env.Command (www_ball, web_ball,
-             ['rm -rf $out/tmp',
-              'mkdir -p $absbuild/$out/tmp',
-              'tar -C $absbuild/$out/tmp -xzf $SOURCE',
-              'cd $absbuild/$out/tmp && for i in $$(find . -name "$out"); '
-              + ' do mv $$i $$(dirname $$i)/out-www; done',
-              'tar -C $absbuild/$out/tmp -czf $TARGET .'])
-    env.Alias ('web', www_ball)
-
-#### tags
-env.Append (
-    ETAGSFLAGS = """--regex='{c++}/^LY_DEFINE *(\([^,]+\)/\\1/' \
-    --regex='{c++}/^LY_DEFINE *([^"]*"\([^"]+\)"/\\1/'""")
-code_ext = ['.cc', '.hh', '.scm', '.tcc',]
-env.Command ('TAGS', filter (lambda x: os.path.splitext (x)[1] in code_ext,
-                 src_files),
-         'etags $ETAGSFLAGS $SOURCES')
-
-# Note: SConscripts are only needed in directories where something needs
-# to be done, building or installing
-for d in subdirs:
-    if os.path.exists (os.path.join (d, 'SConscript')):
-        b = os.path.join (env['build'], d, env['out'])
-        # Support clean sourcetree build (--srcdir build)
-        # and ./out build.
-        if os.path.abspath (b) != os.path.abspath (d):
-            env.BuildDir (b, d, duplicate = 0)
-        SConscript (os.path.join (b, 'SConscript'))
-
-env.Command ('tree', ['#/VERSION', '#/SConstruct'], symlink_tree)
diff --git a/THANKS b/THANKS
index 8a077a16f849f7057d9bdb437d374e9059da98b8..6703d344813dc33b2628681e09a040325ca4de00 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -1,4 +1,4 @@
-Release 2.11
+Release 2.12
 ************
 
 
@@ -102,6 +102,7 @@ Luc Wehli
 Maarten Hijzelendoorn
 Marc Lanoiselée
 Mark Polesky
+Matthieu Jacquot
 Matthijs Frankeno
 Martijn Vromans
 Marnen Laibow-Koser
diff --git a/VERSION b/VERSION
index 3940f458623f924821a3e043cf0ad813bc14a661..22304042b55748d45e4aae869641ac41db9f1d5d 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,6 +1,6 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=12
-PATCH_LEVEL=1
+PATCH_LEVEL=2
 MY_PATCH_LEVEL=
 
diff --git a/buildscripts/GNUmakefile b/buildscripts/GNUmakefile
deleted file mode 100644 (file)
index 3a40aa0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-depth = ..
-
-STEPMAKE_TEMPLATES=script install po
-EXTRA_DIST_FILES=pfx2ttf.fontforge
-
-include $(depth)/make/stepmake.make
-
-# Should we install these? This should be handled by sysadmin or
-# packager but if she forgets...
-#INSTALLATION_OUT_SUFFIXES=1
-#INSTALLATION_OUT_DIR1=$(local_lilypond_datadir)/scripts
-#INSTALLATION_OUT_FILES1=$(outdir)/lilypond-login $(outdir)/lilypond-profile
-
-all: $(INSTALLATION_FILES)
-
diff --git a/buildscripts/SConscript b/buildscripts/SConscript
deleted file mode 100644 (file)
index 98d254f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*-python-*-
-
-Import ('env')
-sources = ['lilypond-profile.sh', 'lilypond-login.sh']
-gens = map (env.AT_COPY, sources)
diff --git a/buildscripts/bib2html.py b/buildscripts/bib2html.py
deleted file mode 100644 (file)
index c16f21c..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#!@PYTHON@
-import os
-import sys
-import getopt
-import tempfile
-
-# usage:
-def usage ():
-    print 'usage: %s [-s style] [-o <outfile>] BIBFILES...'
-
-(options, files) = getopt.getopt (sys.argv[1:], 's:o:', [])
-
-output = 'bib.html'
-style = 'long'
-
-for (o,a) in options:
-    if o == '-h' or o == '--help':
-        usage ()
-        sys.exit (0)
-    elif o == '-s' or o == '--style':
-        style = a
-    elif o == '-o' or o == '--output':
-        output = a
-    else:
-        raise Exception ('unknown option: %s' % o)
-
-
-if style not in ['alpha','index','long','longp','long-pario','short','short-pario','split']:
-    sys.stderr.write ("Unknown style \`%s'\n" % style)
-
-tempfile = tempfile.mktemp ('bib2html')
-
-if not files:
-   usage ()
-   sys.exit (2)
-
-
-def strip_extension (f, ext):
-    (p, e) = os.path.splitext (f)
-    if e == ext:
-        e = ''
-    return p + e
-
-nf = []
-for f in files:
-    nf.append (strip_extension (f, '.bib'))
-
-files = ','.join (nf)
-
-open (tempfile + '.aux', 'w').write (r'''
-\relax 
-\citation{*}
-\bibstyle{html-%(style)s}
-\bibdata{%(files)s}''' % vars ()) 
-
-cmd = "bibtex %s" % tempfile
-
-sys.stdout.write ("Invoking `%s'\n" % cmd)
-stat = os.system (cmd)
-if stat <> 0:
-    sys.exit(1)
-
-
-#TODO: do tex -> html on output 
-
-bbl = open (tempfile + '.bbl').read ()
-
-open (output, 'w').write  (bbl)
-
-
-def cleanup (tempfile):
-    for a in ['aux','bbl', 'blg']:
-        os.unlink (tempfile + '.' + a)
-
-cleanup (tempfile)
-
diff --git a/buildscripts/build-coverage.sh b/buildscripts/build-coverage.sh
deleted file mode 100644 (file)
index b86ebaa..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-
-if test "$1" == "--fresh"; then
-  fresh=yes
-fi
-
-if test ! -f config-cov.make; then
-  fresh=yes
-fi
-
-if test "$fresh" = "yes";
-then
-  ./configure --enable-config=cov --disable-optimising \
-   &&   make conf=cov -j2 clean \
-   &&   perl -i~ -pe 's/-pipe /-fprofile-arcs -ftest-coverage -pipe /g' config-cov.make \
-   &&   perl -i~ -pe 's/ -ldl / -lgcov -ldl /g' config-cov.make
-else
-  find -name '*.gcda' -exec rm  '{}' ';'
-fi
-
-mkdir -p scripts/out-cov/
-touch scripts/out-cov/midi2ly scripts/out-cov/midi2ly.1
-make conf=cov -j2 &&  \
-  make conf=cov test-clean OUT_TEST=testcov LILYPOND_JOBS= && \
-  make conf=cov test OUT_TEST=testcov LILYPOND_JOBS='-dtrace-scheme-coverage '
-
-if test "$?" != "0"; then
-  tail -100 out-cov/test-run.log
-  exit 1
-fi
-
-depth=../..
-resultdir=out/coverage-results
-
-rm -rf $resultdir
-mkdir $resultdir
-cd $resultdir
-
-ln $depth/lily/* .
-ln $depth/scm/*.scm .
-mv $depth/input/regression/out-testcov/*.scm.cov .
-ln $depth/ly/*.ly .
-ln $depth/lily/out-cov/*[ch] .
-mkdir include
-ln $depth/lily/include/* include/
-ln $depth/flower/include/* include/
-for a in *[cl] *.yy
-do
-   gcov -o $depth/lily/out-cov/  -p $a > $a.gcov-summary
-done 
-
-python $depth/buildscripts/coverage.py --uncovered *.cc > uncovered.txt
-python $depth/buildscripts/coverage.py --hotspots *.cc > hotspots.txt
-python $depth/buildscripts/coverage.py --summary *.cc > summary.txt
-python $depth/buildscripts/coverage.py --uncovered *.scm > uncovered-scheme.txt
-
-head -20 summary.txt
-
-cat <<EOF
-results in
-
-  out/coverage-results/summary.txt
-  out/coverage-results/uncovered.txt
-  out/coverage-results/uncovered-scheme.txt
-  out/coverage-results/hotspots.txt
-
-EOF
diff --git a/buildscripts/build-profile.sh b/buildscripts/build-profile.sh
deleted file mode 100644 (file)
index 072cf64..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh
-
-if test "$1" == "--fresh"; then
-  fresh=yes
-fi
-
-if test ! -f config-prof.make; then
-  fresh=yes
-fi
-
-if test "$fresh" = "yes";
-then
-  ./configure --enable-config=prof --enable-optimising \
-   &&   perl -i~ -pe 's/-pipe /-pg -pipe /g' config-prof.make \
-   &&   perl -i~ -pe 's/ -ldl / -pg -ldl /g' config-prof.make
-fi
-
-make conf=prof -j2
-
-if test "$?" != "0"; then
-  exit 2
-fi
-
-depth=../..
-resultdir=out/profile-results
-
-rm -rf $resultdir
-mkdir $resultdir
-cd $resultdir
-
-
-cat > long-score.ly << EOF
-\version "2.10.0"
-foo = \new Staff \new Voice \repeat unfold 50 \relative { c4 d8[ d16( e]~ e16[ e e) f] g8  }
-\score { 
-  \new ChoirStaff << 
-    \foo \foo \foo \foo 
-    \foo \foo \foo \foo 
-
-  >>
-  \midi {}
-  \layout {}
-}
-EOF
-
-rm gmon.sum
-
-exe=$depth/out-prof/bin/lilypond
-
-## todo: figure out representative sample.
-files="wtk1-fugue2 wtk1-fugue2 wtk1-fugue2 wtk1-fugue2 mozart-hrn-3  mozart-hrn-3  long-score"
-
-
-
-$exe -ddump-profile --formats=ps -I $depth/input/ -I  $depth/input/mutopia/J.S.Bach/ \
-    -I $depth/input/mutopia/W.A.Mozart/ \
-    $files
-
-
-for a in *.profile; do
-  echo $a
-  cat $a
-done
-
-echo 'running gprof' 
-gprof $exe > profile
-
-exit 0
-
-
-## gprof -s takes forever.
-for a in seq 1 3; do
-  for f in $files ; do
-    $exe -ddump-profile --formats=ps -I $depth/input/ -I  $depth/input/mutopia/J.S.Bach/ \
-       -I $depth/input/mutopia/W.A.Mozart/ \
-       $f
-
-    echo 'running gprof' 
-    if test -f gmon.sum ; then
-      gprof -s $exe gmon.out gmon.sum
-    else
-      mv gmon.out gmon.sum
-    fi
-  done
-done
-
-gprof $exe gmon.sum > profile
diff --git a/buildscripts/builder.py b/buildscripts/builder.py
deleted file mode 100644 (file)
index 8313c37..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-# -*-python-*-
-
-import glob
-import os
-import string
-
-Import ('env')
-
-# utility
-
-def add_suffixes (target, source, env, target_suffixes, src_suffixes):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + map (lambda x: base + x, target_suffixes),
-        source + map (lambda x: base + x, src_suffixes))
-
-# junkme; see _concat
-def join_path (path, infix=os.pathsep, prefix = ''):
-    def dir (x):
-        if x and x[0] == '#':
-            return env['srcdir'] + x[1:]
-        return x
-    return string.join (map (lambda x: prefix + dir (x), path), infix)
-
-
-def src_glob (s):
-    here = os.getcwd ()
-    os.chdir (env.Dir ('.').srcnode ().abspath)
-    result = glob.glob (s)
-    os.chdir (here)
-    return result
-
-Export ('src_glob')
-
-def base_glob (s):
-    return map (lambda x: os.path.splitext (x)[0], src_glob (s))
-
-Export ('base_glob')
-
-def install (target, dir):
-    dest = env['DESTDIR'] + dir
-    if type (target) == type ([]):
-        map (lambda x: env.Install (dir, x), target)
-    else:
-        env.Install (dir, target)
-    env.Alias ('install', dir)
-
-Export ('install')
-
-def _fixme (s):
-    x = string.replace (s, '#', env['srcdir'])
-    x = string.replace (x, '@', env['absbuild'])
-    return x
-
-# Clean separation between generic action + flags and actual
-# configuration and flags in environment for this build.
-
-# Generic builders could/should be part of SCons.
-
-
-HH = Builder (action = 'bison -d -o ${TARGET.base}.cc $SOURCE',
-       suffix = '.hh', src_suffix = '.yy')
-env.Append (BUILDERS = {'HH' : HH})
-
-
-# Setup LilyPond environment.  For the LilyPond build, we override
-# some of these commands in the ENVironment.
-
-lilypond_book_flags = '''--format=$LILYPOND_BOOK_FORMAT --process="lilypond -I$srcdir -I$srcdir/input/test $__verbose --backend=eps --formats=ps,png --header=texidoc -dinternal-type-checking -ddump-signatures -danti-alias-factor=2" '''
-
-env.Append (
-    BSTINPUTS = '${SOURCE.dir}:${TARGET.dir}:',
-    BIB2HTML = '$PYTHON $srcdir/buildscripts/bib2html.py',
-    LILYOND_BOOK = 'lilypond-book',
-    LILYPOND_BOOK_FORMAT = '',
-    LILYPOND_BOOK_FLAGS = lilypond_book_flags,
-    LILYPOND_PATH = [],
-    # The SCons way around FOO_PATH:
-    LILYPOND_INCFLAGS = '$( ${_concat(INCPREFIX, LILYPOND_PATH, INCSUFFIX, __env__)} $)',
-
-    MAKEINFO_PATH = [],
-    MAKEINFO_FLAGS = [],
-    MAKEINFO_INCFLAGS = '$( ${_concat(INCPREFIX, MAKEINFO_PATH, INCSUFFIX, __env__, RDirs)} $)',
-    #TEXI2DVI_FLAGS = [],
-    _TEXI2DVI_FLAGS = '$( ${_concat(" ", TEXI2DVI_FLAGS,)} $)',
-    )
-
-TXT =\
-  Builder (action = '$MAKEINFO --output=$TARGET $MAKEINFO_INCFLAGS\
-  --no-split --no-headers $SOURCE',
-       suffix = '.txt', src_suffix = '.texi')
-env.Append (BUILDERS = {'TXT': TXT})
-
-INFO =\
-  Builder (action = '$MAKEINFO --output=$TARGET $MAKEINFO_INCFLAGS $SOURCE',
-       suffix = '.info', src_suffix = '.texi')
-env.Append (BUILDERS = {'INFO': INFO})
-
-HTML =\
-  Builder (action = '$MAKEINFO --output=$TARGET $MAKEINFO_INCLUDES\
-  --html --no-split --no-headers $MAKEINFO_FLAGS $SOURCE',
-suffix = '.html', src_suffix = '.texi')
-env.Append (BUILDERS = {'HTML': HTML})
-
-TEXI =\
-  Builder (action =
-       '$LILYPOND_BOOK --output=${TARGET.dir} \
-       --include=${TARGET.dir} $LILYPOND_INCFLAGS \
-       --process="$LILYPOND $LILYPOND_INCFLAGS" \
-       $LILYPOND_BOOK_FLAGS \
-       $SOURCE',
-       suffix = '.texi', src_suffix = '.tely')
-env.Append (BUILDERS = {'TEXI': TEXI})
-
-TEXIDVI =\
-    Builder (action = 'cd ${TARGET.dir} && \
-    texi2dvi --batch -I $srcdir/Documentation/user $_TEXI2DVI_FLAGS ${SOURCE.file}',
-        suffix = '.dvi', src_suffix = '.texi')
-env.Append (BUILDERS = {'TEXIDVI': TEXIDVI})
-
-DVIPS =\
-   Builder (action = 'TEXINPUTS=${TARGET.dir}:$$TEXINPUTS $DVIPS -o $TARGET $DVIPS_FLAGS $SOURCE',
-       suffix = '.ps', src_suffix = '.dvi')
-env.Append (BUILDERS = {'DVIPS': DVIPS})
-
-DVIPDF =\
-   Builder (action = 'TEXINPUTS=${TARGET.dir}:$$TEXINPUTS $DVIPS -o $TARGET -Ppdf $DVIPS_FLAGS $SOURCE',
-       suffix = '.pdfps', src_suffix = '.dvi')
-env.Append (BUILDERS = {'DVIPDF': DVIPDF})
-
-PSPDF =\
-   Builder (action = 'ps2pdf $PSPDF_FLAGS $SOURCE $TARGET',
-       suffix = '.pdf', src_suffix = '.pdfps')
-env.Append (BUILDERS = {'PSPDF': PSPDF})
-
-PNG2EPS =\
-    Builder (action = 'convert $SOURCE $TARGET',
-        suffix = '.eps', src_suffix = '.png')
-env.Append (BUILDERS = {'PNG2EPS': PNG2EPS})
-
-EPS2PNG =\
-    Builder (action = 'convert $SOURCE $TARGET',
-        suffix = '.png', src_suffix = '.eps')
-env.Append (BUILDERS = {'EPS2PNG': EPS2PNG})
-
-def add_ps_target (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + [base + '.ps'], source)
-
-lilypond =\
-    Builder (action = '$LILYPOND --output=${TARGET.base} --include=${TARGET.dir} $SOURCE',
-         suffix = '.pdf', src_suffix = '.ly')
-##                    emitter = add_ps_target)
-env.Append (BUILDERS = {'LilyPond': lilypond})
-
-ABC = Builder (action = '$ABC2LY --output=${TARGET} --strict $SOURCE',
-       suffix = '.ly', src_suffix = '.abc')
-env.Append (BUILDERS = {'ABC': ABC})
-
-def add_log_target (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + [base + '.log'], source)
-
-def add_tfm_target (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + [base + '.tfm'], source)
-
-def add_lisp_enc_target (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + [base + '.lisp', base + '.enc'],
-        source)
-
-def add_cff_cffps_svg (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + [base + '.cff', base + '.cff.ps', base + '.svg'],
-        source)
-
-a = 'cd ${TARGET.dir} \
-&& MFINPUTS=.:${SOURCE.dir}:$srcdir/${SOURCE.dir}: \
-$MF "\\mode:=$MFMODE; nonstopmode; input ${SOURCE.filebase};" \
-| grep -v "@\|>>\|w:\|h:";'
-tfm = Builder (action = a, suffix = '.tfm', src_suffix = '.mf',
-#               emitter = lambda t, s, e: add_suffixes (t, s, e, ['.log'], []))
-       emitter = add_log_target)
-env.Append (BUILDERS = {'TFM': tfm})
-
-a = '$PYTHON $MF_TO_TABLE_PY \
---outdir=${TARGET.dir} \
---global-lisp=${TARGET.base}.otf-gtable \
---lisp=${TARGET.base}.lisp \
---enc=${TARGET.base}.enc \
-${TARGET.base}.log'
-gtable = Builder (action = a, suffix = '.otf-gtable', src_suffix = '.log',
-         emitter = add_lisp_enc_target)
-env.Append (BUILDERS = {'GTABLE': gtable})
-
-def add_enc_src (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    #return (target, source + [base + '.enc'])
-    return (target + [base + '.pfb', base + '.svg'], source + [base + '.enc'])
-
-def add_svg (target, source, env):
-    base = os.path.splitext (str (target[0]))[0]
-    return (target + [base + '.svg'], source)
-
-# FIXME UGH, should fix --output option for mftrace
-a = 'cd ${TARGET.dir} && \
-if test -e ${SOURCE.filebase}.enc; then encoding="--encoding=${SOURCE.filebase}.enc"; fi; \
-MFINPUTS=$srcdir/mf:.: \
-$MFTRACE --formats=pfa,pfb,svg --simplify --keep-trying --no-afm \
-$$encoding $__verbose \
---include=${TARGET.dir} \
-${SOURCE.file}'
-
-pfa = Builder (action = a,
-       suffix = '.pfa',
-       src_suffix = '.mf',
-       emitter = add_enc_src)
-env.Append (BUILDERS = {'PFA': pfa})
-
-a = ['(cd ${TARGET.dir} && $FONTFORGE -script ${SOURCE.file})',
-#     '$PYTHON $srcdir/buildscripts/ps-embed-cff.py ${SOURCE.base}.cff $$(cat ${SOURCE.base}.fontname) ${SOURCE.base}.cff.ps',
-  'rm -f ${TARGET.dir}/*.scale.pfa']
-otf = Builder (action = a,
-       suffix = '.otf',
-       src_suffix = '.pe',
-#               emitter = add_cff_cffps_svg
-               emitter = add_svg
-       )
-env.Append (BUILDERS = {'OTF': otf})
-
-
-# Specific builders
-
-env['DIFF_PY'] = '$srcdir/stepmake/bin/package-diff.py'
-a = '$PYTHON $DIFF_PY $NO__verbose --outdir=${TARGET.dir}'
-patch = Builder (action = a, suffix = '.diff', src_suffix = '.tar.gz')
-env.Append (BUILDERS = {'PATCH': patch})
-
-atvars = [
-'BASH',
-'DATE',
-'sharedstatedir',
-'GUILE',
-'bindir',
-'date',
-'datadir',
-'lilypond_datadir',
-'lilypond_libdir',
-'local_lilypond_datadir',
-'local_lilypond_libdir',
-'localedir',
-'PACKAGE',
-'package',
-'PATHSEP',
-'PERL',
-'prefix',
-'program_prefix',
-'program_suffix',
-'PYTHON',
-'SHELL',
-'TOPLEVEL_VERSION',
-'step-bindir',
-]
-
-def at_copy (target, source, env):
-  n = str (source[0])
-  s = open (n).read ()
-  for i in atvars:
-      if env.has_key (i):
-          s = string.replace (s, '@%s@'% i, env[i])
-  t = str (target[0])
-  open (t, 'w').write (s)
-  # wugh
-  if os.path.basename (os.path.dirname (str (target[0]))) == 'bin':
-      os.chmod (t, 0755)
-
-AT_COPY = Builder (action = at_copy, src_suffix = ['.in', '.py', '.sh',])
-env.Append (BUILDERS = {'AT_COPY': AT_COPY})
-
-MO = Builder (action = 'msgfmt -o $TARGET $SOURCE',
-       suffix = '.mo', src_suffix = '.po')
-env.Append (BUILDERS = {'MO': MO})
-
-ugh =  'ln -f po/lilypond.pot ${TARGET.dir}/lilypond.po ; '
-a = ugh + 'xgettext --default-domain=lilypond --join \
---output-dir=${TARGET.dir} --add-comments \
---keyword=_ --keyword=_f --keyword=_i $SOURCES'
-PO = Builder (action = a, suffix = '.pot',
-       src_suffix = ['.cc', '.hh', '.py'], multi = 1)
-env['potarget'] = os.path.join (env['absbuild'], 'po', env['out'],
-                'lilypond.pot')
-env['pocommand'] = a
-
-ugh = '; mv ${TARGET} ${SOURCE}'
-a = 'msgmerge ${SOURCE} ${SOURCE.dir}/lilypond.pot -o ${TARGET}' + ugh
-POMERGE = Builder (action = a, suffix = '.pom', src_suffix = '.po')
-env.Append (BUILDERS = {'POMERGE': POMERGE})
-
-a = 'BSTINPUTS=$BSTINPUTS $BIB2HTML -o $TARGET $SOURCE'
-BIB2HTML = Builder (action = a, suffix = '.html', src_suffix = '.bib')
-env.Append (BUILDERS = {'BIB2HTML': BIB2HTML})
-
-a = '$PYTHON $srcdir/buildscripts/lys-to-tely.py \
---name=${TARGET.base} --title="$TITLE" $SOURCES'
-LYS2TELY = Builder (action = a, suffix = '.tely', src_suffix = '.ly')
-env.Append (BUILDERS = {'LYS2TELY': LYS2TELY})
-
-
-def mutopia (ly=None, abc=None):
-    e = env.Copy (
-        LILYPOND_BOOK_FLAGS = lilypond_book_flags,
-        )
-    
-    if not abc:
-        abc = base_glob ('*.abc')
-    if not ly:
-        ly = base_glob ('*.ly') + map (e.ABC, abc)
-    pdf = map (e.LilyPond, ly)
-    env.Depends (pdf, ['#/lily', '#/mf'])
-    env.Alias ('doc', pdf)
-
-Export ('mutopia')
-
-def collate (title = 'collated files'):
-    ly = base_glob ('*.ly')
-    
-    e = env.Copy (
-        TITLE = title,
-        LILYPOND_BOOK_FLAGS = lilypond_book_flags,
-        # __verbose = ' --verbose',
-        )
-    tely = e.LYS2TELY ('collated-files', ly)
-    texi = e.TEXI (tely)
-    env.Depends (texi, ['#/lily', '#/mf'])
-    dvi = e.TEXIDVI (texi)
-    pspdf = e.DVIPDF (dvi)
-    pdf = e.PSPDF (pspdf)
-    html = e.HTML (texi)
-
-    env.Alias ('doc', pdf)
-    env.Alias ('doc', html)
-
-Export ('collate')
-
-Export ('env')
diff --git a/buildscripts/buildlib.py b/buildscripts/buildlib.py
deleted file mode 100644 (file)
index cd99586..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#!@PYTHON@
-
-import subprocess
-import re
-import sys
-
-verbose = False
-
-def read_pipe (command):
-    child = subprocess.Popen (command,
-                              stdout = subprocess.PIPE,
-                              stderr = subprocess.PIPE,
-                              shell = True)
-    (output, error) = child.communicate ()
-    code = str (child.wait ())
-    if not child.stdout or child.stdout.close ():
-        print "pipe failed: %(command)s" % locals ()
-    if code != '0':
-        error = code + ' ' + error
-    return (output, error)
-
-revision_re = re.compile ('GIT [Cc]ommittish:\s+([a-f0-9]+)')
-vc_diff_cmd = 'git diff %(color_flag)s %(revision)s HEAD -- %(original)s | cat'
-
-def check_translated_doc (original, translated_file, translated_contents, color=False):
-    m = revision_re.search (translated_contents)
-    if not m:
-        sys.stderr.write ('error: ' + translated_file + \
-                          ": no 'GIT committish: <hash>' found.\nPlease check " + \
-                          'the whole file against the original in English, then ' + \
-                          'fill in HEAD committish in the header.\n')
-        sys.exit (1)
-    revision = m.group (1)
-
-    if color:
-        color_flag = '--color'
-    else:
-        color_flag = '--no-color'
-    c = vc_diff_cmd % vars ()
-    if verbose:
-        sys.stderr.write ('running: ' + c)
-    return read_pipe (c)
diff --git a/buildscripts/catmidi.py b/buildscripts/catmidi.py
deleted file mode 100644 (file)
index c90d602..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!@PYTHON@
-
-import sys
-import midi
-
-(h,tracks) = midi.parse (open (sys.argv[1]).read ())
-
-tracks = tracks[1:]
-
-for t in tracks:
-    for e in t:
-        print e
diff --git a/buildscripts/check_texi_refs.py b/buildscripts/check_texi_refs.py
deleted file mode 100644 (file)
index dff7e33..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-#!/usr/bin/env python
-
-"""
-check_texi_refs.py
-Interactive Texinfo cross-references checking and fixing tool
-
-"""
-
-
-import sys
-import re
-import os
-import optparse
-import imp
-
-outdir = 'out-www'
-
-log = sys.stderr
-stdout = sys.stdout
-
-file_not_found = 'file not found in include path'
-
-warn_not_fixed = '*** Warning: this broken x-ref has not been fixed!\n'
-
-opt_parser = optparse.OptionParser (usage='check_texi_refs.py [OPTION]... FILE',
-                                    description='''Check and fix \
-cross-references in a collection of Texinfo
-documents heavily cross-referenced each other.
-''')
-
-opt_parser.add_option ('-a', '--auto-fix',
-                       help="Automatically fix cross-references whenever \
-it is possible",
-                       action='store_true',
-                       dest='auto_fix',
-                       default=False)
-
-opt_parser.add_option ('-b', '--batch',
-                       help="Do not run interactively",
-                       action='store_false',
-                       dest='interactive',
-                       default=True)
-
-opt_parser.add_option ('-c', '--check-comments',
-                       help="Also check commented out x-refs",
-                       action='store_true',
-                       dest='check_comments',
-                       default=False)
-
-opt_parser.add_option ('-p', '--check-punctuation',
-                       help="Check punctuation after x-refs",
-                       action='store_true',
-                       dest='check_punctuation',
-                       default=False)
-
-opt_parser.add_option ("-I", '--include', help="add DIR to include path",
-                       metavar="DIR",
-                       action='append', dest='include_path',
-                       default=[os.path.abspath (os.getcwd ())])
-
-(options, files) = opt_parser.parse_args ()
-
-class InteractionError (Exception):
-    pass
-
-
-manuals_defs = imp.load_source ('manuals_defs', files[0])
-manuals = {}
-
-def find_file (name, prior_directory='.'):
-    p = os.path.join (prior_directory, name)
-    out_p = os.path.join (prior_directory, outdir, name)
-    if os.path.isfile (p):
-        return p
-    elif os.path.isfile (out_p):
-        return out_p
-
-    # looking for file in include_path
-    for d in options.include_path:
-        p = os.path.join (d, name)
-        if os.path.isfile (p):
-            return p
-
-    # file not found in include_path: looking in `outdir' subdirs
-    for d in options.include_path:
-        p = os.path.join (d, outdir, name)
-        if os.path.isfile (p):
-            return p
-
-    raise EnvironmentError (1, file_not_found, name)
-
-
-exit_code = 0
-
-def set_exit_code (n):
-    global exit_code
-    exit_code = max (exit_code, n)
-
-
-if options.interactive:
-    try:
-        import readline
-    except:
-        pass
-
-    def yes_prompt (question, default=False, retries=3):
-        d = {True: 'y', False: 'n'}.get (default, False)
-        while retries:
-            a = raw_input ('%s [default: %s]' % (question, d) + '\n')
-            if a.lower ().startswith ('y'):
-                return True
-            if a.lower ().startswith ('n'):
-                return False
-            if a == '' or retries < 0:
-                return default
-            stdout.write ("Please answer yes or no.\n")
-            retries -= 1
-
-    def search_prompt ():
-        """Prompt user for a substring to look for in node names.
-
-If user input is empty or matches no node name, return None,
-otherwise return a list of (manual, node name, file) tuples.
-
-"""
-        substring = raw_input ("Enter a substring to search in node names \
-(press Enter to skip this x-ref):\n")
-        if not substring:
-            return None
-        substring = substring.lower ()
-        matches = []
-        for k in manuals:
-            matches += [(k, node, manuals[k]['nodes'][node][0])
-                        for node in manuals[k]['nodes']
-                        if substring in node.lower ()]
-        return matches
-
-else:
-    def yes_prompt (question, default=False, retries=3):
-        return default
-
-    def search_prompt ():
-        return None
-
-
-ref_re = re.compile \
-    ('@(ref|ruser|rlearning|rprogram|rglos)(?:\\{(?P<ref>[^,\\\\\\}]+?)|\
-named\\{(?P<refname>[^,\\\\]+?),(?P<display>[^,\\\\\\}]+?))\\}(?P<last>.)',
-     re.DOTALL)
-node_include_re = re.compile (r'(?m)^@(node|include)\s+(.+?)$')
-
-whitespace_re = re.compile (r'\s+')
-line_start_re = re.compile ('(?m)^')
-
-def which_line (index, newline_indices):
-    """Calculate line number of a given string index
-
-Return line number of string index index, where
-newline_indices is an ordered iterable of all newline indices.
-"""
-    inf = 0
-    sup = len (newline_indices) - 1
-    n = len (newline_indices)
-    while inf + 1 != sup:
-        m = (inf + sup) / 2
-        if index >= newline_indices [m]:
-            inf = m
-        else:
-            sup = m
-    return inf + 1
-
-
-comments_re = re.compile ('(?<!@)(@c(?:omment)? \
-.*?\\n|^@ignore\\n.*?\\n@end ignore\\n)', re.M | re.S)
-
-def calc_comments_boundaries (texinfo_doc):
-    return [(m.start (), m.end ()) for m in comments_re.finditer (texinfo_doc)]
-
-
-def is_commented_out (start, end, comments_boundaries):
-    for k in range (len (comments_boundaries)):
-        if (start > comments_boundaries[k][0]
-            and end <= comments_boundaries[k][1]):
-            return True
-        elif end <= comments_boundaries[k][0]:
-            return False
-    return False
-
-
-def read_file (f, d):
-    s = open (f).read ()
-    base = os.path.basename (f)
-    dir = os.path.dirname (f)
-
-    d['contents'][f] = s
-
-    d['newline_indices'][f] = [m.end () for m in line_start_re.finditer (s)]
-    if options.check_comments:
-        d['comments_boundaries'][f] = []
-    else:
-        d['comments_boundaries'][f] = calc_comments_boundaries (s)
-
-    for m in node_include_re.finditer (s):
-        if m.group (1) == 'node':
-            line = which_line (m.start (), d['newline_indices'][f])
-            d['nodes'][m.group (2)] = (f, line)
-
-        elif m.group (1) == 'include':
-            try:
-                p = find_file (m.group (2), dir)
-            except EnvironmentError, (errno, strerror):
-                if strerror == file_not_found:
-                    continue
-                else:
-                    raise
-            read_file (p, d)
-
-
-def read_manual (name):
-    """Look for all node names and cross-references in a Texinfo document
-
-Return a (manual, dictionary) tuple where manual is the cross-reference
-macro name defined by references_dict[name], and dictionary
-has the following keys:
-
-  'nodes' is a dictionary of `node name':(file name, line number),
-
-  'contents' is a dictionary of file:`full file contents',
-
-  'newline_indices' is a dictionary of
-file:[list of beginning-of-line string indices],
-
-  'comments_boundaries' is a list of (start, end) tuples,
-which contain string indices of start and end of each comment.
-
-Included files that can be found in the include path are processed too.
-
-"""
-    d = {}
-    d['nodes'] = {}
-    d['contents'] = {}
-    d['newline_indices'] = {}
-    d['comments_boundaries'] = {}
-    manual = manuals_defs.references_dict.get (name, '')
-    try:
-        f = find_file (name + '.tely')
-    except EnvironmentError, (errno, strerror):
-        if not strerror == file_not_found:
-            raise
-        else:
-            try:
-                f = find_file (name + '.texi')
-            except EnvironmentError, (errno, strerror):
-                if strerror == file_not_found:
-                    sys.stderr.write (name + '.{texi,tely}: ' +
-                                      file_not_found + '\n')
-                    return (manual, d)
-                else:
-                    raise
-
-    log.write ("Processing manual %s (%s)\n" % (f, manual))
-    read_file (f, d)
-    return (manual, d)
-
-
-log.write ("Reading files...\n")
-
-manuals = dict ([read_manual (name)
-                 for name in manuals_defs.references_dict.keys ()])
-
-ref_fixes = set ()
-bad_refs_count = 0
-fixes_count = 0
-
-def add_fix (old_type, old_ref, new_type, new_ref):
-    ref_fixes.add ((old_type, old_ref, new_type, new_ref))
-
-
-def lookup_fix (r):
-    found = []
-    for (old_type, old_ref, new_type, new_ref) in ref_fixes:
-        if r == old_ref:
-            found.append ((new_type, new_ref))
-    return found
-
-
-def preserve_linebreak (text, linebroken):
-    if linebroken:
-        if ' ' in text:
-            text = text.replace (' ', '\n', 1)
-            n = ''
-        else:
-            n = '\n'
-    else:
-        n = ''
-    return (text, n)
-
-
-def choose_in_numbered_list (message, string_list, sep=' ', retries=3):
-    S = set (string_list)
-    S.discard ('')
-    string_list = list (S)
-    numbered_list = sep.join ([str (j + 1) + '. ' + string_list[j]
-                               for j in range (len (string_list))]) + '\n'
-    t = retries
-    while t > 0:
-        value = ''
-        stdout.write (message +
-                      "(press Enter to discard and start a new search)\n")
-        input = raw_input (numbered_list)
-        if not input:
-            return ''
-        try:
-            value = string_list[int (input) - 1]
-        except IndexError:
-            stdout.write ("Error: index number out of range\n")
-        except ValueError:
-            matches = [input in v for v in string_list]
-            n = matches.count (True)
-            if n == 0:
-                stdout.write ("Error: input matches no item in the list\n")
-            elif n > 1:
-                stdout.write ("Error: ambiguous input (matches several items \
-in the list)\n")
-            else:
-                value = string_list[matches.index (True)]
-        if value:
-            return value
-        t -= 1
-    raise InteractionError ("%d retries limit exceeded" % retries)
-
-refs_count = 0
-
-def check_ref (manual, file, m):
-    global fixes_count, bad_refs_count, refs_count
-    refs_count += 1
-    bad_ref = False
-    fixed = True
-    type = m.group (1)
-    original_name = m.group ('ref') or m.group ('refname')
-    name = whitespace_re.sub (' ', original_name). strip ()
-    newline_indices = manuals[manual]['newline_indices'][file]
-    line = which_line (m.start (), newline_indices)
-    linebroken = '\n' in original_name
-    original_display_name = m.group ('display')
-    next_char = m.group ('last')
-    if original_display_name: # the xref has an explicit display name
-        display_linebroken = '\n' in original_display_name
-        display_name = whitespace_re.sub (' ', original_display_name). strip ()
-    commented_out = is_commented_out \
-        (m.start (), m.end (), manuals[manual]['comments_boundaries'][file])
-    useful_fix = not outdir in file
-
-    # check puncuation after x-ref
-    if options.check_punctuation and not next_char in '.,;:!?':
-        stdout.write ("Warning: %s: %d: `%s': x-ref \
-not followed by punctuation\n" % (file, line, name))
-
-    # validate xref
-    explicit_type = type
-    new_name = name
-
-    if type != 'ref' and type == manual and not commented_out:
-        if useful_fix:
-            fixed = False
-            bad_ref = True
-            stdout.write ("\n%s: %d: `%s': external %s x-ref should be internal\n"
-                          % (file, line, name, type))
-            if options.auto_fix or yes_prompt ("Fix this?"):
-                type = 'ref'
-
-    if type == 'ref':
-        explicit_type = manual
-
-    if not name in manuals[explicit_type]['nodes'] and not commented_out:
-        bad_ref = True
-        fixed = False
-        stdout.write ('\n')
-        if type == 'ref':
-            stdout.write ("\e[1;31m%s: %d: `%s': wrong internal x-ref\e[0m\n"
-                          % (file, line, name))
-        else:
-            stdout.write ("\e[1;31m%s: %d: `%s': wrong external `%s' x-ref\e[0m\n"
-                          % (file, line, name, type))
-        # print context
-        stdout.write ('--\n' + manuals[manual]['contents'][file]
-                      [newline_indices[max (0, line - 2)]:
-                       newline_indices[min (line + 3,
-                                            len (newline_indices) - 1)]] +
-                      '--\n')
-
-        # try to find the reference in other manuals
-        found = []
-        for k in [k for k in manuals if k != explicit_type]:
-            if name in manuals[k]['nodes']:
-                if k == manual:
-                    found = ['ref']
-                    stdout.write ("\e[1;32m  found as internal x-ref\e[0m\n")
-                    break
-                else:
-                    found.append (k)
-                    stdout.write ("\e[1;32m  found as `%s' x-ref\e[0m\n" % k)
-
-        if (len (found) == 1
-            and (options.auto_fix or yes_prompt ("Fix this x-ref?"))):
-            add_fix (type, name, found[0], name)
-            type = found[0]
-            fixed = True
-
-        elif len (found) > 1 and useful_fix:
-            if options.interactive or options.auto_fix:
-                stdout.write ("* Several manuals contain this node name, \
-cannot determine manual automatically.\n")
-            if options.interactive:
-                t = choose_in_numbered_list ("Choose manual for this x-ref by \
-index number or beginning of name:\n", found)
-                if t:
-                    add_fix (type, name, t, name)
-                    type = t
-                    fixed = True
-
-        if not fixed:
-            # try to find a fix already made
-            found = lookup_fix (name)
-
-            if len (found) == 1:
-                stdout.write ("Found one previous fix: %s `%s'\n" % found[0])
-                if options.auto_fix or yes_prompt ("Apply this fix?"):
-                    type, new_name = found[0]
-                    fixed = True
-
-            elif len (found) > 1:
-                if options.interactive or options.auto_fix:
-                    stdout.write ("* Several previous fixes match \
-this node name, cannot fix automatically.\n")
-                if options.interactive:
-                    concatened = choose_in_numbered_list ("Choose new manual \
-and x-ref by index number or beginning of name:\n", [''.join ([i[0], ' ', i[1]])
-                                                     for i in found],
-                                                    sep='\n')
-                    if concatened:
-                        type, new_name = concatenated.split (' ', 1)
-                        fixed = True
-
-        if not fixed:
-            # all previous automatic fixing attempts failed,
-            # ask user for substring to look in node names
-            while True:
-                node_list = search_prompt ()
-                if node_list == None:
-                    if options.interactive:
-                        stdout.write (warn_not_fixed)
-                    break
-                elif not node_list:
-                    stdout.write ("No matched node names.\n")
-                else:
-                    concatenated = choose_in_numbered_list ("Choose \
-node name and manual for this x-ref by index number or beginning of name:\n", \
-                            [' '.join ([i[0], i[1], '(in %s)' % i[2]])
-                             for i in node_list],
-                                                            sep='\n')
-                    if concatenated:
-                        t, z = concatenated.split (' ', 1)
-                        new_name = z.split (' (in ', 1)[0]
-                        add_fix (type, name, t, new_name)
-                        type = t
-                        fixed = True
-                        break
-
-    if fixed and type == manual:
-        type = 'ref'
-    bad_refs_count += int (bad_ref)
-    if bad_ref and not useful_fix:
-        stdout.write ("*** Warning: this file is automatically generated, \
-please fix the code source instead of generated documentation.\n")
-
-    # compute returned string
-    if new_name == name:
-        if bad_ref and (options.interactive or options.auto_fix):
-            # only the type of the ref was fixed
-            fixes_count += int (fixed)
-        if original_display_name:
-            return ('@%snamed{%s,%s}' % (type, original_name, original_display_name)) + next_char
-        else:
-            return ('@%s{%s}' % (type, original_name)) + next_char
-    else:
-        fixes_count += int (fixed)
-        (ref, n) = preserve_linebreak (new_name, linebroken)
-        if original_display_name:
-            if bad_ref:
-                stdout.write ("Current display name is `%s'\n")
-                display_name = raw_input \
-                    ("Enter a new display name or press enter to keep the existing name:\n") \
-                    or display_name
-                (display_name, n) = preserve_linebreak (display_name, display_linebroken)
-            else:
-                display_name = original_display_name
-            return ('@%snamed{%s,%s}' % (type, ref, display_name)) + \
-                next_char + n
-        else:
-            return ('@%s{%s}' % (type, ref)) + next_char + n
-
-
-log.write ("Checking cross-references...\n")
-
-try:
-    for key in manuals:
-        for file in manuals[key]['contents']:
-            s = ref_re.sub (lambda m: check_ref (key, file, m),
-                            manuals[key]['contents'][file])
-            if s != manuals[key]['contents'][file]:
-                open (file, 'w').write (s)
-except KeyboardInterrupt:
-    log.write ("Operation interrupted, exiting.\n")
-    sys.exit (2)
-except InteractionError, instance:
-    log.write ("Operation refused by user: %s\nExiting.\n" % instance)
-    sys.exit (3)
-
-log.write ("\e[1;36mDone: %d x-refs found, %d bad x-refs found, fixed %d.\e[0m\n" %
-           (refs_count, bad_refs_count, fixes_count))
diff --git a/buildscripts/check_translation.py b/buildscripts/check_translation.py
deleted file mode 100644 (file)
index 090b1fb..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env python
-
-import __main__
-import optparse
-import os
-import sys
-
-import langdefs
-import buildlib
-
-verbose = 0
-use_colors = False
-lang = 'C'
-C = lang
-
-def dir_lang (file, lang, lang_dir_index):
-    path_components = file.split ('/')
-    path_components[lang_dir_index] = lang
-    return os.path.join (*path_components)
-
-def do_file (file_name, lang_codes, buildlib):
-    if verbose:
-        sys.stderr.write ('%s...\n' % file_name)
-    split_file_name = file_name.split ('/')
-    d1, d2 = split_file_name[0:2]
-    if d1 in lang_codes:
-        check_lang = d1
-        lang_dir_index = 0
-    elif d2 in lang_codes:
-        check_lang = d2
-        lang_dir_index = 1
-    else:
-        check_lang = lang
-    if check_lang == C:
-        raise Exception ('cannot determine language for ' + file_name)
-    
-    original = dir_lang (file_name, '', lang_dir_index)
-    translated_contents = open (file_name).read ()
-    (diff_string, error) \
-        = buildlib.check_translated_doc (original,
-                                         file_name,
-                                         translated_contents,
-                                         color=use_colors and not update_mode)
-
-    if error:
-        sys.stderr.write ('warning: %s: %s' % (file_name, error))
-
-    if update_mode:
-        if error or len (diff_string) >= os.path.getsize (original):
-            buildlib.read_pipe (text_editor + ' ' + file_name + ' ' + original)
-        elif diff_string:
-            diff_file = original + '.diff'
-            f = open (diff_file, 'w')
-            f.write (diff_string)
-            f.close ()
-            buildlib.read_pipe (text_editor + ' ' + file_name + ' ' + diff_file)
-            os.remove (diff_file)
-    else:
-        sys.stdout.write (diff_string)
-
-def usage ():
-    sys.stdout.write (r'''
-Usage:
-check-translation [--language=LANG] [--verbose] [--update] FILE...
-
-This script is licensed under the GNU GPL.
-''')
-
-def do_options ():
-    global lang, verbose, update_mode, use_colors
-
-    p = optparse.OptionParser (usage="check-translation [--language=LANG] [--verbose] FILE...",
-                               description="This script is licensed under the GNU GPL.")
-    p.add_option ("--language",
-                  action='store',
-                  default='site',
-                  dest="language")
-    p.add_option ("--no-color",
-                  action='store_false',
-                  default=True,
-                  dest="color",
-                  help="do not print ANSI-cooured output")
-    p.add_option ("--verbose",
-                  action='store_true',
-                  default=False,
-                  dest="verbose",
-                  help="print details, including executed shell commands")
-    p.add_option ('-u', "--update",
-                  action='store_true',
-                  default=False,
-                  dest='update_mode',
-                  help='call $EDITOR to update the translation')
-    
-    (options, files) = p.parse_args ()
-    verbose = options.verbose
-    lang = options.language
-    use_colors = options.color
-    update_mode = options.update_mode
-    
-    return files
-
-def main ():
-    global update_mode, text_editor
-
-    files = do_options ()
-    if 'EDITOR' in os.environ:
-        text_editor = os.environ['EDITOR']
-    else:
-        update_mode = False
-    
-    buildlib.verbose = verbose
-
-    for i in files:
-        do_file (i, langdefs.LANGDICT.keys (), buildlib)
-
-if __name__ == '__main__':
-    main ()
diff --git a/buildscripts/coverage.py b/buildscripts/coverage.py
deleted file mode 100644 (file)
index d44f81f..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/usr/bin/python
-
-import os
-import glob
-import re
-import sys
-import optparse
-
-#File 'accidental-engraver.cc'
-#Lines executed:87.70% of 252
-
-def summary (args):
-    results = []
-    for f in args:
-        str = open (f).read ()
-        m = re.search ("File '([^']+.cc)'\s*Lines executed:([0-9.]+)% of ([0-9]+)", str)
-
-        if m and '/usr/lib' in m.group (1):
-            continue
-
-        if m:
-            cov = float (m.group (2))
-            lines = int (m.group (3))
-            pain = lines * (100.0 - cov)
-            file = m.group (1)
-            tup = (pain, locals ().copy())
-
-            results.append(tup)
-
-    results.sort ()
-    results.reverse()
-
-    print 'files sorted by number of untested lines (decreasing)'
-    print
-    print '%5s (%6s): %s' % ('cov %', 'lines', 'file')
-    print '----------------------------------------------'
-
-    for (pain, d) in results:
-        print '%(cov)5.2f (%(lines)6d): %(file)s' % d
-
-class Chunk:
-    def __init__ (self, range, coverage_count, all_lines, file):
-        assert coverage_count >= 0
-        assert type (range) == type (())
-        
-        self.coverage_count = coverage_count
-        self.range = range
-        self.all_lines = all_lines
-        self.file = file
-
-    def length (self):
-        return self.range[1] - self.range[0]
-
-    def text (self):
-        return ''.join ([l[2] for l in self.lines()])
-        
-    def lines (self):
-        return self.all_lines[self.range[0]:
-                              self.range[1]]
-    def widen (self):
-        self.range = (min (self.range[0] -1, 0),
-                      self.range[0] +1)
-    def write (self):
-        print 'chunk in', self.file
-        for (c, n, l) in self.lines ():
-            cov = '%d' % c
-            if c == 0:
-                cov = '#######'
-            elif c < 0:
-                cov = ''
-            sys.stdout.write ('%8s:%8d:%s' % (cov, n, l))
-            
-    def uncovered_score (self):
-        return self.length ()
-    
-class SchemeChunk (Chunk):
-    def uncovered_score (self):
-        text = self.text ()
-        if (text.startswith  ('(define ')
-            and not text.startswith ('(define (')):
-            return 0
-
-        if text.startswith  ('(use-modules '):
-            return 0
-
-        if (text.startswith  ('(define-public ')
-            and not text.startswith ('(define-public (')):
-            return 0
-
-        return len ([l for (c,n,l) in self.lines() if (c == 0)]) 
-
-def read_gcov (f):
-    ls = []
-
-    in_lines = [l for l in open (f).readlines ()]
-    (count_len, line_num_len) = tuple (map (len, in_lines[0].split (':')[:2]))
-    
-    for l in in_lines:
-        c = l[:count_len].strip ()
-        l = l[count_len+1:]
-        n = int (l[:line_num_len].strip ())
-
-        if n == 0:
-            continue
-
-        if '#' in c:
-            c = 0
-        elif c == '-':
-            c = -1
-        else:
-            c = int (c)
-        
-        l = l[line_num_len+1:]
-
-        ls.append ((c,n,l))
-        
-    return ls
-
-def get_c_chunks (ls, file):
-    chunks = []
-    chunk = []
-
-    last_c = -1
-    for (c, n, l) in ls:
-        if not (c == last_c or c < 0 and l != '}\n'):
-            if chunk and last_c >= 0:
-                nums = [n-1 for (n, l) in chunk]
-                chunks.append (Chunk ((min (nums), max (nums)+1),
-                                      last_c, ls, file))
-                chunk = []
-
-        chunk.append ((n,l))
-        if c >= 0:
-            last_c = c
-            
-    return chunks
-
-def get_scm_chunks (ls, file):
-    chunks = []
-    chunk = []
-
-    def new_chunk ():
-        if chunk:
-            nums = [n-1 for (n, l) in chunk]
-            chunks.append (SchemeChunk ((min (nums), max (nums)+1),
-                                        max (last_c, 0), ls, file))
-            chunk[:] = []
-        
-    last_c = -1
-    for (cov_count, line_number, line) in ls:
-        if line.startswith ('('):
-            new_chunk ()
-            last_c = -1
-        
-        chunk.append ((line_number, line))
-        if cov_count >= 0:
-            last_c = cov_count
-
-    return chunks
-
-def widen_chunk (ch, ls):
-    a -= 1
-    b += 1
-
-    return [(n, l)  for (c, n, l) in ls[a:b]]
-    
-
-def extract_chunks (file):
-    try:
-        ls = read_gcov (file)
-    except IOError, s :
-        print s
-        return []
-        
-    cs = []
-    if 'scm' in file:
-        cs = get_scm_chunks (ls, file)
-    else:
-        cs = get_c_chunks (ls, file)
-    return cs
-
-
-def filter_uncovered (chunks):
-    def interesting (c):
-        if c.coverage_count > 0:
-            return False
-        
-        t = c.text()
-        for stat in  ('warning', 'error', 'print', 'scm_gc_mark'):
-            if stat in t:
-                return False
-        return True
-   
-    return [c for c in chunks if interesting (c)]
-    
-
-def main ():
-    p = optparse.OptionParser (usage="usage coverage.py [options] files",
-                               description="")
-    p.add_option ("--summary",
-                  action='store_true',
-                  default=False,
-                  dest="summary")
-    
-    p.add_option ("--hotspots",
-                  default=False,
-                  action='store_true',
-                  dest="hotspots")
-    
-    p.add_option ("--uncovered",
-                  default=False,
-                  action='store_true',
-                  dest="uncovered")
-
-    
-    (options, args) = p.parse_args ()
-    
-
-    if options.summary:
-        summary (['%s.gcov-summary' % s for s in args])
-
-    if options.uncovered or options.hotspots:
-        chunks = []
-        for a in args:
-            name = a
-            if name.endswith ('scm'):
-                name += '.cov'
-            else:
-                name += '.gcov'
-            
-            chunks += extract_chunks  (name)
-
-        if options.uncovered:
-            chunks = filter_uncovered (chunks)
-            chunks = [(c.uncovered_score (), c) for c in chunks if c.uncovered_score() > 0]
-        elif options.hotspots:
-            chunks = [((c.coverage_count, -c.length()), c) for c in chunks]
-            
-            
-        chunks.sort ()
-        chunks.reverse ()
-        for (score, c) in chunks:
-            c.write ()
-
-            
-        
-if __name__ == '__main__':
-    main ()
diff --git a/buildscripts/extract_texi_filenames.py b/buildscripts/extract_texi_filenames.py
deleted file mode 100644 (file)
index 5798d5d..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-#!@PYTHON@
-# -*- coding: utf-8 -*-
-# extract_texi_filenames.py
-
-# USAGE:  extract_texi_filenames.py [-o OUTDIR] FILES
-#
-# -o OUTDIR specifies that output files should rather be written in OUTDIR
-#
-# Description:
-# This script parses the .texi file given and creates a file with the
-# nodename <=> filename/anchor map.
-# The idea behind: Unnumbered subsections go into the same file as the
-# previous numbered section, @translationof gives the original node name,
-# which is then used for the filename/anchor.
-#
-# If this script is run on a file texifile.texi, it produces a file
-# texifile[.LANG].xref-map with tab-separated entries of the form
-#        NODE\tFILENAME\tANCHOR
-# LANG is the document language in case it's not 'en'
-# Note: The filename does not have any extension appended!
-# This file can then be used by our texi2html init script to determine
-# the correct file name and anchor for external refs
-
-import sys
-import re
-import os
-import getopt
-
-optlist, args = getopt.getopt (sys.argv[1:],'o:')
-files = args
-
-outdir = '.'
-for x in optlist:
-    if x[0] == '-o':
-        outdir = x[1]
-
-if not os.path.isdir (outdir):
-    if os.path.exists (outdir):
-        os.unlink (outdir)
-    os.makedirs (outdir)
-
-include_re = re.compile (r'@include ((?!../lily-).*?)\.texi$', re.M)
-whitespaces = re.compile (r'\s+')
-section_translation_re = re.compile ('^@(node|(?:unnumbered|appendix)\
-(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|\
-(?:major|chap|(?:sub){0,2})heading|translationof) (.*?)\\s*$', re.MULTILINE)
-
-def expand_includes (m, filename):
-    filepath = os.path.join (os.path.dirname (filename), m.group(1)) + '.texi'
-    if os.path.exists (filepath):
-        return extract_sections (filepath)[1]
-    else:
-        print "Unable to locate include file " + filepath
-        return ''
-
-lang_re = re.compile (r'^@documentlanguage (.+)', re.M)
-
-def extract_sections (filename):
-    result = ''
-    f = open (filename, 'r')
-    page = f.read ()
-    f.close()
-    # Search document language
-    m = lang_re.search (page)
-    if m and m.group (1) != 'en':
-        lang_suffix = '.' + m.group (1)
-    else:
-        lang_suffix = ''
-    # Replace all includes by their list of sections and extract all sections
-    page = include_re.sub (lambda m: expand_includes (m, filename), page)
-    sections = section_translation_re.findall (page)
-    for sec in sections:
-        result += "@" + sec[0] + " " + sec[1] + "\n"
-    return (lang_suffix, result)
-
-# Convert a given node name to its proper file name (normalization as explained
-# in the texinfo manual:
-# http://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref-Node-Name-Expansion.html
-def texinfo_file_name(title):
-    # exception: The top node is always mapped to index.html
-    if title == "Top":
-        return "index"
-    # File name normalization by texinfo (described in the texinfo manual):
-    # 1/2: letters and numbers are left unchanged
-    # 3/4: multiple, leading and trailing whitespace is removed
-    title = title.strip ();
-    title = whitespaces.sub (' ', title)
-    # 5:   all remaining spaces are converted to '-'
-    # 6:   all other 7- or 8-bit chars are replaced by _xxxx (xxxx=ascii character code)
-    result = ''
-    for index in range(len(title)):
-        char = title[index]
-        if char == ' ': # space -> '-'
-            result += '-'
-        elif ( ('0' <= char and char <= '9' ) or
-               ('A' <= char and char <= 'Z' ) or
-               ('a' <= char and char <= 'z' ) ):  # number or letter
-            result += char
-        else:
-            ccode = ord(char)
-            if ccode <= 0xFFFF:
-                result += "_%04x" % ccode
-            else:
-                result += "__%06x" % ccode
-    # 7: if name begins with number, prepend 't_g' (so it starts with a letter)
-    if (result != '') and (ord(result[0]) in range (ord('0'), ord('9'))):
-        result = 't_g' + result
-    return result
-
-texinfo_re = re.compile (r'@.*{(.*)}')
-def remove_texinfo (title):
-    return texinfo_re.sub (r'\1', title)
-
-def create_texinfo_anchor (title):
-    return texinfo_file_name (remove_texinfo (title))
-
-unnumbered_re = re.compile (r'unnumbered.*')
-def process_sections (filename, lang_suffix, page):
-    sections = section_translation_re.findall (page)
-    basename = os.path.splitext (os.path.basename (filename))[0]
-    p = os.path.join (outdir, basename) + lang_suffix + '.xref-map'
-    f = open (p, 'w')
-
-    this_title = ''
-    this_filename = 'index'
-    this_anchor = ''
-    this_unnumbered = False
-    had_section = False
-    for sec in sections:
-        if sec[0] == "node":
-            # Write out the cached values to the file and start a new section:
-            if this_title != '' and this_title != 'Top':
-                    f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
-            had_section = False
-            this_title = remove_texinfo (sec[1])
-            this_anchor = create_texinfo_anchor (sec[1])
-        elif sec[0] == "translationof":
-            anchor = create_texinfo_anchor (sec[1])
-            # If @translationof is used, it gives the original node name, which
-            # we use for the anchor and the file name (if it is a numbered node)
-            this_anchor = anchor
-            if not this_unnumbered:
-                this_filename = anchor
-        else:
-            # Some pages might not use a node for every section, so treat this
-            # case here, too: If we already had a section and encounter enother
-            # one before the next @node, we write out the old one and start
-            # with the new values
-            if had_section and this_title != '':
-                f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
-                this_title = remove_texinfo (sec[1])
-                this_anchor = create_texinfo_anchor (sec[1])
-            had_section = True
-
-            # unnumbered nodes use the previously used file name, only numbered
-            # nodes get their own filename! However, top-level @unnumbered
-            # still get their own file.
-            this_unnumbered = unnumbered_re.match (sec[0])
-            if not this_unnumbered or sec[0] == "unnumbered":
-                this_filename = this_anchor
-
-    if this_title != '' and this_title != 'Top':
-        f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
-    f.close ()
-
-
-for filename in files:
-    print "extract_texi_filenames.py: Processing %s" % filename
-    (lang_suffix, sections) = extract_sections (filename)
-    process_sections (filename, lang_suffix, sections)
diff --git a/buildscripts/find-superfluous-includes.py b/buildscripts/find-superfluous-includes.py
deleted file mode 100644 (file)
index ded1087..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/python
-import sys
-import re
-import os
-
-
-full_paths = {}
-incs = {}
-inc_re = re.compile ('^#include "([^"]+)"')
-def parse_file (fn):
-    lst = []
-
-    lc = 0
-    for l in open (fn).readlines():
-        lc += 1
-        m = inc_re.search (l)
-        if m:
-            lst.append ((lc, m.group (1)))
-
-    base = os.path.split (fn)[1]
-    full_paths[base] = fn
-    incs[base] = lst
-    
-
-def has_include (f, name):
-    try:
-        return name in [b for (a,b) in incs[f]]
-    except KeyError:
-        return False
-
-for a in sys.argv:
-    parse_file (a)
-
-print '-*-compilation-*-'
-for (f, lst) in incs.items ():
-    for (n, inc) in lst:
-        for (n2, inc2) in lst:
-            if has_include (inc2, inc):
-                print "%s:%d: already have %s from %s" % (full_paths[f], n,
-                                                          inc, inc2)
-                break
-
-        
-    
diff --git a/buildscripts/fixcc.py b/buildscripts/fixcc.py
deleted file mode 100644 (file)
index 3cc162b..0000000
+++ /dev/null
@@ -1,625 +0,0 @@
-#!/usr/bin/python
-
-# fixcc -- nitpick lily's c++ code
-
-# TODO
-#  * maintainable rules: regexp's using whitespace (?x) and match names
-#    <identifier>)
-#  * trailing `*' vs. function definition
-#  * do not break/change indentation of fixcc-clean files
-#  * check lexer, parser
-#  * rewrite in elisp, add to cc-mode
-#  * using regexes is broken by design
-#  * ?
-#  * profit
-
-import __main__
-import getopt
-import os
-import re
-import string
-import sys
-import time
-
-COMMENT = 'COMMENT'
-STRING = 'STRING'
-GLOBAL_CXX = 'GC++'
-CXX = 'C++'
-verbose_p = 0
-indent_p = 0
-
-rules = {
-    GLOBAL_CXX:
-    [
-    # delete gratuitous block
-    ('''\n(    |\t)\s*{\n\s*(.*?)(?![{}]|\b(do|for|else|if|switch|while)\b);\n\s*}''',
-    '\n\\2;'),
-    ],
-    CXX:
-    [
-    # space before parenthesis open
-    ('([^\( \]])[ \t]*\(', '\\1 ('),
-    # space after comma
-    ("\([^'],\)[ \t]*", '\1 '),
-    # delete gratuitous block
-    ('''\n(    |\t)\s*{\n\s*(.*?)(?![{}]|\b(do|for|else|if|switch|while)\b);\n\s*}''',
-    '\n\\2;'),
-    # delete inline tabs
-    ('(\w)\t+', '\\1 '),
-    # delete inline double spaces
-    ('   *', ' '),
-    # delete space after parenthesis open
-    ('\([ \t]*', '('),
-    # delete space before parenthesis close
-    ('[ \t]*\)', ')'),
-    # delete spaces after prefix
-    ('(--|\+\+)[ \t]*([\w\)])', '\\1\\2'),
-    # delete spaces before postfix
-    ('([\w\)\]])[ \t]*(--|\+\+)', '\\1\\2'),
-    # delete space after parenthesis close
-    #('\)[ \t]*([^\w])', ')\\1'),
-    # delete space around operator
-    # ('([\w\(\)\]])([ \t]*)(::|\.)([ \t]*)([\w\(\)])', '\\1\\3\\5'),
-    ('([\w\(\)\]])([ \t]*)(\.|->)([ \t]*)([\w\(\)])', '\\1\\3\\5'),
-    # delete space after operator
-    ('(::)([ \t]*)([\w\(\)])', '\\1\\3'),
-    # delete superflous space around operator
-    ('([\w\(\)\]])([ \t]+)(&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|\+|-|=|/|:|&|\||\*)([ \t]+)([\w\(\)])', '\\1 \\3 \\5'),
-    # space around operator1
-    ('([\w\)\]]) *(&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|=|/|:|&|\||\*) *([\w\(])', '\\1 \\2 \\3'),
-    # space around operator2
-    ('([\w\)\]]) *(&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|=|/|:|&|\||\*) ([^\w\s])', '\\1 \\2 \\3'),
-    # space around operator3
-    ('([^\w\s]) (&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|[^-]>|=|/|:|&|\||\*) *([\w\(])', '\\1 \\2 \\3'),
-    # space around operator4
-    ('([\w\(\)\]]) (\*|/|\+|-) *([-:])', '\\1 \\2 \\3'),
-    # space around +/-; exponent
-    ('([\w\)\]])(\+|-)([_A-Za-z\(])', '\\1 \\2 \\3'),
-    ('([_\dA-Za-df-z\)\]])(\+|-)([\w\(])', '\\1 \\2 \\3'),
-    # trailing operator
-    (' (::|&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|\+|-|=|/|:|&XXX|\||\*XXX)[ \t]*\n([ \t]*)',         '\n\\2\\1 '),
-    # pointer
-    ##('(bool|char|const|delete|int|stream|unsigned|void|size_t|struct \w+|[A-Z]\w*|,|;|&&|<|[^-]>|\|\||-|\+)[ \t]*(\*|&)[ \t]*', '\\1 \\2'),
-    ('(bool|char|const|delete|int|stream|unsigned|void|size_t|struct \w+|[A-Z]\w*|,|;|:|=|\?\)|&&|<|[^-]>|\|\||-|\+)[ \t]*(\*|&)[ \t]*', '\\1 \\2'),
-    #to#('(bool|char|const|delete|int|stream|unsigned|void|([A-Z]\w*)|[,])[ \n\t]*(\*|&)[ \t]*', '\\1 \\3'),
-    # pointer with template
-    ('(( *((bool|char|const|delete|int|stream|unsigned|void|size_t|class[ \t]+\w*|[A-Z]\w*|\w+::\w+|[,])[ \*&],*)+)>) *(\*|&) *', '\\1 \\5'),
-    #to#('(( *((bool|char|delete|int|stream|unsigned|void|(class[ \t]+\w*)|([A-Z]\w*)|[,])[ \*&],*)+)>)[ \t\n]*(\*|&) *', '\\1 \\7'),
-    # unary pointer, minus, not
-    ('(return|=) (\*|&|-|!) ([\w\(])', '\\1 \\2\\3'),
-    # space after `operator'
-    ('(\Woperator) *([^\w\s])', '\\1 \\2'),
-    # dangling brace close
-    ('\n[ \t]*(\n[ \t]*})', '\\1'),
-    # dangling newline
-    ('\n[ \t]*\n[ \t]*\n', '\n\n'),
-    # dangling parenthesis open
-    #('[ \t]*\n[ \t]*\([ \t]*\n', '('),
-    ('\([ \t]*\n', '('),
-    # dangling parenthesis close
-    ('\n[ \t]*\)', ')'),
-    # dangling comma
-    ('\n[ \t]*,', ','),
-    # dangling semicolon
-    ('\n[ \t]*;', ';'),
-    # brace open
-    ('(\w)[ \t]*([^\s]*){([ \t]*\n)', '\\1\\2\n{\n'),
-    # brace open backslash
-    ('(\w[^\n]*){[ \t]*\\\\\n', '\\1\\\n{\\\n'),
-    # brace close
-    ("}[ \t]*([^'\n]*\w[^\n\\\]*)\n", '}\n\\1\n'),
-    # brace close backslash
-    ("}[ \t]*([^'\n]*\w[^\n\\\]*)", '\n}\n\\1'),
-    # delete space after `operator'
-    #('(\Woperator) (\W)', '\\1\\2'),
-    # delete space after case, label
-    ('(\W(case|label) ([\w]+)) :', '\\1:'),
-    # delete space before comma
-    ('[ \t]*,', ','),
-    # delete space before semicolon
-    ('[ \t]*;', ';'),
-    # delete space before eol-backslash
-    ('[ \t]*\\\\\n', '\\\n'),
-    # delete trailing whitespace
-    ('[ \t]*\n', '\n'),
-
-    ## Deuglify code that also gets ugly by rules above.
-    # delete newline after typedef struct
-    ('(typedef struct\s+([\w]*\s){([^}]|{[^}]*})*})\s*\n\s*(\w[\w\d]*;)', '\\1 \\4'),
-    # delete spaces around template brackets
-    #('(dynamic_cast|template|([A-Z]\w*))[ \t]*<[ \t]*(( *(bool|char|int|unsigned|void|(class[ \t]+\w*)|([A-Z]\w*)),?)+)[ \t]?(| [\*&])[ \t]*>', '\\1<\\3\\8>'),
-    ('(dynamic_cast|template|typedef|\w+::\w+|[A-Z]\w*)[ \t]*<[ \t]*(( *(bool|char|const|int|unsigned|void|size_t|class[ \t]+\w*|[A-Z]\w*)( *[\*&]?,|[\*&])*)+)[ \t]?(| [\*&])[ \t]*>', '\\1<\\2\\6>'),
-    ('(\w+::\w+|[A-Z]\w*) < ((\w+::\w+|[A-Z]\w*)<[A-Z]\w*>) >', '\\1<\\2 >'),
-    ('((if|while)\s+\(([^\)]|\([^\)]*\))*\))\s*;', '\\1\n;'),
-    ('(for\s+\(([^;]*;[^;]*;([^\)]|\([^\)]*\))*)\))\s*;', '\\1\n;'),
-    # do {..} while
-    ('(}\s*while\s*)(\(([^\)]|\([^\)]*\))*\))\s*;', '\\1\\2;'),
-
-    ## Fix code that gets broken by rules above.
-    ##('->\s+\*', '->*'),
-    # delete space before #define x()
-    ('#[ \t]*define (\w*)[ \t]*\(', '#define \\1('),
-    # add space in #define x ()
-    ('#[ \t]*define (\w*)(\(([^\(\)]|\([^\(\)]*\))*\)\\n)',
-    '#define \\1 \\2'),
-    # delete space in #include <>
-    ('#[ \t]*include[ \t]*<[ \t]*([^ \t>]*)[ \t]*(/?)[ \t]*([^ \t>]*)[ \t]*>',
-    '#include <\\1\\2\\3>'),
-    # delete backslash before empty line (emacs' indent region is broken)
-    ('\\\\\n\n', '\n\n'),
-    ],
-
-    COMMENT:
-    [
-    # delete trailing whitespace
-    ('[ \t]*\n', '\n'),
-    # delete empty first lines
-    ('(/\*\n)\n*', '\\1'),
-    # delete empty last lines
-    ('\n*(\n\*/)', '\\1'),
-    ## delete newline after start?
-    #('/(\*)\n', '\\1'),
-    ## delete newline before end?
-    #('\n(\*/)', '\\1'),
-    ],
-    }
-
-# Recognize special sequences in the input.
-#
-#   (?P<name>regex) -- Assign result of REGEX to NAME.
-#   *? -- Match non-greedily.
-#   (?m) -- Multiline regex: Make ^ and $ match at each line.
-#   (?s) -- Make the dot match all characters including newline.
-#   (?x) -- Ignore whitespace in patterns.
-no_match = 'a\ba'
-snippet_res = {
-    CXX: {
-    'multiline_comment':
-    r'''(?sx)
-    (?P<match>
-    (?P<code>
-    [ \t]*/\*.*?\*/))''',
-    
-    'singleline_comment':
-    r'''(?mx)
-    ^.*
-    (?P<match>
-    (?P<code>
-    [ \t]*//([ \t][^\n]*|)\n))''',
-
-    'string':
-    r'''(?x)
-    (?P<match>
-    (?P<code>
-    "([^\"\n](\")*)*"))''',
-    
-    'char':
-    r'''(?x)
-    (?P<match>
-    (?P<code>
-    '([^']+|\')))''',
-     
-     'include':
-     r'''(?x)
-     (?P<match>
-     (?P<code>
-     "#[ \t]*include[ \t]*<[^>]*>''',
-     },
-     }
-
-class Chunk:
-    def replacement_text (self):
-        return ''
-
-    def filter_text (self):
-        return self.replacement_text ()
-
-class Substring (Chunk):
-    def __init__ (self, source, start, end):
-        self.source = source
-        self.start = start
-        self.end = end
-
-    def replacement_text (self):
-        s = self.source[self.start:self.end]
-        if verbose_p:
-            sys.stderr.write ('CXX Rules')
-        for i in rules[CXX]:
-            if verbose_p:
-                sys.stderr.write ('.')
-                #sys.stderr.write ('\n\n***********\n')
-                #sys.stderr.write (i[0])
-                #sys.stderr.write ('\n***********\n')
-                #sys.stderr.write ('\n=========>>\n')
-                #sys.stderr.write (s)
-                #sys.stderr.write ('\n<<=========\n')
-            s = re.sub (i[0], i[1], s)
-        if verbose_p:
-            sys.stderr.write ('done\n')
-        return s
-        
-
-class Snippet (Chunk):
-    def __init__ (self, type, match, format):
-        self.type = type
-        self.match = match
-        self.hash = 0
-        self.options = []
-        self.format = format
-
-    def replacement_text (self):
-        return self.match.group ('match')
-
-    def substring (self, s):
-        return self.match.group (s)
-
-    def __repr__ (self):
-        return `self.__class__` + ' type = ' + self.type
-
-class Multiline_comment (Snippet):
-    def __init__ (self, source, match, format):
-        self.type = type
-        self.match = match
-        self.hash = 0
-        self.options = []
-        self.format = format
-
-    def replacement_text (self):
-        s = self.match.group ('match')
-        if verbose_p:
-            sys.stderr.write ('COMMENT Rules')
-        for i in rules[COMMENT]:
-            if verbose_p:
-                sys.stderr.write ('.')
-            s = re.sub (i[0], i[1], s)
-        return s
-
-snippet_type_to_class = {
-    'multiline_comment': Multiline_comment,
-#        'string': Multiline_comment,
-#        'include': Include_snippet,
-}
-
-def find_toplevel_snippets (s, types):
-    if verbose_p:
-        sys.stderr.write ('Dissecting')
-
-    res = {}
-    for i in types:
-        res[i] = re.compile (snippet_res[format][i])
-
-    snippets = []
-    index = 0
-    ## found = dict (map (lambda x: (x, None),
-    ##                      types))
-    ## urg python2.1
-    found = {}
-    map (lambda x, f = found: f.setdefault (x, None),
-      types)
-
-    # We want to search for multiple regexes, without searching
-    # the string multiple times for one regex.
-    # Hence, we use earlier results to limit the string portion
-    # where we search.
-    # Since every part of the string is traversed at most once for
-    # every type of snippet, this is linear.
-
-    while 1:
-        if verbose_p:
-            sys.stderr.write ('.')
-        first = None
-        endex = 1 << 30
-        for type in types:
-            if not found[type] or found[type][0] < index:
-                found[type] = None
-                m = res[type].search (s[index:endex])
-                if not m:
-                    continue
-
-                cl = Snippet
-                if snippet_type_to_class.has_key (type):
-                    cl = snippet_type_to_class[type]
-                snip = cl (type, m, format)
-                start = index + m.start ('match')
-                found[type] = (start, snip)
-
-            if found[type] \
-             and (not first \
-                or found[type][0] < found[first][0]):
-                first = type
-
-                # FIXME.
-
-                # Limiting the search space is a cute
-                # idea, but this *requires* to search
-                # for possible containing blocks
-                # first, at least as long as we do not
-                # search for the start of blocks, but
-                # always/directly for the entire
-                # @block ... @end block.
-
-                endex = found[first][0]
-
-        if not first:
-            snippets.append (Substring (s, index, len (s)))
-            break
-
-        (start, snip) = found[first]
-        snippets.append (Substring (s, index, start))
-        snippets.append (snip)
-        found[first] = None
-        index = start + len (snip.match.group ('match'))
-
-    return snippets
-
-def nitpick_file (outdir, file):
-    s = open (file).read ()
-
-    for i in rules[GLOBAL_CXX]:
-        s = re.sub (i[0], i[1], s)
-
-    # FIXME: Containing blocks must be first, see
-    #        find_toplevel_snippets.
-    #        We leave simple strings be part of the code
-    snippet_types = (
-        'multiline_comment',
-        'singleline_comment',
-        'string',
-#                'char',
-        )
-
-    chunks = find_toplevel_snippets (s, snippet_types)
-    #code = filter (lambda x: is_derived_class (x.__class__, Substring),
-    #               chunks)
-
-    t = string.join (map (lambda x: x.filter_text (), chunks), '')
-    fixt = file
-    if s != t:
-        if not outdir:
-            os.system ('mv %s %s~' % (file, file))
-        else: 
-            fixt = os.path.join (outdir,
-                      os.path.basename (file))
-        h = open (fixt, "w")
-        h.write (t)
-        h.close ()
-    if s != t or indent_p:
-        indent_file (fixt)
-
-def indent_file (file):
-    emacs = '''emacs\
-    --no-window-system\
-    --batch\
-    --no-site-file\
-    --no-init-file\
-    %(file)s\
-    --eval '(let ((error nil)
-           (version-control nil))
-        (load-library "cc-mode")
-        (c++-mode)
-        (indent-region (point-min) (point-max))
-        (if (buffer-modified-p (current-buffer))
-         (save-buffer)))' ''' % vars ()
-    emacsclient = '''emacsclient\
-    --socket-name=%(socketdir)s/%(socketname)s\
-    --no-wait\
-    --eval '(let ((error nil)
-           (version-control nil))
-        (load-library "cc-mode")
-        (find-file "%(file)s")
-        (c++-mode)
-        (indent-region (point-min) (point-max))
-        (if (buffer-modified-p (current-buffer))
-         (save-buffer)))' ''' \
-         % { 'file': file,
-           'socketdir' : socketdir,
-           'socketname' : socketname, }
-    if verbose_p:
-        sys.stderr.write (emacs)
-        sys.stderr.write ('\n')
-    os.system (emacs)
-
-
-def usage ():
-    sys.stdout.write (r'''
-Usage:
-fixcc [OPTION]... FILE...
-
-Options:
- --help
- --indent   reindent, even if no changes
- --verbose
- --test
-
-Typical use with LilyPond:
-
- fixcc $(find flower kpath-guile lily -name '*cc' -o -name '*hh' | grep -v /out)
-
-This script is licensed under the GNU GPL
-''')
-
-def do_options ():
-    global indent_p, outdir, verbose_p
-    (options, files) = getopt.getopt (sys.argv[1:], '',
-                     ['help', 'indent', 'outdir=',
-                     'test', 'verbose'])
-    for (o, a) in options:
-        if o == '--help':
-            usage ()
-            sys.exit (0)
-        elif o == '--indent':
-            indent_p = 1
-        elif o == '--outdir':
-            outdir = a
-        elif o == '--verbose':
-            verbose_p = 1
-        elif o == '--test':
-            test ()
-            sys.exit (0)
-        else:
-            assert unimplemented
-    if not files:
-        usage ()
-        sys.exit (2)
-    return files
-
-
-outdir = 0
-format = CXX
-socketdir = '/tmp/fixcc'
-socketname = 'fixcc%d' % os.getpid ()
-
-def setup_client ():
-    #--no-window-system\
-    #--batch\
-    os.unlink (os.path.join (socketdir, socketname))
-    os.mkdir (socketdir, 0700)
-    emacs='''emacs\
-        --no-site-file\
-        --no-init-file\
-        --eval '(let ((error nil)
-               (version-control nil))
-            (load-library "server")
-            (setq server-socket-dir "%(socketdir)s")
-            (setq server-name "%(socketname)s")
-            (server-start)
-            (while t) (sleep 1000))' ''' \
-            % { 'socketdir' : socketdir,
-              'socketname' : socketname, }
-              
-    if not os.fork ():
-        os.system (emacs)
-        sys.exit (0)
-    while not os.path.exists (os.path.join (socketdir, socketname)):
-        time.sleep (1)
-
-def main ():
-    #emacsclient should be faster, but this does not work yet
-    #setup_client ()
-    files = do_options ()
-    if outdir and not os.path.isdir (outdir):
-        os.makedirs (outdir)
-    for i in files:
-        sys.stderr.write ('%s...\n' % i)
-        nitpick_file (outdir, i)
-
-
-## TODO: make this compilable and check with g++
-TEST = '''
-#include <libio.h>
-#include <map>
-class
-ostream ;
-
-class Foo {
-public: static char* foo ();
-std::map<char*,int>* bar (char, char) { return 0; }
-};
-typedef struct
-{
- Foo **bar;
-} String;
-
-ostream &
-operator << (ostream & os, String d);
-
-typedef struct _t_ligature
-{
- char *succ, *lig;
- struct _t_ligature * next;
-}  AFM_Ligature;
-typedef std::map < AFM_Ligature const *, int > Bar;
-
- /**
- (c) 1997--2008 Han-Wen Nienhuys <hanwen@cs.uu.nl>
- */
-/*      ||
-*      vv
-* !OK  OK
-*/
-/*     ||
-   vv
- !OK  OK
-*/
-char *
-Foo:: foo ()
-{
-int
-i
-;
- char* a= &++ i ;
- a [*++ a] = (char*) foe (*i, &bar) *
- 2;
- int operator double ();
- std::map<char*,int> y =*bar(-*a ,*b);
- Interval_t<T> & operator*= (T r);
- Foo<T>*c;
- int compare (Pqueue_ent < K, T > const& e1, Pqueue_ent < K,T> *e2);
- delete *p;
- if (abs (f)*2 > abs (d) *FUDGE)
-  ;
- while (0);
- for (; i<x foo(); foo>bar);
- for (; *p && > y;
-   foo > bar)
-;
- do {
- ;;;
- }
- while (foe);
-
- squiggle. extent;
- 1 && * unsmob_moment (lf);
- line_spanner_ = make_spanner ("DynamicLineSpanner", rq ? rq->*self_scm
-(): SCM_EOL);
- case foo: k;
-
- if (0) {a=b;} else {
- c=d;
- }
-
- cookie_io_functions_t Memory_out_stream::functions_ = {
-  Memory_out_stream::reader,
-  ...
- };
-
- int compare (Array < Pitch> *, Array < Pitch> *);
- original_ = (Grob *) & s;
- Drul_array< Link_array<Grob> > o;
-}
-
- header_.char_info_pos = (6 + header_length) * 4;
- return ly_bool2scm (*ma < * mb);
-
- 1 *::sign(2);
-
- (shift) *-d;
-
- a = 0 ? *x : *y;
-
-a = "foo() 2,2,4";
-{
- if (!span_)
-  {
-   span_ = make_spanner ("StaffSymbol", SCM_EOL);
-  }
-}
-{
- if (!span_)
-  {
-   span_ = make_spanner (StaffSymbol, SCM_EOL);
-  }
-}
-'''
-
-def test ():
-    test_file = 'fixcc.cc'
-    open (test_file, 'w').write (TEST)
-    nitpick_file (outdir, test_file)
-    sys.stdout.write (open (test_file).read ())
-
-if __name__ == '__main__':
-    main ()
-
diff --git a/buildscripts/gen-emmentaler-scripts.py b/buildscripts/gen-emmentaler-scripts.py
deleted file mode 100644 (file)
index 3da8840..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#!@PYTHON@
-import sys
-import getopt
-import re 
-import os
-
-(options, files) = \
- getopt.getopt (sys.argv[1:],
-        '',
-        ['dir='])
-
-
-outdir = ''
-for opt in options:
-    o = opt[0]
-    a = opt[1]
-    if o == '--dir':
-        outdir = a
-    else:
-        print o
-        raise getopt.error
-
-# Ugh
-for design_size in [11,13,14,16,18,20,23,26]:
-    name = 'Emmentaler' 
-    filename = name.lower ()
-    script = '''#!@FONTFORGE@
-
-New();
-
-# Separate Feta versioning?
-#         *  using 20 as Weight works for gnome-font-select widget: gfs
-
-notice = "";
-notice += "This font is distributed under the GNU General Public License. ";
-notice += "As a special exception, if you create a document which uses ";
-notice += "this font, and embed this font or unaltered portions of this ";
-notice += "font into the document, this font does not by itself cause the ";
-notice += "resulting document to be covered by the GNU General Public License.";;
-
-SetFontNames("%(name)s-%(design_size)d", "%(name)s", "%(name)s %(design_size)d", "%(design_size)d", notice, "@TOPLEVEL_VERSION@");
-
-MergeFonts("feta%(design_size)d.pfb");
-MergeFonts("parmesan%(design_size)d.pfb");
-
-# load nummer/din after setting PUA.
-i = 0;
-while (i < CharCnt())
- Select(i);
-# crashes fontforge, use PUA for now -- jcn
-# SetUnicodeValue(i + 0xF0000, 0);
-/*
-PRIVATE AREA
-   In the BMP, the range 0xe000 to 0xf8ff will never be  assigned  to  any
-   characters  by  the standard and is reserved for private usage. For the
-   Linux community, this private area has been subdivided further into the
-   range  0xe000  to 0xefff which can be used individually by any end-user
-   and the Linux zone in the range 0xf000 to 0xf8ff where  extensions  are
-   coordinated  among  all  Linux  users.  The  registry of the characters
-   assigned to the Linux zone is currently maintained by  H.  Peter  Anvin
-   <Peter.Anvin@linux.org>.
-*/
- SetUnicodeValue(i + 0xE000, 0);
- ++i;
-endloop
-
-
-MergeFonts("feta-alphabet%(design_size)d.pfb");
-MergeKern("feta-alphabet%(design_size)d.tfm");
-
-LoadTableFromFile("LILF", "%(filename)s-%(design_size)d.subfonts");
-LoadTableFromFile("LILC", "feta%(design_size)d.otf-table");
-LoadTableFromFile("LILY", "feta%(design_size)d.otf-gtable");
-
-Generate("%(filename)s-%(design_size)d.otf");
-Generate("%(filename)s-%(design_size)d.svg");
-''' % vars()
-
-    basename = '%s-%d' % (filename, design_size)
-    path = os.path.join (outdir, basename + '.pe')
-    open (path, 'w').write (script)
-
-    subfonts = ['feta%(design_size)d',
-          'parmesan%(design_size)d',
-          'feta-alphabet%(design_size)d']
-
-    ns = []
-    for s in subfonts:
-        ns.append ('%s' % (s % vars()))
-        
-    subfonts_str = ' '.join (ns)
-    
-    open (os.path.join (outdir, '%(filename)s-%(design_size)d.subfonts' % vars()), 'w').write (subfonts_str)
-
-    path = os.path.join (outdir, '%s-%d.dep' % (filename, design_size))
-
-    deps = r'''%(filename)s-%(design_size)d.otf: $(outdir)/feta%(design_size)d.pfa \
- $(outdir)/parmesan%(design_size)d.pfa  \
- $(outdir)/feta-alphabet%(design_size)d.pfa feta%(design_size)d.otf-table \
- $(outdir)/feta-alphabet%(design_size)d.pfa feta%(design_size)d.otf-gtable
-''' % vars()
-    open (path, 'w').write (deps)
-
-    open (os.path.join (outdir, basename + '.fontname'), 'w').write ("%s-%d" % (name, design_size))
diff --git a/buildscripts/genicon.py b/buildscripts/genicon.py
deleted file mode 100644 (file)
index 5437352..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#!@PYTHON@
-import os
-import sys
-import tempfile
-
-base = os.path.splitext (os.path.split (sys.argv[1])[1])[0]
-input = os.path.abspath (sys.argv[1])
-output = os.path.abspath (sys.argv[2])
-program_name= os.path.split (sys.argv[0])[1]
-
-dir = tempfile.mktemp (program_name)
-os.mkdir (dir, 0777)
-os.chdir(dir)
-
-def system (c):
-    print c
-    if os.system (c):
-        raise 'barf'
-
-outputs = []
-for sz in [48,32,16] :
-    
-    for depth in [24,8]:
-        out = '%(base)s-%(sz)d-%(depth)d.png' % locals()
-        system ('convert -depth %(depth)d -sample %(sz)d %(input)s %(out)s' %
-            locals ())
-        outputs.append (out)
-        
-system('icotool --output %s --create %s' % (output, ' '.join (outputs)))
-system('rm -rf %(dir)s' % locals())                 
-
diff --git a/buildscripts/git-update-changelog.py b/buildscripts/git-update-changelog.py
deleted file mode 100644 (file)
index 09f0d16..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import time
-import os
-import re
-import optparse
-
-def read_pipe (x):
-    print 'pipe', x
-    return os.popen (x).read ()
-
-def system (x):
-    print x
-    return os.system (x)
-    
-class PatchFailed(Exception):
-    pass
-
-def sign (x):
-    if x < 0:
-        return -1
-    if x > 0:
-        return 1
-
-    return 0
-    
-
-class Commit:
-    def __init__ (self, dict):
-        for v in ('message',
-                  'date',
-                  'author',
-                  'committish'):
-            self.__dict__[v] = dict[v]
-        
-        self.date = ' '.join  (self.date.split (' ')[:-1])
-        self.date = time.strptime (self.date, '%a %b %d %H:%M:%S %Y')
-        
-        m = re.search ('(.*)<(.*)>', self.author)
-        self.email = m.group (2).strip ()
-        self.name = m.group (1).strip ()
-        self.diff = read_pipe ('git show %s' % self.committish)
-    def compare (self, other):
-        return sign (time.mktime (self.date) - time.mktime (other.date))
-
-
-    def check_diff_chunk (self, filename, chunk):
-        removals = []
-        def note_removal (m):
-            removals.append (m.group (1))
-            
-        re.sub ('\n-([^\n]+)', note_removal, chunk)
-
-        if removals == []:
-            return True
-        if not os.path.exists (filename):
-            return False
-
-        contents = open (filename).read ()
-        for r in removals:
-            if r not in contents:
-                return False
-
-        return True
-
-    def check_diff (self):
-        chunks = re.split ('\ndiff --git ', self.diff)
-
-        ok = True
-        for c in chunks:
-            m = re.search ('^a/([^ ]+)', c)
-            if not m:
-                continue
-            
-            file = m.group (1)
-            
-            c = re.sub('\n--- [^\n]+', '', c)
-            ok = ok and self.check_diff_chunk (file, c)
-            if not ok:
-                break
-
-        return ok
-        
-    def touched_files (self):
-        files = []
-        def note_file (x):
-            files.append (x.group (1))
-            return ''
-
-        re.sub ('\n--- a/([^\n]+)\n',
-                note_file, self.diff)
-        re.sub('\n--- /dev/null\n\\+\\+\\+ b/([^\n]+)',
-               note_file, self.diff)
-
-        return files
-
-    def has_patch (self):
-        return self.touched_files () <> []
-    
-    def apply (self, add_del_files):
-        def note_add_file (x):
-            add_del_files.append (('add', x.group (1)))
-            return ''
-        
-        def note_del_file (x):
-            add_del_files.append (('del', x.group (1)))
-            return ''
-        
-        re.sub('\n--- /dev/null\n\\+\\+\\+ b/([^\n]+)',
-               note_add_file, self.diff)
-        
-        re.sub('\n--- a/([^\n]+)\n\\+\\+\\+ /dev/null',
-               note_del_file, self.diff)
-
-        p = os.popen ('patch -f -p1 ', 'w')
-        p.write (self.diff)
-
-        if p.close ():
-            raise PatchFailed, self.committish
-        
-    
-def parse_commit_log (log):
-    committish = re.search ('^([^\n]+)', log).group (1)
-    author = re.search ('\nAuthor:\s+([^\n]+)', log).group (1)
-    date_match = re.search ('\nDate:\s+([^\n]+)', log)
-    date = date_match.group (1)
-    log = log[date_match.end (1):]
-
-    message = re.sub ("\n *", '', log)
-    message = message.strip ()
-
-    c = Commit (locals ())
-    return c
-
-def parse_add_changes (from_commit, max_count=0):
-    opt = ''
-    rest = '..'
-    if max_count:
-
-        # fixme.
-        assert max_count == 1
-        opt = '--max-count=%d' % max_count 
-        rest = ''
-        
-    log = read_pipe ('git log %(opt)s %(from_commit)s%(rest)s' % locals ())
-
-    log = log[len ('commit '):]
-    log = log.strip ()
-
-    if not log:
-        return []
-        
-    commits = map (parse_commit_log, re.split ('\ncommit ', log))
-    commits.reverse ()
-    
-    return commits
-
-
-def header (commit):
-    return '%d-%02d-%02d  %s  <%s>\n' % (commit.date[:3] + (commit.name, commit.email))
-
-def changelog_body (commit):
-    s = ''
-    s += ''.join ('\n* %s: ' % f for f in commit.touched_files())
-    s += '\n' + commit.message
-    
-    s = s.replace ('\n', '\n\t')
-    s += '\n'
-    return s
-
-def main ():
-    p = optparse.OptionParser (usage="usage git-update-changelog.py [options] [commits]",
-                               description="""
-Apply GIT patches and update change log.
-
-Run this file from the CVS directory, with commits from the repository in --git-dir.
-
-""")
-    p.add_option ("--start",
-                  action='store',
-                  default='',
-                  metavar="FIRST",
-                  dest="start",
-                  help="all commits starting with FIRST (exclusive).")
-    
-    p.add_option ("--git-dir",
-                  action='store',
-                  default='',
-                  dest="gitdir",
-                  help="the GIT directory to merge.")
-
-    (options, args) = p.parse_args ()
-    
-    log = open ('ChangeLog').read ()
-
-    if options.gitdir:
-        os.environ['GIT_DIR'] = options.gitdir
-
-
-    if not args:
-        if not options.start:
-            print 'Must set start committish.'  
-            sys.exit (1)
-
-        commits = parse_add_changes (options.start)
-    else:
-        commits = [] 
-        for a in args:
-            commits += parse_add_changes (a, max_count=1)
-
-    if not commits:
-        return
-    
-    new_log = ''
-    last_commit = None
-
-    first = header (commits[0]) + '\n'
-    if first == log[:len (first)]:
-        log = log[len (first):]
-
-    try:
-        previously_done = dict((c, 1) for c in open ('.git-commits-done').read ().split ('\n'))
-    except IOError:
-        previously_done = {}
-
-    commits = [c for c in commits if not previously_done.has_key (c.committish)]
-    commits = sorted (commits, cmp=Commit.compare)
-
-    system ('cvs up')
-    
-    file_adddel = []
-    collated_log = ''
-    collated_message = ''
-    commits_done = []
-    while commits:
-        c = commits[0]
-        
-        if not c.has_patch ():
-            print 'patchless commit (merge?)'
-            continue
-
-        ok = c.check_diff ()
-
-        if not ok:
-            print "Patch doesn't seem to apply"
-            print 'skipping', c.committish
-            print 'message:', c.message
-
-            break
-
-
-        commits = commits[1:]
-        commits_done.append (c) 
-            
-        print 'patch ', c.committish
-        try:
-            c.apply (file_adddel)
-        except PatchFailed:
-            break
-        
-        if c.touched_files () == ['ChangeLog']:
-            continue
-        
-        if (last_commit
-            and c.author != last_commit.author
-            and c.date[:3] != last_commit.date[:3]):
-
-            new_log += header (last_commit)
-
-        collated_log = changelog_body (c)  + collated_log
-        last_commit = c
-
-        collated_message += c.message + '\n'
-        
-
-
-    for (op, f) in file_adddel:
-        if op == 'del':
-            system ('cvs remove %(f)s' % locals ())
-        if op == 'add':
-            system ('cvs add %(f)s' % locals ())
-
-    if last_commit: 
-        collated_log = header (last_commit) + collated_log + '\n'
-
-    log = collated_log + log
-
-    try:
-        os.unlink ('ChangeLog~')
-    except OSError:
-        pass
-    
-    os.rename ('ChangeLog', 'ChangeLog~')
-    open ('ChangeLog', 'w').write (log)
-
-    open ('.msg','w').write (collated_message)
-    print '\nCommit message\n**\n%s\n**\n' % collated_message
-    print '\nRun:\n\n\tcvs commit -F .msg\n\n'
-    print '\n\techo %s >> .git-commits-done\n\n' % ' '.join ([c.committish
-                                                              for c in commits_done]) 
-
-
-    if commits:
-        print 'Commits left to do:'
-        print ' '.join ([c.committish for c in commits])
-    
-main ()
-    
-    
-    
diff --git a/buildscripts/grand-replace.sh b/buildscripts/grand-replace.sh
deleted file mode 100644 (file)
index 645eae6..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#! @BASH@
-# note: dash does not work
-
-pytt '(Copyright|\(c\)|\(C\)|@copyright\{\})\s*2007' '\1 2007--2008' $(find . -mindepth 2 -type f | grep -Ev 'out/|out-scons|out-www/|.git/|.scon|#|~' | grep -iv 'change')
-pytt '(Copyright|\(c\)|\(C\)|@copyright\{\})\s*([^-]*--)(200[0-7])' '\1 \2\062008' $(find . -mindepth 2 -type f | grep -Ev 'out/|out-scons|out-www/|.git/|.scon|#|~' | grep -iv 'change')
diff --git a/buildscripts/help2man.pl b/buildscripts/help2man.pl
deleted file mode 100644 (file)
index 9cb09c4..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
-#!@PERL@ -w
-
-# Generate a short man page from --help and --version output.
-# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software
-# Foundation, Inc.
-
-# 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, 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.
-
-# Written by Brendan O'Dea <bod@debian.org>
-# Available from ftp://ftp.gnu.org/gnu/help2man/
-
-use 5.005;
-use strict;
-use Getopt::Long;
-use Text::Tabs qw(expand);
-use POSIX qw(strftime setlocale LC_TIME);
-
-my $this_program = 'help2man';
-my $this_version = '1.28';
-my $version_info = <<EOT;
-GNU $this_program $this_version
-
-Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-Written by Brendan O'Dea <bod\@debian.org>
-EOT
-
-my $help_info = <<EOT;
-`$this_program' generates a man page out of `--help' and `--version' output.
-
-Usage: $this_program [OPTIONS]... EXECUTABLE
-
- -n, --name=STRING       description for the NAME paragraph
- -s, --section=SECTION   section number for manual page (1, 6, 8)
- -m, --manual=TEXT       name of manual (User Commands, ...)
- -S, --source=TEXT       source of program (FSF, Debian, ...)
- -i, --include=FILE      include material from `FILE'
- -I, --opt-include=FILE  include material from `FILE' if it exists
- -o, --output=FILE       send output to `FILE'
- -p, --info-page=TEXT    name of Texinfo manual
- -N, --no-info           suppress pointer to Texinfo manual
-     --help              print this help, then exit
-     --version           print version number, then exit
-
-EXECUTABLE should accept `--help' and `--version' options although
-alternatives may be specified using:
-
- -h, --help-option=STRING     help option string
- -v, --version-option=STRING  version option string
-
-Report bugs to <bug-help2man\@gnu.org>.
-EOT
-
-my $section = 1;
-my $manual = '';
-my $source = '';
-my $help_option = '--help';
-my $version_option = '--version';
-my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info);
-
-my %opt_def = (
-    'n|name=s'          => \$opt_name,
-    's|section=s'       => \$section,
-    'm|manual=s'        => \$manual,
-    'S|source=s'        => \$source,
-    'i|include=s'       => sub { push @opt_include, [ pop, 1 ] },
-    'I|opt-include=s'   => sub { push @opt_include, [ pop, 0 ] },
-    'o|output=s'        => \$opt_output,
-    'p|info-page=s'     => \$opt_info,
-    'N|no-info'                 => \$opt_no_info,
-    'h|help-option=s'   => \$help_option,
-    'v|version-option=s' => \$version_option,
-);
-
-# Parse options.
-Getopt::Long::config('bundling');
-GetOptions (%opt_def,
-    help    => sub { print $help_info; exit },
-    version => sub { print $version_info; exit },
-) or die $help_info;
-
-die $help_info unless @ARGV == 1;
-
-my %include = ();
-my %append = ();
-my @include = (); # retain order given in include file
-
-# Process include file (if given).  Format is:
-#
-#   [section name]
-#   verbatim text
-#
-# or
-#
-#   /pattern/
-#   verbatim text
-#
-
-while (@opt_include)
-{
-    my ($inc, $required) = @{shift @opt_include};
-
-    next unless -f $inc or $required;
-    die "$this_program: can't open `$inc' ($!)\n"
-       unless open INC, $inc;
-
-    my $key;
-    my $hash = \%include;
-
-    while (<INC>)
-    {
-       # [section]
-       if (/^\[([^]]+)\]/)
-       {
-           $key = uc $1;
-           $key =~ s/^\s+//;
-           $key =~ s/\s+$//;
-           $hash = \%include;
-           push @include, $key unless $include{$key};
-           next;
-       }
-
-       # /pattern/
-       if (m!^/(.*)/([ims]*)!)
-       {
-           my $pat = $2 ? "(?$2)$1" : $1;
-
-           # Check pattern.
-           eval { $key = qr($pat) };
-           if ($@)
-           {
-               $@ =~ s/ at .*? line \d.*//;
-               die "$inc:$.:$@";
-           }
-
-           $hash = \%append;
-           next;
-       }
-
-       # Check for options before the first section--anything else is
-       # silently ignored, allowing the first for comments and
-       # revision info.
-       unless ($key)
-       {
-           # handle options
-           if (/^-/)
-           {
-               local @ARGV = split;
-               GetOptions %opt_def;
-           }
-
-           next;
-       }
-
-       $hash->{$key} ||= '';
-       $hash->{$key} .= $_;
-    }
-
-    close INC;
-
-    die "$this_program: no valid information found in `$inc'\n"
-       unless $key;
-}
-
-# Compress trailing blank lines.
-for my $hash (\(%include, %append))
-{
-    for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ }
-}
-
-# Turn off localisation of executable's output.
-@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
-
-# Turn off localisation of date (for strftime).
-setlocale LC_TIME, 'C';
-
-# Grab help and version info from executable.
-my ($help_text, $version_text) = map {
-    join '', map { s/ +$//; expand $_ } `$ARGV[0] $_ 2>/dev/null`
-       or die "$this_program: can't get `$_' info from $ARGV[0]\n"
-} $help_option, $version_option;
-
-my $date = strftime "%B %Y", localtime;
-(my $program = $ARGV[0]) =~ s!.*/!!;
-my $package = $program;
-my $version;
-
-if ($opt_output)
-{
-    unlink $opt_output
-       or die "$this_program: can't unlink $opt_output ($!)\n"
-       if -e $opt_output;
-
-    open STDOUT, ">$opt_output"
-       or die "$this_program: can't create $opt_output ($!)\n";
-}
-
-# The first line of the --version information is assumed to be in one
-# of the following formats:
-#
-#   <version>
-#   <program> <version>
-#   {GNU,Free} <program> <version>
-#   <program> ({GNU,Free} <package>) <version>
-#   <program> - {GNU,Free} <package> <version>
-#
-# and seperated from any copyright/author details by a blank line.
-
-($_, $version_text) = split /\n+/, $version_text, 2;
-
-if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or
-    /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/)
-{
-    $program = $1;
-    $package = $2;
-    $version = $3;
-}
-elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/)
-{
-    $program = $2;
-    $package = $1 ? "$1$2" : $2;
-    $version = $3;
-}
-else
-{
-    $version = $_;
-}
-
-$program =~ s!.*/!!;
-
-# No info for `info' itself.
-$opt_no_info = 1 if $program eq 'info';
-
-# --name overrides --include contents.
-$include{NAME} = "$program \\- $opt_name\n" if $opt_name;
-
-# Default (useless) NAME paragraph.
-$include{NAME} ||= "$program \\- manual page for $program $version\n";
-
-# Man pages traditionally have the page title in caps.
-my $PROGRAM = uc $program;
-
-# Set default page head/footers
-$source ||= "$program $version";
-unless ($manual)
-{
-    for ($section)
-    {
-       if (/^(1[Mm]|8)/) { $manual = 'System Administration Utilities' }
-       elsif (/^6/)      { $manual = 'Games' }
-       else              { $manual = 'User Commands' }
-    }
-}
-
-# Extract usage clause(s) [if any] for SYNOPSIS.
-if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m)
-{
-    my @syn = $2 . $3;
-
-    if ($_ = $4)
-    {
-       s/^\n//;
-       for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ }
-    }
-
-    my $synopsis = '';
-    for (@syn)
-    {
-       $synopsis .= ".br\n" if $synopsis;
-       s!^\S*/!!;
-       s/^(\S+) *//;
-       $synopsis .= ".B $1\n";
-       s/\s+$//;
-       s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
-       s/^/\\fI/ unless s/^\\fR//;
-       $_ .= '\fR';
-       s/(\\fI)( *)/$2$1/g;
-       s/\\fI\\fR//g;
-       s/^\\fR//;
-       s/\\fI$//;
-       s/^\./\\&./;
-
-       $synopsis .= "$_\n";
-    }
-
-    $include{SYNOPSIS} ||= $synopsis;
-}
-
-# Process text, initial section is DESCRIPTION.
-my $sect = 'DESCRIPTION';
-$_ = "$help_text\n\n$version_text";
-
-# Normalise paragraph breaks.
-s/^\n+//;
-s/\n*$/\n/;
-s/\n\n+/\n\n/g;
-
-# Temporarily exchange leading dots, apostrophes and backslashes for
-# tokens.
-s/^\./\x80/mg;
-s/^'/\x81/mg;
-s/\\/\x82/g;
-
-# Start a new paragraph (if required) for these.
-s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g;
-
-sub convert_option;
-
-while (length)
-{
-    # Convert some standard paragraph names.
-    if (s/^(Options|Examples): *\n//)
-    {
-       $sect = uc $1;
-       next;
-    }
-
-    # Copyright section
-    if (/^Copyright +[(\xa9]/)
-    {
-       $sect = 'COPYRIGHT';
-       $include{$sect} ||= '';
-       $include{$sect} .= ".PP\n" if $include{$sect};
-
-       my $copy;
-       ($copy, $_) = split /\n\n/, $_, 2;
-
-       for ($copy)
-       {
-           # Add back newline
-           s/\n*$/\n/;
-
-           # Convert iso9959-1 copyright symbol or (c) to nroff
-           # character.
-           s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg;
-
-           # Insert line breaks before additional copyright messages
-           # and the disclaimer.
-           s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g;
-
-           # Join hyphenated lines.
-           s/([A-Za-z])-\n */$1/g;
-       }
-
-       $include{$sect} .= $copy;
-       $_ ||= '';
-       next;
-    }
-
-    # Catch bug report text.
-    if (/^(Report +bugs|Email +bug +reports +to) /)
-    {
-       $sect = 'REPORTING BUGS';
-    }
-
-    # Author section.
-    elsif (/^Written +by/)
-    {
-       $sect = 'AUTHOR';
-    }
-
-    # Examples, indicated by an indented leading $, % or > are
-    # rendered in a constant width font.
-    if (/^( +)([\$\%>] )\S/)
-    {
-       my $indent = $1;
-       my $prefix = $2;
-       my $break = '.IP';
-       $include{$sect} ||= '';
-       while (s/^$indent\Q$prefix\E(\S.*)\n*//)
-       {
-           $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n";
-           $break = '.br';
-       }
-
-       next;
-    }
-
-    my $matched = '';
-    $include{$sect} ||= '';
-
-    # Sub-sections have a trailing colon and the second line indented.
-    if (s/^(\S.*:) *\n / /)
-    {
-       $matched .= $& if %append;
-       $include{$sect} .= qq(.SS "$1"\n);
-    }
-
-    my $indent = 0;
-    my $content = '';
-
-    # Option with description.
-    if (s/^( {1,10}([+-]\S.*?))(?:(  +(?!-))|\n( {20,}))(\S.*)\n//)
-    {
-       $matched .= $& if %append;
-       $indent = length ($4 || "$1$3");
-       $content = ".TP\n\x83$2\n\x83$5\n";
-       unless ($4)
-       {
-           # Indent may be different on second line.
-           $indent = length $& if /^ {20,}/;
-       }
-    }
-
-    # Option without description.
-    elsif (s/^ {1,10}([+-]\S.*)\n//)
-    {
-       $matched .= $& if %append;
-       $content = ".HP\n\x83$1\n";
-       $indent = 80; # not continued
-    }
-
-    # Indented paragraph with tag.
-    elsif (s/^( +(\S.*?)  +)(\S.*)\n//)
-    {
-       $matched .= $& if %append;
-       $indent = length $1;
-       $content = ".TP\n\x83$2\n\x83$3\n";
-    }
-
-    # Indented paragraph.
-    elsif (s/^( +)(\S.*)\n//)
-    {
-       $matched .= $& if %append;
-       $indent = length $1;
-       $content = ".IP\n\x83$2\n";
-    }
-
-    # Left justified paragraph.
-    else
-    {
-       s/(.*)\n//;
-       $matched .= $& if %append;
-       $content = ".PP\n" if $include{$sect};
-       $content .= "$1\n";
-    }
-
-    # Append continuations.
-    while (s/^ {$indent}(\S.*)\n//)
-    {
-       $matched .= $& if %append;
-       $content .= "\x83$1\n"
-    }
-
-    # Move to next paragraph.
-    s/^\n+//;
-
-    for ($content)
-    {
-       # Leading dot and apostrophe protection.
-       s/\x83\./\x80/g;
-       s/\x83'/\x81/g;
-       s/\x83//g;
-
-       # Convert options.
-       s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge;
-    }
-
-    # Check if matched paragraph contains /pat/.
-    if (%append)
-    {
-       for my $pat (keys %append)
-       {
-           if ($matched =~ $pat)
-           {
-               $content .= ".PP\n" unless $append{$pat} =~ /^\./;
-               $content .= $append{$pat};
-           }
-       }
-    }
-
-    $include{$sect} .= $content;
-}
-
-# Refer to the real documentation.
-unless ($opt_no_info)
-{
-    my $info_page = $opt_info || $program;
-
-    $sect = 'SEE ALSO';
-    $include{$sect} ||= '';
-    $include{$sect} .= ".PP\n" if $include{$sect};
-    $include{$sect} .= <<EOT;
-The full documentation for
-.B $program
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B $program
-programs are properly installed at your site, the command
-.IP
-.B info $info_page
-.PP
-should give you access to the complete manual.
-EOT
-}
-
-# Output header.
-print <<EOT;
-.\\" DO NOT MODIFY THIS FILE!  It was generated by $this_program $this_version.
-.TH $PROGRAM "$section" "$date" "$source" "$manual"
-EOT
-
-# Section ordering.
-my @pre = qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES);
-my @post = ('AUTHOR', 'REPORTING BUGS', 'COPYRIGHT', 'SEE ALSO');
-my $filter = join '|', @pre, @post;
-
-# Output content.
-for (@pre, (grep ! /^($filter)$/o, @include), @post)
-{
-    if ($include{$_})
-    {
-       my $quote = /\W/ ? '"' : '';
-       print ".SH $quote$_$quote\n";
-       
-       for ($include{$_})
-       {
-           # Replace leading dot, apostrophe and backslash tokens.
-           s/\x80/\\&./g;
-           s/\x81/\\&'/g;
-           s/\x82/\\e/g;
-           print;
-       }
-    }
-}
-
-exit;
-
-# Convert option dashes to \- to stop nroff from hyphenating 'em, and
-# embolden.  Option arguments get italicised.
-sub convert_option
-{
-    local $_ = '\fB' . shift;
-
-    s/-/\\-/g;
-    unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
-    {
-       s/=(.)/\\fR=\\fI$1/;
-       s/ (.)/ \\fI$1/;
-       $_ .= '\fR';
-    }
-
-    $_;
-}
diff --git a/buildscripts/html-gettext.py b/buildscripts/html-gettext.py
deleted file mode 100644 (file)
index ccfe693..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#!@PYTHON@
-# html-gettext.py
-
-# USAGE:  html-gettext.py [-o OUTDIR] LANG FILES
-#
-# -o OUTDIR specifies that output files should be written in OUTDIR
-#    rather than be overwritten
-#
-
-import sys
-import re
-import os
-import getopt
-
-import langdefs
-
-optlist, args = getopt.getopt(sys.argv[1:],'o:')
-lang = args[0]
-files = args [1:]
-
-outdir = '.'
-for x in optlist:
-    if x[0] == '-o':
-        outdir = x[1]
-
-double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
-my_gettext = langdefs.translation[lang]
-
-html_codes = ((' -- ', ' &ndash; '),
-              (' --- ', ' &mdash; '),
-              ("'", '&rsquo;'))
-texi_html_conversion = {
-    'command': {
-        'html2texi':
-            (re.compile (r'(?:<samp><span class="command">|<code>)(.*?)(?:</span></samp>|</code>)'),
-             r'@command{\1}'),
-        'texi2html':
-            (re.compile (r'@command{(.*?)}'),
-             r'<code>\1</code>'),
-        },
-    'code': {
-        'html2texi':
-            (re.compile (r'<code>(.*?)</code>'),
-             r'@code{\1}'),
-        'texi2html':
-            (re.compile (r'@code{(.*?)}'),
-             r'<code>\1</code>'),
-        },
-    }
-
-whitespaces = re.compile (r'\s+')
-
-
-def _ (s):
-    if not s:
-        return ''
-    str = whitespaces.sub (' ', s)
-    for c in html_codes:
-        str = str.replace (c[1], c[0])
-    for command in texi_html_conversion:
-        d = texi_html_conversion[command]
-        str = d['html2texi'][0].sub (d['html2texi'][1], str)
-        str = my_gettext (str)
-        str = d['texi2html'][0].sub (d['texi2html'][1], str)
-    for c in html_codes:
-        str = str.replace (c[0], c[1])
-    return str
-
-link_re =  re.compile (r'<link rel="(up|prev|next)" (.*?) title="([^"]*?)">')
-
-def link_gettext (m):
-    return '<link rel="' + m.group (1) + '" ' + m.group (2) \
-        + ' title="' + _ (m.group (3)) + '">'
-
-makeinfo_title_re = re.compile (r'<title>([^<]*?) - ([^<]*?)</title>')
-
-def makeinfo_title_gettext (m):
-    return '<title>' + _ (m.group (1)) + ' - ' + m.group (2) + '</title>'
-
-texi2html_title_re = re.compile (r'<title>(.+): ([A-Z\d.]+ |)(.+?)</title>')
-
-def texi2html_title_gettext (m):
-    return '<title>' + _ (m.group (1)) + double_punct_char_separator + ': ' \
-        + m.group (2) + _ (m.group (3)) + '</title>'
-
-a_href_re = re.compile ('(?s)<a (?P<attributes>[^>]*?href="[\\w.#-_]+"[^>]*?>)(?P<code><code>)?\
-(?P<appendix>Appendix )?(?P<leading>[A-Z0-9.]+ | (?:&lt;){1,2} |&nbsp;[^>:]+?:&nbsp;|&nbsp;|)\
-(?P<name>(?:<samp><span class="command">|</?code>|</span>|[^>])+?)(?P<end_code>(?(code)</code>|))\
-(?P<trailing> (?:&gt;){1,2} |&nbsp;|)</a>:?')
-
-def a_href_gettext (m):
-    s = ''
-    if m.group(0)[-1] == ':':
-        s = double_punct_char_separator + ':'
-    t = ''
-    if m.group ('appendix'):
-        t = _ (m.group ('appendix'))
-    return '<a ' + m.group ('attributes') + (m.group ('code') or '') + \
-        t + m.group ('leading') + _ (m.group ('name')) + \
-        m.group ('end_code') + m.group ('trailing') + '</a>' + s
-
-h_re = re.compile (r'<h(\d)( class="\w+"|)>\s*(Appendix |)([A-Z\d.]+ |)(.+?)\s*</h\1>')
-
-def h_gettext (m):
-    if m.group (3):
-        s = _ (m.group (3))
-    else:
-        s= ''
-    return '<h' + m.group (1) + m.group (2) + '>' + s +\
-           m.group (4) + _ (m.group (5)) + '</h' + m.group (1) + '>'
-
-for filename in files:
-    f = open (filename, 'r')
-    page = f.read ()
-    f.close ()
-    page = link_re.sub (link_gettext, page)
-    page = makeinfo_title_re.sub (makeinfo_title_gettext, page)
-    page = texi2html_title_re.sub (texi2html_title_gettext, page)
-    page = a_href_re.sub (a_href_gettext, page)
-    page = h_re.sub (h_gettext, page)
-    for w in ('Next:', 'Previous:', 'Up:'):
-        page = page.replace (w, _ (w))
-    page = langdefs.LANGDICT[lang].html_filter (page)
-    f = open (os.path.join (outdir, filename), 'w')
-    f.write (page)
-    f.close ()
diff --git a/buildscripts/install-info-html.sh b/buildscripts/install-info-html.sh
deleted file mode 100644 (file)
index a116cd9..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-#!@BASH@
-
-name=install-info-html
-version=1.0
-
-all=
-index_dir=.
-
-#
-# debugging
-#
-debug_echo=:
-
-
-#
-# print usage
-#
-help ()
-{
-       cat << EOF
-$name $version
-Install HTML info document.
-
-Usage: $name [OPTIONS]... [DOCUMENT-DIR]...
-
-Options:
-  -a, --all            assume all subdirectories of index to be DOCUMENT-DIRs
-  -d, --dir=DIR        set index directory to DIR (default=.)
-  -D, --debug          print debugging info
-  -h, --help           show this help text
-  -v, --version        show version
-EOF
-}
-
-cleanup ()
-{
-       $debug_echo "cleaning ($?)..."
-}
-
-trap cleanup 0 9 15
-
-#
-# Find command line options and switches
-#
-
-# "x:" x takes argument
-#
-options="adhvW:"
-#
-# ugh, "\-" is a hack to support long options
-# must be in double quotes for bash-2.0
-
-while getopts "\-:$options" O
-do
-       $debug_echo "O: \`$O'"
-       $debug_echo "arg: \`$OPTARG'"
-       case $O in
-               a)
-                       all=yes
-                       ;;
-               D)
-                       [ "$debug_echo" = "echo" ] && set -x
-                       debug_echo=echo
-                       ;;
-               h)
-                       help;
-                       exit 0
-                       ;;
-               v)
-                       echo $name $version
-                       exit 0
-                       ;;
-               d)
-                       index_dir=$OPTARG
-                       ;;
-       # a long option!
-       -)
-               case "$OPTARG" in
-                       a*|-a*)
-                               all=yes
-                               ;;
-                       de*|-de*)
-                               [ "$debug_echo" = "echo" ] && set -x
-                               debug_echo=echo
-                               ;;
-                       h*|-h*)
-                               help;
-                               exit 0
-                               ;;
-                       di*|-di*)
-                               index_dir="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
-                               ;;
-                       version|-version)
-                               echo $name $version
-                               exit 0
-                               ;;
-                       *|-*)
-                               echo "$0: invalid option -- \"$OPTARG\""
-                               help;
-                               exit -1
-                               ;;
-               esac
-       esac
-done
-shift `expr $OPTIND - 1`
-
-#
-# Input file name
-#
-if [ -z "$all" -a -z "$1" ]; then
-       help
-       echo "$name: No HTML documents given"
-       exit 2
-fi
-
-if [ -n "$all" -a -n "$1" ]; then
-       echo "$name: --all specified, ignoring DIRECTORY-DIRs"
-fi
-
-if [ -n "$all" ]; then
-       document_dirs=`/bin/ls -d1 $index_dir`
-else
-       document_dirs=$*
-fi
-
-index_file=$index_dir/index.html
-rm -f $index_file
-echo -n "$name: Writing index: $index_file..."
-
-# head
-cat >> $index_file <<EOF
-<html> 
-<title>Info documentation index</title>
-<body>
-<h1>Info documentation index</h1>
-<p>
-This is the directory file \`index.html' a.k.a. \`DIR', which contains the
-topmost node of the HTML Info hierarchy.
-</p>
-<ul>
-EOF
-
-#list
-for i in $document_dirs; do
-    cat <<EOF
-<li> <a href="$i/index.html">$i</a> (<a href="$i.html">$i as one big page</a>)</li>
-EOF
-done >> $index_file
-
-# foot
-cat >> $index_file <<EOF
-</ul>
-</body>
-</html>
-EOF
-echo
diff --git a/buildscripts/lilypond-words.py b/buildscripts/lilypond-words.py
deleted file mode 100644 (file)
index e9851f6..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-#!@PYTHON@
-
-# Created 01 September 2003 by Heikki Junes.
-# Rewritten by John Mandereau
-
-# Generates lilypond-words.el for (X)Emacs and lilypond-words[.vim] for Vim.
-
-import re
-import sys
-import os
-import getopt
-
-keywords = []
-reserved_words = []
-note_names = []
-
-# keywords not otherwise found
-keywords += ['include', 'maininput', 'version']
-
-# the main keywords
-s = open ('lily/lily-lexer.cc', 'r').read ()
-keywords += [w for w in re.findall (r"\s*{\"(.+)\",\s*.*},\s*\n", s)]
-
-s = open ('scm/markup.scm', 'r').read ()
-keywords += [w for w in re.findall (r"(?m)^\s*\(cons\s*([a-z-]+)-markup", s)]
-
-# identifiers and keywords
-for name in ['ly/chord-modifiers-init.ly',
-             'ly/dynamic-scripts-init.ly',
-             'ly/engraver-init.ly',
-             'ly/grace-init.ly',
-             'ly/gregorian.ly',
-             'ly/music-functions-init.ly',
-             'ly/performer-init.ly',
-             'ly/property-init.ly',
-             'ly/scale-definitions-init.ly',
-             'ly/script-init.ly',
-             'ly/spanners-init.ly',
-             'ly/declarations-init.ly',
-             'ly/params-init.ly']:
-    s = open (name, 'r').read ()
-    keywords += [w for w in re.findall (r"(?m)^\s*\"?([a-zA-Z]+)\"?\s*=", s)]
-
-# note names
-for name in ['ly/catalan.ly',
-             'ly/deutsch.ly',
-             'ly/drumpitch-init.ly',
-             'ly/english.ly',
-             'ly/espanol.ly',
-             'ly/italiano.ly',
-             'ly/nederlands.ly',
-             'ly/norsk.ly',
-             'ly/portugues.ly',
-             'ly/suomi.ly',
-             'ly/svenska.ly',
-             'ly/vlaams.ly']:
-    s = open (name, 'r').read ()
-    note_names += [n for n in re.findall (r"(?m)^\s*\(([a-z]+)[^l]+ly:make-pitch", s)]
-
-# reserved words
-for name in ['ly/engraver-init.ly',
-             'ly/performer-init.ly']:
-    s = open (name, 'r').read ()
-    for pattern in [r"(?m)^\s*.consists\s+\"([a-zA-Z_]+)\"",
-                    r"[\\]name\s+[\"]?([a-zA-Z_]+)[\"]?",
-                    r"\s+([a-zA-Z_]+)\s*\\(?:set|override)"]:
-        reserved_words += [w for w in re.findall (pattern, s)]
-
-keywords = list (set (keywords))
-keywords.sort (reverse=True)
-
-reserved_words = list (set (reserved_words))
-reserved_words.sort (reverse=True)
-
-note_names = list (set (note_names))
-note_names.sort (reverse=True)
-
-
-# output
-outdir = ''
-out_words = False
-out_el = False
-out_vim = False
-
-options = getopt.getopt (sys.argv[1:],
-  '', ['words', 'el', 'vim', 'dir='])[0]
-
-for (o, a) in options:
-    if o == '--words':
-        out_words = True
-    elif o == '--el':
-        out_el = True
-    elif o == '--vim':
-        out_vim = True
-    elif o == '--dir':
-        outdir = a
-
-if out_words or out_el:
-    outstring = ''.join (['\\\\' + w + '\n' for w in keywords])
-    outstring += ''.join ([w + '\n' for w in reserved_words])
-    outstring += ''.join ([w + '\n' for w in note_names])
-
-if out_words:
-    f = open (os.path.join (outdir, 'lilypond-words'), 'w')
-    f.write (outstring)
-
-if out_el:
-    f = open (os.path.join (outdir, 'lilypond-words.el'), 'w')
-    f.write (outstring)
-
-    # the menu in lilypond-mode.el
-    # for easier typing of this list, replace '/' with '\' below
-    # when writing to file
-    elisp_menu = ['/( - _ /) -',
-                  '/[ - _ /] -',
-                  '< - _ > -',
-                  '<< - _ >> -',
-                  '///( - _ ///) -',
-                  '///[ - _ ///] -',
-                  '///< - _ ///! -',
-                  '///> - _ ///! -',
-                  '//center - / << _ >> -',
-                  '//column - / << _ >> -',
-                  '//context/ Staff/ = - % { _ } -',
-                  '//context/ Voice/ = - % { _ } -',
-                  '//markup - { _ } -',
-                  '//notes - { _ } -',
-                  '//relative - % { _ } -',
-                  '//score - { //n /? //simultaneous { //n _ //n } /! //n //paper {  } //n /? //midi {  } //n /! } //n -',
-                  '//simultaneous - { _ } -',
-                  '//sustainDown - _ //sustainUp -',
-                  '//times - % { _ } -',
-                  '//transpose - % { _ } -',
-                  '']
-    f.write ('\n'.join ([line.replace ('/', '\\') for line in elisp_menu]))
-
-if out_vim:
-    f = open (os.path.join (outdir, 'lilypond-words.vim'), 'w')
-    f.write ('syn match lilyKeyword \"[-_^]\\?\\\\\\(')
-    f.write (''.join ([w + '\\|' for w in keywords]))
-    f.write ('n\\)\\(\\A\\|\\n\\)\"me=e-1\n')
-
-    f.write ('syn match lilyReservedWord \"\\(\\A\\|\\n\\)\\(')
-    f.write (''.join ([w + '\\|' for w in reserved_words]))
-    f.write ('Score\\)\\(\\A\\|\\n\\)\"ms=s+1,me=e-1\n')
-
-    f.write ('syn match lilyNote \"\\<\\(\\(\\(')
-    f.write (''.join ([w + '\\|' for w in note_names]))
-    f.write ('a\\)\\([,\']\\)\\{,4}\\([?!]\\)\\?\\)\\|s\\|r\\)\\(\\(128\\|64\\|32\\|16\\|8\\|4\\|2\\|1\\|\\\\breve\\|\\\\longa\\|\\\\maxima\\)[.]\\{,8}\\)\\?\\(\\A\\|\\n\\)\"me=e-1\n')
diff --git a/buildscripts/lys-to-tely.py b/buildscripts/lys-to-tely.py
deleted file mode 100644 (file)
index c9d698f..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-#!@PYTHON@
-
-
-'''
-TODO:
-
- * Add @nodes, split at sections?
-
-'''
-
-
-import sys
-import os
-import getopt
-import re
-
-program_name = 'lys-to-tely'
-
-include_snippets = '@lysnippets'
-fragment_options = 'printfilename,texidoc'
-help_text = r"""Usage: %(program_name)s [OPTIONS]... LY-FILE...
-Construct tely doc from LY-FILEs.
-
-Options:
- -h, --help                     print this help
- -f, --fragment-options=OPTIONS use OPTIONS as lilypond-book fragment
-   options
- -o, --output=NAME              write tely doc to NAME
- -t, --title=TITLE              set tely doc title TITLE
-     --template=TEMPLATE        use TEMPLATE as Texinfo template file,
-   instead of standard template; TEMPLATE should contain a command
-   '%(include_snippets)s' to tell where to insert LY-FILEs.  When this
-   option is used, NAME and TITLE are ignored.
-"""
-
-def help (text):
-    sys.stdout.write ( text)
-    sys.exit (0)
-
-(options, files) = getopt.getopt (sys.argv[1:], 'f:hn:t:',
-                     ['fragment-options=', 'help', 'name=', 'title=', 'template='])
-
-name = "ly-doc"
-title = "Ly Doc"
-template = '''\input texinfo
-@setfilename %%(name)s.info
-@settitle %%(title)s
-
-@documentencoding utf-8
-@iftex
-@afourpaper
-@end iftex
-
-@finalout @c we do not want black boxes.
-
-@c fool ls-latex
-@ignore
-@author Han-Wen Nienhuys and Jan Nieuwenhuizen
-@title %%(title)s
-@end ignore
-
-@node Top, , , (dir)
-@top %%(title)s
-
-%s
-
-@bye
-''' % include_snippets
-
-for opt in options:
-    o = opt[0]
-    a = opt[1]
-    if o == '-h' or o == '--help':
-        # We can't use vars () inside a function, as that only contains all 
-        # local variables and none of the global variables! Thus we have to 
-        # generate the help text here and pass it to the function...
-        help (help_text % vars ())
-    elif o == '-n' or o == '--name':
-        name = a
-    elif o == '-t' or o == '--title':
-        title = a
-    elif o == '-f' or o == '--fragment-options':
-        fragment_options = a
-    elif o == '--template':
-        template = open (a, 'r').read ()
-    else:
-        raise Exception ('unknown option: ' + o)
-
-texi_file_re = re.compile ('.*\.i?te(ly|xi)$')
-
-def name2line (n):
-    if texi_file_re.match (n):
-        # We have a texi include file, simply include it:
-        s = r"@include %s" % os.path.basename (n)
-    else:
-        # Assume it's a lilypond file -> create image etc.
-        s = r"""
-@ifhtml
-@html
-<a name="%s"></a>
-@end html
-@end ifhtml
-
-@lilypondfile[%s]{%s}
-""" % (os.path.basename (n), fragment_options, n)
-    return s
-
-if files:
-    dir = os.path.dirname (name) or "."
-# don't strip .tely extension, input/lsr uses .itely
-    name = os.path.basename (name)
-    template = template % vars ()
-
-    s = "\n".join (map (name2line, files))
-    s = template.replace (include_snippets, s, 1)
-    f = "%s/%s" % (dir, name)
-    sys.stderr.write ("%s: writing %s..." % (program_name, f))
-    h = open (f, "w")
-    h.write (s)
-    h.close ()
-    sys.stderr.write ('\n')
-else:
-    # not Unix philosophy, but hey, at least we notice when
-    # we don't distribute any .ly files.
-    sys.stderr.write ("No files specified. Doing nothing")
diff --git a/buildscripts/makelsr.py b/buildscripts/makelsr.py
deleted file mode 100644 (file)
index cb0619f..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import os
-import glob
-import re
-
-USAGE = '''  Usage: makelsr.py LSR_SNIPPETS_DIR
-This script must be run from top of the source tree;
-it updates snippets input/lsr with snippets in input/new or LSR_SNIPPETS_DIR.
-'''
-
-LY_HEADER_LSR = '''%% Do not edit this file; it is auto-generated from LSR http://lsr.dsi.unimi.it
-%% This file is in the public domain.
-'''
-
-LY_HEADER_NEW = '''%% Do not edit this file; it is auto-generated from input/new
-%% This file is in the public domain.
-'''
-
-DEST = os.path.join ('input', 'lsr')
-NEW_LYS = os.path.join ('input', 'new')
-TEXIDOCS = os.path.join ('input', 'texidocs')
-
-TAGS = []
-# NR 1
-TAGS.extend (['pitches', 'rhythms', 'expressive-marks',
-'repeats', 'simultaneous-notes', 'staff-notation',
-'editorial-annotations', 'text'])
-# NR 2
-TAGS.extend (['vocal-music', 'chords', 'keyboards',
-'percussion', 'fretted-strings', 'unfretted-strings',
-'ancient-notation', 'winds', 'world-music'
-])
-
-# other
-TAGS.extend (['contexts-and-engravers', 'tweaks-and-overrides',
-'paper-and-layout', 'breaks', 'spacing', 'midi', 'titles', 'template'])
-
-def exit_with_usage (n=0):
-       sys.stderr.write (USAGE)
-       sys.exit (n)
-
-try:
-       in_dir = sys.argv[1]
-except:
-       exit_with_usage (2)
-
-if not (os.path.isdir (DEST) and os.path.isdir (NEW_LYS)):
-       exit_with_usage (3)
-
-unsafe = []
-unconverted = []
-notags_files = []
-
-# mark the section that will be printed verbatim by lilypond-book
-end_header_re = re.compile ('(\\header {.+?doctitle = ".+?})\n', re.M | re.S)
-
-def mark_verbatim_section (ly_code):
-       return end_header_re.sub ('\\1 % begin verbatim\n\n', ly_code, 1)
-
-# '% LSR' comments are to be stripped
-lsr_comment_re = re.compile (r'\s*%+\s*LSR.*')
-
-begin_header_re = re.compile (r'\\header\s*{', re.M)
-
-# add tags to ly files from LSR
-def add_tags (ly_code, tags):
-       return begin_header_re.sub ('\\g<0>\n  lsrtags = "' + tags + '"\n', ly_code, 1)
-
-def copy_ly (srcdir, name, tags):
-       global unsafe
-       global unconverted
-       dest = os.path.join (DEST, name)
-       tags = ', '.join (tags)
-       s = open (os.path.join (srcdir, name)).read ()
-
-       texidoc_translations_path = os.path.join (TEXIDOCS,
-                                                 os.path.splitext (name)[0] + '.texidoc')
-       if os.path.exists (texidoc_translations_path):
-               texidoc_translations = open (texidoc_translations_path).read ()
-               # Since we want to insert the translations verbatim using a 
-               # regexp, \\ is understood as ONE escaped backslash. So we have
-               # to escape those backslashes once more...
-               texidoc_translations = texidoc_translations.replace ('\\', '\\\\')
-               s = begin_header_re.sub ('\\g<0>\n' + texidoc_translations, s, 1)
-
-       if in_dir in srcdir:
-               s = LY_HEADER_LSR + add_tags (s, tags)
-       else:
-               s = LY_HEADER_NEW + s
-
-       s = mark_verbatim_section (s)
-       s = lsr_comment_re.sub ('', s)
-       open (dest, 'w').write (s)
-
-       e = os.system ("convert-ly -e '%s'" % dest)
-       if e:
-               unconverted.append (dest)
-       if os.path.exists (dest + '~'):
-               os.remove (dest + '~')
-       # -V seems to make unsafe snippets fail nicer/sooner
-       e = os.system ("lilypond -V -dno-print-pages -dsafe -o /tmp/lsrtest '%s'" % dest)
-       if e:
-               unsafe.append (dest)
-
-def read_source_with_dirs (src):
-       s = {}
-       l = {}
-       for tag in TAGS:
-               srcdir = os.path.join (src, tag)
-               l[tag] = set (map (os.path.basename, glob.glob (os.path.join (srcdir, '*.ly'))))
-               for f in l[tag]:
-                       if f in s:
-                               s[f][1].append (tag)
-                       else:
-                               s[f] = (srcdir, [tag])
-       return s, l
-
-
-tags_re = re.compile ('lsrtags\\s*=\\s*"(.+?)"')
-
-def read_source (src):
-       s = {}
-       l = dict ([(tag, set()) for tag in TAGS])
-       for f in glob.glob (os.path.join (src, '*.ly')):
-               basename = os.path.basename (f)
-               m = tags_re.search (open (f, 'r').read ())
-               if m:
-                       file_tags = [tag.strip() for tag in m.group (1). split(',')]
-                       s[basename] = (src, file_tags)
-                       [l[tag].add (basename) for tag in file_tags if tag in TAGS]
-               else:
-                       notags_files.append (f)
-       return s, l
-
-
-def dump_file_list (file, list):
-       f = open (file, 'w')
-       f.write ('\n'.join (list) + '\n')
-
-## clean out existing lys and generated files
-map (os.remove, glob.glob (os.path.join (DEST, '*.ly')) +
-     glob.glob (os.path.join (DEST, '*.snippet-list')))
-
-# read LSR source where tags are defined by subdirs
-snippets, tag_lists = read_source_with_dirs (in_dir)
-# read input/new where tags are directly
-s, l = read_source (NEW_LYS)
-snippets.update (s)
-for t in TAGS:
-       tag_lists[t].update (l[t])
-
-for (name, (srcdir, tags)) in snippets.items ():
-       copy_ly (srcdir, name, tags)
-
-for (tag, file_set) in tag_lists.items ():
-       dump_file_list (os.path.join (DEST, tag + '.snippet-list'), sorted(file_set))
-
-if unconverted:
-       sys.stderr.write ('These files could not be converted successfully by convert-ly:\n')
-       sys.stderr.write ('\n'.join (unconverted) + '\n\n')
-
-if notags_files:
-       sys.stderr.write ('No tags could be found in these files:\n')
-       sys.stderr.write ('\n'.join (notags_files) + '\n\n')
-
-dump_file_list ('lsr-unsafe.txt', unsafe)
-sys.stderr.write ('''
-
-Unsafe files printed in lsr-unsafe.txt: CHECK MANUALLY!
-  git add input/lsr/*.ly
-  xargs git-diff HEAD < lsr-unsafe.txt
-
-''')
-
diff --git a/buildscripts/manuals_definitions.py b/buildscripts/manuals_definitions.py
deleted file mode 100644 (file)
index e8e6d50..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/python
-
-# This module is imported by check_texi_refs.py
-
-references_dict = {
-    'lilypond': 'ruser',
-    'lilypond-learning': 'rlearning',
-    'lilypond-program': 'rprogram',
-    'lilypond-snippets': 'rlsr',
-    'music-glossary': 'rglos',
-    'lilypond-internals': 'rinternals' }
diff --git a/buildscripts/mass-link.py b/buildscripts/mass-link.py
deleted file mode 100644 (file)
index 17412e5..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!@PYTHON@
-# mass-link.py
-
-# USAGE:  mass-link.py  [--prepend-suffix SUFFIX]   symbolic | hard   SOURCEDIR DESTDIR FILES
-#
-# create hard or symbolic links to SOURCEDIR/FILES in DESTDIR
-#
-# If --prepend-suffix is specified, link to foo.bar will be called fooSUFFIX.bar.
-# Shell wildcards expansion is performed on FILES.
-
-import sys
-import os
-import glob
-import getopt
-
-print "mass-link.py"
-
-optlist, args = getopt.getopt (sys.argv[1:], '', ['prepend-suffix='])
-link_type, source_dir, dest_dir = args[0:3]
-files = args[3:]
-
-source_dir = os.path.normpath (source_dir)
-dest_dir = os.path.normpath (dest_dir)
-
-prepended_suffix = ''
-for x in optlist:
-    if x[0] == '--prepend-suffix':
-        prepended_suffix = x[1]
-
-if prepended_suffix:
-    def insert_suffix (p):
-        l = p.split ('.')
-        if len (l) >= 2:
-            l[-2] += prepended_suffix
-            return '.'.join (l)
-        return p + prepended_suffix
-else:
-    insert_suffix = lambda p: p
-
-if link_type == 'symbolic':
-    link = os.symlink
-elif link_type == 'hard':
-    link = os.link
-else:
-    sys.stderr.write(sys.argv[0] + ': ' + link_type + ": wrong argument, expected 'symbolic' or 'hard'\n")
-    sys.exit (1)
-
-sourcefiles = []
-for pattern in files:
-    sourcefiles += (glob.glob (os.path.join (source_dir, pattern)))
-
-def relative_path (f):
-    if source_dir == '.':
-        return f
-    return f[len (source_dir) + 1:]
-
-destfiles = [os.path.join (dest_dir, insert_suffix (relative_path (f))) for f in sourcefiles]
-
-destdirs = set ([os.path.dirname (dest) for dest in destfiles])
-[os.makedirs (d) for d in destdirs if not os.path.exists (d)]
-
-def force_link (src,dest):
-    if os.path.exists (dest):
-        os.system ('rm -f ' + dest)
-    link (src, dest)
-
-map (force_link, sourcefiles, destfiles)
diff --git a/buildscripts/mf-to-table.py b/buildscripts/mf-to-table.py
deleted file mode 100644 (file)
index 2c1df75..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-#!@PYTHON@
-
-# mf-to-table.py -- convert spacing info in MF logs . 
-#
-# source file of the GNU LilyPond music typesetter
-#
-# (c) 1997--2008 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
-import os
-import sys
-import getopt
-import re
-import time
-
-def read_log_file (fn):
-    str = open (fn).read ()
-    str = re.sub ('\n', '', str)
-    str = re.sub ('[\t ]+', ' ', str)
-
-    deps = []
-    autolines = []
-    def include_func (match, d = deps):
-        d.append (match.group (1))
-        return ''
-
-    def auto_func (match, a = autolines):
-        a.append (match.group (1))
-        return ''
-
-    str = re.sub ('\\(([/a-z.A-Z_0-9-]+\\.mf)', include_func, str)
-    str = re.sub ('@{(.*?)@}', auto_func, str)
-
-    return (autolines, deps)
-
-
-class Char_metric:
-    def __init__ (self):
-        pass
-
-font_family = 'feta'
-
-def parse_logfile (fn):
-    autolines, deps = read_log_file (fn)
-    charmetrics = []
-    
-    global_info = {
-        'filename' : os.path.splitext (os.path.basename (fn))[0]
-        }
-    group = ''
-
-    for l in autolines:
-        tags = l.split ('@:')
-        if tags[0] == 'group':
-            group = tags[1]
-        elif tags[0] == 'puorg':
-            group = ''
-        elif tags[0] == 'char':
-            name = tags[9]
-
-            if group:
-                name = group + '.' + name
-            m = {
-                'description': tags[1],
-                'name': name,
-                'code': int (tags[2]),
-                'breapth': float (tags[3]),
-                'width': float (tags[4]),
-                'depth': float (tags[5]),
-                'height': float (tags[6]),
-                'wx': float (tags[7]),
-                'wy': float (tags[8]),
-            }
-            charmetrics.append (m)
-        elif tags[0] == 'font':
-            global font_family
-            font_family = (tags[3])
-            # To omit 'GNU' (foundry) from font name proper:
-            # name = tags[2:]
-            #urg
-            if 0: # testing
-                tags.append ('Regular')
-
-            encoding = re.sub (' ','-', tags[5])
-            tags = tags[:-1]
-            name = tags[1:]
-            global_info['design_size'] = float (tags[4])
-            global_info['FontName'] = '-'.join (name)
-            global_info['FullName'] = ' '.join (name)
-            global_info['FamilyName'] = '-'.join (name[1:-1])
-            if 1:
-                global_info['Weight'] = tags[4]
-            else: # testing
-                global_info['Weight'] = tags[-1]
-
-            global_info['FontBBox'] = '0 0 1000 1000'
-            global_info['Ascender'] = '0'
-            global_info['Descender'] = '0'
-            global_info['EncodingScheme'] = encoding
-
-        elif tags[0] == 'parameter':
-            global_info[tags[1]] = tags[2];
-            
-    return (global_info, charmetrics, deps)
-
-
-
-def character_lisp_table (global_info, charmetrics):
-
-    def conv_char_metric (charmetric):
-        f = 1.0
-        s = """(%s .
-((bbox . (%f %f %f %f))
-(subfont . "%s")
-(subfont-index . %d)
-(attachment . (%f . %f))))
-""" %(charmetric['name'],
-   -charmetric['breapth'] * f,
-   -charmetric['depth'] * f,
-   charmetric['width'] * f,
-   charmetric['height'] * f,
-   global_info['filename'],
-   charmetric['code'],
-   charmetric['wx'],
-   charmetric['wy'])
-
-        return s
-
-    s = ''
-    for c in charmetrics:
-        s += conv_char_metric (c)
-
-    return s
-
-
-def global_lisp_table (global_info):
-    str = ''
-
-    keys = ['staffsize', 'stafflinethickness', 'staff_space',
-        'linethickness', 'black_notehead_width', 'ledgerlinethickness',
-        'design_size', 
-        'blot_diameter'
-        ]
-    for k in keys:
-        if global_info.has_key (k):
-            str = str + "(%s . %s)\n" % (k,global_info[k])
-
-    return str
-
-    
-def ps_encoding (name, global_info, charmetrics):
-    encs = ['.notdef'] * 256
-    for m in charmetrics:
-        encs[m['code']] = m['name']
-
-
-    s =  ('/%s [\n' % name)
-    for m in range (0, 256):
-        s += ('  /%s %% %d\n' % (encs[m], m))
-    s +=  ('] def\n')
-    return s
-
-def get_deps (deps, targets):
-    s = ''
-    for t in targets:
-        t = re.sub ( '^\\./', '', t)
-        s += ('%s '% t)
-    s += (": ")
-    for d in deps:
-        s += ('%s ' % d)
-    s += ('\n')
-    return s
-
-def help ():
-    sys.stdout.write(r"""Usage: mf-to-table [OPTIONS] LOGFILEs
-
-Generate feta metrics table from preparated feta log.
-
-Options:
- -d, --dep=FILE         print dependency info to FILE
- -h, --help             print this help
- -l, --ly=FILE          name output table
- -o, --outdir=DIR       prefix for dependency info
- -p, --package=DIR      specify package
-
- """)
-    sys.exit (0)
-
-
-(options, files) = \
- getopt.getopt (sys.argv[1:],
-        'a:d:ho:p:t:',
-        ['enc=',  'outdir=', 'dep=', 'lisp=',
-         'global-lisp=',
-         'debug', 'help', 'package='])
-
-global_lisp_nm = ''
-char_lisp_nm = ''
-enc_nm = ''
-depfile_nm = ''
-lyfile_nm = ''
-outdir_prefix = '.'
-
-for opt in options:
-    o = opt[0]
-    a = opt[1]
-    if o == '--dep' or o == '-d':
-        depfile_nm = a
-    elif o == '--outdir' or o == '-o':
-        outdir_prefix = a
-    elif o == '--lisp': 
-        char_lisp_nm = a
-    elif o == '--global-lisp': 
-        global_lisp_nm = a
-    elif o == '--enc':
-        enc_nm = a
-    elif o== '--help' or o == '-h':
-        help()
-    elif o == '--debug':
-        debug_b = 1
-    else:
-        print o
-        raise getopt.error
-
-base = os.path.splitext (lyfile_nm)[0]
-
-for filenm in files:
-    (g, m, deps) = parse_logfile (filenm)
-
-    enc_name = 'FetaEncoding'
-    if re.search ('parmesan', filenm):
-        enc_name = 'ParmesanEncoding'
-    elif re.search ('feta-brace', filenm):
-        enc_name = 'FetaBraceEncoding'
-    elif re.search ('feta-alphabet', filenm):
-        enc_name = 'FetaAlphabetEncoding';
-
-    open (enc_nm, 'w').write (ps_encoding (enc_name, g, m))
-    open (char_lisp_nm, 'w').write (character_lisp_table (g, m))
-    open (global_lisp_nm, 'w').write (global_lisp_table (g))
-    if depfile_nm:
-        open (depfile_nm, 'wb').write (get_deps (deps,
-                                                 [base + '.log', base + '.dvi', base + '.pfa',
-                                                  depfile_nm,
-                                                  base + '.pfb']))
diff --git a/buildscripts/mf2pt1.pl b/buildscripts/mf2pt1.pl
deleted file mode 100644 (file)
index 804fc1f..0000000
+++ /dev/null
@@ -1,1090 +0,0 @@
-#! /usr/bin/perl
-
-##################################################
-# Convert stylized Metafont to PostScript Type 1 #
-# By Scott Pakin <scott+mf@pakin.org>            #
-##################################################
-
-########################################################################
-# mf2pt1                                                               #
-# Copyright (C) 2008 Scott Pakin                                       #
-#                                                                      #
-# This program may be distributed and/or modified under the conditions #
-# of the LaTeX Project Public License, either version 1.3c of this     #
-# license or (at your option) any later version.                       #
-#                                                                      #
-# The latest version of this license is in:                            #
-#                                                                      #
-#    http://www.latex-project.org/lppl.txt                             #
-#                                                                      #
-# and version 1.3c or later is part of all distributions of LaTeX      #
-# version 2006/05/20 or later.                                         #
-########################################################################
-
-our $VERSION = "2.4.4";   # mf2pt1 version number
-require 5.6.1;            # I haven't tested mf2pt1 with older Perl versions
-
-use File::Basename;
-use File::Spec;
-use Getopt::Long;
-use Pod::Usage;
-use Math::Trig;
-use warnings;
-use strict;
-
-# Define some common encoding vectors.
-my @standardencoding =
-    ((map {"_a$_"} (0..31)),
-     qw (space exclam quotedbl numbersign dollar percent ampersand
-         quoteright parenleft parenright asterisk plus comma hyphen
-         period slash zero one two three four five six seven eight
-         nine colon semicolon less equal greater question at A B C D E
-         F G H I J K L M N O P Q R S T U V W X Y Z bracketleft
-         backslash bracketright asciicircum underscore quoteleft a b c
-         d e f g h i j k l m n o p q r s t u v w x y z braceleft bar
-         braceright asciitilde),
-     (map {"_a$_"} (127..160)),
-     qw (exclamdown cent sterling fraction yen florin section currency
-         quotesingle quotedblleft guillemotleft guilsinglleft
-         guilsinglright fi fl _a176 endash dagger daggerdbl
-         periodcentered _a181 paragraph bullet quotesinglbase
-         quotedblbase quotedblright guillemotright ellipsis
-         perthousand _a190 questiondown _a192 grave acute circumflex
-         tilde macron breve dotaccent dieresis _a201 ring cedilla
-         _a204 hungarumlaut ogonek caron emdash),
-     (map {"_a$_"} (209..224)),
-     qw (AE _a226 ordfeminine _a228 _a229 _a230 _a231 Lslash Oslash OE
-         ordmasculine _a236 _a237 _a238 _a239 _a240 ae _a242 _a243
-         _a244 dotlessi _a246 _a247 lslash oslash oe germandbls _a252
-         _a253 _a254 _a255));
-my @isolatin1encoding =
-    ((map {"_a$_"} (0..31)),
-     qw (space exclam quotedbl numbersign dollar percent ampersand
-         quoteright parenleft parenright asterisk plus comma minus
-         period slash zero one two three four five six seven eight
-         nine colon semicolon less equal greater question at A B C D E
-         F G H I J K L M N O P Q R S T U V W X Y Z bracketleft
-         backslash bracketright asciicircum underscore quoteleft a b c
-         d e f g h i j k l m n o p q r s t u v w x y z braceleft bar
-         braceright asciitilde),
-     (map {"_a$_"} (128..143)),
-     qw (dotlessi grave acute circumflex tilde macron breve dotaccent
-         dieresis _a153 ring cedilla _a156 hungarumlaut ogonek
-         caron space exclamdown cent sterling currency yen brokenbar
-         section dieresis copyright ordfeminine guillemotleft
-         logicalnot hyphen registered macron degree plusminus
-         twosuperior threesuperior acute mu paragraph periodcentered
-         cedilla onesuperior ordmasculine guillemotright onequarter
-         onehalf threequarters questiondown Agrave Aacute Acircumflex
-         Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex
-         Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde
-         Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash
-         Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls
-         agrave aacute acircumflex atilde adieresis aring ae ccedilla
-         egrave eacute ecircumflex edieresis igrave iacute icircumflex
-         idieresis eth ntilde ograve oacute ocircumflex otilde
-         odieresis divide oslash ugrave uacute ucircumflex udieresis
-         yacute thorn ydieresis));
-my @ot1encoding =
-    qw (Gamma Delta Theta Lambda Xi Pi Sigma Upsilon Phi
-        Psi Omega ff fi fl ffi ffl dotlessi dotlessj grave acute caron
-        breve macron ring cedilla germandbls ae oe oslash AE OE Oslash
-        suppress exclam quotedblright numbersign dollar percent
-        ampersand quoteright parenleft parenright asterisk plus comma
-        hyphen period slash zero one two three four five six seven
-        eight nine colon semicolon exclamdown equal questiondown
-        question at A B C D E F G H I J K L M N O P Q R S T U V W X Y
-        Z bracketleft quotedblleft bracketright circumflex dotaccent
-        quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z
-        endash emdash hungarumlaut tilde dieresis);
-my @t1encoding =
-    qw (grave acute circumflex tilde dieresis hungarumlaut ring caron
-        breve macron dotaccent cedilla ogonek quotesinglbase
-        guilsinglleft guilsinglright quotedblleft quotedblright
-        quotedblbase guillemotleft guillemotright endash emdash cwm
-        perthousand dotlessi dotlessj ff fi fl ffi ffl space exclam
-        quotedbl numbersign dollar percent ampersand quoteright
-        parenleft parenright asterisk plus comma hyphen period slash
-        zero one two three four five six seven eight nine colon
-        semicolon less equal greater question at A B C D E F G H I J K L
-        M N O P Q R S T U V W X Y Z bracketleft backslash bracketright
-        asciicircum underscore quoteleft a b c d e f g h i j k l m n o p
-        q r s t u v w x y z braceleft bar braceright asciitilde
-        sfthyphen Abreve Aogonek Cacute Ccaron Dcaron Ecaron Eogonek
-        Gbreve Lacute Lcaron Lslash Nacute Ncaron Eng Ohungarumlaut
-        Racute Rcaron Sacute Scaron Scedilla Tcaron Tcedilla
-        Uhungarumlaut Uring Ydieresis Zacute Zcaron Zdotaccent IJ
-        Idotaccent dcroat section abreve aogonek cacute ccaron dcaron
-        ecaron eogonek gbreve lacute lcaron lslash nacute ncaron eng
-        ohungarumlaut racute rcaron sacute scaron scedilla tcaron
-        tcedilla uhungarumlaut uring ydieresis zacute zcaron zdotaccent
-        ij exclamdown questiondown sterling Agrave Aacute Acircumflex
-        Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex
-        Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve
-        Oacute Ocircumflex Otilde Odieresis OE Oslash Ugrave Uacute
-        Ucircumflex Udieresis Yacute Thorn SS agrave aacute acircumflex
-        atilde adieresis aring ae ccedilla egrave eacute ecircumflex
-        edieresis igrave iacute icircumflex idieresis eth ntilde ograve
-        oacute ocircumflex otilde odieresis oe oslash ugrave uacute
-        ucircumflex udieresis yacute thorn germandbls);
-
-# Define font parameters that the user can override.
-my $fontversion;
-my $creationdate;
-my $comment;
-my $familyname;
-my $weight;
-my $fullname;
-my $fixedpitch;
-my $italicangle;
-my $underlinepos;
-my $underlinethick;
-my $fontname;
-my $uniqueID;
-my $designsize;
-my ($mffile, $pt1file, $pfbfile, $ffscript);
-my $encoding;
-my $rounding;
-my $bpppix;
-
-# Define all of our other global variables.
-my $progname = basename $0, ".pl";
-my $mag;
-my @fontbbox;
-my @charbbox;
-my @charwd;
-my @glyphname;
-my @charfiles;
-my $filebase;
-my $filedir;
-my $filenoext;
-my $versionmsg = "mf2pt1 version $VERSION
-
-Copyright (C) 2008 Scott Pakin
-
-This program may be distributed and/or modified under the conditions
-of the LaTeX Project Public License, either version 1.3c of this
-license or (at your option) any later version.
-
-The latest version of this license is in:
-
-   http://www.latex-project.org/lppl.txt
-
-and version 1.3c or later is part of all distributions of LaTeX
-version 2006/05/20 or later.
-";
-
-
-######################################################################
-
-# The routines to compute the fractional approximation of a real number
-# are heavily based on code posted by Ben Tilly
-# <http://www.perlmonks.org/?node_id=26179> on Nov 16th, 2000, to the
-# PerlMonks list.  See <http://www.perlmonks.org/index.pl?node_id=41961>.
-
-
-# Takes numerator/denominator pairs.
-# Returns a PS fraction string representation (with a trailing space).
-sub frac_string (@)
-{
-    my $res = "";
-
-    while (@_) {
-        my $n = shift;
-        my $d = shift;
-        $res .= $n . " ";
-        $res .= $d . " div " if $d > 1;
-    }
-
-    return $res;
-}
-
-
-# Takes a number.
-# Returns a numerator and denominator with the smallest denominator
-# so that the difference of the resulting fraction to the number is
-# smaller or equal to $rounding.
-sub frac_approx ($)
-{
-    my $num = shift;
-    my $f = ret_frac_iter ($num);
-
-    while (1) {
-        my ($n, $m) = $f->();
-        my $approx = $n / $m;
-        my $delta = abs ($num - $approx);
-        return ($n, $m) if ($delta <= $rounding);
-    }
-}
-
-
-# Takes a number, returns the best integer approximation and (in list
-# context) the error.
-sub best_int ($)
-{
-    my $x = shift;
-    my $approx = sprintf '%.0f', $x;
-    if (wantarray) {
-        return ($approx, $x - $approx);
-    }
-    else {
-        return $approx;
-    }
-}
-
-
-# Takes a numerator and denominator, in scalar context returns
-# the best fraction describing them, in list the numerator and
-# denominator.
-sub frac_standard ($$)
-{
-    my $n = best_int(shift);
-    my $m = best_int(shift);
-    my $k = gcd($n, $m);
-    $n /= $k;
-    $m /= $k;
-    if ($m < 0) {
-        $n *= -1;
-        $m *= -1;
-    }
-    if (wantarray) {
-        return ($n, $m);
-    }
-    else {
-        return "$n/$m";
-    }
-}
-
-
-# Euclidean algorithm for calculating a GCD.
-# Takes two integers, returns the greatest common divisor.
-sub gcd ($$)
-{
-    my ($n, $m) = @_;
-    while ($m) {
-        my $k = $n % $m;
-        ($n, $m) = ($m, $k);
-    }
-    return $n;
-}
-
-
-# Takes a list of terms in a continued fraction, and converts it
-# into a fraction.
-sub ints_to_frac (@)
-{
-    my ($n, $m) = (0, 1);     # Start with 0
-    while (@_) {
-        my $k = pop;
-        if ($n) {
-            # Want frac for $k + 1/($n/$m)
-            ($n, $m) = frac_standard($k*$n + $m, $n);
-        }
-        else {
-            # Want $k
-            ($n, $m) = frac_standard($k, 1);
-        }
-    }
-    return frac_standard($n, $m);
-}
-
-
-# Takes a number, returns an anon sub which iterates through a set of
-# fractional approximations that converges very quickly to the number.
-sub ret_frac_iter ($)
-{
-    my $x = shift;
-    my $term_iter = ret_next_term_iter($x);
-    my @ints;
-    return sub {
-        push @ints, $term_iter->();
-        return ints_to_frac(@ints);
-    }
-}
-
-
-# Terms of a continued fraction converging on that number.
-sub ret_next_term_iter ($)
-{
-    my $x = shift;
-    return sub {
-        (my $n, $x) = best_int($x);
-        if (0 != $x) {
-            $x = 1/$x;
-        }
-        return $n;
-    }
-}
-
-######################################################################
-
-# Round a number to the nearest integer.
-sub round ($)
-{
-    return int($_[0] + 0.5*($_[0] <=> 0));
-}
-
-
-# Round a number to a given precision.
-sub prec ($)
-{
-  return round ($_[0] / $rounding) * $rounding;
-}
-
-
-# Set a variable's value to the first defined value in the given list.
-# If the variable was not previously defined and no value in the list
-# is defined, do nothing.
-sub assign_default (\$@)
-{
-    my $varptr = shift;        # Pointer to variable to define
-    return if defined $$varptr && $$varptr ne "UNSPECIFIED";
-    foreach my $val (@_) {
-        next if !defined $val;
-        $$varptr = $val;
-        return;
-    }
-}
-
-
-# Print and execute a shell command.  An environment variable with the
-# same name as the command overrides the command name.  Return 1 on
-# success, 0 on failure.  Optionally abort if the command fails, based
-# on the first argument to execute_command.
-sub execute_command ($@)
-{
-    my $abort_on_failure = shift;
-    my @command = @_;
-    $command[0] = $ENV{uc $command[0]} || $command[0];
-    my $prettyargs = join (" ", map {/[\\ ]/ ? "'$_'" : $_} @command);
-    print "Invoking \"$prettyargs\"...\n";
-    my $result = system @command;
-    die "${progname}: \"$prettyargs\" failed ($!)\n" if $result && $abort_on_failure;
-    return !$result;
-}
-
-
-# Output the font header.
-sub output_header ()
-{
-    # Show the initial boilerplate.
-    print OUTFILE <<"ENDHEADER";
-%!FontType1-1.0: $fontname $fontversion
-%%CreationDate: $creationdate
-% Font converted to Type 1 by mf2pt1, written by Scott Pakin.
-11 dict begin
-/FontInfo 11 dict dup begin
-/version ($fontversion) readonly def
-/Notice ($comment) readonly def
-/FullName ($fullname) readonly def
-/FamilyName ($familyname) readonly def
-/Weight ($weight) readonly def
-/ItalicAngle $italicangle def
-/isFixedPitch $fixedpitch def
-/UnderlinePosition $underlinepos def
-/UnderlineThickness $underlinethick def
-end readonly def
-/FontName /$fontname def
-ENDHEADER
-
-    # If we're not using an encoding that PostScript knows about, then
-    # create an encoding vector.
-    if ($encoding==\@standardencoding) {
-        print OUTFILE "/Encoding StandardEncoding def\n";
-    }
-    else {
-        print OUTFILE "/Encoding 256 array\n";
-        print OUTFILE "0 1 255 {1 index exch /.notdef put} for\n";
-        foreach my $charnum (0 .. $#{$encoding}) {
-            if ($encoding->[$charnum] && $encoding->[$charnum]!~/^_a\d+$/) {
-                print OUTFILE "dup $charnum /$encoding->[$charnum] put\n";
-            }
-        }
-        print OUTFILE "readonly def\n";
-    }
-
-    # Show the final boilerplate.
-    print OUTFILE <<"ENDHEADER";
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID $uniqueID def
-/FontBBox{@fontbbox}readonly def
-currentdict end
-currentfile eexec
-dup /Private 5 dict dup begin
-/RD{string currentfile exch readstring pop}executeonly def
-/ND{noaccess def}executeonly def
-/NP{noaccess put}executeonly def
-ENDHEADER
-}
-
-
-# Use MetaPost to generate one PostScript file per character.  We
-# calculate the font bounding box from these characters and store them
-# in @fontbbox.  If the input parameter is 1, set other font
-# parameters, too.
-sub get_bboxes ($)
-{
-    execute_command 1, ("mpost", "-mem=mf2pt1", "-progname=mpost",
-                        "\\mode:=localfont; mag:=$mag; bpppix $bpppix; input $mffile");
-    opendir (CURDIR, ".") || die "${progname}: $! ($filedir)\n";
-    @charfiles = sort
-                   { ($a=~ /\.(\d+)$/)[0] <=> ($b=~ /\.(\d+)$/)[0] }
-                   grep /^$filebase.*\.\d+$/, readdir(CURDIR);
-    close CURDIR;
-    @fontbbox = (1000000, 1000000, -1000000, -1000000);
-    foreach my $psfile (@charfiles) {
-        # Read the character number from the output file's extension.
-        $psfile =~ /\.(\d+)$/;
-        my $charnum = $1;
-
-        # Process in turn each line of the current PostScript file.
-        my $havebbox = 0;
-        open (PSFILE, "<$psfile") || die "${progname}: $! ($psfile)\n";
-        while (<PSFILE>) {
-            my @tokens = split " ";
-            if ($tokens[0] eq "%%BoundingBox:") {
-                # Store the MetaPost-produced bounding box, just in case
-                # the given font doesn't use beginchar.
-                @tokens = ("%", "MF2PT1:", "glyph_dimensions", @tokens[1..4]);
-                $havebbox--;
-            }
-            next if $#tokens<1 || $tokens[1] ne "MF2PT1:";
-
-            # Process a "special" inserted into the generated PostScript.
-          MF2PT1_CMD:
-            {
-                # glyph_dimensions llx lly urx ury -- specified glyph dimensions
-                $tokens[2] eq "glyph_dimensions" && do {
-                    my @bbox = @tokens[3..6];
-                    $fontbbox[0]=$bbox[0] if $bbox[0]<$fontbbox[0];
-                    $fontbbox[1]=$bbox[1] if $bbox[1]<$fontbbox[1];
-                    $fontbbox[2]=$bbox[2] if $bbox[2]>$fontbbox[2];
-                    $fontbbox[3]=$bbox[3] if $bbox[3]>$fontbbox[3];
-                    $charbbox[$charnum] = \@bbox;
-                    $havebbox++;
-                    last MF2PT1_CMD;
-                };
-
-                # If all we want is the bounding box, exit the loop now.
-                last MF2PT1_CMD if !$_[0];
-
-                # glyph_name name -- glyph name
-                $tokens[2] eq "glyph_name" && do {
-                    $glyphname[$charnum] = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # charwd wd -- character width as in TFM
-                $tokens[2] eq "charwd" && do {
-                    $charwd[$charnum] = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_identifier name -- full font name
-                $tokens[2] eq "font_identifier" && do {
-                    $fullname = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_size number -- font design size (pt, not bp)
-                $tokens[2] eq "font_size" && $tokens[3] && do {
-                    $designsize = $tokens[3] * 72 / 72.27;
-                    last MF2PT1_CMD;
-                };
-
-                # font_slant number -- italic amount
-                $tokens[2] eq "font_slant" && do {
-                    $italicangle = 0 + rad2deg (atan(-$tokens[3]));
-                    last MF2PT1_CMD;
-                };
-
-                # font_coding_scheme string -- font encoding
-                $tokens[2] eq "font_coding_scheme" && do {
-                    $encoding = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_version string -- font version number (xxx.yyy)
-                $tokens[2] eq "font_version" && do {
-                    $fontversion = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_comment string -- font comment notice
-                $tokens[2] eq "font_comment" && do {
-                    $comment = join (" ", @tokens[3..$#tokens]);
-                    last MF2PT1_CMD;
-                };
-
-                # font_family string -- font family name
-                $tokens[2] eq "font_family" && do {
-                    $familyname = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_weight string -- font weight (e.g., "Book" or "Heavy")
-                $tokens[2] eq "font_weight" && do {
-                    $weight = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_fixed_pitch number -- fixed width font (0=false, 1=true)
-                $tokens[2] eq "font_fixed_pitch" && do {
-                    $fixedpitch = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_underline_position number -- vertical underline position
-                $tokens[2] eq "font_underline_position" && do {
-                    # We store $underlinepos in points and later
-                    # scale it by 1000/$designsize.
-                    $underlinepos = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_underline_thickness number -- thickness of underline
-                $tokens[2] eq "font_underline_thickness" && do {
-                    # We store $underlinethick in points and later
-                    # scale it by 1000/$designsize.
-                    $underlinethick = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_name string -- font name
-                $tokens[2] eq "font_name" && do {
-                    $fontname = $tokens[3];
-                    last MF2PT1_CMD;
-                };
-
-                # font_unique_id number (as string) -- globally unique font ID
-                $tokens[2] eq "font_unique_id" && do {
-                    $uniqueID = 0+$tokens[3];
-                    last MF2PT1_CMD;
-                };
-            }
-        }
-        close PSFILE;
-        if (!$havebbox) {
-            warn "${progname}: No beginchar in character $charnum; glyph dimensions are probably incorrect\n";
-        }
-    }
-}
-
-
-# Convert ordinary, MetaPost-produced PostScript files into Type 1
-# font programs.
-sub output_font_programs ()
-{
-    # Iterate over all the characters.  We convert each one, line by
-    # line and token by token.
-    print "Converting PostScript graphics to Type 1 font programs...\n";
-    foreach my $psfile (@charfiles) {
-        # Initialize the font program.
-        $psfile =~ /\.(\d+)$/;
-        my $charnum = $1;
-        my $gname = $glyphname[$charnum] || $encoding->[$charnum];
-        my @fontprog;
-        push @fontprog, ("/$gname {",
-                         frac_string (frac_approx ($charbbox[$charnum]->[0]),
-                                      frac_approx ($charwd[$charnum] * $mag))
-                         . "hsbw");
-        my ($cpx, $cpy) =
-            ($charbbox[$charnum]->[0], 0);  # Current point (PostScript)
-
-        # Iterate over every line in the current file.
-        open (PSFILE, "<$psfile") || die "${progname}: $! ($psfile)\n";
-        while (my $oneline=<PSFILE>) {
-            next if $oneline=~/^\%/;
-            next if $oneline=~/set/;   # Fortunately, "set" never occurs on "good" lines.
-            my @arglist;   # Arguments to current PostScript function
-
-            # Iterate over every token in the current line.
-          TOKENLOOP:
-            foreach my $token (split " ", $oneline) {
-                # Number: Round and push on the argument list.
-                $token =~ /^[-.\d]+$/ && do {
-                    push @arglist, prec ($&);
-                    next TOKENLOOP;
-                };
-
-                # curveto: Convert to vhcurveto, hvcurveto, or rrcurveto.
-                $token eq "curveto" && do {
-                    my ($dx1, $dy1) = ($arglist[0] - $cpx,
-                                       $arglist[1] - $cpy);
-                    my ($dx1n, $dx1d) = frac_approx ($dx1);
-                    my ($dy1n, $dy1d) = frac_approx ($dy1);
-                    $cpx += $dx1n / $dx1d;
-                    $cpy += $dy1n / $dy1d;
-
-                    my ($dx2, $dy2) = ($arglist[2] - $cpx,
-                                       $arglist[3] - $cpy);
-                    my ($dx2n, $dx2d) = frac_approx ($dx2);
-                    my ($dy2n, $dy2d) = frac_approx ($dy2);
-                    $cpx += $dx2n / $dx2d;
-                    $cpy += $dy2n / $dy2d;
-
-                    my ($dx3, $dy3) = ($arglist[4] - $cpx,
-                                       $arglist[5] - $cpy);
-                    my ($dx3n, $dx3d) = frac_approx ($dx3);
-                    my ($dy3n, $dy3d) = frac_approx ($dy3);
-                    $cpx += $dx3n / $dx3d;
-                    $cpy += $dy3n / $dy3d;
-
-                    if (!$dx1n && !$dy3n) {
-                        push @fontprog, frac_string ($dy1n, $dy1d,
-                                                     $dx2n, $dx2d,
-                                                     $dy2n, $dy2d,
-                                                     $dx3n, $dx3d)
-                                        . "vhcurveto";
-                    }
-                    elsif (!$dy1n && !$dx3n) {
-                        push @fontprog, frac_string ($dx1n, $dx1d,
-                                                     $dx2n, $dx2d,
-                                                     $dy2n, $dy2d,
-                                                     $dy3n, $dy3d)
-                                        . "hvcurveto";
-                    }
-                    else {
-                        push @fontprog, frac_string ($dx1n, $dx1d,
-                                                     $dy1n, $dy1d,
-                                                     $dx2n, $dx2d,
-                                                     $dy2n, $dy2d,
-                                                     $dx3n, $dx3d,
-                                                     $dy3n, $dy3d)
-                                        . "rrcurveto";
-                    }
-                    next TOKENLOOP;
-                };
-
-                # lineto: Convert to vlineto, hlineto, or rlineto.
-                $token eq "lineto" && do {
-                    my ($dx, $dy) = ($arglist[0] - $cpx,
-                                     $arglist[1] - $cpy);
-                    my ($dxn, $dxd) = frac_approx ($dx);
-                    my ($dyn, $dyd) = frac_approx ($dy);
-                    $cpx += $dxn / $dxd;
-                    $cpy += $dyn / $dyd;
-
-                    if (!$dxn) {
-                        push @fontprog, frac_string ($dyn, $dyd)
-                                        . "vlineto" if $dyn;
-                    }
-                    elsif (!$dyn) {
-                        push @fontprog, frac_string ($dxn, $dxd)
-                                        . "hlineto";
-                    }
-                    else {
-                        push @fontprog, frac_string ($dxn, $dxd, $dyn, $dyd)
-                                        . "rlineto";
-                    }
-                    next TOKENLOOP;
-                };
-
-                # moveto: Convert to vmoveto, hmoveto, or rmoveto.
-                $token eq "moveto" && do {
-                    my ($dx, $dy) = ($arglist[0] - $cpx,
-                                     $arglist[1] - $cpy);
-                    my ($dxn, $dxd) = frac_approx ($dx);
-                    my ($dyn, $dyd) = frac_approx ($dy);
-                    $cpx += $dxn / $dxd;
-                    $cpy += $dyn / $dyd;
-
-                    if (!$dxn) {
-                        push @fontprog, frac_string ($dyn, $dyd)
-                                        . "vmoveto";
-                    }
-                    elsif (!$dyn) {
-                        push @fontprog, frac_string ($dxn, $dxd)
-                                        . "hmoveto";
-                    }
-                    else {
-                        push @fontprog, frac_string ($dxn, $dxd, $dyn, $dyd)
-                                        . "rmoveto";
-                    }
-                    next TOKENLOOP;
-                };
-
-                # closepath: Output as is.
-                $token eq "closepath" && do {
-                    push @fontprog, $token;
-                    next TOKENLOOP;
-                };
-            }
-        }
-        close PSFILE;
-        push @fontprog, ("endchar",
-                         "} ND");
-        print OUTFILE join ("\n\t", @fontprog), "\n";
-    }
-}
-
-
-# Output the final set of code for the Type 1 font.
-sub output_trailer ()
-{
-    print OUTFILE <<"ENDTRAILER";
-/.notdef {
-        0 @{[$fontbbox[2]-$fontbbox[0]]} hsbw
-        endchar
-        } ND
-end
-end
-readonly put
-noaccess put
-dup/FontName get exch definefont pop
-mark currentfile closefile
-cleartomark
-ENDTRAILER
-}
-
-######################################################################
-
-# Parse the command line.  Asterisks in the following represents
-# commands also defined by Plain Metafont.
-my %opthash = ();
-GetOptions (\%opthash,
-            "fontversion=s",       # font_version
-            "comment=s",           # font_comment
-            "family=s",            # font_family
-            "weight=s",            # font_weight
-            "fullname=s",          # font_identifier (*)
-            "fixedpitch!",         # font_fixed_pitch
-            "italicangle=f",       # font_slant (*)
-            "underpos=f",          # font_underline_position
-            "underthick=f",        # font_underline_thickness
-            "name=s",              # font_name
-            "uniqueid=i",          # font_unique_id
-            "designsize=f",        # font_size (*)
-            "encoding=s",          # font_coding_scheme (*)
-            "rounding=f",
-            "bpppix=f",
-            "ffscript=s",
-            "h|help",
-            "V|version") || pod2usage(2);
-if (defined $opthash{"h"}) {
-    pod2usage(-verbose => 1,
-              -output  => \*STDOUT,    # Bug workaround for Pod::Usage
-              -exitval => "NOEXIT");
-    print "Please e-mail bug reports to scott+mf\@pakin.org.\n";
-    exit 1;
-}
-do {print $versionmsg; exit 1} if defined $opthash{"V"};
-pod2usage(2) if $#ARGV != 0;
-
-# Extract the filename from the command line.
-$mffile = $ARGV[0];
-my @fileparts = fileparse $mffile, ".mf";
-$filebase = $fileparts[0];
-$filedir = $fileparts[1];
-$filenoext = File::Spec->catfile ($filedir, $filebase);
-$pt1file = $filebase . ".pt1";
-$pfbfile = $filebase . ".pfb";
-
-assign_default $bpppix, $opthash{bpppix}, 0.02;
-
-# Make our first pass through the input, to set values for various options.
-$mag = 100;           # Get a more precise bounding box.
-get_bboxes(1);        # This might set $designsize.
-
-# Sanity-check the specified precision.
-assign_default $rounding, $opthash{rounding}, 1;
-if ($rounding<=0.0 || $rounding>1.0) {
-    die sprintf "%s: Invalid rounding amount \"%g\"; value must be a positive number no greater than 1.0\n", $progname, $rounding;
-}
-
-# Ensure that every user-definable parameter is assigned a value.
-assign_default $fontversion, $opthash{fontversion}, "001.000";
-assign_default $creationdate, scalar localtime;
-assign_default $comment, $opthash{comment}, "Font converted to Type 1 by mf2pt1, written by Scott Pakin.";
-assign_default $weight, $opthash{weight}, "Medium";
-assign_default $fixedpitch, $opthash{fixedpitch}, 0;
-assign_default $uniqueID, $opthash{uniqueid}, int(rand(1000000)) + 4000000;
-assign_default $designsize, $opthash{designsize};
-die "${progname}: a design size must be specified in $mffile or on the command line\n" if !defined $designsize;
-die "${progname}: the design size must be a positive number\n" if $designsize<=0.0;
-assign_default $underlinepos, $opthash{underpos}, -1;
-$underlinepos = round(1000*$underlinepos/$designsize);
-assign_default $underlinethick, $opthash{underthick}, 0.5;
-$underlinethick = round(1000*$underlinethick/$designsize);
-assign_default $fullname, $opthash{fullname}, $filebase;
-assign_default $familyname, $opthash{family}, $fullname;
-assign_default $italicangle, $opthash{italicangle}, 0;
-assign_default $fontname, $opthash{name}, "$familyname-$weight";
-$fontname =~ s/\s//g;
-assign_default $encoding, $opthash{encoding}, "standard";
-my $encoding_name = $encoding;
-ENCODING:
-{
-    if (-e $encoding) {
-        # Filenames take precedence over built-in encodings.
-        my @enc_array;
-        open (ENCFILE, "<$encoding") || die "${progname}: $! ($encoding)\n";
-        while (my $oneline = <ENCFILE>) {
-            $oneline =~ s/\%.*$//;
-            foreach my $word (split " ", $oneline) {
-                push @enc_array, substr($word, 1) if substr($word, 0, 1) eq "/";
-            }
-        }
-        close ENCFILE;
-        $encoding_name = substr (shift @enc_array, 1);
-        $encoding = \@enc_array;
-        last ENCODING;
-    }
-    $encoding=\@standardencoding,  last ENCODING  if $encoding eq "standard";
-    $encoding=\@isolatin1encoding, last ENCODING  if $encoding eq "isolatin1";
-    $encoding=\@ot1encoding,       last ENCODING  if $encoding eq "ot1";
-    $encoding=\@t1encoding,        last ENCODING  if $encoding eq "t1";
-    $encoding=\@glyphname,         last ENCODING  if $encoding eq "asis";
-    warn "${progname}: Unknown encoding \"$encoding\"; using standard Adobe encoding\n";
-    $encoding=\@standardencoding;     # Default to standard encoding
-}
-assign_default $fixedpitch, $opthash{fixedpitch}, 0;
-$fixedpitch = $fixedpitch ? "true" : "false";
-assign_default $ffscript, $opthash{ffscript};
-
-# Output the final values of all of our parameters.
-print "\n";
-print <<"PARAMVALUES";
-mf2pt1 is using the following font parameters:
-    font_version:              $fontversion
-    font_comment:              $comment
-    font_family:               $familyname
-    font_weight:               $weight
-    font_identifier:           $fullname
-    font_fixed_pitch:          $fixedpitch
-    font_slant:                $italicangle
-    font_underline_position:   $underlinepos
-    font_underline_thickness:  $underlinethick
-    font_name:                 $fontname
-    font_unique_id:            $uniqueID
-    font_size:                 $designsize (bp)
-    font_coding_scheme:        $encoding_name
-PARAMVALUES
-    ;
-print "\n";
-
-# Scale by a factor of 1000/design size.
-$mag = 1000.0 / $designsize;
-get_bboxes(0);
-print "\n";
-
-# Output the font in disassembled format.
-open (OUTFILE, ">$pt1file") || die "${progname}: $! ($pt1file)\n";
-output_header();
-printf OUTFILE "2 index /CharStrings %d dict dup begin\n",
-               1+scalar(grep {defined($_)} @charbbox);
-output_font_programs();
-output_trailer();
-close OUTFILE;
-unlink @charfiles;
-print "\n";
-
-# Convert from the disassembled font format to Type 1 binary format.
-if (!execute_command 0, ("t1asm", $pt1file, $pfbfile)) {
-    die "${progname}: You'll need either to install t1utils and rerun $progname or find another way to convert $pt1file to $pfbfile\n";
-    exit 1;
-}
-print "\n";
-unlink $pt1file;
-
-# Use FontForge to autohint the result.
-my $user_script = 0;   # 1=script file was provided by the user; 0=created here
-if (defined $ffscript) {
-    # The user provided his own script.
-    $user_script = 1;
-}
-else {
-    # Create a FontForge script file.
-    $ffscript = $filebase . ".pe";
-    open (FFSCRIPT, ">$ffscript") || die "${progname}: $! ($ffscript)\n";
-    print FFSCRIPT <<'AUTOHINT';
-Open($1);
-SelectAll();
-RemoveOverlap();
-AddExtrema();
-Simplify(0, 2);
-CorrectDirection();
-Simplify(0, 2);
-RoundToInt();
-AutoHint();
-Generate($1);
-Quit(0);
-AUTOHINT
-    ;
-    close FFSCRIPT;
-}
-if (!execute_command 0, ("fontforge", "-script", $ffscript, $pfbfile)) {
-    warn "${progname}: You'll need to install FontForge if you want $pfbfile autohinted (not required, but strongly recommended)\n";
-}
-unlink $ffscript if !$user_script;
-print "\n";
-
-# Finish up.
-print "*** Successfully generated $pfbfile! ***\n";
-exit 0;
-
-######################################################################
-
-__END__
-
-=head1 NAME
-
-mf2pt1 - produce a PostScript Type 1 font program from a Metafont source
-
-
-=head1 SYNOPSIS
-
-mf2pt1
-[B<--help>]
-[B<--version>]
-[B<--comment>=I<string>]
-[B<--designsize>=I<number>]
-[B<--encoding>=I<encoding>]
-[B<--family>=I<name>]
-[B<-->[B<no>]B<fixedpitch>]
-[B<--fontversion>=I<MMM.mmm>]
-[B<--fullname>=I<name>]
-[B<--italicangle>=I<number>]
-[B<--name>=I<name>]
-[B<--underpos>=I<number>]
-[B<--underthick>=I<number>]
-[B<--uniqueid>=I<number>]
-[B<--weight>=I<weight>]
-[B<--rounding>=I<number>]
-[B<--bpppix>=I<number>]
-[B<--ffscript>=I<file.pe>]
-I<infile>.mf
-
-
-=head1 WARNING
-
-The B<mf2pt1> Info file is the main source of documentation for
-B<mf2pt1>.  This man page is merely a brief summary.
-
-
-=head1 DESCRIPTION
-
-B<mf2pt1> facilitates producing PostScript Type 1 fonts from a
-Metafont source file.  It is I<not>, as the name may imply, an
-automatic converter of arbitrary Metafont fonts to Type 1 format.
-B<mf2pt1> imposes a number of restrictions on the Metafont input.  If
-these restrictions are met, B<mf2pt1> will produce valid Type 1
-output.  (Actually, it produces "disassembled" Type 1; the B<t1asm>
-program from the B<t1utils> suite will convert this to a true Type 1
-font.)
-
-=head2 Usage
-
-    mf2pt1 myfont.mf
-
-=head1 OPTIONS
-
-Font parameters are best specified within a Metafont program.  If
-necessary, though, command-line options can override any of these
-parameters.  The B<mf2pt1> Info page, the primary source of B<mf2pt1>
-documentation, describes the following in greater detail.
-
-=over 4
-
-=item B<--help>
-
-Provide help on B<mf2pt1>'s command-line options.
-
-=item B<--version>
-
-Output the B<mf2pt1> version number, copyright, and license.
-
-=item B<--comment>=I<string>
-
-Include a font comment, usually a copyright notice.
-
-=item B<--designsize>=I<number>
-
-Specify the font design size in points.
-
-=item B<--encoding>=I<encoding>
-
-Designate the font encoding, either the name of a---typically
-F<.enc>---file which contains a PostScript font-encoding vector or one
-of C<standard> (the default), C<ot1>, C<t1>, or C<isolatin1>.
-
-=item B<--family>=I<name>
-
-Specify the font family.
-
-=item B<--fixedpitch>, B<--nofixedpitch>
-
-Assert that the font uses either monospaced (B<--fixedpitch>) or
-proportional (B<--nofixedpitch>) character widths.
-
-=item B<--fontversion>=I<MMM.mmm>
-
-Specify the font's major and minor version number.
-
-=item B<--fullname>=I<name>
-
-Designate the full font name (family plus modifiers).
-
-=item B<--italicangle>=I<number>
-
-Designate the italic angle in degrees counterclockwise from vertical.
-
-=item B<--name>=I<name>
-
-Provide the font name.
-
-=item B<--underpos>=I<number>
-
-Specify the vertical position of the underline in thousandths of the
-font height.
-
-=item B<--underthick>=I<number>
-
-Specify the thickness of the underline in thousandths of the font
-height.
-
-=item B<--uniqueid>=I<number>
-
-Specify a globally unique font identifier.
-
-=item B<--weight>=I<weight>
-
-Provide a description of the font weight (e.g., ``Heavy'').
-
-=item B<--rounding>=I<number>
-
-Specify the fraction of a font unit (0.0 < I<number> <= 1.0) to which
-to round coordinate values [default: 1.0].
-
-=item B<--bpppix>=I<number>
-
-Redefine the number of big points per pixel from 0.02 to I<number>.
-
-=item B<--ffscript>=I<file.pe>
-
-Name a script to pass to FontForge.
-
-=back
-
-
-=head1 FILES
-
-F<mf2pt1.mem> (which is generated from F<mf2pt1.mp> and F<mfplain.mp>)
-
-
-=head1 NOTES
-
-As stated in L</"WARNING">, the complete source of documentation for
-B<mf2pt1> is the Info page, not this man page.
-
-
-=head1 SEE ALSO
-
-mf(1), mpost(1), t1asm(1), fontforge(1)
-
-
-=head1 AUTHOR
-
-Scott Pakin, I<scott+mf@pakin.org>
diff --git a/buildscripts/mirrortree.py b/buildscripts/mirrortree.py
deleted file mode 100644 (file)
index 0aa0bc8..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!@PYTHON@
-
-import re
-import os
-
-def new_link_path (link, dir, r):
-    l = link.split ('/')
-    d = dir.split ('/')
-    i = 0
-    while i < len(d) and i < len(l) and l[i] == '..':
-        if r.match (d[i]):
-            del l[i]
-        else:
-            i += 1
-    return '/'.join ([x for x in l if not r.match (x)])
-
-def walk_tree (tree_roots = [],
-               process_dirs = '.*',
-               exclude_dirs = '',
-               find_files = '.*',
-               exclude_files = ''):
-    """Walk directory trees and.returns (dirs, symlinks, files, extra_files) tuple.
-
-    Arguments:
-     tree_roots=DIRLIST      use DIRLIST as tree roots list
-     process_dir=PATTERN      only process files in directories named PATTERN
-     exclude_dir=PATTERN      don't recurse into directories named PATTERN
-     find_files=PATTERN    filters files which are hardlinked
-     exclude_files=PATTERN    exclude files named PATTERN
-    """
-    find_files_re = re.compile (find_files)
-    exclude_dirs_re = re.compile (exclude_dirs)
-    exclude_files_re = re.compile (exclude_files)
-    process_dirs_re = re.compile (process_dirs)
-
-    dirs_paths = []
-    symlinks_paths = []
-    files_paths = []
-
-    for d in tree_roots:
-        for current_dir, dirs, files in os.walk(d):
-            i = 0
-            while i < len(dirs):
-                if exclude_dirs_re.search (os.path.join (current_dir, dirs[i])):
-                    del dirs[i]
-                else:
-                    p = os.path.join (current_dir, dirs[i])
-                    if os.path.islink (p):
-                        symlinks_paths.append (p)
-                    i += 1
-            if not process_dirs_re.search (current_dir):
-                continue
-            dirs_paths.append (current_dir)
-            for f in files:
-                if exclude_files_re.match (f):
-                    continue
-                p = os.path.join (current_dir, f)
-                if os.path.islink (p):
-                    symlinks_paths.append (p)
-                elif find_files_re.match (f):
-                    files_paths.append (p)
-    return (dirs_paths, symlinks_paths, files_paths)
diff --git a/buildscripts/musicxml_generate_intervals.py b/buildscripts/musicxml_generate_intervals.py
deleted file mode 100644 (file)
index 3c00715..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-
-notes = "CDEFGAB"
-alterations = [-1, 0, 1]
-
-def print_note (octave, note, alteration):
-    print "      <note>\n        <pitch>\n          <step>%s</step>" % notes[note]
-    if alteration <> 0:
-        print "          <alter>%s</alter>" % alteration
-    print "          <octave>%s</octave>\n        </pitch>\n        <duration>1</duration>\n        <voice>1</voice>\n        <type>quarter</type>\n      </note>" % octave
-
-
-print """<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwise//EN"
-                                "http://www.musicxml.org/dtds/partwise.dtd">
-<score-partwise>
-  <movement-title>Various piches and interval sizes</movement-title>
-  <part-list>
-    <score-part id="P1">
-      <part-name>MusicXML Part</part-name>
-    </score-part>
-  </part-list>
-  <!--=========================================================-->
-  <part id="P1">
-    <measure number="1">
-      <attributes>
-        <divisions>1</divisions>
-        <key>
-          <fifths>0</fifths>
-          <mode>major</mode>
-        </key>
-        <time symbol="common">
-          <beats>2</beats>
-          <beat-type>4</beat-type>
-        </time>
-        <clef>
-          <sign>G</sign>
-          <line>2</line>
-        </clef>
-      </attributes>
-"""
-
-start_octave = 5
-
-for octave in (start_octave, start_octave+1):
-    for note in (0,1,2,3,4,5,6):
-        for alteration in alterations:
-            if octave == start_octave and note == 0 and alteration == -1:
-                continue
-            print_note (octave, note, alteration)
-#             if octave == start_octave and note == 0 and alteration == 0:
-#                 continue
-            print_note (start_octave-(octave-start_octave)-(1-(7-note)/7), (7-note)%7, -alteration)
-
-print """    </measure>
-  </part>
-</score-partwise>
-"""
diff --git a/buildscripts/musicxml_generate_keys.py b/buildscripts/musicxml_generate_keys.py
deleted file mode 100644 (file)
index 7a16ac9..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-
-notes = "CDEFGAB"
-alterations = [-1, 0, 1]
-
-def print_measure (nr, fifth, mode, atts1 = "", atts = "", final = ""):
-    print """    <measure number="%s">
-      <attributes>
-%s        <key>
-          <fifths>%s</fifths>
-          <mode>%s</mode>
-        </key>
-%s      </attributes>
-      <note>
-        <pitch>
-          <step>C</step>
-          <octave>4</octave>
-        </pitch>
-        <duration>2</duration>
-        <voice>1</voice>
-        <type>half</type>
-      </note>
-%s    </measure>""" % (nr, atts1, fifth, mode, atts, final)
-
-first_div = """        <divisions>1</divisions>
-"""
-first_atts = """        <time symbol="common">
-          <beats>2</beats>
-          <beat-type>4</beat-type>
-        </time>
-        <clef>
-          <sign>G</sign>
-          <line>2</line>
-        </clef>
-"""
-
-final_barline = """      <barline location="right">
-        <bar-style>light-heavy</bar-style>
-      </barline>
-"""
-
-print """<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwise//EN"
-                                "http://www.musicxml.org/dtds/partwise.dtd">
-<score-partwise>
-  <movement-title>Different Key signatures</movement-title>
-  <identification>
-    <miscellaneous>
-      <miscellaneous-field name="description">Various key signature: from 11
-            flats to 11 sharps (each one first one measure in major, then one
-            measure in minor)</miscellaneous-field>
-    </miscellaneous>
-  </identification>
-  <part-list>
-    <score-part id="P1">
-      <part-name>MusicXML Part</part-name>
-    </score-part>
-  </part-list>
-  <!--=========================================================-->
-  <part id="P1">"""
-
-max_range = 11
-measure = 0
-for fifth in range(-max_range, max_range+1):
-    measure += 1
-    if fifth == -max_range:
-        print_measure (measure, fifth, "major", first_div, first_atts)
-    else:
-        print_measure (measure, fifth, "major")
-    measure += 1
-    if fifth == max_range:
-        print_measure (measure, fifth, "minor", "", "", final_barline)
-    else:
-        print_measure (measure, fifth, "minor")
-    
-
-print """  </part>
-</score-partwise>"""
diff --git a/buildscripts/musicxml_generate_timesignatures.py b/buildscripts/musicxml_generate_timesignatures.py
deleted file mode 100644 (file)
index c4cc78a..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env python
-
-notes = "CDEFGAB"
-alterations = [-1, 0, 1]
-
-dot_xml = """        <dot/>
-"""
-tie_xml = """        <tie type="%s"/>
-"""
-tie_notation_xml = """        <notations><tied type="%s"/></notations>
-"""
-
-
-def generate_note (duration, end_tie = False):
-    if duration < 2:
-      (notetype, dur) = ("8th", 1)
-    elif duration < 4:
-      (notetype, dur) = ("quarter", 2)
-    elif duration < 8:
-      (notetype, dur) = ("half", 4)
-    else:
-      (notetype, dur) = ("whole", 8)
-    dur_processed = dur
-    dot = ""
-    if (duration - dur_processed >= dur/2):
-      dot = dot_xml
-      dur_processed += dur/2
-      if (duration - dur_processed >= max(dur/4, 1)):
-        dot += dot_xml
-        dur_processed += dur/4
-    tie = ""
-    tie_notation = ""
-    if end_tie:
-        tie += tie_xml % "stop"
-        tie_notation += tie_notation_xml % "stop"
-    second_note = None
-    if duration - dur_processed > 0:
-        second_note = generate_note (duration-dur_processed, True)
-        tie += tie_xml % "start"
-        tie_notation += tie_notation_xml % "start"
-    note = """      <note>
-        <pitch>
-          <step>C</step>
-          <octave>5</octave>
-        </pitch>
-        <duration>%s</duration>
-%s        <voice>1</voice>
-        <type>%s</type>
-%s%s      </note>""" % (dur_processed, tie, notetype, dot, tie_notation)
-    if second_note:
-        return "%s\n%s" % (note, second_note)
-    else:
-        return note
-
-def print_measure (nr, beats, type, params = "", attr = "", attr2 = "", barline = ""):
-    duration = 8*beats/type
-    note = generate_note (duration)
-
-    print """    <measure number="%s">
-      <attributes>
-%s        <time%s>
-          <beats>%s</beats>
-          <beat-type>%s</beat-type>
-        </time>
-%s      </attributes>
-%s
-%s    </measure>""" % (nr, attr, params, beats, type, attr2, note, barline)
-
-first_key = """        <divisions>2</divisions>
-        <key>
-          <fifths>0</fifths>
-          <mode>major</mode>
-        </key>
-"""
-first_clef = """        <clef>
-          <sign>G</sign>
-          <line>2</line>
-        </clef>
-"""
-
-final_barline = """      <barline location="right">
-        <bar-style>light-heavy</bar-style>
-      </barline>
-"""
-
-print """<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwise//EN"
-                                "http://www.musicxml.org/dtds/partwise.dtd">
-<score-partwise>
-  <identification>
-    <miscellaneous>
-      <miscellaneous-field name="description">Various time signatures: 2/2 
-            (alla breve), 4/4 (C), 2/2, 3/2, 2/4, 3/4, 4/4, 5/4, 3/8, 6/8, 
-            12/8</miscellaneous-field>
-    </miscellaneous>
-  </identification>
-  <part-list>
-    <score-part id="P1">
-      <part-name>MusicXML Part</part-name>
-    </score-part>
-  </part-list>
-  <!--=========================================================-->
-  <part id="P1">"""
-
-measure = 1
-
-print_measure (measure, 2, 2, " symbol=\"common\"", first_key, first_clef)
-measure += 1
-
-print_measure (measure, 4, 4, " symbol=\"common\"")
-measure += 1
-
-print_measure (measure, 2, 2)
-measure += 1
-
-print_measure (measure, 3, 2)
-measure += 1
-
-print_measure (measure, 2, 4)
-measure += 1
-
-print_measure (measure, 3, 4)
-measure += 1
-
-print_measure (measure, 4, 4)
-measure += 1
-
-print_measure (measure, 5, 4)
-measure += 1
-
-print_measure (measure, 3, 8)
-measure += 1
-
-print_measure (measure, 6, 8)
-measure += 1
-
-print_measure (measure, 12, 8, "", "", "", final_barline)
-measure += 1
-
-print """  </part>
-</score-partwise>"""
diff --git a/buildscripts/mutopia-index.py b/buildscripts/mutopia-index.py
deleted file mode 100644 (file)
index 50e4ebb..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/usr/bin/env python
-# mutopia-index.py
-
-import fnmatch
-import getopt
-import os
-import re
-import stat
-import sys
-
-def find (pat, dir):
-    f = os.popen ('find %s -name "%s"'% (dir, pat))
-    lst = []
-    for a in f.readlines():
-        a = a[:-1]
-        lst.append (a)
-    return lst
-
-
-junk_prefix = 'out-www/'
-
-headertext= r"""
-
-<h1>LilyPond samples</h1>
-
-
-<p>You are looking at a page with some LilyPond samples.  These files
-are also included in the distribution. The output is completely
-generated from the source file, without any further touch up.
-
-<p>
-
-The pictures are 90 dpi anti-aliased snapshots of the printed output.
-For a good impression of the quality print out the PDF file.
-"""
-
-headertext_nopics= r"""
-<p>No examples were found in this directory. 
-"""
-
-#
-# FIXME breaks on multiple strings.
-#
-def read_lilypond_header (fn):
-    s = open (fn).read ()
-    s = re.sub ('%.*$', '', s)
-    s = re.sub ('\n', ' ', s)                
-
-    dict = {}
-    m = re.search (r"""\\header\s*{([^}]*)}""", s)
-
-    if m:
-            s = m.group (1)
-    else:
-            return dict
-
-    while s:
-        m = re.search (r'''\s*(\S+)\s*=\s*"([^"]+)"''', s)
-        if m == None:
-            s = ''
-        else:
-            s = s[m.end (0):]
-            left  = m.group         (1)
-            right = m.group (2)
-
-            left = re.sub ('"', '', left)
-            right = re.sub ('"', '', right)
-            dict[left] = right
-
-    return dict
-
-def help ():
-    sys.stdout.write (r'''Usage: mutopia-index [OPTIONS] INFILE OUTFILE
-Generate index for mutopia.
-
-Options:
- -h, --help                 print this help
- -o, --output=FILE          write output to file
- -s, --subdirs=DIR             add subdir
-   --suffix=SUF             specify suffix
-   
-''')
-    sys.exit (0)
-
-# ugh.
-def gen_list (inputs, file_name):
-    sys.stderr.write ("generating HTML list %s" % file_name)
-    sys.stderr.write ('\n')
-    if file_name:
-        list = open (file_name, 'w')
-    else:
-        list = sys.stdout
-    list.write ('''<html><head><title>Rendered Examples</title>
-<style type="text/css">
-hr { border:0; height:1; color: #000000; background-color: #000000; }\n
-</style>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-</head>''')
-
-    list.write ('<body bgcolor=white>\n')
-    
-    if inputs:
-        list.write (headertext)
-    else:
-        list.write (headertext_nopics)
-
-    for ex in inputs:
-        print ex
-        
-        (base, ext) = os.path.splitext (ex)
-        (base, ext2) = os.path.splitext (base)                
-        ext = ext2 + ext
-        
-        header = read_lilypond_header (ex)
-        head = header.get ('title', os.path.basename (base))
-        composer = header.get ('composer', '')
-        desc = header.get ('description', '')
-        list.write ('<hr>\n')
-        list.write ('<h1>%s</h1>\n' % head);
-        if composer:
-            list.write ('<h2>%s</h2>\n' % composer)
-        if desc:
-            list.write ('%s<p>' % desc)
-        list.write ('<ul>\n')
-
-        def list_item (file_name, desc, type, lst = list):
-            if os.path.isfile (file_name):
-                lst.write ('<li><a href="%s">%s</a>'
-                     % (re.sub (junk_prefix, '', file_name), desc))
-
-                # FIXME: include warning if it uses \include
-                # files.
-                
-                size = os.stat (file_name)[stat.ST_SIZE]
-                kB = (size + 512) / 1024
-                if kB:
-                    lst.write (' (%s %d kB)' % (type, kB))
-                else:
-                    lst.write (' (%s %d characters)'
-                         % (type, size))
-                pictures = ['jpeg', 'png', 'xpm']
-                lst.write ('\n')
-            else:
-                print "cannot find" , `file_name`
-
-        list_item (base + ext, 'The input', 'ASCII')
-
-        pages_found = 0
-        for page in range (1, 100):
-            f = base + '-page%d.png' % page
-            
-            if not os.path.isfile (f):
-                break
-            pages_found += 1
-            list_item (f, 'See a picture of page %d' % page, 'png')
-
-        if pages_found == 0 and os.path.exists (base + '.png'):
-            list_item (base + ".png",
-                 'See a picture', 'png')
-
-            
-        list_item (base + '.pdf', 'Print', 'PDF')
-        list_item (base + '.midi', 'Listen', 'MIDI')
-        list.write ('</ul>\n');
-
-    list.write ('</body></html>\n');
-    list.close ()
-
-(options, files) = getopt.getopt (sys.argv[1:],
- 'ho:', ['help', 'output='])
-outfile = 'examples.html'
-
-subdirs = []
-for (o, a) in options:
-    if o == '--help' or o == '-h':
-        help ()
-    elif o == '--output' or o == '-o':
-        outfile = a
-
-dirs  = []
-for f in files:
-    dirs += find ('out-www', f)
-
-if not dirs:
-    dirs = ['.']
-
-allfiles = []
-
-for d in dirs:
-    allfiles += find ('*.ly', d)
-
-allfiles = [f for f in allfiles
-            if not f.endswith ('snippet-map.ly')
-            and not re.search ('lily-[0-9a-f]+', f)
-            and 'musicxml' not in f]
-
-gen_list (allfiles, outfile)
diff --git a/buildscripts/output-distance.py b/buildscripts/output-distance.py
deleted file mode 100644 (file)
index 8586d24..0000000
+++ /dev/null
@@ -1,1262 +0,0 @@
-#!@TARGET_PYTHON@
-import sys
-import optparse
-import os
-import math
-
-## so we can call directly as buildscripts/output-distance.py
-me_path = os.path.abspath (os.path.split (sys.argv[0])[0])
-sys.path.insert (0, me_path + '/../python/')
-sys.path.insert (0, me_path + '/../python/out/')
-
-
-X_AXIS = 0
-Y_AXIS = 1
-INFTY = 1e6
-
-OUTPUT_EXPRESSION_PENALTY = 1
-ORPHAN_GROB_PENALTY = 1
-options = None
-
-################################################################
-# system interface.
-temp_dir = None
-class TempDirectory:
-    def __init__ (self):
-        import tempfile
-        self.dir = tempfile.mkdtemp ()
-        print 'dir is', self.dir
-    def __del__ (self):
-        print 'rm -rf %s' % self.dir 
-        os.system ('rm -rf %s' % self.dir)
-    def __call__ (self):
-        return self.dir
-
-
-def get_temp_dir  ():
-    global temp_dir
-    if not temp_dir:
-        temp_dir = TempDirectory ()
-    return temp_dir ()
-
-def read_pipe (c):
-    print 'pipe' , c
-    return os.popen (c).read ()
-
-def system (c):
-    print 'system' , c
-    s = os.system (c)
-    if s :
-        raise Exception ("failed")
-    return
-
-def shorten_string (s):
-    threshold = 15 
-    if len (s) > 2*threshold:
-        s = s[:threshold] + '..' + s[-threshold:]
-    return s
-
-def max_distance (x1, x2):
-    dist = 0.0
-
-    for (p,q) in zip (x1, x2):
-        dist = max (abs (p-q), dist)
-        
-    return dist
-
-
-def compare_png_images (old, new, dest_dir):
-    def png_dims (f):
-        m = re.search ('([0-9]+) x ([0-9]+)', read_pipe ('file %s' % f))
-        
-        return tuple (map (int, m.groups ()))
-
-    dest = os.path.join (dest_dir, new.replace ('.png', '.compare.jpeg'))
-    try:
-        dims1 = png_dims (old)
-        dims2 = png_dims (new)
-    except AttributeError:
-        ## hmmm. what to do?
-        system ('touch %(dest)s' % locals ())
-        return
-    
-    dims = (min (dims1[0], dims2[0]),
-            min (dims1[1], dims2[1]))
-
-    dir = get_temp_dir ()
-    system ('convert -depth 8 -crop %dx%d+0+0 %s %s/crop1.png' % (dims + (old, dir)))
-    system ('convert -depth 8 -crop %dx%d+0+0 %s %s/crop2.png' % (dims + (new, dir)))
-
-    system ('compare -depth 8 %(dir)s/crop1.png %(dir)s/crop2.png %(dir)s/diff.png' % locals ())
-
-    system ("convert  -depth 8 %(dir)s/diff.png -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity'    %(dir)s/matte.png" % locals ())
-
-    system ("composite -compose atop -quality 65 %(dir)s/matte.png %(new)s %(dest)s" % locals ())
-
-
-################################################################
-# interval/bbox arithmetic.
-
-empty_interval = (INFTY, -INFTY)
-empty_bbox = (empty_interval, empty_interval)
-
-def interval_is_empty (i):
-    return i[0] > i[1]
-
-def interval_length (i):
-    return max (i[1]-i[0], 0) 
-    
-def interval_union (i1, i2):
-    return (min (i1[0], i2[0]),
-            max (i1[1], i2[1]))
-
-def interval_intersect (i1, i2):
-    return (max (i1[0], i2[0]),
-            min (i1[1], i2[1]))
-
-def bbox_is_empty (b):
-    return (interval_is_empty (b[0])
-            or interval_is_empty (b[1]))
-
-def bbox_union (b1, b2):
-    return (interval_union (b1[X_AXIS], b2[X_AXIS]),
-            interval_union (b2[Y_AXIS], b2[Y_AXIS]))
-            
-def bbox_intersection (b1, b2):
-    return (interval_intersect (b1[X_AXIS], b2[X_AXIS]),
-            interval_intersect (b2[Y_AXIS], b2[Y_AXIS]))
-
-def bbox_area (b):
-    return interval_length (b[X_AXIS]) * interval_length (b[Y_AXIS])
-
-def bbox_diameter (b):
-    return max (interval_length (b[X_AXIS]),
-                interval_length (b[Y_AXIS]))
-                
-
-def difference_area (a, b):
-    return bbox_area (a) - bbox_area (bbox_intersection (a,b))
-
-class GrobSignature:
-    def __init__ (self, exp_list):
-        (self.name, self.origin, bbox_x,
-         bbox_y, self.output_expression) = tuple (exp_list)
-        
-        self.bbox = (bbox_x, bbox_y)
-        self.centroid = (bbox_x[0] + bbox_x[1], bbox_y[0] + bbox_y[1])
-
-    def __repr__ (self):
-        return '%s: (%.2f,%.2f), (%.2f,%.2f)\n' % (self.name,
-                                                   self.bbox[0][0],
-                                                   self.bbox[0][1],
-                                                   self.bbox[1][0],
-                                                   self.bbox[1][1])
-                                                 
-    def axis_centroid (self, axis):
-        return apply (sum, self.bbox[axis])  / 2 
-    
-    def centroid_distance (self, other, scale):
-        return max_distance (self.centroid, other.centroid) / scale 
-        
-    def bbox_distance (self, other):
-        divisor = bbox_area (self.bbox) + bbox_area (other.bbox)
-
-        if divisor:
-            return (difference_area (self.bbox, other.bbox) +
-                    difference_area (other.bbox, self.bbox)) / divisor
-        else:
-            return 0.0
-        
-    def expression_distance (self, other):
-        if self.output_expression == other.output_expression:
-            return 0
-        else:
-            return 1
-
-################################################################
-# single System.
-
-class SystemSignature:
-    def __init__ (self, grob_sigs):
-        d = {}
-        for g in grob_sigs:
-            val = d.setdefault (g.name, [])
-            val += [g]
-
-        self.grob_dict = d
-        self.set_all_bbox (grob_sigs)
-
-    def set_all_bbox (self, grobs):
-        self.bbox = empty_bbox
-        for g in grobs:
-            self.bbox = bbox_union (g.bbox, self.bbox)
-
-    def closest (self, grob_name, centroid):
-        min_d = INFTY
-        min_g = None
-        try:
-            grobs = self.grob_dict[grob_name]
-
-            for g in grobs:
-                d = max_distance (g.centroid, centroid)
-                if d < min_d:
-                    min_d = d
-                    min_g = g
-
-
-            return min_g
-
-        except KeyError:
-            return None
-    def grobs (self):
-        return reduce (lambda x,y: x+y, self.grob_dict.values(), [])
-
-################################################################
-## comparison of systems.
-
-class SystemLink:
-    def __init__ (self, system1, system2):
-        self.system1 = system1
-        self.system2 = system2
-        
-        self.link_list_dict = {}
-        self.back_link_dict = {}
-
-
-        ## pairs
-        self.orphans = []
-
-        ## pair -> distance
-        self.geo_distances = {}
-
-        ## pairs
-        self.expression_changed = []
-
-        self._geometric_distance = None
-        self._expression_change_count = None
-        self._orphan_count = None
-        
-        for g in system1.grobs ():
-
-            ## skip empty bboxes.
-            if bbox_is_empty (g.bbox):
-                continue
-            
-            closest = system2.closest (g.name, g.centroid)
-            
-            self.link_list_dict.setdefault (closest, [])
-            self.link_list_dict[closest].append (g)
-            self.back_link_dict[g] = closest
-
-
-    def calc_geometric_distance (self):
-        total = 0.0
-        for (g1,g2) in self.back_link_dict.items ():
-            if g2:
-                d = g1.bbox_distance (g2)
-                if d:
-                    self.geo_distances[(g1,g2)] = d
-
-                total += d
-
-        self._geometric_distance = total
-    
-    def calc_orphan_count (self):
-        count = 0
-        for (g1, g2) in self.back_link_dict.items ():
-            if g2 == None:
-                self.orphans.append ((g1, None))
-                
-                count += 1
-
-        self._orphan_count = count
-    
-    def calc_output_exp_distance (self):
-        d = 0
-        for (g1,g2) in self.back_link_dict.items ():
-            if g2:
-                d += g1.expression_distance (g2)
-
-        self._expression_change_count = d
-
-    def output_expression_details_string (self):
-        return ', '.join ([g1.name for g1 in self.expression_changed])
-    
-    def geo_details_string (self):
-        results = [(d, g1,g2) for ((g1, g2), d) in self.geo_distances.items()]
-        results.sort ()
-        results.reverse ()
-        
-        return ', '.join (['%s: %f' % (g1.name, d) for (d, g1, g2) in results])
-
-    def orphan_details_string (self):
-        return ', '.join (['%s-None' % g1.name for (g1,g2) in self.orphans if g2==None])
-
-    def geometric_distance (self):
-        if self._geometric_distance == None:
-            self.calc_geometric_distance ()
-        return self._geometric_distance
-    
-    def orphan_count (self):
-        if self._orphan_count == None:
-            self.calc_orphan_count ()
-            
-        return self._orphan_count
-    
-    def output_expression_change_count (self):
-        if self._expression_change_count == None:
-            self.calc_output_exp_distance ()
-        return self._expression_change_count
-        
-    def distance (self):
-        return (self.output_expression_change_count (),
-                self.orphan_count (),
-                self.geometric_distance ())
-    
-def read_signature_file (name):
-    print 'reading', name
-    
-    entries = open (name).read ().split ('\n')
-    def string_to_tup (s):
-        return tuple (map (float, s.split (' '))) 
-
-    def string_to_entry (s):
-        fields = s.split('@')
-        fields[2] = string_to_tup (fields[2])
-        fields[3] = string_to_tup (fields[3])
-
-        return tuple (fields)
-    
-    entries = [string_to_entry (e) for e in entries
-               if e and not e.startswith ('#')]
-
-    grob_sigs = [GrobSignature (e) for e in entries]
-    sig = SystemSignature (grob_sigs)
-    return sig
-
-
-################################################################
-# different systems of a .ly file.
-
-hash_to_original_name = {}
-
-class FileLink:
-    def __init__ (self, f1, f2):
-        self._distance = None
-        self.file_names = (f1, f2)
-        
-    def text_record_string (self):
-        return '%-30f %-20s\n' % (self.distance (),
-                                  self.name ()
-                                  + os.path.splitext (self.file_names[1])[1]
-                                  )
-    
-    def calc_distance (self):
-        return 0.0
-
-    def distance (self):
-        if self._distance == None:
-           self._distance = self.calc_distance ()
-
-        return self._distance
-    
-    def source_file (self):
-        for ext in ('.ly', '.ly.txt'):
-            base = os.path.splitext (self.file_names[1])[0]
-            f = base + ext
-            if os.path.exists (f):
-                return f
-            
-        return ''
-        
-    def name (self):
-        base = os.path.basename (self.file_names[1])
-        base = os.path.splitext (base)[0]
-        base = hash_to_original_name.get (base, base)
-        base = os.path.splitext (base)[0]
-        return base
-    
-    def extension (self):
-        return os.path.splitext (self.file_names[1])[1]
-
-    def link_files_for_html (self, dest_dir):
-        for f in self.file_names:
-            link_file (f, os.path.join (dest_dir, f))
-
-    def get_distance_details (self):
-        return ''
-
-    def get_cell (self, oldnew):
-        return ''
-    
-    def get_file (self, oldnew):
-        return self.file_names[oldnew]
-    
-    def html_record_string (self, dest_dir):
-        dist = self.distance()
-        
-        details = self.get_distance_details ()
-        if details:
-            details_base = os.path.splitext (self.file_names[1])[0]
-            details_base += '.details.html'
-            fn = dest_dir + '/'  + details_base
-            open_write_file (fn).write (details)
-
-            details = '<br>(<a href="%(details_base)s">details</a>)' % locals ()
-
-        cell1 = self.get_cell (0)
-        cell2 = self.get_cell (1)
-
-        name = self.name () + self.extension ()
-        file1 = self.get_file (0)
-        file2 = self.get_file (1)
-        
-        return '''<tr>
-<td>
-%(dist)f
-%(details)s
-</td>
-<td>%(cell1)s<br><font size=-2><a href="%(file1)s"><tt>%(name)s</tt></font></td>
-<td>%(cell2)s<br><font size=-2><a href="%(file2)s"><tt>%(name)s</tt></font></td>
-</tr>''' % locals ()
-
-
-class FileCompareLink (FileLink):
-    def __init__ (self, f1, f2):
-        FileLink.__init__ (self, f1, f2)
-        self.contents = (self.get_content (self.file_names[0]),
-                         self.get_content (self.file_names[1]))
-        
-
-    def calc_distance (self):
-        ## todo: could use import MIDI to pinpoint
-        ## what & where changed.
-
-        if self.contents[0] == self.contents[1]:
-            return 0.0
-        else:
-            return 100.0;
-        
-    def get_content (self, f):
-        print 'reading', f
-        s = open (f).read ()
-        return s
-
-
-class GitFileCompareLink (FileCompareLink):
-    def get_cell (self, oldnew):
-        str = self.contents[oldnew]
-
-        # truncate long lines
-        str = '\n'.join ([l[:80] for l in str.split ('\n')])
-
-        
-        str = '<font size="-2"><pre>%s</pre></font>' % str
-        return str
-    
-    def calc_distance (self):
-        if self.contents[0] == self.contents[1]:
-            d = 0.0
-        else:
-            d = 1.0001 *options.threshold
-
-        return d
-
-        
-class TextFileCompareLink (FileCompareLink):
-    def calc_distance (self):
-        import difflib
-        diff = difflib.unified_diff (self.contents[0].strip().split ('\n'),
-                                     self.contents[1].strip().split ('\n'),
-                                     fromfiledate = self.file_names[0],
-                                     tofiledate = self.file_names[1]
-                                     )
-        
-        self.diff_lines =  [l for l in diff]
-        self.diff_lines = self.diff_lines[2:]
-        
-        return math.sqrt (float (len ([l for l in self.diff_lines if l[0] in '-+'])))
-        
-    def get_cell (self, oldnew):
-        str = ''
-        if oldnew == 1:
-            str = '\n'.join ([d.replace ('\n','') for d in self.diff_lines])
-        str = '<font size="-2"><pre>%s</pre></font>' % str
-        return str
-
-class LogFileCompareLink (TextFileCompareLink):
-  def get_content (self, f):
-      c = TextFileCompareLink.get_content (self, f)
-      c = re.sub ("\nProcessing `[^\n]+'\n", '', c)
-      return c
-        
-class ProfileFileLink (FileCompareLink):
-    def __init__ (self, f1, f2):
-        FileCompareLink.__init__ (self, f1, f2)
-        self.results = [{}, {}]
-    
-    def get_cell (self, oldnew):
-        str = ''
-        for k in ('time', 'cells'):
-            if oldnew==0:
-                str += '%-8s: %d\n' %  (k, int (self.results[oldnew][k]))
-            else:
-                str += '%-8s: %8d (%5.3f)\n' % (k, int (self.results[oldnew][k]),
-                                                self.get_ratio (k))
-
-        return '<pre>%s</pre>' % str
-            
-    def get_ratio (self, key):
-        (v1,v2) = (self.results[0].get (key, -1),
-                   self.results[1].get (key, -1))
-
-        if v1 <= 0 or v2 <= 0:
-            return 0.0
-
-        return (v1 - v2) / float (v1+v2)
-    
-    def calc_distance (self):
-        for oldnew in (0,1):
-            def note_info (m):
-                self.results[oldnew][m.group(1)] = float (m.group (2))
-            
-            re.sub ('([a-z]+): ([-0-9.]+)\n',
-                    note_info, self.contents[oldnew])
-
-        dist = 0.0
-        factor = {
-            'time': 0.1,
-            'cells': 5.0,
-            }
-        
-        for k in ('time', 'cells'):
-            real_val = math.tan (self.get_ratio (k) * 0.5 * math.pi)
-            dist += math.exp (math.fabs (real_val) * factor[k])  - 1
-
-        dist = min (dist, 100)
-        return dist
-
-    
-class MidiFileLink (TextFileCompareLink):
-    def get_content (self, oldnew):
-        import midi
-        
-        data = FileCompareLink.get_content (self, oldnew)
-        midi = midi.parse (data)
-        tracks = midi[1]
-
-        str = ''
-        j = 0
-        for t in tracks:
-            str += 'track %d' % j
-            j += 1
-
-            for e in t:
-                ev_str = repr (e)
-                if re.search ('LilyPond [0-9.]+', ev_str):
-                    continue
-                
-                str += '  ev %s\n' % `e`
-        return str
-    
-
-
-class SignatureFileLink (FileLink):
-    def __init__ (self, f1, f2 ):
-        FileLink.__init__ (self, f1, f2)
-        self.system_links = {}
-
-    def add_system_link (self, link, number):
-        self.system_links[number] = link
-
-    def calc_distance (self):
-        d = 0.0
-
-        orphan_distance = 0.0
-        for l in self.system_links.values ():
-            d = max (d, l.geometric_distance ())
-            orphan_distance += l.orphan_count ()
-            
-        return d + orphan_distance
-
-    def add_file_compare (self, f1, f2):
-        system_index = [] 
-
-        def note_system_index (m):
-            system_index.append (int (m.group (1)))
-            return ''
-        
-        base1 = re.sub ("-([0-9]+).signature", note_system_index, f1)
-        base2 = re.sub ("-([0-9]+).signature", note_system_index, f2)
-
-        self.base_names = (os.path.normpath (base1),
-                           os.path.normpath (base2))
-
-        s1 = read_signature_file (f1)
-        s2 = read_signature_file (f2)
-
-        link = SystemLink (s1, s2)
-
-        self.add_system_link (link, system_index[0])
-
-    
-    def create_images (self, dest_dir):
-
-        files_created = [[], []]
-        for oldnew in (0, 1):
-            pat = self.base_names[oldnew] + '.eps'
-
-            for f in glob.glob (pat):
-                infile = f
-                outfile = (dest_dir + '/' + f).replace ('.eps', '.png')
-                data_option = ''
-                if options.local_data_dir:
-                    data_option = ('-slilypond-datadir=%s/../share/lilypond/current '
-                                   % os.path.dirname(infile))
-                
-                mkdir (os.path.split (outfile)[0])
-                cmd = ('gs -sDEVICE=png16m -dGraphicsAlphaBits=4 -dTextAlphaBits=4 '
-                       ' %(data_option)s '
-                       ' -r101 '
-                       ' -sOutputFile=%(outfile)s -dNOSAFER -dEPSCrop -q -dNOPAUSE '
-                       ' %(infile)s  -c quit ') % locals ()
-
-                files_created[oldnew].append (outfile)
-                system (cmd)
-
-        return files_created
-    
-    def link_files_for_html (self, dest_dir):
-        FileLink.link_files_for_html (self, dest_dir)
-        to_compare = [[], []]
-
-        exts = []
-        if options.create_images:
-            to_compare = self.create_images (dest_dir)
-        else:
-            exts += ['.png', '-page*png']
-        
-        for ext in exts:            
-            for oldnew in (0,1):
-                for f in glob.glob (self.base_names[oldnew] + ext):
-                    dst = dest_dir + '/' + f
-                    link_file (f, dst)
-
-                    if f.endswith ('.png'):
-                        to_compare[oldnew].append (f)
-                        
-        if options.compare_images:                
-            for (old, new) in zip (to_compare[0], to_compare[1]):
-                compare_png_images (old, new, dest_dir)
-
-
-    def get_cell (self, oldnew):
-        def img_cell (ly, img, name):
-            if not name:
-                name = 'source'
-            else:
-                name = '<tt>%s</tt>' % name
-                
-            return '''
-<a href="%(img)s">
-<img src="%(img)s" style="border-style: none; max-width: 500px;">
-</a><br>
-''' % locals ()
-        def multi_img_cell (ly, imgs, name):
-            if not name:
-                name = 'source'
-            else:
-                name = '<tt>%s</tt>' % name
-
-            imgs_str = '\n'.join (['''<a href="%s">
-<img src="%s" style="border-style: none; max-width: 500px;">
-</a><br>''' % (img, img) 
-                                  for img in imgs])
-
-
-            return '''
-%(imgs_str)s
-''' % locals ()
-
-
-
-        def cell (base, name):
-            pat = base + '-page*.png'
-            pages = glob.glob (pat)
-
-            if pages:
-                return multi_img_cell (base + '.ly', sorted (pages), name)
-            else:
-                return img_cell (base + '.ly', base + '.png', name)
-
-
-
-        str = cell (os.path.splitext (self.file_names[oldnew])[0], self.name ())  
-        if options.compare_images and oldnew == 1:
-            str = str.replace ('.png', '.compare.jpeg')
-            
-        return str
-
-
-    def get_distance_details (self):
-        systems = self.system_links.items ()
-        systems.sort ()
-
-        html = ""
-        for (c, link) in systems:
-            e = '<td>%d</td>' % c
-            for d in link.distance ():
-                e += '<td>%f</td>' % d
-            
-            e = '<tr>%s</tr>' % e
-
-            html += e
-
-            e = '<td>%d</td>' % c
-            for s in (link.output_expression_details_string (),
-                      link.orphan_details_string (),
-                      link.geo_details_string ()):
-                e += "<td>%s</td>" % s
-
-            
-            e = '<tr>%s</tr>' % e
-            html += e
-            
-        original = self.name ()
-        html = '''<html>
-<head>
-<title>comparison details for %(original)s</title>
-</head>
-<body>
-<table border=1>
-<tr>
-<th>system</th>
-<th>output</th>
-<th>orphan</th>
-<th>geo</th>
-</tr>
-
-%(html)s
-</table>
-
-</body>
-</html>
-''' % locals ()
-        return html
-
-
-################################################################
-# Files/directories
-
-import glob
-import re
-
-def compare_signature_files (f1, f2):
-    s1 = read_signature_file (f1)
-    s2 = read_signature_file (f2)
-    
-    return SystemLink (s1, s2).distance ()
-
-def paired_files (dir1, dir2, pattern):
-    """
-    Search DIR1 and DIR2 for PATTERN.
-
-    Return (PAIRED, MISSING-FROM-2, MISSING-FROM-1)
-
-    """
-
-    files = []
-    for d in (dir1,dir2):
-        found = [os.path.split (f)[1] for f in glob.glob (d + '/' + pattern)]
-        found = dict ((f, 1) for f in found)
-        files.append (found)
-        
-    pairs = []
-    missing = []
-    for f in files[0]:
-        try:
-            files[1].pop (f)
-            pairs.append (f)
-        except KeyError:
-            missing.append (f)
-
-    return (pairs, files[1].keys (), missing)
-    
-class ComparisonData:
-    def __init__ (self):
-        self.result_dict = {}
-        self.missing = []
-        self.added = []
-        self.file_links = {}
-
-    def read_sources (self):
-
-        ## ugh: drop the .ly.txt
-        for (key, val) in self.file_links.items ():
-            
-            def note_original (match, ln=val):
-                key = ln.name ()
-                hash_to_original_name[key] = match.group (1)
-                return ''
-
-            sf = val.source_file ()
-            if sf:
-                re.sub (r'\\sourcefilename "([^"]+)"',
-                        note_original, open (sf).read ())
-            else:
-                print 'no source for', val
-        
-    def compare_trees (self, dir1, dir2):
-        self.compare_directories (dir1, dir2)
-        
-        (root, dirs, files) = os.walk (dir1).next ()
-        for d in dirs:
-            d1 = os.path.join (dir1, d)
-            d2 = os.path.join (dir2, d)
-
-            if os.path.islink (d1) or os.path.islink (d2):
-                continue
-            
-            if os.path.isdir (d2):
-                self.compare_trees (d1, d2)
-    
-    def compare_directories (self, dir1, dir2):
-        for ext in ['signature',
-                    'midi',
-                    'log',
-                    'profile',
-                    'gittxt']:
-            (paired, m1, m2) = paired_files (dir1, dir2, '*.' + ext)
-
-            self.missing += [(dir1, m) for m in m1] 
-            self.added += [(dir2, m) for m in m2] 
-
-            for p in paired:
-                if (options.max_count
-                    and len (self.file_links) > options.max_count):
-                    continue
-                
-                f2 = dir2 +  '/' + p
-                f1 = dir1 +  '/' + p
-                self.compare_files (f1, f2)
-
-    def compare_files (self, f1, f2):
-        if f1.endswith ('signature'):
-            self.compare_signature_files (f1, f2)
-        else:
-            ext = os.path.splitext (f1)[1]
-            klasses = {
-                '.midi': MidiFileLink,
-                '.log' : LogFileCompareLink,
-                '.profile': ProfileFileLink,
-                '.gittxt': GitFileCompareLink, 
-                }
-            
-            if klasses.has_key (ext):
-                self.compare_general_files (klasses[ext], f1, f2)
-
-    def compare_general_files (self, klass, f1, f2):
-        name = os.path.split (f1)[1]
-
-        file_link = klass (f1, f2)
-        self.file_links[name] = file_link
-        
-    def compare_signature_files (self, f1, f2):
-        name = os.path.split (f1)[1]
-        name = re.sub ('-[0-9]+.signature', '', name)
-        
-        file_link = None
-        try:
-            file_link = self.file_links[name]
-        except KeyError:
-            generic_f1 = re.sub ('-[0-9]+.signature', '.ly', f1)
-            generic_f2 = re.sub ('-[0-9]+.signature', '.ly', f2)
-            file_link = SignatureFileLink (generic_f1, generic_f2)
-            self.file_links[name] = file_link
-
-        file_link.add_file_compare (f1, f2)
-
-    def write_changed (self, dest_dir, threshold):
-        (changed, below, unchanged) = self.thresholded_results (threshold)
-
-        str = '\n'.join ([os.path.splitext (link.file_names[1])[0]
-                        for link in changed])
-        fn = dest_dir + '/changed.txt'
-        
-        open_write_file (fn).write (str)
-                
-    def thresholded_results (self, threshold):
-        ## todo: support more scores.
-        results = [(link.distance(), link)
-                   for link in self.file_links.values ()]
-        results.sort ()
-        results.reverse ()
-
-        unchanged = [r for (d,r) in results if d == 0.0]
-        below = [r for (d,r) in results if threshold >= d > 0.0]
-        changed = [r for (d,r) in results if d > threshold]
-
-        return (changed, below, unchanged)
-                
-    def write_text_result_page (self, filename, threshold):
-        out = None
-        if filename == '':
-            out = sys.stdout
-        else:
-            print 'writing "%s"' % filename
-            out = open_write_file (filename)
-
-        (changed, below, unchanged) = self.thresholded_results (threshold)
-
-        
-        for link in changed:
-            out.write (link.text_record_string ())
-
-        out.write ('\n\n')
-        out.write ('%d below threshold\n' % len (below))
-        out.write ('%d unchanged\n' % len (unchanged))
-        
-    def create_text_result_page (self, dir1, dir2, dest_dir, threshold):
-        self.write_text_result_page (dest_dir + '/index.txt', threshold)
-        
-    def create_html_result_page (self, dir1, dir2, dest_dir, threshold):
-        dir1 = dir1.replace ('//', '/')
-        dir2 = dir2.replace ('//', '/')
-
-        (changed, below, unchanged) = self.thresholded_results (threshold)
-
-
-        html = ''
-        old_prefix = os.path.split (dir1)[1]
-        for link in changed:
-            html += link.html_record_string (dest_dir)
-
-
-        short_dir1 = shorten_string (dir1)
-        short_dir2 = shorten_string (dir2)
-        html = '''<html>
-<table rules="rows" border bordercolor="blue">
-<tr>
-<th>distance</th>
-<th>%(short_dir1)s</th>
-<th>%(short_dir2)s</th>
-</tr>
-%(html)s
-</table>
-</html>''' % locals()
-
-        html += ('<p>')
-        below_count = len (below)
-
-        if below_count:
-            html += ('<p>%d below threshold</p>' % below_count)
-            
-        html += ('<p>%d unchanged</p>' % len (unchanged))
-
-        dest_file = dest_dir + '/index.html'
-        open_write_file (dest_file).write (html)
-
-
-        for link in changed:
-            link.link_files_for_html (dest_dir)
-        
-
-    def print_results (self, threshold):
-        self.write_text_result_page ('', threshold)
-
-def compare_trees (dir1, dir2, dest_dir, threshold):
-    data = ComparisonData ()
-    data.compare_trees (dir1, dir2)
-    data.read_sources ()
-
-    
-    data.print_results (threshold)
-
-    if os.path.isdir (dest_dir):
-        system ('rm -rf %s '% dest_dir)
-
-    data.write_changed (dest_dir, threshold)
-    data.create_html_result_page (dir1, dir2, dest_dir, threshold)
-    data.create_text_result_page (dir1, dir2, dest_dir, threshold)
-    
-################################################################
-# TESTING
-
-def mkdir (x):
-    if not os.path.isdir (x):
-        print 'mkdir', x
-        os.makedirs (x)
-
-def link_file (x, y):
-    mkdir (os.path.split (y)[0])
-    try:
-        print x, '->', y
-        os.link (x, y)
-    except OSError, z:
-        print 'OSError', x, y, z
-        raise OSError
-    
-def open_write_file (x):
-    d = os.path.split (x)[0]
-    mkdir (d)
-    return open (x, 'w')
-
-
-def system (x):
-    
-    print 'invoking', x
-    stat = os.system (x)
-    assert stat == 0
-
-
-def test_paired_files ():
-    print paired_files (os.environ["HOME"] + "/src/lilypond/scripts/",
-                        os.environ["HOME"] + "/src/lilypond-stable/buildscripts/", '*.py')
-                  
-    
-def test_compare_trees ():
-    system ('rm -rf dir1 dir2')
-    system ('mkdir dir1 dir2')
-    system ('cp 20{-*.signature,.ly,.png,.eps,.log,.profile} dir1')
-    system ('cp 20{-*.signature,.ly,.png,.eps,.log,.profile} dir2')
-    system ('cp 20expr{-*.signature,.ly,.png,.eps,.log,.profile} dir1')
-    system ('cp 19{-*.signature,.ly,.png,.eps,.log,.profile} dir2/')
-    system ('cp 19{-*.signature,.ly,.png,.eps,.log,.profile} dir1/')
-    system ('cp 19-1.signature 19.sub-1.signature')
-    system ('cp 19.ly 19.sub.ly')
-    system ('cp 19.profile 19.sub.profile')
-    system ('cp 19.log 19.sub.log')
-    system ('cp 19.png 19.sub.png')
-    system ('cp 19.eps 19.sub.eps')
-
-    system ('cp 20multipage* dir1')
-    system ('cp 20multipage* dir2')
-    system ('cp 19multipage-1.signature dir2/20multipage-1.signature')
-
-    
-    system ('mkdir -p dir1/subdir/ dir2/subdir/')
-    system ('cp 19.sub{-*.signature,.ly,.png,.eps,.log,.profile} dir1/subdir/')
-    system ('cp 19.sub{-*.signature,.ly,.png,.eps,.log,.profile} dir2/subdir/')
-    system ('cp 20grob{-*.signature,.ly,.png,.eps,.log,.profile} dir2/')
-    system ('cp 20grob{-*.signature,.ly,.png,.eps,.log,.profile} dir1/')
-    system ('echo HEAD is 1 > dir1/tree.gittxt')
-    system ('echo HEAD is 2 > dir2/tree.gittxt')
-
-    ## introduce differences
-    system ('cp 19-1.signature dir2/20-1.signature')
-    system ('cp 19.profile dir2/20.profile')
-    system ('cp 19.png dir2/20.png')
-    system ('cp 19multipage-page1.png dir2/20multipage-page1.png')
-    system ('cp 20-1.signature dir2/subdir/19.sub-1.signature')
-    system ('cp 20.png dir2/subdir/19.sub.png')
-    system ("sed 's/: /: 1/g'  20.profile > dir2/subdir/19.sub.profile")
-
-    ## radical diffs.
-    system ('cp 19-1.signature dir2/20grob-1.signature')
-    system ('cp 19-1.signature dir2/20grob-2.signature')
-    system ('cp 19multipage.midi dir1/midi-differ.midi')
-    system ('cp 20multipage.midi dir2/midi-differ.midi')
-    system ('cp 19multipage.log dir1/log-differ.log')
-    system ('cp 19multipage.log dir2/log-differ.log &&  echo different >> dir2/log-differ.log &&  echo different >> dir2/log-differ.log')
-
-    compare_trees ('dir1', 'dir2', 'compare-dir1dir2', options.threshold)
-
-
-def test_basic_compare ():
-    ly_template = r"""
-
-\version "2.10.0"
-#(define default-toplevel-book-handler
-  print-book-with-defaults-as-systems )
-
-#(ly:set-option (quote no-point-and-click))
-
-\sourcefilename "my-source.ly"
-%(papermod)s
-\header { tagline = ##f }
-\score {
-<<
-\new Staff \relative c {
-  c4^"%(userstring)s" %(extragrob)s
-  }
-\new Staff \relative c {
-  c4^"%(userstring)s" %(extragrob)s
-  }
->>
-\layout{}
-}
-
-"""
-
-    dicts = [{ 'papermod' : '',
-               'name' : '20',
-               'extragrob': '',
-               'userstring': 'test' },
-             { 'papermod' : '#(set-global-staff-size 19.5)',
-               'name' : '19',
-               'extragrob': '',
-               'userstring': 'test' },
-             { 'papermod' : '',
-               'name' : '20expr',
-               'extragrob': '',
-               'userstring': 'blabla' },
-             { 'papermod' : '',
-               'name' : '20grob',
-               'extragrob': 'r2. \\break c1',
-               'userstring': 'test' },
-             ]
-
-    for d in dicts:
-        open (d['name'] + '.ly','w').write (ly_template % d)
-        
-    names = [d['name'] for d in dicts]
-
-    system ('lilypond -ddump-profile -dseparate-log-files -ddump-signatures --png -dbackend=eps ' + ' '.join (names))
-    
-
-    multipage_str = r'''
-    #(set-default-paper-size "a6")
-    \score {
-      \relative {c1 \pageBreak c1 }
-      \layout {}
-      \midi {}
-    }
-    '''
-
-    open ('20multipage.ly', 'w').write (multipage_str.replace ('c1', 'd1'))
-    open ('19multipage.ly', 'w').write ('#(set-global-staff-size 19.5)\n' + multipage_str)
-    system ('lilypond -dseparate-log-files -ddump-signatures --png 19multipage 20multipage ')
-    test_compare_signatures (names)
-    
-def test_compare_signatures (names, timing=False):
-    import time
-
-    times = 1
-    if timing:
-        times = 100
-
-    t0 = time.clock ()
-
-    count = 0
-    for t in range (0, times):
-        sigs = dict ((n, read_signature_file ('%s-1.signature' % n)) for n in names)
-        count += 1
-
-    if timing:
-        print 'elapsed', (time.clock() - t0)/count
-
-
-    t0 = time.clock ()
-    count = 0
-    combinations = {}
-    for (n1, s1) in sigs.items():
-        for (n2, s2) in sigs.items():
-            combinations['%s-%s' % (n1, n2)] = SystemLink (s1,s2).distance ()
-            count += 1
-
-    if timing:
-        print 'elapsed', (time.clock() - t0)/count
-
-    results = combinations.items ()
-    results.sort ()
-    for k,v in results:
-        print '%-20s' % k, v
-
-    assert combinations['20-20'] == (0.0,0.0,0.0)
-    assert combinations['20-20expr'][0] > 0.0
-    assert combinations['20-19'][2] < 10.0
-    assert combinations['20-19'][2] > 0.0
-
-
-def run_tests ():
-    dir = 'test-output-distance'
-
-    do_clean = not os.path.exists (dir)
-
-    print 'test results in ', dir
-    if do_clean:
-        system ('rm -rf ' + dir)
-        system ('mkdir ' + dir)
-        
-    os.chdir (dir)
-    if do_clean:
-        test_basic_compare ()
-        
-    test_compare_trees ()
-    
-################################################################
-#
-
-def main ():
-    p = optparse.OptionParser ("output-distance - compare LilyPond formatting runs")
-    p.usage = 'output-distance.py [options] tree1 tree2'
-    
-    p.add_option ('', '--test-self',
-                  dest="run_test",
-                  action="store_true",
-                  help='run test method')
-    
-    p.add_option ('--max-count',
-                  dest="max_count",
-                  metavar="COUNT",
-                  type="int",
-                  default=0, 
-                  action="store",
-                  help='only analyze COUNT signature pairs')
-
-    p.add_option ('', '--threshold',
-                  dest="threshold",
-                  default=0.3,
-                  action="store",
-                  type="float",
-                  help='threshold for geometric distance')
-
-    p.add_option ('--no-compare-images',
-                  dest="compare_images",
-                  default=True,
-                  action="store_false",
-                  help="Don't run graphical comparisons")
-
-    p.add_option ('--create-images',
-                  dest="create_images",
-                  default=False,
-                  action="store_true",
-                  help="Create PNGs from EPSes")
-
-
-    p.add_option ('--local-datadir',
-                  dest="local_data_dir",
-                  default=False,
-                  action="store_true",
-                  help='whether to use the share/lilypond/ directory in the test directory')
-
-    p.add_option ('-o', '--output-dir',
-                  dest="output_dir",
-                  default=None,
-                  action="store",
-                  type="string",
-                  help='where to put the test results [tree2/compare-tree1tree2]')
-
-    global options
-    (options, args) = p.parse_args ()
-
-    if options.run_test:
-        run_tests ()
-        sys.exit (0)
-
-    if len (args) != 2:
-        p.print_usage()
-        sys.exit (2)
-
-    name = options.output_dir
-    if not name:
-        name = args[0].replace ('/', '')
-        name = os.path.join (args[1], 'compare-' + shorten_string (name))
-    
-    compare_trees (args[0], args[1], name, options.threshold)
-
-if __name__ == '__main__':
-    main()
-
diff --git a/buildscripts/pfx2ttf.fontforge b/buildscripts/pfx2ttf.fontforge
deleted file mode 100644 (file)
index 6428c7c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#!@FONTFORGE@
-
-Open($1);
-MergeKern($2)
-
-
-# The AFM files of `New Century Schoolbook' family as distributed within the
-# urw-fonts-1.0.7pre41.tar.bz2 archive contain a bunch of ligatures which
-# shouldn't be active by default:
-#
-#   T + M -> trademark
-#   N + o -> afii61352
-#   i + j -> ij
-#   I + J -> IJ
-#
-# This font bundle is shipped by Fedora Core 6 and other GNU/Linux
-# distributions; we simply remove those ligatures.
-
-SelectIf("trademark", "trademark", \
-         "afii61352", "afii61352", \
-         "ij", "ij", \
-         "IJ", "IJ");
-if (Strtol($version) < 20070501)
-  RemoveATT("Ligature", "*", "*");
-else
-  RemovePosSub("*");
-endif
-
-Generate($3 + $fontname + ".otf");
-
-# EOF
diff --git a/buildscripts/postprocess_html.py b/buildscripts/postprocess_html.py
deleted file mode 100644 (file)
index e94da79..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-#!@PYTHON@
-
-"""
-Postprocess HTML files:
-add footer, tweak links, add language selection menu.
-"""
-import re
-import os
-import time
-import operator
-
-import langdefs
-
-# This is to try to make the docball not too big with almost duplicate files
-# see process_links()
-non_copied_pages = ['Documentation/user/out-www/lilypond-big-page',
-                    'Documentation/user/out-www/lilypond-internals-big-page',
-                    'Documentation/user/out-www/lilypond-learning-big-page',
-                    'Documentation/user/out-www/lilypond-program-big-page',
-                    'Documentation/user/out-www/music-glossary-big-page',
-                    'out-www/examples',
-                    'Documentation/topdocs',
-                    'Documentation/bibliography',
-                    'Documentation/out-www/THANKS',
-                    'Documentation/out-www/DEDICATION',
-                    'Documentation/out-www/devel',
-                    'input/']
-
-def _doc (s):
-    return s
-
-header = r"""
-"""
-
-footer = '''
-<div class="footer">
-<p class="footer_version">
-%(footer_name_version)s
-</p>
-<p class="footer_report">
-%(footer_report_links)s
-</p>
-</div>
-'''
-footer_name_version = _doc ('This page is for %(package_name)s-%(package_version)s (%(branch_str)s).')
-# ugh, must not have "_doc" in strings because it is naively replaced with "_" in hacked gettext process
-footer_report_links = _doc ('Your <a href="%(suggest_Docs_url)s">suggestions for the documentation</a> are welcome, please report errors to our <a href="%(mail_address_url)s">bug list</a>.')
-
-
-mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs'
-suggest_Docs_url = 'http://lilypond.org/web/devel/participating/documentation-adding'
-
-header_tag = '<!-- header_tag -->'
-header_tag_re = re.compile (header_tag)
-
-footer_tag = '<!-- footer_tag -->'
-footer_tag_re = re.compile (footer_tag)
-
-lang_available = _doc ("Other languages: %s.")
-browser_lang = _doc ('About <A HREF="%s">automatic language selection</A>.')
-browser_language_url = "/web/about/browser-language"
-
-LANGUAGES_TEMPLATE = '''
-<p id="languages">
- %(language_available)s
- <br/>
- %(browser_language)s
-</p>
-'''
-
-
-html_re = re.compile ('(.*?)(?:[.]([^/.]*))?[.]html$')
-pages_dict = {}
-
-def build_pages_dict (filelist):
-    """Build dictionary of available translations of each page"""
-    global pages_dict
-    for f in filelist:
-        m = html_re.match (f)
-        if m:
-            g = m.groups()
-            if len (g) <= 1 or g[1] == None:
-                e = ''
-            else:
-                e = g[1]
-            if not g[0] in pages_dict:
-                pages_dict[g[0]] = [e]
-            else:
-                pages_dict[g[0]].append (e)
-
-def source_links_replace (m, source_val):
-    return 'href="' + os.path.join (source_val, m.group (1)) + '"'
-
-splitted_docs_re = re.compile ('(input/lsr/out-www/lilypond-snippets|\
-Documentation/user/out-www/(lilypond|music-glossary|lilypond-program|\
-lilypond-learning))/')
-
-snippets_ref_re = re.compile (r'href="(\.\./)?lilypond-snippets')
-user_ref_re = re.compile ('href="(?:\.\./)?lilypond\
-(-internals|-learning|-program|(?!-snippets))')
-
-docindex_link_re = re.compile (r'href="index.html"')
-
-
-## Windows does not support symlinks.
-# This function avoids creating symlinks for splitted HTML manuals
-# Get rid of symlinks in GNUmakefile.in (local-WWW-post)
-# this also fixes missing PNGs only present in translated docs
-def hack_urls (s, prefix):
-    if splitted_docs_re.match (prefix):
-        s = re.sub ('(href|src)="(../lily-.*?|.*?[.]png)"', '\\1="../\\2"', s)
-
-    # fix xrefs between documents in different directories ad hoc
-    if 'user/out-www/lilypond' in prefix:
-        s = snippets_ref_re.sub ('href="source/input/lsr/lilypond-snippets', s)
-    elif 'input/lsr' in prefix:
-        s = user_ref_re.sub ('href="source/Documentation/user/lilypond\\1', s)
-    
-    # we also need to replace in the lsr, which is already processed above!
-    if 'input/' in prefix or 'Documentation/topdocs' in prefix:
-        # fix the link from the regtest, lsr and topdoc pages to the doc index 
-        # (rewrite prefix to obtain the relative path of the doc index page)
-        rel_link = re.sub (r'out-www/.*$', '', prefix)
-        rel_link = re.sub (r'[^/]*/', '../', rel_link)
-        if 'input/regression' in prefix:
-            indexfile = "Documentation/devel"
-        else:
-            indexfile = "index"
-        s = docindex_link_re.sub ('href="' + rel_link + indexfile + '.html\"', s)
-
-    source_path = os.path.join (os.path.dirname (prefix), 'source')
-    if not os.path.islink (source_path):
-        return s
-    source_val = os.readlink (source_path)
-    return re.sub ('href="source/(.*?)"', lambda m: source_links_replace (m, source_val), s)
-
-body_tag_re = re.compile ('(?i)<body([^>]*)>')
-html_tag_re = re.compile ('(?i)<html>')
-doctype_re = re.compile ('(?i)<!DOCTYPE')
-doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
-css_re = re.compile ('(?i)<link rel="stylesheet" type="text/css" ([^>]*)href="[^">]*?lilypond.*\.css"([^>]*)>')
-end_head_tag_re = re.compile ('(?i)</head>')
-css_link = """    <link rel="stylesheet" type="text/css" title="Patrick McCarty's design" href="%(rel)sDocumentation/lilypond-mccarty.css">
-    <link rel="alternate stylesheet" type="text/css" href="%(rel)sDocumentation/lilypond.css" title="Andrew Hawryluk's design">
-    <link rel="alternate stylesheet" type="text/css" href="%(rel)sDocumentation/lilypond-blue.css" title="Kurt Kroon's blue design">
-    <!--[if lte IE 7]>
-    <link href="%(rel)sDocumentation/lilypond-ie-fixes.css" rel="stylesheet" type="text/css">
-    <![endif]-->
-"""
-
-
-def add_header (s, prefix):
-    """Add header (<body>, doctype and CSS)"""
-    if header_tag_re.search (s) == None:
-        body = '<body\\1>'
-        (s, n) = body_tag_re.subn (body + header, s, 1)
-        if not n:
-            (s, n) = html_tag_re.subn ('<html>' + header, s, 1)
-            if not n:
-                s = header + s
-
-        s = header_tag + '\n' + s
-
-        if doctype_re.search (s) == None:
-            s = doctype + s
-
-        if css_re.search (s) == None:
-            depth = (prefix.count ('/') - 1) * '../'
-            s = end_head_tag_re.sub ((css_link % {'rel': depth}) + '</head>', s)
-    return s
-
-title_tag_re = re.compile ('.*?<title>(.*?)</title>', re.DOTALL)
-AT_web_title_re = re.compile ('@WEB-TITLE@')
-
-def add_title (s):
-    # urg
-    # maybe find first node?
-    fallback_web_title = '-- --'
-    m = title_tag_re.match (s)
-    if m:
-        fallback_web_title = m.group (1)
-    s = AT_web_title_re.sub (fallback_web_title, s)
-    return s
-
-footer_insert_re = re.compile ('<!--\s*FOOTER\s*-->')
-end_body_re = re.compile ('(?i)</body>')
-end_html_re = re.compile ('(?i)</html>')
-
-def add_footer (s, footer_text):
-    """add footer"""
-    (s, n) = footer_insert_re.subn (footer_text + '\n' + '<!-- FOOTER -->', s, 1)
-    if not n:
-        (s, n) = end_body_re.subn (footer_text + '\n' + '</body>', s, 1)
-    if not n:
-        (s, n) = end_html_re.subn (footer_text + '\n' + '</html>', s, 1)
-    if not n:
-        s += footer_text + '\n'
-    return s
-
-def find_translations (prefix, lang_ext):
-    """find available translations of a page"""
-    available = []
-    missing = []
-    for l in langdefs.LANGUAGES:
-        e = l.webext
-        if lang_ext != e:
-            if e in pages_dict[prefix]:
-                available.append (l)
-            elif lang_ext == '' and l.enabled and reduce (operator.and_,
-                                                          [not prefix.startswith (s)
-                                                           for s in non_copied_pages]):
-                # English version of missing translated pages will be written
-                missing.append (e)
-    return available, missing
-
-online_links_re = re.compile ('''(href|src)=['"]\
-((?!Compiling-from-source.html")[^/][.]*[^.:'"]*)\
-([.]html)(#[^"']*|)['"]''')
-offline_links_re = re.compile ('href=[\'"]\
-((?!Compiling-from-source.html")[^/][.]*[^.:\'"]*)([.]html)(#[^"\']*|)[\'"]')
-big_page_name_re = re.compile ('''(.+?)-big-page''')
-
-def process_i18n_big_page_links (match, prefix, lang_ext):
-    big_page_name = big_page_name_re.match (match.group (1))
-    if big_page_name:
-        destination_path = os.path.normpath (os.path.join (os.path.dirname (prefix),
-                                                           big_page_name.group (0)))
-        if not lang_ext in pages_dict[destination_path]:
-            return match.group (0)
-    return 'href="' + match.group (1) + '.' + lang_ext \
-        + match.group (2) + match.group (3) + '"'
-
-def process_links (s, prefix, lang_ext, file_name, missing, target):
-    page_flavors = {}
-    if target == 'online':
-        # Strip .html, suffix for auto language selection (content
-        # negotiation).  The menu must keep the full extension, so do
-        # this before adding the menu.
-        page_flavors[file_name] = \
-            [lang_ext, online_links_re.sub ('\\1="\\2\\4"', s)]
-    elif target == 'offline':
-        # in LANG doc index: don't rewrite .html suffixes
-        # as not all .LANG.html pages exist;
-        # the doc index should be translated and contain links with the right suffixes
-        if prefix == 'Documentation/out-www/index':
-            page_flavors[file_name] = [lang_ext, s]
-        elif lang_ext == '':
-            page_flavors[file_name] = [lang_ext, s]
-            for e in missing:
-                page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = \
-                    [e, offline_links_re.sub ('href="\\1.' + e + '\\2\\3"', s)]
-        else:
-            # For saving bandwidth and disk space, we don't duplicate big pages
-            # in English, so we must process translated big pages links differently.
-            if 'big-page' in prefix:
-                page_flavors[file_name] = \
-                    [lang_ext,
-                     offline_links_re.sub \
-                         (lambda match: process_i18n_big_page_links (match, prefix, lang_ext),
-                          s)]
-            else:
-                page_flavors[file_name] = \
-                    [lang_ext,
-                     offline_links_re.sub ('href="\\1.' + lang_ext + '\\2\\3"', s)]
-    return page_flavors
-
-def add_menu (page_flavors, prefix, available, target, translation):
-    for k in page_flavors:
-        language_menu = ''
-        languages = ''
-        if page_flavors[k][0] != '':
-            t = translation[page_flavors[k][0]]
-        else:
-            t = _doc
-        for lang in available:
-            lang_file = lang.file_name (os.path.basename (prefix), '.html')
-            if language_menu != '':
-                language_menu += ', '
-            language_menu += '<a href="%s">%s</a>' % (lang_file, t (lang.name))
-        if target == 'offline':
-            browser_language = ''
-        elif target == 'online':
-            browser_language = t (browser_lang) % browser_language_url
-        if language_menu:
-            language_available = t (lang_available) % language_menu
-            languages = LANGUAGES_TEMPLATE % vars ()
-        page_flavors[k][1] = add_footer (page_flavors[k][1], languages)
-    return page_flavors
-
-
-def process_html_files (package_name = '',
-                        package_version = '',
-                        target = 'offline',
-                        name_filter = lambda s: s):
-    """Add header, footer and tweak links to a number of HTML files
-
-    Arguments:
-     package_name=NAME         set package_name to NAME
-     package_version=VERSION   set package version to VERSION
-     targets=offline|online    set page processing depending on the target
-          offline is for reading HTML pages locally
-          online is for hosting the HTML pages on a website with content
-            negotiation
-     name_filter               a HTML file name filter
-    """
-    translation = langdefs.translation
-    localtime = time.strftime ('%c %Z', time.localtime (time.time ()))
-
-    if "http://" in mail_address:
-        mail_address_url = mail_address
-    else:
-        mail_address_url= 'mailto:' + mail_address
-
-    versiontup = package_version.split ('.')
-    branch_str = _doc ('stable-branch')
-    if int (versiontup[1]) %  2:
-        branch_str = _doc ('development-branch')
-
-    # Initialize dictionaries for string formatting
-    subst = {}
-    subst[''] = dict ([i for i in globals ().items() if type (i[1]) is str])
-    subst[''].update (dict ([i for i in locals ().items() if type (i[1]) is str]))
-    for l in translation:
-        e = langdefs.LANGDICT[l].webext
-        if e:
-            subst[e] = {}
-            for name in subst['']:
-                subst[e][name] = translation[l] (subst[''][name])
-    # Do deeper string formatting as early as possible,
-    # so only one '%' formatting pass is needed later
-    for e in subst:
-        subst[e]['footer_name_version'] = subst[e]['footer_name_version'] % subst[e]
-        subst[e]['footer_report_links'] = subst[e]['footer_report_links'] % subst[e]
-
-    for prefix, ext_list in pages_dict.items ():
-        for lang_ext in ext_list:
-            file_name = langdefs.lang_file_name (prefix, lang_ext, '.html')
-            in_f = open (file_name)
-            s = in_f.read()
-            in_f.close()
-
-            s = s.replace ('%', '%%')
-            s = hack_urls (s, prefix)
-            s = add_header (s, prefix)
-
-            ### add footer
-            if footer_tag_re.search (s) == None:
-                s = add_footer (s, footer_tag + footer)
-
-                available, missing = find_translations (prefix, lang_ext)
-                page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
-                # Add menu after stripping: must not have autoselection for language menu.
-                page_flavors = add_menu (page_flavors, prefix, available, target, translation)
-            for k in page_flavors:
-                page_flavors[k][1] = page_flavors[k][1] % subst[page_flavors[k][0]]
-                out_f = open (name_filter (k), 'w')
-                out_f.write (page_flavors[k][1])
-                out_f.close()
-        # if the page is translated, a .en.html symlink is necessary for content negotiation
-        if target == 'online' and ext_list != ['']:
-            os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html'))
diff --git a/buildscripts/pytt.py b/buildscripts/pytt.py
deleted file mode 100644 (file)
index 1026c02..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#! @PYTHON@
-
-import os
-import re
-import sys
-
-frm = re.compile (sys.argv[1], re.MULTILINE)
-to = sys.argv[2]
-
-if not sys.argv[3:] or sys.argv[3] == '-':
-       sys.stdout.write (re.sub (frm, to, sys.stdin.read ()))
-for file in sys.argv[3:]:
-       s = open (file).read ()
-       name = os.path.basename (file)
-       base, ext = os.path.splitext (name)
-       t = re.sub (frm, to % locals (), s)
-       if s != t:
-               if 1:
-                       os.system ('mv %(file)s %(file)s~~' % locals ())
-                       h = open (file, "w")
-                       h.write (t)
-                       h.close ()
-               else:
-                       sys.stdout.write (t)
diff --git a/buildscripts/readlink.py b/buildscripts/readlink.py
deleted file mode 100644 (file)
index 70267ff..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-for i in sys.argv[1:]:
-    print os.path.realpath (i)
diff --git a/buildscripts/tely-gettext.py b/buildscripts/tely-gettext.py
deleted file mode 100644 (file)
index b4e5660..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# tely-gettext.py
-
-# Temporary script that helps translated docs sources conversion
-# for texi2html processing
-
-# USAGE:  tely-gettext.py BUILDSCRIPT-DIR LOCALEDIR LANG FILES
-
-print "tely_gettext.py"
-
-import sys
-import re
-import os
-import gettext
-
-if len (sys.argv) > 3:
-    buildscript_dir, localedir, lang = sys.argv[1:4]
-else:
-    print """USAGE:  tely-gettext.py BUILDSCRIPT-DIR LOCALEDIR LANG FILES
-  For example buildscripts/tely-gettext.py buildscripts Documentation/po/out-www de Documentation/de/user/*.tely"""
-    sys.exit (1)
-
-sys.path.append (buildscript_dir)
-import langdefs
-
-double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
-t = gettext.translation('lilypond-doc', localedir, [lang])
-_doc = t.gettext
-
-include_re = re.compile (r'@include (.*?)$', re.M)
-whitespaces = re.compile (r'\s+')
-ref_re = re.compile (r'(?ms)@(ruser|rprogram|ref|rlearning)\{(.*?)\}')
-node_section_re = re.compile (r'@node (.*?)\n@((?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) (.*?)\n')
-menu_entry_re = re.compile (r'\* (.*?)::')
-
-def ref_gettext (m):
-    r = whitespaces.sub (' ', m.group (2))
-    return '@' + m.group (1) + '{' + _doc (r) + '}'
-
-def node_gettext (m):
-    return '@node ' + _doc (m.group (1)) + '\n@' + \
-        m.group (2) + ' ' + _doc (m.group (3)) + \
-       '\n@translationof ' + m.group (1) + '\n'
-
-def menu_entry_gettext (m):
-    return '* ' + _doc (m.group (1)) + '::'
-
-def process_file (filename):
-    print "Processing %s" % filename
-    f = open (filename, 'r')
-    page = f.read ()
-    f.close()
-    page = node_section_re.sub (node_gettext, page)
-    page = ref_re.sub (ref_gettext, page)
-    page = menu_entry_re.sub (menu_entry_gettext, page)
-    page = page.replace ("""-- SKELETON FILE --
-When you actually translate this file, please remove these lines as
-well as all `UNTRANSLATED NODE: IGNORE ME' lines.""", """@c -- SKELETON FILE --""")
-    page = page.replace ('UNTRANSLATED NODE: IGNORE ME', "@c UNTRANSLATED NODE: IGNORE ME")
-    includes = [whitespaces.sub ('', f) for f in include_re.findall (page)]
-    f = open (filename, 'w')
-    f.write (page)
-    f.close ()
-    dir = os.path.dirname (filename)
-    for file in includes:
-        p = os.path.join (dir, file)
-        if os.path.exists (p):
-            process_file (p)
-
-for filename in sys.argv[4:]:
-    process_file (filename)
diff --git a/buildscripts/texi-gettext.py b/buildscripts/texi-gettext.py
deleted file mode 100644 (file)
index 546819b..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#!@PYTHON@
-# -*- coding: utf-8 -*-
-# texi-gettext.py
-
-# USAGE:  texi-gettext.py [-o OUTDIR] LANG FILES
-#
-# -o OUTDIR specifies that output files should rather be written in OUTDIR
-#
-
-print "texi_gettext.py"
-
-import sys
-import re
-import os
-import getopt
-
-import langdefs
-
-optlist, args = getopt.getopt (sys.argv[1:],'o:')
-lang = args[0]
-files = args[1:]
-
-outdir = '.'
-for x in optlist:
-    if x[0] == '-o':
-        outdir = x[1]
-
-double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
-_doc = langdefs.translation[lang]
-
-include_re = re.compile (r'@include ((?!../lily-).*?)\.texi$', re.M)
-whitespaces = re.compile (r'\s+')
-ref_re = re.compile (r'(?ms)@(rglos|ruser|rprogram|ref)(\{)(.*?)(\})')
-node_section_re = re.compile (r'@(node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading)( )(.*?)(\n)')
-menu_entry_re = re.compile (r'\* (.*?)::')
-
-def title_gettext (m):
-    if m.group (2) == '{':
-        r = whitespaces.sub (' ', m.group (3))
-    else:
-        r = m.group (3)
-    return '@' + m.group (1) + m.group (2) + _doc (r) + m.group (4)
-
-def menu_entry_gettext (m):
-    return '* ' + _doc (m.group (1)) + '::'
-
-def include_replace (m, filename):
-    if os.path.exists (os.path.join (os.path.dirname (filename), m.group(1)) + '.texi'):
-        return '@include ' + m.group(1) + '.pdftexi'
-    return m.group(0)
-
-def process_file (filename):
-    print "Processing %s" % filename
-    f = open (filename, 'r')
-    page = f.read ()
-    f.close()
-    page = node_section_re.sub (title_gettext, page)
-    page = ref_re.sub (title_gettext, page)
-    page = menu_entry_re.sub (menu_entry_gettext, page)
-    page = page.replace ("""-- SKELETON FILE --
-When you actually translate this file, please remove these lines as
-well as all `UNTRANSLATED NODE: IGNORE ME' lines.""", '')
-    page = page.replace ('UNTRANSLATED NODE: IGNORE ME', _doc ("This section has not been translated yet; please refer to the manual in English."))
-    includes = include_re.findall (page)
-    page = include_re.sub (lambda m: include_replace (m, filename), page)
-    p = os.path.join (outdir, filename) [:-4] + 'pdftexi'
-    f = open (p, 'w')
-    f.write (page)
-    f.close ()
-    dir = os.path.dirname (filename)
-    for file in includes:
-        p = os.path.join (dir, file) + '.texi'
-        if os.path.exists (p):
-            process_file (p)
-
-for filename in files:
-    process_file (filename)
diff --git a/buildscripts/texi-langutils.py b/buildscripts/texi-langutils.py
deleted file mode 100644 (file)
index 720b520..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-#!@PYTHON@
-# texi-langutils.py
-
-# WARNING: this script can't find files included in a different directory
-
-import sys
-import re
-import getopt
-import os
-
-import langdefs
-
-def read_pipe (command):
-    print command
-    pipe = os.popen (command)
-    output = pipe.read ()
-    if pipe.close ():
-        print "pipe failed: %(command)s" % locals ()
-    return output
-
-
-optlist, texi_files = getopt.getopt(sys.argv[1:],'no:d:b:i:l:',['skeleton', 'gettext'])
-process_includes = not ('-n', '') in optlist # -n   don't process @include's in texinfo files
-
-make_gettext = ('--gettext', '') in optlist   # --gettext    generate a node list from a Texinfo source
-make_skeleton = ('--skeleton', '') in optlist # --skeleton   extract the node tree from a Texinfo source
-
-output_file = 'doc.pot'
-
-# @untranslated should be defined as a macro in Texinfo source
-node_blurb = '''@untranslated
-'''
-doclang = ''
-head_committish = read_pipe ('git-rev-parse HEAD')
-intro_blurb = '''@c -*- coding: utf-8; mode: texinfo%(doclang)s -*-
-@c This file is part of %(topfile)s
-@ignore
-    Translation of GIT committish: %(head_committish)s
-    When revising a translation, copy the HEAD committish of the
-    version that you are working on.  See TRANSLATION for details.
-@end ignore
-'''
-
-end_blurb = """
-@c -- SKELETON FILE --
-"""
-
-for x in optlist:
-    if x[0] == '-o': # -o NAME   set PO output file name to NAME
-        output_file = x[1]
-    elif x[0] == '-d': # -d DIR    set working directory to DIR
-        os.chdir (x[1])
-    elif x[0] == '-b': # -b BLURB  set blurb written at each node to BLURB
-        node_blurb = x[1]
-    elif x[0] == '-i': # -i BLURB  set blurb written at beginning of each file to BLURB
-        intro_blurb = x[1]
-    elif x[0] == '-l': # -l ISOLANG  set documentlanguage to ISOLANG
-        doclang = '; documentlanguage: ' + x[1]
-
-texinfo_with_menus_re = re.compile (r"^(\*) +([^:\n]+)::.*?$|^@(include|menu|end menu|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *(.*?)$|@(rglos){(.+?)}", re.M)
-
-texinfo_re = re.compile (r"^@(include|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *(.+?)$|@(rglos){(.+?)}", re.M)
-
-ly_string_re = re.compile (r'^([a-zA-Z]+)[\t ]*=|%+[\t ]*(.*)$|\\(?:new|context)\s+(?:[a-zA-Z]*?(?:Staff(?:Group)?|Voice|FiguredBass|FretBoards|Names|Devnull))\s+=\s+"?([a-zA-Z]+)"?\s+')
-lsr_verbatim_ly_re = re.compile (r'% begin verbatim$')
-texinfo_verbatim_ly_re = re.compile (r'^@lilypond\[.*?verbatim')
-
-def process_texi (texifilename, i_blurb, n_blurb, write_skeleton, topfile, output_file=None, scan_ly=False):
-    try:
-        f = open (texifilename, 'r')
-        texifile = f.read ()
-        f.close ()
-        printedfilename = texifilename.replace ('../','')
-        includes = []
-
-        # process ly var names and comments
-        if output_file and (scan_ly or texifilename.endswith ('.ly')):
-            lines = texifile.splitlines ()
-            i = 0
-            in_verb_ly_block = False
-            if texifilename.endswith ('.ly'):
-                verbatim_ly_re = lsr_verbatim_ly_re
-            else:
-                verbatim_ly_re = texinfo_verbatim_ly_re
-            for i in range (len (lines)):
-                if verbatim_ly_re.search (lines[i]):
-                    in_verb_ly_block = True
-                elif lines[i].startswith ('@end lilypond'):
-                    in_verb_ly_block = False
-                elif in_verb_ly_block:
-                    for (var, comment, context_id) in ly_string_re.findall (lines[i]):
-                        if var:
-                            output_file.write ('# ' + printedfilename + ':' + \
-                                               str (i + 1) + ' (variable)\n_(r"' + var + '")\n')
-                        elif comment:
-                            output_file.write ('# ' + printedfilename + ':' + \
-                                               str (i + 1) + ' (comment)\n_(r"' + \
-                                               comment.replace ('"', '\\"') + '")\n')
-                        elif context_id:
-                            output_file.write ('# ' + printedfilename + ':' + \
-                                               str (i + 1) + ' (context id)\n_(r"' + \
-                                               context_id + '")\n')
-
-        # process Texinfo node names and section titles
-        if write_skeleton:
-            g = open (os.path.basename (texifilename), 'w')
-            subst = globals ()
-            subst.update (locals ())
-            g.write (i_blurb % subst)
-            tutu = texinfo_with_menus_re.findall (texifile)
-            node_trigger = False
-            for item in tutu:
-                if item[0] == '*':
-                    g.write ('* ' + item[1] + '::\n')
-                elif output_file and item[4] == 'rglos':
-                    output_file.write ('_(r"' + item[5] + '") # @rglos in ' + printedfilename + '\n')
-                elif item[2] == 'menu':
-                    g.write ('@menu\n')
-                elif item[2] == 'end menu':
-                    g.write ('@end menu\n\n')
-                else:
-                    g.write ('@' + item[2] + ' ' + item[3] + '\n')
-                    if node_trigger:
-                        g.write (n_blurb)
-                        node_trigger = False
-                    elif item[2] == 'include':
-                        includes.append (item[3])
-                    else:
-                        if output_file:
-                            output_file.write ('# @' + item[2] + ' in ' + \
-                                printedfilename + '\n_(r"' + item[3].strip () + '")\n')
-                        if item[2] == 'node':
-                            node_trigger = True
-            g.write (end_blurb)
-            g.close ()
-
-        elif output_file:
-            toto = texinfo_re.findall (texifile)
-            for item in toto:
-                if item[0] == 'include':
-                    includes.append(item[1])
-                elif item[2] == 'rglos':
-                    output_file.write ('# @rglos in ' + printedfilename + '\n_(r"' + item[3] + '")\n')
-                else:
-                    output_file.write ('# @' + item[0] + ' in ' + printedfilename + '\n_(r"' + item[1].strip () + '")\n')
-
-        if process_includes:
-            dir = os.path.dirname (texifilename)
-            for item in includes:
-                process_texi (os.path.join (dir, item.strip ()), i_blurb, n_blurb, write_skeleton, topfile, output_file, scan_ly)
-    except IOError, (errno, strerror):
-        sys.stderr.write ("I/O error(%s): %s: %s\n" % (errno, texifilename, strerror))
-
-
-if intro_blurb != '':
-    intro_blurb += '\n\n'
-if node_blurb != '':
-    node_blurb = '\n' + node_blurb + '\n\n'
-if make_gettext:
-    node_list_filename = 'node_list'
-    node_list = open (node_list_filename, 'w')
-    node_list.write ('# -*- coding: utf-8 -*-\n')
-    for texi_file in texi_files:
-        # Urgly: scan ly comments and variable names only in English doco
-        is_english_doc = 'Documentation/user' in texi_file
-        process_texi (texi_file, intro_blurb, node_blurb, make_skeleton,
-                      os.path.basename (texi_file), node_list,
-                      scan_ly=is_english_doc)
-    for word in ('Up:', 'Next:', 'Previous:', 'Appendix ', 'Footnotes', 'Table of Contents'):
-        node_list.write ('_(r"' + word + '")\n')
-    node_list.close ()
-    os.system ('xgettext -c -L Python --no-location -o ' + output_file + ' ' + node_list_filename)
-else:
-    for texi_file in texi_files:
-        process_texi (texi_file, intro_blurb, node_blurb, make_skeleton,
-                      os.path.basename (texi_file))
diff --git a/buildscripts/texi-skeleton-update.py b/buildscripts/texi-skeleton-update.py
deleted file mode 100644 (file)
index f761408..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#!@PYTHON@
-# texi-skeleton-update.py
-
-import sys
-import glob
-import os
-import shutil
-
-sys.stderr.write ('texi-skeleton-update.py\n')
-
-orig_skeletons = set ([os.path.basename (f) for f in glob.glob (sys.argv[1] + '/*.ite??')])
-new_skeletons = set ([os.path.basename (f) for f in glob.glob (sys.argv[2] + '/*.ite??')])
-
-for f in new_skeletons:
-    if f in orig_skeletons:
-        g = open (os.path.join (sys.argv[1], f), 'r').read ()
-        if '-- SKELETON FILE --' in g:
-            sys.stderr.write ("Updating %s...\n" % f)
-            shutil.copy (os.path.join (sys.argv[2], f), sys.argv[1])
-    elif f != 'fdl.itexi':
-        sys.stderr.write ("Copying new file %s...\n" % f)
-        shutil.copy (os.path.join (sys.argv[2], f), sys.argv[1])
-
-for f in orig_skeletons.difference (new_skeletons):
-    sys.stderr.write ("Warning: outdated skeleton file %s\n" % f)
diff --git a/buildscripts/texi2omf.py b/buildscripts/texi2omf.py
deleted file mode 100644 (file)
index cc2603f..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-#!@PYTHON@
-
-import getopt
-import os
-import re
-import sys
-import time
-
-def usage ():
-    sys.stderr.write ('''
-texi2omf [options] FILE.texi > FILE.omf
-
-Options:
-
---format=FORM         set format FORM  (HTML, PS, PDF, [XML]).
---location=FILE       file name as installed on disk.
---version=VERSION
-
-Use the following commands (enclose in @ignore)
-
-@omfsubject . .
-@omfdescription . .
-@omftype . . 
-
-etc.
-
-
-''')
-    
-(options, files) = getopt.getopt (sys.argv[1:], '',
-                 ['format=', 'location=', 'version='])
-
-license = 'FDL'
-location = ''
-version = ''
-email = os.getenv ('MAILADDRESS')
-name = os.getenv ('USERNAME')
-format = 'xml'
-
-for (o, a) in options:
-    if o == '--format':
-        format = a
-    elif o == '--location':
-        location = 'file:%s' % a
-    elif o == '--version':
-        version = a
-    else:
-        assert 0
-
-        
-if not files:
-    usage ()
-    sys.exit (2)
-
-
-formats = {
-    'html' : 'text/html',
-    'pdf' : 'application/pdf',
-    'ps.gz' : 'application/postscript',
-    'ps' : 'application/postscript',
-    'xml' : 'text/xml',
-    }
-
-if not formats.has_key (format):
-    sys.stderr.write ("Format `%s' unknown\n" % format)
-    sys.exit (1)
-
-
-infile = files[0]
-
-today = time.localtime ()
-
-texi = open (infile).read ()
-
-if not location:
-    location = 'file:/%s' % re.sub (r'\..*', '.' + format, infile)
-
-omf_vars = {
-    'date': '%d-%d-%d' %  today[:3],
-    'mimeformat': formats[format],
-    'maintainer':  "%s (%s)" % (name, email),
-    'version' : version,
-    'location' : location,
-    'language' : 'C',
-    }
-
-omf_caterories = ['subject', 'creator', 'maintainer', 'contributor',
-         'title', 'subtitle', 'version', 'category', 'type',
-         'description', 'license', 'language',]
-    
-for a in omf_caterories:
-    m = re.search ('@omf%s (.*)\n'% a, texi)
-    if m:
-        omf_vars[a] = m.group (1)
-    elif not omf_vars.has_key (a):
-        omf_vars[a] = ''
-        
-if not omf_vars['title']:
-    title = ''
-    m = re.search ('@title (.*)\n', texi)
-    if m:
-        title = m.group (1)
-
-    subtitle = ''
-    m = re.search ('@subtitle (.*)\n', texi)
-    if m:
-        subtitle = m.group (1)
-
-    if subtitle:
-        title  = '%s -- %s' % (title, subtitle)
-
-    omf_vars['title'] = title
-    
-if not omf_vars['creator']:
-    m = re.search ('@author (.*)\n', texi)
-    if m:
-        omf_vars['creator'] = m.group (1)
-
-
-
-print r'''<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE omf PUBLIC "-//OMF//DTD Scrollkeeper OMF Variant V1.0//EN" "http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd">
-<omf>
- <resource>
-  <creator>
-   %(creator)s
-  </creator>
-  <maintainer>
-   %(maintainer)s
-  </maintainer>
-  <title>
-   %(title)s
-  </title>
-  <date>
-   %(date)s
-  </date>
-  <version identifier="%(version)s" date="%(date)s" />
-  <subject category="%(category)s"/>
-  <description>
-  %(description)s
-  </description>
-  <type>
-  %(type)s
-  </type>
-  <format mime="%(mimeformat)s" />
-  <identifier url="%(location)s"/>
-  <language code="%(language)s"/>
-  <rights type="%(license)s" />
- </resource>
-</omf>
-
-''' % omf_vars
-
-
diff --git a/buildscripts/translations-status.py b/buildscripts/translations-status.py
deleted file mode 100644 (file)
index c931993..0000000
+++ /dev/null
@@ -1,578 +0,0 @@
-#!/usr/bin/env python
-
-"""
-USAGE: translations-status.py BUILDSCRIPT-DIR LOCALEDIR
-
-  This script must be run from Documentation/
-
-  Reads template files translations.template.html.in
-and for each LANG in LANGUAGES LANG/translations.template.html.in
-  Writes translations.html.in and for each LANG in LANGUAGES
-translations.LANG.html.in
-  Writes out/translations-status.txt
-  Updates word counts in TRANSLATION
-"""
-
-import sys
-import re
-import string
-import os
-
-import langdefs
-import buildlib
-
-def progress (str):
-    sys.stderr.write (str + '\n')
-
-progress ("translations-status.py")
-
-_doc = lambda s: s
-
-# load gettext messages catalogs
-translation = langdefs.translation
-
-
-language_re = re.compile (r'^@documentlanguage (.+)', re.M)
-comments_re = re.compile (r'^@ignore\n(.|\n)*?\n@end ignore$|@c .*?$', re.M)
-space_re = re.compile (r'\s+', re.M)
-lilypond_re = re.compile (r'@lilypond({.*?}|(.|\n)*?\n@end lilypond$)', re.M)
-node_re = re.compile ('^@node .*?$', re.M)
-title_re = re.compile ('^@(top|chapter|(?:sub){0,2}section|' + \
-'(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?) (.*?)$', re.M)
-include_re = re.compile ('^@include (.*?)$', re.M)
-
-translators_re = re.compile (r'^@c\s+Translators\s*:\s*(.*?)$', re.M | re.I)
-checkers_re = re.compile (r'^@c\s+Translation\s*checkers\s*:\s*(.*?)$',
-                          re.M | re.I)
-status_re = re.compile (r'^@c\s+Translation\s*status\s*:\s*(.*?)$', re.M | re.I)
-post_gdp_re = re.compile ('post.GDP', re.I)
-untranslated_node_str = '@untranslated'
-skeleton_str = '-- SKELETON FILE --'
-
-section_titles_string = _doc ('Section titles')
-last_updated_string = _doc (' <p><i>Last updated %s</i></p>\n')
-detailed_status_heads = [_doc ('Translators'), _doc ('Translation checkers'),
-                         _doc ('Translated'), _doc ('Up to date'),
-                         _doc ('Other info')]
-format_table = {
-    'not translated': {'color':'d0f0f8', 'short':_doc ('no'), 'abbr':'NT',
-                       'long':_doc ('not translated')},
-    'partially translated': {'color':'dfef77',
-                             'short':_doc ('partially (%(p)d %%)'),
-                             'abbr':'%(p)d%%',
-                             'long':_doc ('partially translated (%(p)d %%)')},
-    'fully translated': {'color':'1fff1f', 'short':_doc ('yes'), 'abbr':'FT',
-                         'long': _doc ('translated')},
-    'up to date': {'short':_doc ('yes'), 'long':_doc ('up to date'),
-                   'abbr':'100%%', 'vague':_doc ('up to date')},
-    'outdated': {'short':_doc ('partially'), 'abbr':'%(p)d%%',
-                 'vague':_doc ('partially up to date')},
-    'N/A': {'short':_doc ('N/A'), 'abbr':'N/A', 'color':'d587ff', 'vague':''},
-    'pre-GDP':_doc ('pre-GDP'),
-    'post-GDP':_doc ('post-GDP')
-}
-
-texi_level = {
-# (Unumbered/Numbered/Lettered, level)
-    'top': ('u', 0),
-    'unnumbered': ('u', 1),
-    'unnumberedsec': ('u', 2),
-    'unnumberedsubsec': ('u', 3),
-    'chapter': ('n', 1),
-    'section': ('n', 2),
-    'subsection': ('n', 3),
-    'appendix': ('l', 1)
-}
-
-appendix_number_trans = string.maketrans ('@ABCDEFGHIJKLMNOPQRSTUVWXY',
-                                          'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
-
-class SectionNumber (object):
-    def __init__ (self):
-        self.__data = [[0,'u']]
-
-    def __increase_last_index (self):
-        type = self.__data[-1][1]
-        if type == 'l':
-            self.__data[-1][0] = \
-                self.__data[-1][0].translate (appendix_number_trans)
-        elif type == 'n':
-            self.__data[-1][0] += 1
-
-    def format (self):
-        if self.__data[-1][1] == 'u':
-            return ''
-        return '.'.join ([str (i[0]) for i in self.__data if i[1] != 'u']) + ' '
-
-    def increase (self, (type, level)):
-        if level == 0:
-            self.__data = [[0,'u']]
-        while level + 1 < len (self.__data):
-            del self.__data[-1]
-        if level + 1 > len (self.__data):
-            self.__data.append ([0, type])
-            if type == 'l':
-                self.__data[-1][0] = '@'
-        if type == self.__data[-1][1]:
-            self.__increase_last_index ()
-        else:
-            self.__data[-1] = ([0, type])
-            if type == 'l':
-                self.__data[-1][0] = 'A'
-            elif type == 'n':
-                self.__data[-1][0] = 1
-        return self.format ()
-
-
-def percentage_color (percent):
-    p = percent / 100.0
-    if p < 0.33:
-        c = [hex (int (3 * p * b + (1 - 3 * p) * a))[2:]
-             for (a, b) in [(0xff, 0xff), (0x5c, 0xa6), (0x5c, 0x4c)]]
-    elif p < 0.67:
-        c = [hex (int ((3 * p - 1) * b + (2 - 3 * p) * a))[2:]
-             for (a, b) in [(0xff, 0xff), (0xa6, 0xff), (0x4c, 0x3d)]]
-    else:
-        c = [hex (int ((3 * p - 2) * b + 3 * (1 - p) * a))[2:]
-             for (a, b) in [(0xff, 0x1f), (0xff, 0xff), (0x3d, 0x1f)]]
-    return ''.join (c)
-
-
-def update_word_count (text, filename, word_count):
-    return re.sub (r'(?m)^(\d+) *' + filename,
-                   str (word_count).ljust (6) + filename,
-                   text)
-
-po_msgid_re = re.compile (r'^msgid "(.*?)"(?:\n"(.*?)")*', re.M)
-
-def po_word_count (po_content):
-    s = ' '.join ([''.join (t) for t in po_msgid_re.findall (po_content)])
-    return len (space_re.split (s))
-
-sgml_tag_re = re.compile (r'<.*?>', re.S)
-
-def sgml_word_count (sgml_doc):
-    s = sgml_tag_re.sub ('', sgml_doc)
-    return len (space_re.split (s))
-
-def tely_word_count (tely_doc):
-    '''
-    Calculate word count of a Texinfo document node by node.
-
-    Take string tely_doc as an argument.
-    Return a list of integers.
-
-    Texinfo comments and @lilypond blocks are not included in word counts.
-    '''
-    tely_doc = comments_re.sub ('', tely_doc)
-    tely_doc = lilypond_re.sub ('', tely_doc)
-    nodes = node_re.split (tely_doc)
-    return [len (space_re.split (n)) for n in nodes]
-
-
-class TelyDocument (object):
-    def __init__ (self, filename):
-        self.filename = filename
-        self.contents = open (filename).read ()
-
-        ## record title and sectionning level of first Texinfo section
-        m = title_re.search (self.contents)
-        if m:
-            self.title = m.group (2)
-            self.level = texi_level [m.group (1)]
-        else:
-            self.title = 'Untitled'
-            self.level = ('u', 1)
-
-        m = language_re.search (self.contents)
-        if m:
-            self.language = m.group (1)
-
-        included_files = [os.path.join (os.path.dirname (filename), t)
-                          for t in include_re.findall (self.contents)]
-        self.included_files = [p for p in included_files if os.path.exists (p)]
-
-    def print_title (self, section_number):
-        return section_number.increase (self.level) + self.title
-
-
-class TranslatedTelyDocument (TelyDocument):
-    def __init__ (self, filename, masterdocument, parent_translation=None):
-        TelyDocument.__init__ (self, filename)
-
-        self.masterdocument = masterdocument
-        if not hasattr (self, 'language') \
-                and hasattr (parent_translation, 'language'):
-            self.language = parent_translation.language
-        if hasattr (self, 'language'):
-            self.translation = translation[self.language]
-        else:
-            self.translation = lambda x: x
-        self.title = self.translation (self.title)
-
-        ## record authoring information
-        m = translators_re.search (self.contents)
-        if m:
-            self.translators = [n.strip () for n in m.group (1).split (',')]
-        else:
-            self.translators = parent_translation.translators
-        m = checkers_re.search (self.contents)
-        if m:
-            self.checkers = [n.strip () for n in m.group (1).split (',')]
-        elif isinstance (parent_translation, TranslatedTelyDocument):
-            self.checkers = parent_translation.checkers
-        else:
-            self.checkers = []
-
-        ## check whether translation is pre- or post-GDP
-        m = status_re.search (self.contents)
-        if m:
-            self.post_gdp = bool (post_gdp_re.search (m.group (1)))
-        else:
-            self.post_gdp = False
-
-        ## record which parts (nodes) of the file are actually translated
-        self.partially_translated = not skeleton_str in self.contents
-        nodes = node_re.split (self.contents)
-        self.translated_nodes = [not untranslated_node_str in n for n in nodes]
-
-        ## calculate translation percentage
-        master_total_word_count = sum (masterdocument.word_count)
-        translation_word_count = \
-            sum ([masterdocument.word_count[k] * self.translated_nodes[k]
-                  for k in range (min (len (masterdocument.word_count),
-                                       len (self.translated_nodes)))])
-        self.translation_percentage = \
-            100 * translation_word_count / master_total_word_count
-
-        ## calculate how much the file is outdated
-        (diff_string, error) = \
-            buildlib.check_translated_doc (masterdocument.filename, self.filename, self.contents)
-        if error:
-            sys.stderr.write ('warning: %s: %s' % (self.filename, error))
-            self.uptodate_percentage = None
-        else:
-            diff = diff_string.splitlines ()
-            insertions = sum ([len (l) - 1 for l in diff
-                               if l.startswith ('+')
-                               and not l.startswith ('+++')])
-            deletions = sum ([len (l) - 1 for l in diff
-                              if l.startswith ('-')
-                              and not l.startswith ('---')])
-            outdateness_percentage = 50.0 * (deletions + insertions) / \
-                (masterdocument.size + 0.5 * (deletions - insertions))
-            self.uptodate_percentage = 100 - int (outdateness_percentage)
-            if self.uptodate_percentage > 100:
-                alternative = 50
-                progress ("%s: strange uptodateness percentage %d %%, \
-setting to %d %%" % (self.filename, self.uptodate_percentage, alternative))
-                self.uptodate_percentage = alternative
-            elif self.uptodate_percentage < 1:
-                alternative = 1
-                progress ("%s: strange uptodateness percentage %d %%, \
-setting to %d %%" % (self.filename, self.uptodate_percentage, alternative))
-                self.uptodate_percentage = alternative
-
-    def completeness (self, formats=['long'], translated=False):
-        if translated:
-            translation = self.translation
-        else:
-            translation = lambda x: x
-
-        if isinstance (formats, str):
-            formats = [formats]
-        p = self.translation_percentage
-        if p == 0:
-            status = 'not translated'
-        elif p == 100:
-            status = 'fully translated'
-        else:
-            status = 'partially translated'
-        return dict ([(f, translation (format_table[status][f]) % locals())
-                      for f in formats])
-
-    def uptodateness (self, formats=['long'], translated=False):
-        if translated:
-            translation = self.translation
-        else:
-            translation = lambda x: x
-
-        if isinstance (formats, str):
-            formats = [formats]
-        p = self.uptodate_percentage
-        if p == None:
-            status = 'N/A'
-        elif p == 100:
-            status = 'up to date'
-        else:
-            status = 'outdated'
-        l = {}
-        for f in formats:
-            if f == 'color' and p != None:
-                l['color'] = percentage_color (p)
-            else:
-                l[f] = translation (format_table[status][f]) % locals ()
-        return l
-
-    def gdp_status (self):
-        if self.post_gdp:
-            return self.translation (format_table['post-GDP'])
-        else:
-            return self.translation (format_table['pre-GDP'])
-
-    def short_html_status (self):
-        s = '  <td>'
-        if self.partially_translated:
-            s += '<br>\n   '.join (self.translators) + '<br>\n'
-            if self.checkers:
-                s += '   <small>' + \
-                    '<br>\n   '.join (self.checkers) + '</small><br>\n'
-
-        c = self.completeness (['color', 'long'])
-        s += '   <span style="background-color: #%(color)s">\
-%(long)s</span><br>\n' % c
-
-        if self.partially_translated:
-            u = self.uptodateness (['vague', 'color'])
-            s += '   <span style="background-color: #%(color)s">\
-%(vague)s</span><br>\n' % u
-
-        s += '  </td>\n'
-        return s
-
-    def text_status (self):
-        s = self.completeness ('abbr')['abbr'] + ' '
-
-        if self.partially_translated:
-            s += self.uptodateness ('abbr')['abbr'] + ' '
-        return s
-
-    def html_status (self, numbering=SectionNumber ()):
-        if self.title == 'Untitled':
-            return ''
-
-        if self.level[1] == 0: # if self is a master document
-            s = '''<table align="center" border="2">
- <tr align="center">
-  <th>%s</th>''' % self.print_title (numbering)
-            s += ''.join (['  <th>%s</th>\n' % self.translation (h)
-                           for h in detailed_status_heads])
-            s += ' </tr>\n'
-            s += ' <tr align="left">\n  <td>%s<br>(%d)</td>\n' \
-                % (self.translation (section_titles_string),
-                   sum (self.masterdocument.word_count))
-
-        else:
-            s = ' <tr align="left">\n  <td>%s<br>(%d)</td>\n' \
-                % (self.print_title (numbering),
-                   sum (self.masterdocument.word_count))
-
-        if self.partially_translated:
-            s += '  <td>' + '<br>\n   '.join (self.translators) + '</td>\n'
-            s += '  <td>' + '<br>\n   '.join (self.checkers) + '</td>\n'
-        else:
-            s += '  <td></td>\n' * 2
-
-        c = self.completeness (['color', 'short'], translated=True)
-        s += '  <td><span style="background-color: #%(color)s">\
-%(short)s</span></td>\n' % {'color': c['color'],
-                           'short': c['short']}
-
-        if self.partially_translated:
-            u = self.uptodateness (['short', 'color'], translated=True)
-            s += '  <td><span style="background-color: #%(color)s">\
-%(short)s</span></td>\n' % {'color': u['color'],
-                           'short': u['short']}
-        else:
-            s += '  <td></td>\n'
-
-        s += '  <td>' + self.gdp_status () + '</td>\n </tr>\n'
-        s += ''.join ([i.translations[self.language].html_status (numbering)
-                       for i in self.masterdocument.includes
-                       if self.language in i.translations])
-
-        if self.level[1] == 0:  # if self is a master document
-            s += '</table>\n<p></p>\n'
-        return s
-
-class MasterTelyDocument (TelyDocument):
-    def __init__ (self,
-                  filename,
-                  parent_translations=dict ([(lang, None)
-                                             for lang in langdefs.LANGDICT])):
-        TelyDocument.__init__ (self, filename)
-        self.size = len (self.contents)
-        self.word_count = tely_word_count (self.contents)
-        translations = dict ([(lang, os.path.join (lang, filename))
-                              for lang in langdefs.LANGDICT])
-        self.translations = \
-            dict ([(lang,
-                    TranslatedTelyDocument (translations[lang],
-                                            self, parent_translations.get (lang)))
-                   for lang in langdefs.LANGDICT
-                   if os.path.exists (translations[lang])])
-        if self.translations:
-            self.includes = [MasterTelyDocument (f, self.translations)
-                             for f in self.included_files]
-        else:
-            self.includes = []
-
-    def update_word_counts (self, s):
-        s = update_word_count (s, self.filename, sum (self.word_count))
-        for i in self.includes:
-            s = i.update_word_counts (s)
-        return s
-
-    def html_status (self, numbering=SectionNumber ()):
-        if self.title == 'Untitled' or not self.translations:
-            return ''
-        if self.level[1] == 0: # if self is a master document
-            s = '''<table align="center" border="2">
- <tr align="center">
-  <th>%s</th>''' % self.print_title (numbering)
-            s += ''.join (['  <th>%s</th>\n' % l for l in self.translations])
-            s += ' </tr>\n'
-            s += ' <tr align="left">\n  <td>Section titles<br>(%d)</td>\n' \
-                % sum (self.word_count)
-
-        else:  # if self is an included file
-            s = ' <tr align="left">\n  <td>%s<br>(%d)</td>\n' \
-                % (self.print_title (numbering), sum (self.word_count))
-
-        s += ''.join ([t.short_html_status ()
-                       for t in self.translations.values ()])
-        s += ' </tr>\n'
-        s += ''.join ([i.html_status (numbering) for i in self.includes])
-
-        if self.level[1] == 0:  # if self is a master document
-            s += '</table>\n<p></p>\n'
-        return s
-
-    def text_status (self, numbering=SectionNumber (), colspec=[48,12]):
-        if self.title == 'Untitled' or not self.translations:
-            return ''
-
-        s = ''
-        if self.level[1] == 0: # if self is a master document
-            s += (self.print_title (numbering) + ' ').ljust (colspec[0])
-            s += ''.join (['%s'.ljust (colspec[1]) % l
-                           for l in self.translations])
-            s += '\n'
-            s += ('Section titles (%d)' % \
-                      sum (self.word_count)).ljust (colspec[0])
-
-        else:
-            s = '%s (%d) ' \
-                % (self.print_title (numbering), sum (self.word_count))
-            s = s.ljust (colspec[0])
-
-        s += ''.join ([t.text_status ().ljust(colspec[1])
-                       for t in self.translations.values ()])
-        s += '\n\n'
-        s += ''.join ([i.text_status (numbering) for i in self.includes])
-
-        if self.level[1] == 0:
-            s += '\n'
-        return s
-
-
-update_category_word_counts_re = re.compile (r'(?ms)^-(\d+)-(.*?\n)\d+ *total')
-
-counts_re = re.compile (r'(?m)^(\d+) ')
-
-def update_category_word_counts_sub (m):
-    return '-' + m.group (1) + '-' + m.group (2) + \
-        str (sum ([int (c)
-                   for c in counts_re.findall (m.group (2))])).ljust (6) + \
-        'total'
-
-
-progress ("Reading documents...")
-
-tely_files = \
-    buildlib.read_pipe ("find -maxdepth 2 -name '*.tely'")[0].splitlines ()
-tely_files.sort ()
-master_docs = [MasterTelyDocument (os.path.normpath (filename))
-               for filename in tely_files]
-master_docs = [doc for doc in master_docs if doc.translations]
-
-main_status_page = open ('translations.template.html.in').read ()
-
-enabled_languages = [l for l in langdefs.LANGDICT
-                     if langdefs.LANGDICT[l].enabled
-                     and l != 'en']
-lang_status_pages = \
-    dict ([(l, open (os.path.join (l, 'translations.template.html.in')). read ())
-           for l in enabled_languages])
-
-progress ("Generating status pages...")
-
-date_time = buildlib.read_pipe ('LANG= date -u')[0]
-
-main_status_html = last_updated_string % date_time
-main_status_html += '\n'.join ([doc.html_status () for doc in master_docs])
-
-html_re = re.compile ('<html>', re.I)
-end_body_re = re.compile ('</body>', re.I)
-
-html_header = '''<html>
-<!-- This page is automatically generated by translation-status.py from
-translations.template.html.in; DO NOT EDIT !-->'''
-
-main_status_page = html_re.sub (html_header, main_status_page)
-
-main_status_page = end_body_re.sub (main_status_html + '\n</body>',
-                                    main_status_page)
-
-open ('translations.html.in', 'w').write (main_status_page)
-
-for l in enabled_languages:
-    date_time = buildlib.read_pipe ('LANG=%s date -u' % l)[0]
-    lang_status_pages[l] = translation[l] (last_updated_string) % date_time + lang_status_pages[l]
-    lang_status_page = html_re.sub (html_header, lang_status_pages[l])
-    html_status = '\n'.join ([doc.translations[l].html_status ()
-                              for doc in master_docs
-                              if l in doc.translations])
-    lang_status_page = end_body_re.sub (html_status + '\n</body>',
-                                        lang_status_page)
-    open (os.path.join (l, 'translations.html.in'), 'w').write (lang_status_page)
-
-main_status_txt = '''Documentation translations status
-Generated %s
-NT = not translated
-FT = fully translated
-
-''' % date_time
-
-main_status_txt += '\n'.join ([doc.text_status () for doc in master_docs])
-
-status_txt_file = 'out/translations-status.txt'
-progress ("Writing %s..." % status_txt_file)
-open (status_txt_file, 'w').write (main_status_txt)
-
-translation_instructions_file = 'TRANSLATION'
-progress ("Updating %s..." % translation_instructions_file)
-translation_instructions = open (translation_instructions_file).read ()
-
-for doc in master_docs:
-    translation_instructions = doc.update_word_counts (translation_instructions)
-
-for html_file in re.findall (r'(?m)^\d+ *(\S+?\.html\S*?)(?: |$)',
-                             translation_instructions):
-    word_count = sgml_word_count (open (html_file).read ())
-    translation_instructions = update_word_count (translation_instructions,
-                                                  html_file,
-                                                  word_count)
-
-for po_file in re.findall (r'(?m)^\d+ *(\S+?\.po\S*?)(?: |$)',
-                           translation_instructions):
-    word_count = po_word_count (open (po_file).read ())
-    translation_instructions = update_word_count (translation_instructions,
-                                                  po_file,
-                                                  word_count)
-
-translation_instructions = \
-    update_category_word_counts_re.sub (update_category_word_counts_sub,
-                                        translation_instructions)
-
-open (translation_instructions_file, 'w').write (translation_instructions)
diff --git a/buildscripts/update-snippets.py b/buildscripts/update-snippets.py
deleted file mode 100644 (file)
index 6b70c79..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#!@PYTHON@
-# update-snippets.py
-
-# USAGE:  update-snippets.py REFERENCE-DIR TARGET-DIR FILES
-#
-# update ly snippets in TARGET-DIR/FILES with snippets from REFERENCE-DIR/FILES
-#
-# More precisely, each existing FILE in TARGET-DIR is matched to the FILE in
-# REFERENCE-DIR (it the latter does not exist, a warning is given).
-#
-# Shell wildcards expansion is performed on FILES.
-# This script currently supports Texinfo format.
-# Ly snippets preceded with a line containing '@c KEEP LY' in TARGET-DIR/FILES
-# will not be updated.
-# An error occurs if REFERENCE-DIR/FILE and TARGET-DIR/FILE do not have the
-# same snippets count.
-
-import sys
-import os
-import glob
-import re
-
-print "update-snippets.py"
-
-comment_re = re.compile (r'(?<!@)(@c(?:omment)? .*?\n|^@ignore\n.*?\n@end ignore\n)', re.M | re.S)
-snippet_re = re.compile (r'^(@lilypond(?:file)?(?:\[.*?\])?\s*\{.+?\}|@lilypond(?:\[.*?\])?(?:.|\n)+?@end lilypond)', re.M)
-
-
-def snippet_split (l):
-    r = []
-    for s in [s for s in l if s]:
-        if s.startswith ('@c ') or s.startswith ('@ignore\n') or s.startswith ('@comment '):
-            r.append(s)
-        else:
-            r += [t for t in snippet_re.split (s) if t]
-    return r
-
-def count_snippet (l):
-    k = 0
-    for s in l:
-        if s.startswith ('@lilypond'):
-            k += 1
-    return k
-
-def find_next_snippet (l, k):
-    while not l[k].startswith ('@lilypond'):
-        k += 1
-    return k
-
-exit_code = 0
-
-def update_exit_code (code):
-    global exit_code
-    exit_code = max (code, exit_code)
-
-ref_dir, target_dir = sys.argv [1:3]
-file_patterns = sys.argv[3:]
-
-total_snippet_count = 0
-changed_snippets_count = 0
-
-for pattern in file_patterns:
-    files = glob.glob (os.path.join (target_dir, pattern))
-    for file in files:
-        ref_file = os.path.join (ref_dir, os.path.basename (file))
-        if not os.path.isfile (ref_file):
-            sys.stderr.write ("Warning: %s: no such file.\nReference file for %s not found.\n" % (ref_file, file))
-            continue
-        f = open (file, 'r')
-        target_source = comment_re.split (f.read ())
-        f.close ()
-        if reduce (lambda x, y: x or y, ['-- SKELETON FILE --' in s for s in target_source]):
-            sys.stderr.write ("Skipping skeleton file %s\n" % file)
-            continue
-        g = open (ref_file, 'r')
-        ref_source = comment_re.split (g.read ())
-        target_source = snippet_split (target_source)
-        ref_source = snippet_split (ref_source)
-        if '' in target_source or '' in ref_source:
-            raise "AAAAARGH: unuseful empty string"
-        snippet_count = count_snippet (target_source)
-        if not snippet_count == count_snippet (ref_source):
-            update_exit_code (1)
-            sys.stderr.write ("Error: %s and %s have different snippet counts.\n\
-Update translation by at least adding a @lilypond block where necessary, then rerun this script.\n" % (ref_file, file))
-            continue
-        total_snippet_count += snippet_count
-        c = 0
-        k = -1
-        for j in range (len (target_source)):
-            if target_source[j].startswith ('@lilypond'):
-                k = find_next_snippet (ref_source, k+1)
-                if j > 0 and (not target_source[j-1].startswith ('@c KEEP LY')) and target_source[j] != ref_source[k]:
-                    target_source[j] = ref_source[k]
-                    c += 1
-                    changed_snippets_count += 1
-        f = open (file, 'w')
-        f.write (''.join (target_source))
-        sys.stderr.write ('%s: %d/%d snippets updated\n' % (file, c, snippet_count))
-
-sys.stderr.write ('\nTotal: %d snippets, %d updated snippets.\n' % (total_snippet_count, changed_snippets_count))
-sys.exit (exit_code)
diff --git a/buildscripts/www_post.py b/buildscripts/www_post.py
deleted file mode 100644 (file)
index 1af5c92..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-#!@PYTHON@
-
-## This is www_post.py. This script is the main stage
-## of toplevel GNUmakefile local-WWW-post target.
-
-# USAGE: www_post PACKAGE_NAME TOPLEVEL_VERSION OUTDIR TARGETS
-# please call me from top of the source directory
-
-import sys
-import os
-import re
-
-import langdefs
-
-import mirrortree
-import postprocess_html
-
-package_name, package_version, outdir, targets = sys.argv[1:]
-targets = targets.split (' ')
-outdir = os.path.normpath (outdir)
-doc_dirs = ['input', 'Documentation', outdir]
-target_pattern = os.path.join (outdir, '%s-root')
-
-# these redirection pages allow to go back to the documentation index
-# from HTML manuals/snippets page
-static_files = {
-    os.path.join (outdir, 'index.html'):
-        '''<META HTTP-EQUIV="refresh" content="0;URL=Documentation/index.html">
-<html><body>Redirecting to the documentation index...</body></html>\n''',
-    os.path.join (outdir, 'VERSION'):
-        package_version + '\n',
-    os.path.join ('input', 'lsr', outdir, 'index.html'):
-        '''<META HTTP-EQUIV="refresh" content="0;URL=../../index.html">
-<html><body>Redirecting to the documentation index...</body></html>\n'''
-    }
-
-for l in langdefs.LANGUAGES:
-    static_files[os.path.join ('Documentation', 'user', outdir, l.file_name ('index', '.html'))] = \
-                                  '<META HTTP-EQUIV="refresh" content="0;URL=../' + l.file_name ('index', '.html') + \
-                                  '">\n<html><body>Redirecting to the documentation index...</body></html>\n'
-
-for f, contents in static_files.items ():
-    open (f, 'w').write (contents)
-
-sys.stderr.write ("Mirrorring...\n")
-dirs, symlinks, files = mirrortree.walk_tree (
-    tree_roots = doc_dirs,
-    process_dirs = outdir,
-    exclude_dirs = '(^|/)(' + r'|po|out|out-test|.*?[.]t2d|\w*?-root)(/|$)|Documentation/(' + '|'.join ([l.code for l in langdefs.LANGUAGES]) + ')',
-    find_files = r'.*?\.(?:midi|html|pdf|png|txt|i?ly|signature|css|zip|xml|mxl)$|VERSION',
-    exclude_files = r'lily-[0-9a-f]+.*\.(pdf|txt)')
-
-# actual mirrorring stuff
-html_files = []
-hardlinked_files = []
-for f in files:
-    if f.endswith ('.html'):
-        html_files.append (f)
-    else:
-        hardlinked_files.append (f)
-dirs = [re.sub ('/' + outdir, '', d) for d in dirs]
-while outdir in dirs:
-    dirs.remove (outdir)
-dirs = list (set (dirs))
-dirs.sort ()
-
-strip_file_name = {}
-strip_re = re.compile (outdir + '/')
-for t in targets:
-    out_root = target_pattern % t
-    strip_file_name[t] = lambda s: os.path.join (target_pattern % t, (strip_re.sub ('', s)))
-    os.mkdir (out_root)
-    map (os.mkdir, [os.path.join (out_root, d) for d in dirs])
-    for f in hardlinked_files:
-        os.link (f, strip_file_name[t] (f))
-    for l in symlinks:
-        p = mirrortree.new_link_path (os.path.normpath (os.readlink (l)), os.path.dirname (l), strip_re)
-        dest = strip_file_name[t] (l)
-        if not os.path.exists (dest):
-            os.symlink (p, dest)
-
-    ## ad-hoc renaming to make xrefs between PDFs work
-    os.rename (os.path.join (out_root, 'input/lsr/lilypond-snippets.pdf'),
-               os.path.join (out_root, 'Documentation/user/lilypond-snippets.pdf'))
-
-# need this for content negotiation with documentation index
-if 'online' in targets:
-    f = open (os.path.join (target_pattern % 'online', 'Documentation/.htaccess'), 'w')
-    f.write ('#.htaccess\nDirectoryIndex index\n')
-    f.close ()
-
-postprocess_html.build_pages_dict (html_files)
-for t in targets:
-    sys.stderr.write ("Processing HTML pages for %s target...\n" % t)
-    postprocess_html.process_html_files (
-        package_name = package_name,
-        package_version = package_version,
-        target = t,
-        name_filter = strip_file_name[t])
-
index f9f5c622eaf8a8554bbff42f7ab9f267b54c4797..0a1cfc241abb6bd98c2f296c5f36aead860bbd97 100644 (file)
@@ -76,7 +76,7 @@ else
       NCSB_FILE=`$FCMATCH --verbose "Century Schoolbook L:style=$style" | grep 'file:' | grep -v "\.ttf"`
 
       NCSB_FILE=`echo $NCSB_FILE | sed 's/^.*"\(.*\)".*$/\1/g'`
-      NCSB_FILE=`$PYTHON "$srcdir/buildscripts/readlink.py" $NCSB_FILE`
+      NCSB_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $NCSB_FILE`
       NCSB_SOURCE_FILES="$NCSB_FILE $NCSB_SOURCE_FILES"
     done
   else
index 0eab184cd0d74f0012dfce2808441b71831154a2..9dcdf1ce6ed158339f0473176400d5a64078f3e5 100644 (file)
@@ -16,11 +16,14 @@ include $(depth)/make/stepmake.make
 LILYPOND_WORDS = $(outdir)/lilypond-words.el
 LILYPOND_WORDS_DEPENDS =\
   $(top-src-dir)/lily/lily-lexer.cc \
-  $(buildscript-dir)/lilypond-words.py \
+  $(buildscript-dir)/lilypond-words \
   $(top-src-dir)/scm/markup.scm \
   $(top-src-dir)/ly/engraver-init.ly
 
+$(buildscript-dir)/lilypond-words:
+       make -C $(depth)/scripts/build
+
 $(LILYPOND_WORDS):
-       cd $(top-src-dir) && $(PYTHON) buildscripts/lilypond-words.py --el --dir=$(top-build-dir)/elisp/$(outconfbase)
+       cd $(top-src-dir) && $(buildscript-dir)/lilypond-words --el --dir=$(top-build-dir)/elisp/$(outconfbase)
 
 all: $(LILYPOND_WORDS)
diff --git a/elisp/SConscript b/elisp/SConscript
deleted file mode 100644 (file)
index 380490c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-sources = src_glob ('*.el') + ['lilypond-words.el']
-
-e = env.Copy ()
-a = '$PYTHON $srcdir/buildscripts/lilypond-words.py --el --dir=${TARGET.dir}'
-e.Command ('lilypond-words.el',
-          ['#/lily/lily-lexer.cc',
-           '#/buildscripts/lilypond-words.py',
-           '#/scm/markup.scm',
-           '#/ly/engraver-init.ly',],
-          a)
-
-install (sources, env['sharedir_package_version'] + '/elisp')
index 7c197ce7e07a5bf031eac54cc1cebd361c928f3a..d8e3a694dd0825b37ef509f28eeac616bdf57b95 100644 (file)
@@ -3,7 +3,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;;  
-;;;; (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; 
 ;;;; Changed 2001--2003 Heikki Junes <heikki.junes@hut.fi>
 ;;;;    * Add PS-compilation, PS-viewing and MIDI-play (29th Aug 2001)
diff --git a/flower/SConscript b/flower/SConscript
deleted file mode 100644 (file)
index c7e0abd..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*-python-*-
-
-name = 'flower'
-outdir = Dir ('.').path
-
-Import ('env', 'src_glob')
-sources = src_glob ('*.cc')
-
-e = env.Copy ()
-e.Append (CPPPATH = ['#/flower/include', outdir,])
-includes = src_glob ('include/*.hh')
-
-if 1: # ut
-       def test_source (x):
-               x.startswith ('test')
-       test_sources = filter (lambda x: x.startswith ('test'), sources)
-       sources = filter (lambda x: not x.startswith ('test'), sources)
-       ee = e.Copy ()
-       ee.Append (LIBS = [name, 'boost_unit_test_framework'])
-       test = ee.Program ('test' + name, test_sources)
-
-if env['static']:
-       e.Library (name, sources) 
-if not env['static'] or env['shared']:
-       e.SharedLibrary (name, sources)
-
-po = env.Command ('lilypond.po', sources + includes, env['pocommand'])
-env.Alias ('po-update', po)
index 0715589303785dc2c3233972ad630b0ae3537f93..9a2fcc4c733dd6ac0971164763bb0ac8e9bdeb41 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "cpu-timer.hh"
index bb07ebccd0f03576bedd90f0e206158d9bcf4955..2d9f1454fbe6dfc0952e31287ecd4b39fd1e1268 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 0177d40c9f70c3ff7f5b993b0ef3b79f084adfe8..513a146ad609823e2266f02a0ec1ab8c72f429d9 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 7e1f3353357ccdeff64756ad5ef31d0bfad80d6d..5d8b4259f308e6b32cf02daa8a8667dcca7005ed 100644 (file)
@@ -1,7 +1,7 @@
 /*
   process command line, GNU style.
 
-  this is Copyleft (c) 1996--2008 Han-Wen Nienhuys, <hanwen@xs4all.nl>
+  this is Copyleft (c) 1996--2009 Han-Wen Nienhuys, <hanwen@xs4all.nl>
 */
 
 #include "getopt-long.hh"
index 88eeda35d55d62323c89845b3e9765abdeb0c1a1..f626aac7498010b6000d2894aacb5bbecb1edc22 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ARITHMETIC_OPERATOR_HH
index 667a76749b77537fe4564802b2bd1ab0b6ed9eb6..46b159b14fd109f62a756d6cbf3e83358cc23cf1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef AXES_HH
index 855c99eaa07efd17dc292ec3e9cbcd02b3bac48d..febadd3d551d3537951efa25de7bcbd62c9b0915 100644 (file)
@@ -1,7 +1,7 @@
 /*
   flowerlib
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 #ifndef COMPARE_HH
 #define COMPARE_HH
index d5be05056cdb2017bbbfa05ae87ab8b89030bae7..ff7d5bb0d79371df51302d0782e4343b1b640d5a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CPU_TIMER_HH
index ceff68fe5506dc135e5cfebba40f0e4b203f79bc..fab90f19d58affa6a8f786310de0ca2952326d94 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DIRECTION_HH
index a184a897209ba20e78bae1abd52ec3aecd5b447e..b895dc9c640d626a65040110297bac7d8836731f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DRUL_ARRAY_HH
index 649521fa71f1a7f5ea834dc9d84fc2f51541b386..a840aea74f494f6bd9609dc74519316d2a2adcef 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef FILE_NAME_HH
index e66ddfa0d4cd38d4873acfc7e63f389b60d6a88e..ee62d94b156b7acc7248818f610f99a3e3983515 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef FILE_PATH_HH
index 43ca4df6893abdbfadb00f39aa18051e8a8def5b..34e56961a11f874029b02fb202419364b092182c 100644 (file)
@@ -1,7 +1,7 @@
 /*
   flower-proto.hh -- typenames in flowerlib
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef FLOWER_PROTO_HH
index 3d1f85a6ccc79464ce7b6866dd63b55c255e2c54..c40e3b3b35c0ecb6010cc3b93ccb09cafd2c409f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GUILE_COMPATIBILITY_HH
index 1e8b3fad219d0383aaacff44ccf42f0e18bf1bd8..f4216736a282d31bc079243b09644921d9e5b1cb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef INTERNATIONAL_HH
index 9808bfaef652768c93d8bb97dd0b1f02716fd030..a38c14b0fcf3fde52850e3a006f5485130444ffc 100644 (file)
@@ -1,7 +1,7 @@
 /*
   interval.hh -- part of flowerlib
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef INTERVAL_HH
index 5ff1e416657d57bc781ca944a75471074000776d..faf9f3db028fc4643b1c38903cbb8a417a597f35 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef INTERVAL_TCC
index 51e5b20373131a3373509218081e0a9c1e40627b..4378a11aca2c4f83a29e7dd37abe42875fa5f80c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the flowerlib
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef LIBC_EXTENSION_HH
index 6e2c7818187fab82fa6c9f15335388219d79e425..6706c58878a2f9d94660c93accf514d2be931eea 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef MATRIX_HH
index ab8a183a6faf3ac1a6044a9f695053017f7fb7fa..438463dc09ce613f01df52a17e72790a970e1445 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MEMORY_STREAM_HH
index 3b89aa86086842c1c8352e8dbaaf9a9c7494a11a..9be837ea7465e6ccf9d245e6c10cb8a447a97c9a 100644 (file)
@@ -1,7 +1,7 @@
 /*
   offset.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef OFFSET_HH
index 619532bbed690abc16190bf9a05987f7c2c08f8a..bef32612f007d2dcf5de344a11540cac20d4ed11 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PARRAY_HH
index 144ba3d1d1dadd0c8b0671b2d9580b7f13e55d8a..54c38a8dbea13b84c308a589cb26d9ab691fbde5 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * poly.h -- routines for manipulation of polynomials in one var
  *
- * (c) 1993--2008 Han-Wen Nienhuys
+ * (c) 1993--2009 Han-Wen Nienhuys
  */
 
 #ifndef POLY_H
index fa28ca011d574eec179824653de1368fabcdda97..6ee7e3a74af232e5ffc919ae97ee419e847b9ab4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PQUEUE_HH
index 0129cea773dd22da6a64fdfc357549d44cf5f46e..ff149008058e7a77e235c104a3cafb274bc0b367 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef RATIONAL_HH
index 9ab3540ce4412e8fb929dd699baccd613be5bc25..eba8a50b8e75468cf39a7c85089ff382a8107062 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef REAL_HH
index 8ae6dfa5af5cbbf8846ac019ca46103df3484c82..4cf82d33fd4f8105fffab208456723deadc039ed 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2006--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef STD_STRING_HH
index 76a11bb9252237189463c667290df2cd01ecc183..1b7ae238561f86b9615205ffb07b9bda9a774bc7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2006--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef STD_VECTOR_HH
index e9db6e8436e01795a83022a8e701fc7782cfca5e..1b47e14914910a9cef98f6365029104cb0648148 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
 
 */
 
index 57431f49082de48e222e6801fdc2fa2e89fdb356..b3b9cf008ec084c74d3a00e2b6d9767e2ea76ab4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef VIRTUAL_METHODS_HH
index f3f95c85640ea48fdb0bf1c64a5c2517c2f0e1cf..eafdccaeca2138c43855fecd88dedcbda092cf92 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef WARN_HH
index 6a493b5e6e5d298b0e2372b5941744828906f084..7c27dde6cc38d39fee172dfb288a479a444b39ce 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "config.hh"
index fcfa18dbd7fcdedba4bc490278e0090fd9734783..64f431f4f5589df47505e47652d20d3909265a14 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "interval.hh"
index 697c527c447f8d57117361bb0f7940c12e2b665b..cca8771e7348b92d0bdd614f2fdcd7d860622546 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the flowerlib
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index dbf6fd83f29555605f4fe42fc7ca5c8f77d3a86c..29917e79b0d7a4f0d663fbe428cec31760286aff 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cassert>
index 67b97865e55ebe5f723fd2f717616257b72f9d48..4693c113ef05b488d7cae97ea3f8da09e7852a28 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "offset.hh"
index 56deefb714f739b111a150df40b69bd9b541e899..b34700b2d0d77dadf92a32d66074926708499e30 100644 (file)
@@ -1,7 +1,7 @@
 /*
   poly.cc -- routines for manipulation of polynomials in one var
 
-  (c) 1993--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1993--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "polynomial.hh"
index a1a87fb29e808b12dea0627cb23e9abb1287e524..f1d661a736fc8aac67e07c367e7442698e20c63e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rational.hh"
index ec5ddffbd4bd05f013b666004938e7350a50ec15..285c51883c5d1fc0a7727816a3e99ab0e5da2e03 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008  Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2006--2009  Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "std-string.hh"
index 74be7c2453ba6c22666639b7d7043d96e1ba8eaf..8529477cde86f7f1c2efecd1f2b2dc14c5184ceb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the Flower Library
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "warn.hh"
diff --git a/input/SConscript b/input/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
index f91dacd38d76370acdd7c6f70adcbacb75f3ffbc..e479c09c0eebc7d26f615b4a816641c434e20639 100644 (file)
@@ -22,7 +22,7 @@ IN_ITELY_FILES = $(call src-wildcard,*-intro.itely)
 GENERATED_ITELY_FILES = $(IN_ITELY_FILES:%-intro.itely=$(outdir)/%.itely)
 
 $(outdir)/%.itely: %-intro.itely %.snippet-list
-       xargs $(PYTHON) $(buildscript-dir)/lys-to-tely.py -f doctitle,texidoc,verbatim --name=$@ --template=$< < $(filter %.snippet-list, $^)
+       xargs $(LYS_TO_TELY) -f doctitle,texidoc,verbatim --name=$@ --template=$< < $(filter %.snippet-list, $^)
 
 $(outdir)/lilypond-snippets.texi: $(GENERATED_ITELY_FILES) $(LY_FILES)
 
index 1906148776d36dab7a81cd11795bb77bcd3170bc..8c8683f2165a67672b45fe5b3e1297df84b73667 100644 (file)
@@ -3,7 +3,7 @@ http://lsr.dsi.unimi.it/
 
 To update this directory, do at top of the source tree
 
-buildscripts/makelsr.py DIR
+scripts/auxiliar/makelsr.py DIR
 
 where DIR is the directory unpacked from lsr-snippets-doc-DATE tarball
 available on http://lsr.dsi.unimi.it/download.
diff --git a/input/lsr/SConscript b/input/lsr/SConscript
deleted file mode 100644 (file)
index c534e35..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'collate')
-collate (title = 'LilyPond Examples')
index 22a086f55175aca4bdf269d10d4801afc0f81b68..7ab5021104d91022fc59c1103a8d4bf4e392d9b6 100644 (file)
@@ -15,14 +15,13 @@ dentro de un contexto @code{Staff}). Se puede elegir entre
 centrado) y @code{#DOWN} (o @code{#-1}, abajo).
 
 Como podemos ver, esta propiedad se puede cambiar tantas veces
-como queramos. Utilice @code{\\once \\override} si no quiere que el
+como queramos.  Utilice @code{\\once \\override} si no quiere que el
 truco se aplique a toda la partitura.
 
 "
   doctitlees = "Añadir un bajo cifrado encima o debajo de las notas"
-
-  doctitlefr = "Ajout d'une basse chiffrée au-dessus ou au-dessous des notes"
   
+  doctitlefr = "Ajout d'une basse chiffrée au-dessus ou au-dessous des notes"
 
   texidoc = "
 When writing a figured bass, here's a way to specify if you want your
index c5077dc34c7e898f16deae0d0fdf7293e5c1fce5..6bdbc5fe1be4d2fabd5093747f05a568cea81329 100644 (file)
@@ -39,7 +39,7 @@ sections (enclosed within curly braces).
 {
   r16[ g16 \times 2/3 { r16 e'8] }
   g16( a \times 2/3 { b d e') }
-  g8[( a \times 2/3 { b d') e']~ }
+  g8[( a \times 2/3 { b d') e'] ~ }
   \time 2/4
   \times 4/5 { e'32\( a b d' e' } a'4.\)
 }
index 41127f6e3282fdfbdccf0776fe8c72cba078b132..80aeac3c941fdcb1e7baca144a6885ad25b9c0c0 100644 (file)
@@ -17,6 +17,20 @@ de líneas.
 "
   doctitlees = "Escritura de partes de percusión"
 
+  texidocfr = "
+Grâce à la puissance des outils préconfigurés tels que la fonction
+@code{\\drummode} et le contexte @code{DrumStaff}, la saisie de 
+parties pour percussions est extrêmement simplifiée : chaque composant
+d'une batterie trouve sa place sur une portée dédiée (avec une clef 
+spécifique) et les têtes de note sont spécifiques à chaque élément.  
+Il est également possible d'affecter un symbole particulier à chaque 
+élément, tout comme de restreindre le nombre de lignes de la portée.
+
+"
+
+  doctitlefr = "Ajout de parties de batterie"
+
+
   texidoc = "
 Using the powerful pre-configured tools such as the @code{\\drummode}
 function and the @code{DrumStaff} context, inputting drum parts is
index bea920b614b8fa554bb4efbeec7526a3bd70bb53..ebb28b6979235169373833c5eea2f8f86c92c68b 100644 (file)
@@ -7,10 +7,9 @@
 
   texidocfr = "Ajout de doigtés à des tablatures"
 
-  texidocfr = "
+  doctitlefr = "
 L'ajout de doigtés à des tablatures s'obtient en conjuguant des
 @code{\\markup} et des @code{\\finger}.
-
 "
 
   texidoc = "
index 4f0a37147fc8db7ed0620e3bc434222d4413ac27..baf329d475e9ac328440ad1e455f79e6771a45b1 100644 (file)
@@ -26,6 +26,6 @@ objects in parentheses.  The associated grob is
   c2-\parenthesize ->
   \override ParenthesesItem #'padding = #0.1
   \override ParenthesesItem #'font-size = #-4
-  <d \parenthesize fis a>2 
+  <d \parenthesize f a>2 
 }
 
index a6923e97b14cbd29abd66e1e9dad1db9e6a9f3c5..fed821a5b36bb5ed4872aa6885f4fc3426a58cf6 100644 (file)
@@ -8,15 +8,15 @@
   texidoces = "
 Con algo de código de Scheme, se puede añadir fácilmente la fecha
 actual a una partitura.
-
 "
   doctitlees = "Añadir la fecha actual a una partitura"
-
-  doctitlefr = "Ajout de la date du jour à une partition"
-
+  
   texidocfr = "
-Avec un peu de code Scheme, voici comment ajouter facilement 
-la date du jour à votre partition."
+Avec un peu de code Scheme, voici comment ajouter facilement
+la date du jour à votre partition.
+"
+  
+  doctitlefr = "Ajout de la date du jour à une partition"
 
   texidoc = "
 With a little Scheme code, the current date can easily be added to a
index 83e15bd307bf9baaa29b86cf4a1ac6b8c6325da0..7e2aa72d20b67c414b924645a2e872d6b7f650f9 100644 (file)
@@ -12,6 +12,14 @@ letra más cerca del pentagrama.
 "
   doctitlees = "Ajuste del especiado vertical de la letra"
 
+  texidocfr = "
+Cet extrait illustre la manière de rapprocher la ligne de paroles 
+de la portée.
+
+"
+  doctitlefr = "Ajustement de l'espacement vertical des paroles"
+
+
   texidoc = "
 This snippet shows how to bring the lyrics line closer to the staff.
 
index 34ac16d14bbe0cb93ecede48d1798feb3ea33579..ce6457e4f1be1429875a692a48f278fd767c6211 100644 (file)
@@ -17,22 +17,24 @@ Accidentals only show up if they are not part of the key signature.
 } % begin verbatim
 
 \layout {
-  ragged-right = ##t
   \context {
     \Voice
     \consists "Ambitus_engraver"
   }
 }
 
-\relative
 <<
   \new Staff {
-    \time  2/4 c4 f' 
+    \relative c' {
+      \time 2/4
+      c4 f'
+    }
   }
-  \new Staff \relative {
-    \time  2/4
-    \key d \major
-    cis as'
+  \new Staff {
+    \relative c' {
+      \time  2/4
+      \key d \major
+      cis4 as'
+    }
   }
 >>
-
index 2f1f606a5bcdcdae058226513d4e8ab480caf23f..a175e5936f093a857a485df99695ea19f8f263fc 100644 (file)
@@ -13,6 +13,13 @@ antigua.
 
   doctitlees = "Tipografía de música antigua"
 
+  texidocfr ="
+Voici comment graver la plupart, sinon tous les symboles que
+LilyPond prend en charge en matière de musique ancienne.
+
+"
+  doctitlefr = "Gravure de musique ancienne"
+
   texidoc = "
 Shown here are many (all?) of the symbols that are included in
 LilyPond's support for ancient notation.
index b0462e0b32b8a1060b0125e12302d16dd24e77b9..d0d09ef503878d5884926ecc7fa09b7fa908b3ee 100644 (file)
@@ -30,6 +30,19 @@ ein Kompromiss werden die Notenlinien nicht auf dem System, sondern
 zwischen den Systemen geschrieben.
 "
 
+  texidocfr = "
+Lorsque l'on transcrit de la musique mensurale, il est d'usage 
+d'indiquer en début de partition,  par un « incipit », les tonalité 
+et tempo originaux.  De nos jours, les musiciens ont l'habitude de 
+voir des barres de mesure qui les aide à appréhender la structure 
+rythmique.  Ces barres n'existaient pas du temps où ces œuvres ont 
+été écrites ; en fait, la métrique évoluait au fil de la pièce.  Un 
+compromis consiste à imprimer des barres de mesure entre les portées 
+plutôt que sur la portée elle-même.
+
+"
+  doctitle = "Exemples de notation ancienne -- transcription moderne de musique mensurale"
+
   texidoc = "
 When transcribing mensural music, an incipit at the beginning of the
 piece is useful to indicate the original key and tempo. While today
index 14feb5ed898dca7b73452f60702f4ad7502d92e4..2935c977a30251ec65831ac753373ddec592931b 100644 (file)
@@ -70,8 +70,6 @@ correspondence between harmonic functions and note head styles.
   doctitle = "Applying note head styles depending on the step of the scale"
 } % begin verbatim
 
-\layout { ragged-right = ##t }
-
 fragment = {
   \key c \major
   c2 d
@@ -97,4 +95,5 @@ fragment = {
       \fragment
     }
   }
+  \layout { ragged-right = ##t }
 }
index 23aed5baab2632a6ce961766e71f3231bfd6eec4..22fc8f0bf1416d8ee4dadc1b1ab2df07fb36be27 100644 (file)
@@ -22,22 +22,25 @@ specified in @code{beatLength}).
   doctitle = "Automatic beam subdivisions"
 } % begin verbatim
 
-\score {
-  \new Staff \relative c'' {
-    << {
-      \voiceOne
-      \set subdivideBeams = ##t
-      b32[ a g f c' b a g b^"subdivide beams" a g f c' b a g]
-      \oneVoice
-    }
-    \new Voice {
-      \voiceTwo
-      b32_"default"[ a g f c' b a g b a g f c' b a g]
-    } >>
+\new Staff {
+  \relative c'' {
+    <<
+      {
+        \voiceOne
+        \set subdivideBeams = ##t
+        b32[ a g f c' b a g
+        b32^"subdivide beams" a g f c' b a g]
+      }
+      \new Voice {
+        \voiceTwo
+        b32_"default"[ a g f c' b a g
+        b32 a g f c' b a g]
+      }
+    >>
+    \oneVoice
     \set beatLength = #(ly:make-moment 1 8)
     b32^"beatLength 1 8"[ a g f c' b a g]
     \set beatLength = #(ly:make-moment 1 16)
     b32^"beatLength 1 16"[ a g f c' b a g]
   }
 }
-
index b78275f82b0e7b9e5e34b6d6d94dedf454ca57c2..6d4cbc3a6edd59cbace26db3a5827372acffe54e 100644 (file)
@@ -41,17 +41,21 @@ qBeam = {
 
 \score {
   <<
-    \new Staff \relative c'' {
-      \time 4/4
-      g8^\markup { without the macro } g g g g g g g
-      g8 g g g4 g8 g g
+    \new Staff {
+      \relative c'' {
+        \time 4/4
+        g8-"without the macro" g g g g g g g
+        g8 g g g4 g8 g g
+      }
     }
     %Use the macro
-    \new Staff \relative c'' {
-      \time 4/4
-      \qBeam
-      g8^\markup { with the macro } g g g g g g g
-      g8 g g g4 g8 g g
+    \new Staff {
+      \relative c'' {
+        \time 4/4
+        \qBeam
+        g8-"with the macro" g g g g g g g
+        g8 g g g4 g8 g g
+      }
     }
   >>
   \layout {
diff --git a/input/lsr/avoiding-collisions-of-chord-fingering-with-beams.ly b/input/lsr/avoiding-collisions-of-chord-fingering-with-beams.ly
deleted file mode 100644 (file)
index d91981e..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-%% Do not edit this file; it is auto-generated from LSR http://lsr.dsi.unimi.it
-%% This file is in the public domain.
-\version "2.12.0"
-
-\header {
-  lsrtags = "rhythms, editorial-annotations, chords, tweaks-and-overrides"
-
-  texidoces = "
-Las digitaciones y los números de cuerda aplicados a notas
-individuales evitan a las barras automáticamente, pero de forma
-predeterminada esto no es cierto para las digitaciones y números
-de cuerda que se aplican a notas concretas de acordes.  El ejemplo
-siguiente muestra cómo se puede sobreescribir este comportamiento
-predeterminado:
-
-"
-  doctitlees = "Evitar colisiones entre digitaciones de acordes y barras de corchea"
-
-  texidoc = "
-Fingerings and string numbers applied to individual notes will
-automatically avoid beams, but this is not true by default for
-fingerings and string numbers applied to the individual notes of
-chords.  The following example shows how this default behavior can be
-overridden:   
-
-"
-  doctitle = "Avoiding collisions of chord fingering with beams"
-} % begin verbatim
-
-\relative c' {
-  \set fingeringOrientations = #'(up)
-  \set stringNumberOrientations = #'(up)
-  \set strokeFingerOrientations = #'(up)
-  
-  % Default behavior
-  r8
-  <f c'-5>8
-  <f c'\5>8
-  <f c'-\rightHandFinger #2 >8
-  
-  % Corrected to avoid collisions
-  r8
-  \override Fingering #'add-stem-support = ##t
-  <f c'-5>8
-  \override StringNumber #'add-stem-support = ##t
-  <f c'\5>8
-  \override StrokeFinger #'add-stem-support = ##t
-  <f c'-\rightHandFinger #2 >8
-}
diff --git a/input/lsr/avoiding-collisions-with-chord-fingerings.ly b/input/lsr/avoiding-collisions-with-chord-fingerings.ly
new file mode 100644 (file)
index 0000000..4ce8094
--- /dev/null
@@ -0,0 +1,38 @@
+%% Do not edit this file; it is auto-generated from LSR http://lsr.dsi.unimi.it
+%% This file is in the public domain.
+\version "2.12.0"
+
+\header {
+  lsrtags = "rhythms, editorial-annotations, chords, tweaks-and-overrides"
+
+  texidoc = "
+Fingerings and string numbers applied to individual notes will
+automatically avoid beams and stems, but this is not true by default
+for fingerings and string numbers applied to the individual notes of
+chords.  The following example shows how this default behavior can be
+overridden.
+
+"
+  doctitle = "Avoiding collisions with chord fingerings"
+} % begin verbatim
+
+\relative c' {
+  \set fingeringOrientations = #'(up)
+  \set stringNumberOrientations = #'(up)
+  \set strokeFingerOrientations = #'(up)
+  
+  % Default behavior
+  r8
+  <f c'-5>8
+  <f c'\5>8
+  <f c'-\rightHandFinger #2 >8
+  
+  % Corrected to avoid collisions
+  r8
+  \override Fingering #'add-stem-support = ##t
+  <f c'-5>8
+  \override StringNumber #'add-stem-support = ##t
+  <f c'\5>8
+  \override StrokeFinger #'add-stem-support = ##t
+  <f c'-\rightHandFinger #2 >8
+}
index 2009bb2528e7be93efc9de296e6934e1e04456b7..06cc98f352c3bb14cf30ad5d6752c1cc4627c6b7 100644 (file)
@@ -20,12 +20,13 @@ function.
   doctitle = "Changing \\flageolet mark size"
 } % begin verbatim
 
-smallFlageolet = #(let ((m (make-music 'ArticulationEvent
-                          'articulation-type "flageolet")))
-       (set! (ly:music-property m 'tweaks)
-             (acons 'font-size -3
-                    (ly:music-property m 'tweaks)))
-       m)
+smallFlageolet =
+#(let ((m (make-music 'ArticulationEvent
+                      'articulation-type "flageolet")))
+   (ly:music-set-property! m 'tweaks
+     (acons 'font-size -3
+       (ly:music-property m 'tweaks)))
+  m)
 
 \layout { ragged-right = ##f }
 
index c540db358e89d8d51cb95a7d5fbe1867f9ba1895..3e74c2921e345a29304b8a68483a9bbd9a2b6624 100644 (file)
@@ -37,7 +37,8 @@ be printed, or the tuplet number may be suppressed altogether.
 } % begin verbatim
 
 \relative c'' {
-  \times 2/3 { c8 c c } \times 2/3 { c8 c c }
+  \times 2/3 { c8 c c }
+  \times 2/3 { c8 c c }
   \override TupletNumber #'text = #tuplet-number::calc-fraction-text
   \times 2/3 { c8 c c }
   \override TupletNumber #'stencil = ##f
index 988f1c1f50e44b1e6b8200776d1e9c8abd30b56e..52773268fd7dafd6dd063f21ecb9b15f497ad826 100644 (file)
@@ -20,7 +20,7 @@ aren't always the same length.
   doctitle = "Chant or psalms notation"
 } % begin verbatim
 
-stemOn = { \override Staff.Stem #'transparent = ##f }
+stemOn = { \revert Staff.Stem #'transparent }
 stemOff = { \override Staff.Stem #'transparent = ##t }
 
 \score {
index 6d057c919209c1d7768912b0282627bbd9788475..5e3faa93877a7ebe010fc9afb0665364ab8fffbb 100644 (file)
@@ -1,6 +1,6 @@
 adding-a-figured-bass-above-or-below-the-notes.ly
 adding-bar-lines-to-chordnames-context.ly
-avoiding-collisions-of-chord-fingering-with-beams.ly
+avoiding-collisions-with-chord-fingerings.ly
 changing-chord-separator.ly
 changing-the-chord-names-to-german-or-semi-german-notation.ly
 changing-the-positions-of-figured-bass-alterations.ly
index b1a6a07f3b81da2d0945333b856ac331c2c2c902..5e667425d3725a083ee7c4dc744728b14f59f552 100644 (file)
@@ -3,12 +3,15 @@
 \version "2.12.0"
 
 \header {
-  lsrtags = "expressive-marks, editorial-annotations, tweaks-and-overrides"
-  texidoc = "Creating a delayed turn, where the lower note of the
-  turn uses the accidental, requires several overrides.  The
-  @code{outside-staff-priority} property must be set to #f, as otherwise
-  this would take precedence over the @code{avoid-slur property}.  The
-  value of @code{halign} is used to position the turn horizontally."
+  lsrtags = "expressive-marks, editorial-annotations,tweaks-and-overrides"
+
+  texidoc = "
+Creating a delayed turn, where the lower note of the
+turn uses the accidental, requires several overrides.  The
+@code{outside-staff-priority} property must be set to @code{#f},
+as otherwise this would take precedence over the
+@code{avoid-slur property}.  The value of @code{halign} is used
+to position the turn horizontally."
 
   doctitle = "Creating a delayed turn"
 } % begin verbatim
index 9098fe7927fdd8edcf976d36967e05365f259b96..acaae74b0a697a417cbe344d38e65bc6fcabe4e9 100644 (file)
@@ -50,29 +50,28 @@ throughout Mars, from Gustav Holst's The Planets.
    'element elt))
 
 
-rhythm = #(define-music-function (parser location note) (ly:music?)
-          "Make the rhythm in Mars (the Planets) at the given note's pitch"
-          (let* ((p (ly:music-property
-                      (car (ly:music-property note 'elements))
-                      'pitch)))
-          (seq-music-list (list
-            (make-triplet (seq-music-list (list
-              (make-note p (ly:make-duration 3 0 2 3))
-              (make-note p (ly:make-duration 3 0 2 3))
-              (make-note p (ly:make-duration 3 0 2 3))
-            )))
-            (make-note p (ly:make-duration 2 0))
-            (make-note p (ly:make-duration 2 0))
-            (make-note p (ly:make-duration 3 0))
-            (make-note p (ly:make-duration 3 0))
-            (make-note p (ly:make-duration 2 0))
-          ))))
+rhythm =
+#(define-music-function (parser location note) (ly:music?)
+  "Make the rhythm in Mars (the Planets) at the given note's pitch"
+  (let ((p (ly:music-property
+              (car (ly:music-property note 'elements))
+              'pitch)))
+  (seq-music-list (list
+    (make-triplet (seq-music-list (list
+      (make-note p (ly:make-duration 3 0 2 3))
+      (make-note p (ly:make-duration 3 0 2 3))
+      (make-note p (ly:make-duration 3 0 2 3))
+    )))
+    (make-note p (ly:make-duration 2 0))
+    (make-note p (ly:make-duration 2 0))
+    (make-note p (ly:make-duration 3 0))
+    (make-note p (ly:make-duration 3 0))
+    (make-note p (ly:make-duration 2 0))
+  ))))
 
-\score {
-  \new Staff {
-    \time 5/4
-    \rhythm c'
-    \rhythm c''
-    \rhythm g
-  }
+\new Staff {
+  \time 5/4
+  \rhythm c'
+  \rhythm c''
+  \rhythm g
 }
index 02b4cab45bbbbadbea26b2f0d17c520b868573ba..13d67688b58f172e95f0f33fbd1e952819217a69 100644 (file)
@@ -33,21 +33,23 @@ solo violin, BWV 1004.
 } % begin verbatim
 
 \relative c' {
-  << {
-    d16( a') s a s a[ s a] s a[ s a]
-  }
-  \\
-  {
-    \slurUp
-    bes,16[ s e](
-    \hideNotes a)
-    \unHideNotes f[(
-    \hideNotes a)
-    \unHideNotes fis](
-    \hideNotes a)
-    \unHideNotes g[(
-    \hideNotes a)
-    \unHideNotes gis](
-    \hideNotes a)
-  } >>
+  <<
+    {
+      d16( a') s a s a[ s a] s a[ s a]
+    }
+    \\
+    {
+      \slurUp
+      bes,16[ s e](
+      \hideNotes a)
+      \unHideNotes f[(
+      \hideNotes a)
+      \unHideNotes fis](
+      \hideNotes a)
+      \unHideNotes g[(
+      \hideNotes a)
+      \unHideNotes gis](
+      \hideNotes a)
+    }
+  >>
 }
index 79ce6efa276348a481e89aa9a0d333ce801bffcf..f326d4f41bc31f35e124d46a111e07362a3b8975 100644 (file)
@@ -54,8 +54,8 @@ This snippet shows how to achieve such notation rules.
   }
   \layout {
     \context {
-    \Staff
-    \remove "Key_engraver"
+      \Staff
+      \remove "Key_engraver"
     }
   }
 }
index 652c2b3f99b107363b4aaf36267532aa84f0f6a1..884345679d93a9d5510424fe5a3a50029f460842 100644 (file)
@@ -2,7 +2,7 @@ adding-fingerings-to-a-score.ly
 allowing-fingerings-to-be-printed-inside-the-staff.ly
 analysis-brackets-above-the-staff.ly
 applying-note-head-styles-depending-on-the-step-of-the-scale.ly
-avoiding-collisions-of-chord-fingering-with-beams.ly
+avoiding-collisions-with-chord-fingerings.ly
 blanking-staff-lines-using-the--whiteout-command.ly
 changing-a-single-notes-size-in-a-chord.ly
 changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly
@@ -17,4 +17,5 @@ grid-lines--emphasizing-rhythms-and-notes-synchronization.ly
 making-some-staff-lines-thicker-than-the-others.ly
 marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly
 measure-counter.ly
+positioning-text-markups-inside-slurs.ly
 using-postscript-to-generate-special-note-head-shapes.ly
index e95535469b5e39d5ca13d094a7fdd82603958ae1..33515ad24d31196f5aae48692306cff9034971af 100644 (file)
@@ -28,6 +28,7 @@ laissez-vibrer-ties.ly
 line-arrows.ly
 modifying-default-values-for-articulation-shorthand-notation.ly
 piano-template-with-centered-dynamics.ly
+positioning-text-markups-inside-slurs.ly
 printing-hairpins-using-al-niente-notation.ly
 printing-metronome-and-rehearsal-marks-below-the-staff.ly
 setting-hairpin-behavior-at-bar-lines.ly
index f0c30ffbeeeb1b6a9d91c4ae64f8569d262264e3..e5de622711918ebe1d54b782ca9cf69b36d59a99 100644 (file)
@@ -59,12 +59,12 @@ no tiene nada que ver con el @code{\\set} de dos notas por detrás.)
   texidoc = "
  Flat flags on lone notes and beam nibs at the ends of beamed figures
 are both possible with a combination of @code{stemLeftBeamCount}, 
-@code{stemRightBeamCount} and paired @code{[ ]} beam indicators.
+@code{stemRightBeamCount} and paired @code{[]} beam indicators.
 
 
 
 
-For right-pointing flat flags on lone notes, use paired @code{[ ]} beam
+For right-pointing flat flags on lone notes, use paired @code{[]} beam
 indicators and set @code{stemLeftBeamCount} to zero (see Example 1).
 
 
@@ -86,16 +86,16 @@ nibs at the start of a run of beamed notes, set
 
 Sometimes it may make sense for a lone note surrounded by rests to
 carry both a left- and right-pointing flat flag. Do this with paired
-@code{[ ]} beam indicators alone (Example 4).  
+@code{[]} beam indicators alone (Example 4).  
 
 
 
 
-(Note that @code{\\set stemLeftBeamCount}is always equivalent to 
-@code{\\once \\set}.  In other words, the beam count settings aren'
-\"sticky\", so the pair of flat flags attached to the lone  @code{c'16
-[ ]} in the last example have nothing to do with the  @code{\\set} two
-notes prior.)
+(Note that @code{\\set stemLeftBeamCount} is always equivalent to 
+@code{\\once \\set}.  In other words, the beam count settings are no
+\"sticky\", so the pair of flat flags attached to the lone 
+@code{c'16[]} in the last example have nothing to do with the 
+@code{\\set} two notes prior.)
 
 
 
@@ -105,47 +105,39 @@ notes prior.)
 } % begin verbatim
 
 \score {
-<<
-% Example 1
-\new RhythmicStaff {
-  \set stemLeftBeamCount = #0
-  c'16 [ ]
-  r8.
-}
-
-% Example 2
-\new RhythmicStaff {
-  r8.
-  \set stemRightBeamCount = #0
-  c'16 [ ]
-}
-
-% Example 3
-\new RhythmicStaff {
-  c'16
-  c'16
-  \set stemRightBeamCount = #2
-  c'16
-  r16
-  r16
-  \set stemLeftBeamCount = #2
-  c'16
-  c'16
-  c'16
-}
-
-% Example 4
-\new RhythmicStaff {
-   c'16
-   c'16
-   \set stemRightBeamCount = #2
-   c'16
-   r16
-   c'16 [ ]
-   r16
-   \set stemLeftBeamCount = #2
-   c'16
-   c'16
-}
->>
+  <<
+    % Example 1
+    \new RhythmicStaff {
+      \set stemLeftBeamCount = #0
+      c16[]
+      r8.
+    }
+    
+    % Example 2
+    \new RhythmicStaff {
+      r8.
+      \set stemRightBeamCount = #0
+      c16[]
+    }
+    
+    % Example 3
+    \new RhythmicStaff {
+      c16 c
+      \set stemRightBeamCount = #2
+      c16 r r
+      \set stemLeftBeamCount = #2
+      c16 c c
+    }
+    
+    % Example 4
+    \new RhythmicStaff {
+      c16 c
+      \set stemRightBeamCount = #2
+      c16 r
+      c16[]
+      r16
+      \set stemLeftBeamCount = #2
+      c16 c
+    }
+  >>
 }
index 4bbf70d0066c1a501fc714ac07400c7f0751f0e5..e2f2259ffc7e3a7d1f94b1a02c15a046e66c539b 100644 (file)
@@ -7,7 +7,7 @@
 
   texidoc = "
 This snippet demonstrates how to obtain automatic ordered rehearsal
-marks, but from the letter or number you want.
+marks, but from the letter or number desired.
 
 "
   doctitle = "Forcing rehearsal marks to start from a given letter or number"
index ee1af2a7b70cd24654e60fda4f43ce550d5d40cc..bf31bee503619638621fa5757072bb9542912d19 100644 (file)
@@ -29,9 +29,10 @@ Beaming patterns may be altered with the @code{beatGrouping} property:
 
 \relative c'' {
   \time 5/16
+  #(override-auto-beam-setting '(end * * 5 16) 5 16)
   \set beatGrouping = #'(2 3)
-  c8[^"(2+3)" c16 c8]
+  c8^"(2+3)" c16 c8
   \set beatGrouping = #'(3 2)
-  c8[^"(3+2)" c16 c8]
+  c8^"(3+2)" c16 c8
 }
 
index b77b8746e361a9fb114b84e44c69425c54ef719a..8a76a480972a92f32958afe1b2da3fba552dc208 100644 (file)
@@ -34,35 +34,30 @@ with melody notes, chord names, and fret diagrams.
       c1 f g c
     }
   }
-
   \new FretBoards {
     \chordmode {
       c1 f g c
     }
   }
-
-
   \new Voice \with {
-    \consists Pitch_squash_engraver
-  } \relative c'' {
-    \improvisationOn
-    c4 c8 c c4 c8 c
-    f4 f8 f f4 f8 f
-    g4 g8 g g4 g8 g
-    c4 c8 c c4 c8 c
+    \consists "Pitch_squash_engraver"
+  } {
+    \relative c'' {
+      \improvisationOn
+      c4 c8 c c4 c8 c
+      f4 f8 f f4 f8 f
+      g4 g8 g g4 g8 g
+      c4 c8 c c4 c8 c
+    }
   }
-
-
   \new Voice = "melody" {
     \relative c'' {
-      \improvisationOff
       c2 e4 e4
       f2. r4
       g2. a4
       e4 c2.
     }
   }
-
   \new Lyrics {
     \lyricsto "melody" {
       This is my song.
index 21bb835877081096e128fc5bf2a1fb3058acb5ca..e8295eec4319820a180fad35e300edda5711add2 100644 (file)
@@ -23,7 +23,7 @@ incipit =
     \once \override Staff.InstrumentName #'self-alignment-Y = #UP
     \once \override Staff.InstrumentName #'Y-offset = #4
     \once \override Staff.InstrumentName #'padding = #0.3
-    \once \override Staff.InstrumentName #'stencil = 
+    \once \override Staff.InstrumentName #'stencil =
     #(lambda (grob)
        (let* ((instrument-name (ly:grob-property grob 'long-text))
               (layout (ly:output-def-clone (ly:grob-layout grob)))
@@ -47,7 +47,7 @@ incipit =
          (ly:output-def-set-variable! layout 'ragged-last #f)
          (ly:output-def-set-variable! layout 'system-count 1)
          (ly:score-add-output-def! score layout)
-         (set! (ly:grob-property grob 'long-text)
+         (ly:grob-set-property! grob 'long-text
                (markup #:score score))
          (ly:system-start-text::print grob)))
   #})
@@ -58,9 +58,7 @@ global = {
   \set Score.skipBars = ##t
   \key g \major
   \time 4/4
-  
-  %make the staff lines invisible on staves
-  \override Staff.BarLine #'transparent = ##t
+
   % the actual music
   \skip 1*8
 
@@ -246,25 +244,19 @@ bassusLyrics = \lyricmode {
         \incipit \bassusIncipit
         \bassusNotes
       >>
+      \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics }
     >>
-    \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics }
-    %% Keep the bass lyrics outside of the staff group to avoid bar lines
-    %% between the lyrics.
   >>
   \layout {
     \context {
       \Score
-      %% no bar lines in staves
+      %% no bar lines in staves or lyrics
       \override BarLine #'transparent = ##t
     }
-    %% the next three instructions keep the lyrics between the bar lines
+    %% the next two instructions keep the lyrics between the bar lines
     \context {
       \Lyrics
-      \consists "Bar_engraver" 
-      \override BarLine #'transparent = ##t
-    } 
-    \context {
-      \StaffGroup
+      \consists "Bar_engraver"
       \consists "Separating_line_group_engraver"
     }
     \context {
index f334b8bbc7440b7d2a2be7fac668a2e048d1c1b7..75c90e6579ac5621c024310d0c6474ce279c73be 100644 (file)
@@ -21,16 +21,18 @@ flag from interfering with tie positioning, the stem is extended.
 
 \relative c'' {
   \time 2/4
-  << {
-    \once \override Stem #'transparent = ##t
-    \once \override Stem #'length = #8
-    b8 ~ b\noBeam
-    \once \override Stem #'transparent = ##t
-    \once \override Stem #'length = #8
-    g8 ~ g\noBeam
-  }
-  \\
-  {
-    b8 g g e
-  } >>
+  <<
+    {
+      \once \override Stem #'transparent = ##t
+      \once \override Stem #'length = #8
+      b8 ~ b\noBeam
+      \once \override Stem #'transparent = ##t
+      \once \override Stem #'length = #8
+      g8 ~ g\noBeam
+    }
+    \\
+    {
+      b8 g g e
+    }
+  >>
 }
index 30609a3b333dc3e19b886c8e72a58b1a1c89ff6f..910266ba6b23dea530581c1e3aadd87ebc049696 100644 (file)
@@ -18,10 +18,10 @@ Beam positions may be controlled manually, by overriding the
 
 \relative c' {
   \time 2/4
-  % from upper staffline (position 4) to center (position 0)
+  % from upper staff-line (position 2) to center (position 0)
   \override Beam #'positions = #'(2 . 0)
   c8 c
-  % from center to one above center (position 2)
+  % from center to one above center (position 1)
   \override Beam #'positions = #'(0 . 1)
   c8 c
 }
index c5914fd2592ec6a2768d549ea115dd8a3d4b4135..9c73e9cde6dfde7cc0d3b92181d6597c1fa7b3cb 100644 (file)
@@ -8,9 +8,7 @@
   texidoc = "
 This example shows how to put crosses on stems. Mark the beginning
 of a spoken section with the @code{\\speakOn} keyword, and end it
-with the @code{\\speakOff} keyword.  Remember to end cross sections
-before entering any rest: this function also adds crosses to the
-invisible stems of rests.
+with the @code{\\speakOff} keyword.
 "
   doctitle = "Marking notes of spoken parts with a cross on the stem"
 } % begin verbatim
@@ -18,14 +16,18 @@ invisible stems of rests.
 
 speakOn = {
   \override Stem #'stencil = #(lambda (grob)
-  (ly:stencil-combine-at-edge
-    (ly:stem::print grob)
-    Y
-    (- (ly:grob-property grob 'direction))
-    (grob-interpret-markup grob
-      (markup #:hspace -1.025 #:fontsize -4
-        #:musicglyph "noteheads.s2cross"))
-    -2.3 0))
+    (let* ((x-parent (ly:grob-parent grob X))
+           (is-rest? (ly:grob? (ly:grob-object x-parent 'rest))))
+      (if is-rest?
+        empty-stencil
+        (ly:stencil-combine-at-edge
+          (ly:stem::print grob)
+          Y
+          (- (ly:grob-property grob 'direction))
+          (grob-interpret-markup grob
+            (markup #:hspace -1.025 #:fontsize -4
+              #:musicglyph "noteheads.s2cross"))
+          -2.3 0))))
 }
 
 speakOff = {
index 081ff01c58ba6deb4c8912ab496689f3fe56809a..449164be3b8ac44351f2616975061ae34b54ebde 100644 (file)
@@ -14,24 +14,24 @@ can be printed on the same staff line, using the following setting.
   doctitle = "Merging multi-measure rests in a polyphonic part"
 } % begin verbatim
 
-normalPos= \revert MultiMeasureRest #'staff-position
+normalPos = \revert MultiMeasureRest #'staff-position
 
 {
   <<
     {
-       c''1
-       R1
-       c''1
-       \normalPos
-       R1
-     }
-     \\
-     {
-       c'1
-       R1
-       c'1
-       \normalPos
-       R1
-     }
+      c''1
+      R1
+      c''1
+      \normalPos
+      R1
+    }
+    \\
+    {
+      c'1
+      R1
+      c'1
+      \normalPos
+      R1
+    }
   >>
 }
index cf3999b27259daf5aa63078c78a3d40586d93664..772c4dad1d8e96d986dcab6bb4b0c19a5c9a6ab0 100644 (file)
@@ -72,6 +72,10 @@ Alternatively, for each item in the list, using the more concise format
 all octaves.
 
 
+For microtonal scales where a \"sharp\" is not 100 cents, @code{alter}
+refers to the alteration as a proportion of a 200-cent whole tone.
+
+
 Here is an example of a possible key signature for generating a
 whole-tone scale: 
 
index 56175e1892df283e94525c5c0ec0ae86d81a6e2a..cfbcec87c029123d1d1c313148721e8610e03a87 100644 (file)
@@ -1,10 +1,8 @@
-%% Do not edit this file; it is auto-generated from LSR http://lsr.dsi.unimi.it
+%% Do not edit this file; it is auto-generated from input/new
 %% This file is in the public domain.
 \version "2.12.0"
 
 \header {
-  lsrtags = "pitches, text"
-
   texidoces = "
 Internamente, la función @code{set-octavation} establece las
 propiedades @code{ottavation} (por ejemplo, a @code{\"8va\"} o a
@@ -26,18 +24,17 @@ und @code{middleCPosition}.  Um den Text der Oktavierungsklammer zu
 
 doctitlede = "Ottava-Text"
 
+  lsrtags = "pitches, text"
   texidoc = "
-Internally, the @code{set-octavation} function sets the properties
-@code{ottavation} (for example, to @code{\"8va\"} or @code{\"8vb\"})
-and @code{middleCPosition}.  To override the text of the bracket, set
-@code{ottavation} after invoking @code{set-octavation}.
-
-
-
+Internally, @code{\\ottava} sets the properties @code{ottavation}
+(for example, to @code{\"8va\"} or @code{\"8vb\"}) and
+@code{middleCPosition}.  To override the text of the bracket, set
+@code{ottavation} after invoking @code{\\ottava}.
 "
   doctitle = "Ottava text"
 } % begin verbatim
 
+
 {
   \ottava #1
   \set Staff.ottavation = #"8"
index 314976cf2d37a9a8008addbb360b64ff6ca00ac8..cb9b9727d6ad7d82e0a20c7902ef469f449fd4ef 100644 (file)
@@ -44,9 +44,9 @@ tuplets have to be beamed manually.
 }
 \relative c'' {
   a8
-  \repeat unfold 8 { \times 2/3 { c[ b a] } }
+  \repeat unfold 5 { \times 2/3 { c[ b a] } }
   % Insert a manual line break within a tuplet
   \times 2/3 { c[ b \bar "" \break a] }
-  \repeat unfold 2 { \times 2/3 { c[ b a] } }
+  \repeat unfold 5 { \times 2/3 { c[ b a] } }
   c8
 }
diff --git a/input/lsr/positioning-text-markups-inside-slurs.ly b/input/lsr/positioning-text-markups-inside-slurs.ly
new file mode 100644 (file)
index 0000000..b65c7d0
--- /dev/null
@@ -0,0 +1,21 @@
+%% Do not edit this file; it is auto-generated from LSR http://lsr.dsi.unimi.it
+%% This file is in the public domain.
+\version "2.12.0"
+
+\header {
+  lsrtags = "expressive-marks, editorial-annotations, tweaks-and-overrides"
+
+  texidoc = "
+Text markups need to have the @code{outside-staff-priority} property
+set to false in order to be printed inside slurs. 
+
+"
+  doctitle = "Positioning text markups inside slurs"
+} % begin verbatim
+
+\relative c'' {
+  \override TextScript #'avoid-slur = #'inside
+  \override TextScript #'outside-staff-priority = ##f
+  c2(^\markup { \halign #-10 \natural } d4.) c8
+}
+
index 3bfefdc1a4e8b0259a683d22ca22151b3373b8eb..00db6fb29de3a8fae1c54b71803b907b559302c6 100644 (file)
@@ -9,8 +9,9 @@
 In the following snippet, two parts have a completely different time
 signature, yet remain synchronized. The bar lines can no longer be
 printed at the @code{Score} level; to allow independent bar lines in
-each part, the @code{Barline_engraver} is moved from the @code{Score}
-context to the @code{Staff} context. 
+each part, the @code{Default_barline_engraver} and
+@code{Timing_translator} are moved from the @code{Score} context to the
+@code{Staff} context. 
 
 "
   doctitle = "Printing music with different time signatures"
@@ -136,5 +137,8 @@ Perkussion = \new StaffGroup <<
 >>
 
 \score {
-  <<  \Bassklarinette \Perkussion >>
+  <<
+    \Bassklarinette
+    \Perkussion
+  >>
 }
index 184a2905d30feae9f142ab93510aae397547e3c9..5e64b7d79ca9a8b8181847cb695005f77c11a0f7 100644 (file)
@@ -25,8 +25,8 @@ the appropriate duration).
 % Macro to print single slash
 rs = {
   \once \override Rest #'stencil = #ly:percent-repeat-item-interface::beat-slash
-  \once \override Rest #'thickness = #'0.48
-  \once \override Rest #'slope = #'1.7
+  \once \override Rest #'thickness = #0.48
+  \once \override Rest #'slope = #1.7
   r4
 }
 
@@ -34,16 +34,16 @@ rs = {
 comp = #(define-music-function (parser location count) ( integer?)
   #{
     \override Rest #'stencil = #ly:percent-repeat-item-interface::beat-slash
-    \override Rest #'thickness = #'0.48
-    \override Rest #'slope = #'1.7
+    \override Rest #'thickness = #0.48
+    \override Rest #'slope = #1.7
     \repeat unfold $count { r4 }
     \revert Rest #'stencil
   #}
 )
 
-\score{
+\score {
   \relative c' {
-    c d e f |
+    c4 d e f |
     \rs \rs \rs \rs |
     \comp #4 |
   }
index dc88624aeee98a59ae4c9deea7097a15da741945..75d487975c7cc2fdc394d12b4fcf7ef3c323679f 100644 (file)
@@ -2,7 +2,7 @@ adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rythms..ly
 adding-drum-parts.ly
 automatic-beam-subdivisions.ly
 automatic-beams-two-per-two-in-4-4-or-2-2-time-signature.ly
-avoiding-collisions-of-chord-fingering-with-beams.ly
+avoiding-collisions-with-chord-fingerings.ly
 beam-endings-in-score-context.ly
 beam-grouping-in-7-8-time.ly
 beams-across-line-breaks.ly
index 621f2195ca627cb89693d35385e4a92df4582a16..1abd1db2710b748fffd37e9694d3fc4b48cdc159 100644 (file)
@@ -17,7 +17,7 @@ altos:
 By specifying the context, the effect of @code{beatGrouping} can be
 limited to the context specified, and the values which may have
 been set in higher-level contexts can be overridden.  The
-@code{\set} commands must be placed @emph{after} all @code{\time}
+@code{\\set} commands must be placed @emph{after} all @code{\\time}
 commands:
 "
   doctitle = "Specifying context with beatGrouping"
@@ -36,7 +36,7 @@ commands:
     \new Voice {
       \relative c' {
         \voiceTwo
-        \set Voice.beatGrouping = #'(1 3 3)
+        \set beatGrouping = #'(1 3 3)
         f8 f f f f f f
       }
     }
index 9b9c04f4a56d7fdd7aa67a9248f6128f05832c51..9e94044ccd491153ad7d5b699df28602d7735968 100644 (file)
@@ -15,17 +15,17 @@ around some text (or other markup).
 
 % New command to add a three sided box, with sides north, west and south
 % Based on the box-stencil command defined in scm/stencil.scm
-% Note that you use ";" to comment a line in Scheme
+% Note that ";" is used to comment a line in Scheme
 #(define-public (NWS-box-stencil stencil thickness padding)
   "Add a box around STENCIL, producing a new stencil."
   (let* ((x-ext (interval-widen (ly:stencil-extent stencil 0) padding))
-        (y-ext (interval-widen (ly:stencil-extent stencil 1) padding))
-        (y-rule (make-filled-box-stencil (cons 0 thickness) y-ext))
-        (x-rule (make-filled-box-stencil
-                 (interval-widen x-ext thickness) (cons 0 thickness))))
+         (y-ext (interval-widen (ly:stencil-extent stencil 1) padding))
+         (y-rule (make-filled-box-stencil (cons 0 thickness) y-ext))
+         (x-rule (make-filled-box-stencil
+                  (interval-widen x-ext thickness) (cons 0 thickness))))
 ;    (set! stencil (ly:stencil-combine-at-edge stencil X 1 y-rule padding))
     (set! stencil (ly:stencil-combine-at-edge stencil X -1 y-rule padding))
-    (set! stencil (ly:stencil-combine-at-edge stencil Y 1 x-rule 0.0))  
+    (set! stencil (ly:stencil-combine-at-edge stencil Y 1 x-rule 0.0))
     (set! stencil (ly:stencil-combine-at-edge stencil Y -1 x-rule 0.0))
     stencil))
 
@@ -34,21 +34,18 @@ around some text (or other markup).
 #(define-markup-command (NWS-box layout props arg) (markup?)
   "Draw a box round @var{arg}.  Looks at @code{thickness},
 @code{box-padding} and @code{font-size} properties to determine line
-thickness and padding around the markup."
-  
+thickness and padding around the markup."  
   (let* ((th (chain-assoc-get 'thickness props  0.1))
-        (size (chain-assoc-get 'font-size props 0))
-        (pad (* (magstep size)
-                (chain-assoc-get 'box-padding props 0.2)))
-        (m (interpret-markup layout props arg)))
+         (size (chain-assoc-get 'font-size props 0))
+         (pad (* (magstep size)
+                 (chain-assoc-get 'box-padding props 0.2)))
+         (m (interpret-markup layout props arg)))
     (NWS-box-stencil m th pad)))
 
-
 % Test it:
 
 \layout { ragged-right = ##f }
-
-\relative c' { 
+\relative c' {
   c2^\markup { \NWS-box ABCD }
-  c^\markup { \NWS-box \note #"4" #1.0 } 
+  c2^\markup { \NWS-box \note #"4" #1.0 }
 }
index 3c612c99ebe75ffd70894013e285ae1782aac973..d6b7695aa4ac4db12e17f627620190e26f62bcfb 100644 (file)
@@ -94,7 +94,8 @@ In this manner, the most natural enharmonic notes are chosen.
 #(define  (naturalize-pitch p)
   (let* ((o (ly:pitch-octave p))
          (a (* 4 (ly:pitch-alteration p)))
-    ; alteration, a, in quarter tone steps, for historical reasons
+         ; alteration, a, in quarter tone steps,
+         ; for historical reasons
          (n (ly:pitch-notename p)))
     (cond
      ((and (> a 1) (or (eq? n 6) (eq? n 2)))
@@ -115,23 +116,23 @@ In this manner, the most natural enharmonic notes are chosen.
          (e (ly:music-property music 'element))
          (p (ly:music-property music 'pitch)))
     (if (pair? es)
-        (ly:music-set-property!
+       (ly:music-set-property!
          music 'elements
          (map (lambda (x) (naturalize x)) es)))
     (if (ly:music? e)
-        (ly:music-set-property!
+       (ly:music-set-property!
          music 'element
          (naturalize e)))
     (if (ly:pitch? p)
-        (begin
-          (set! p (naturalize-pitch p))
-          (ly:music-set-property! music 'pitch p)))
+       (begin
+         (set! p (naturalize-pitch p))
+         (ly:music-set-property! music 'pitch p)))
     music))
 
 naturalizeMusic =
 #(define-music-function (parser location m)
-                                       (ly:music?)
-                       (naturalize m))
+  (ly:music?)
+  (naturalize m))
 
 music = \relative c' { c4 d e g }
 
index c78b7e64f34bc6ba86044556d9efd7189d8dbb7f..136787c5ddab0652d80e46329cdeab154a83918b 100644 (file)
@@ -148,7 +148,7 @@ line, they do not.
   \set Staff.clefPosition = #0
   c'1
   
-  % Here we go back to the normal clef:
+  % Return to the normal clef:
 
   \set Staff.middleCPosition = #0
   c'1
index e4264b29c7d6c68410704d5492199dd2013ac0be..0c246b2e1466eec2650d35131d343ad790e2bdae 100644 (file)
@@ -1,5 +1,5 @@
 analysis-brackets-above-the-staff.ly
-avoiding-collisions-of-chord-fingering-with-beams.ly
+avoiding-collisions-with-chord-fingerings.ly
 caesura-railtracks-with-fermata.ly
 changing-a-single-notes-size-in-a-chord.ly
 changing-form-of-multi--measure-rests.ly
@@ -31,6 +31,7 @@ mensurstriche-layout-bar-lines-between-the-staves.ly
 nesting-staves.ly
 percent-repeat-count-visibility.ly
 positioning-multi--measure-rests.ly
+positioning-text-markups-inside-slurs.ly
 printing-a-repeat-sign-at-the-beginning-of-a-piece.ly
 printing-metronome-and-rehearsal-marks-below-the-staff.ly
 proportional-strict-notespacing.ly
index 4493628a99cf6b73e4a8e920593b9d13f746de0c..28143c8faa7789a6ea934985d7d4b7e564436d9a 100644 (file)
@@ -5,6 +5,15 @@
 \header {
   lsrtags = "editorial-annotations, tweaks-and-overrides"
 
+  texidocfr = "
+Lorsqu'il est impossible d'obtenir facilement une allure particulière
+pour les têtes de note en recourant à la technique du @code{\\markup}, un
+code Postscript peut vous tirer d'embarras.  Voici comment générer des
+têtes ressemblant à des parallélogrammes.
+
+"
+  doctitlefr = "Utilisation de Postscript pour générer des têtes de note à l'allure particulière"
+
   texidoc = "
 When a note head with a special shape cannot easily be generated with
 graphic markup, PostScript code can be used to generate the shape. 
diff --git a/input/manual/SConscript b/input/manual/SConscript
deleted file mode 100644 (file)
index ece0a25..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'collate')
-collate (title = 'LilyPond Examples from the Manual')
diff --git a/input/mutopia/E.Satie/SConscript b/input/mutopia/E.Satie/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
diff --git a/input/mutopia/F.Schubert/SConscript b/input/mutopia/F.Schubert/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
diff --git a/input/mutopia/J.S.Bach/SConscript b/input/mutopia/J.S.Bach/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
diff --git a/input/mutopia/R.Schumann/SConscript b/input/mutopia/R.Schumann/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
diff --git a/input/mutopia/SConscript b/input/mutopia/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
diff --git a/input/mutopia/W.A.Mozart/SConscript b/input/mutopia/W.A.Mozart/SConscript
deleted file mode 100644 (file)
index 361c902..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'mutopia')
-mutopia ()
diff --git a/input/new/SConscript b/input/new/SConscript
deleted file mode 100644 (file)
index f72bfff..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'collate')
-collate (title = 'Advanced snippets')
index 38fec619332dba9b16ad1df47b982261ce8a6b7d..16df65b6069cd1e7cf91132bed83c67f930cd4d9 100644 (file)
@@ -2,11 +2,14 @@
 
 \header {
   lsrtags = "expressive-marks, editorial-annotations, tweaks-and-overrides"
-  texidoc = "Creating a delayed turn, where the lower note of the
-  turn uses the accidental, requires several overrides.  The
-  @code{outside-staff-priority} property must be set to #f, as otherwise
-  this would take precedence over the @code{avoid-slur property}.  The
-  value of @code{halign} is used to position the turn horizontally."
+
+  texidoc = "
+Creating a delayed turn, where the lower note of the
+turn uses the accidental, requires several overrides.  The
+@code{outside-staff-priority} property must be set to @code{#f},
+as otherwise this would take precedence over the
+@code{avoid-slur property}.  The value of @code{halign} is used
+to position the turn horizontally."
 
   doctitle = "Creating a delayed turn"
 }
index ee2eab0e1b94af46e103e9776211c6d1b33287e9..f1cd3193766cafe3863ae9aced6be28701c7a253 100644 (file)
@@ -24,8 +24,8 @@ This snippet shows how to achieve such notation rules.
   }
   \layout {
     \context {
-    \Staff
-    \remove "Key_engraver"
+      \Staff
+      \remove "Key_engraver"
     }
   }
 }
index 7def51448f3d1cb88ca25fd0d29380bc9d9defde..9c5c0ab1b1bb4dfef643d1943b071f0a6857c614 100644 (file)
@@ -16,35 +16,30 @@ with melody notes, chord names, and fret diagrams.
       c1 f g c
     }
   }
-
   \new FretBoards {
     \chordmode {
       c1 f g c
     }
   }
-
-
   \new Voice \with {
-    \consists Pitch_squash_engraver
-  } \relative c'' {
-    \improvisationOn
-    c4 c8 c c4 c8 c
-    f4 f8 f f4 f8 f
-    g4 g8 g g4 g8 g
-    c4 c8 c c4 c8 c
+    \consists "Pitch_squash_engraver"
+  } {
+    \relative c'' {
+      \improvisationOn
+      c4 c8 c c4 c8 c
+      f4 f8 f f4 f8 f
+      g4 g8 g g4 g8 g
+      c4 c8 c c4 c8 c
+    }
   }
-
-
   \new Voice = "melody" {
     \relative c'' {
-      \improvisationOff
       c2 e4 e4
       f2. r4
       g2. a4
       e4 c2.
     }
   }
-
   \new Lyrics {
     \lyricsto "melody" {
       This is my song.
index 4df3bb2f96e1d8572786559b414b169d2a3b0c7a..5664d32cb1a9194505d8809e0d9368d4578f1937 100644 (file)
@@ -13,7 +13,7 @@ incipit =
     \once \override Staff.InstrumentName #'self-alignment-Y = #UP
     \once \override Staff.InstrumentName #'Y-offset = #4
     \once \override Staff.InstrumentName #'padding = #0.3
-    \once \override Staff.InstrumentName #'stencil = 
+    \once \override Staff.InstrumentName #'stencil =
     #(lambda (grob)
        (let* ((instrument-name (ly:grob-property grob 'long-text))
               (layout (ly:output-def-clone (ly:grob-layout grob)))
@@ -37,7 +37,7 @@ incipit =
          (ly:output-def-set-variable! layout 'ragged-last #f)
          (ly:output-def-set-variable! layout 'system-count 1)
          (ly:score-add-output-def! score layout)
-         (set! (ly:grob-property grob 'long-text)
+         (ly:grob-set-property! grob 'long-text
                (markup #:score score))
          (ly:system-start-text::print grob)))
   #})
@@ -48,9 +48,7 @@ global = {
   \set Score.skipBars = ##t
   \key g \major
   \time 4/4
-  
-  %make the staff lines invisible on staves
-  \override Staff.BarLine #'transparent = ##t
+
   % the actual music
   \skip 1*8
 
@@ -236,25 +234,19 @@ bassusLyrics = \lyricmode {
         \incipit \bassusIncipit
         \bassusNotes
       >>
+      \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics }
     >>
-    \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics }
-    %% Keep the bass lyrics outside of the staff group to avoid bar lines
-    %% between the lyrics.
   >>
   \layout {
     \context {
       \Score
-      %% no bar lines in staves
+      %% no bar lines in staves or lyrics
       \override BarLine #'transparent = ##t
     }
-    %% the next three instructions keep the lyrics between the bar lines
+    %% the next two instructions keep the lyrics between the bar lines
     \context {
       \Lyrics
-      \consists "Bar_engraver" 
-      \override BarLine #'transparent = ##t
-    } 
-    \context {
-      \StaffGroup
+      \consists "Bar_engraver"
       \consists "Separating_line_group_engraver"
     }
     \context {
index 501ccd2b9d1871cd8079ff7a49a1427f890b0958..47014eea84109061e870f004f681a4f25e5b09cc 100644 (file)
@@ -18,16 +18,18 @@ flag from interfering with tie positioning, the stem is extended.
 
 \relative c'' {
   \time 2/4
-  << {
-    \once \override Stem #'transparent = ##t
-    \once \override Stem #'length = #8
-    b8 ~ b\noBeam
-    \once \override Stem #'transparent = ##t
-    \once \override Stem #'length = #8
-    g8 ~ g\noBeam
-  }
-  \\
-  {
-    b8 g g e
-  } >>
+  <<
+    {
+      \once \override Stem #'transparent = ##t
+      \once \override Stem #'length = #8
+      b8 ~ b\noBeam
+      \once \override Stem #'transparent = ##t
+      \once \override Stem #'length = #8
+      g8 ~ g\noBeam
+    }
+    \\
+    {
+      b8 g g e
+    }
+  >>
 }
index 184bd48e3bb69f47ed3428442d52e473e8e87c5f..bdf0224acfe35bac061b12744c842b9f6046efe1 100644 (file)
@@ -6,23 +6,25 @@
   texidoc = "
 This example shows how to put crosses on stems. Mark the beginning
 of a spoken section with the @code{\\speakOn} keyword, and end it
-with the @code{\\speakOff} keyword.  Remember to end cross sections
-before entering any rest: this function also adds crosses to the
-invisible stems of rests.
+with the @code{\\speakOff} keyword.
 "
   doctitle = "Marking notes of spoken parts with a cross on the stem"
 }
 
 speakOn = {
   \override Stem #'stencil = #(lambda (grob)
-  (ly:stencil-combine-at-edge
-    (ly:stem::print grob)
-    Y
-    (- (ly:grob-property grob 'direction))
-    (grob-interpret-markup grob
-      (markup #:hspace -1.025 #:fontsize -4
-        #:musicglyph "noteheads.s2cross"))
-    -2.3 0))
+    (let* ((x-parent (ly:grob-parent grob X))
+           (is-rest? (ly:grob? (ly:grob-object x-parent 'rest))))
+      (if is-rest?
+        empty-stencil
+        (ly:stencil-combine-at-edge
+          (ly:stem::print grob)
+          Y
+          (- (ly:grob-property grob 'direction))
+          (grob-interpret-markup grob
+            (markup #:hspace -1.025 #:fontsize -4
+              #:musicglyph "noteheads.s2cross"))
+          -2.3 0))))
 }
 
 speakOff = {
diff --git a/input/new/ottava-text.ly b/input/new/ottava-text.ly
new file mode 100644 (file)
index 0000000..6110b79
--- /dev/null
@@ -0,0 +1,23 @@
+\version "2.12.0"
+
+\header {
+  lsrtags = "pitches, text"
+  texidoc = "
+Internally, @code{\\ottava} sets the properties @code{ottavation}
+(for example, to @code{\"8va\"} or @code{\"8vb\"}) and
+@code{middleCPosition}.  To override the text of the bracket, set
+@code{ottavation} after invoking @code{\\ottava}.
+"
+  doctitle = "Ottava text"
+}
+
+{
+  \ottava #1
+  \set Staff.ottavation = #"8"
+  c''1
+  \ottava #0
+  c'1
+  \ottava #1
+  \set Staff.ottavation = #"Text"
+  c''1
+}
index 71ef3530c70577a1fd292fe29c49295cc94afd19..5744ba37ae1b306c5da9c3d5c6f9fd6f4dcf0d17 100644 (file)
@@ -6,7 +6,7 @@
 By specifying the context, the effect of @code{beatGrouping} can be
 limited to the context specified, and the values which may have
 been set in higher-level contexts can be overridden.  The
-@code{\set} commands must be placed @emph{after} all @code{\time}
+@code{\\set} commands must be placed @emph{after} all @code{\\time}
 commands:
 "
   doctitle = "Specifying context with beatGrouping"
@@ -24,7 +24,7 @@ commands:
     \new Voice {
       \relative c' {
         \voiceTwo
-        \set Voice.beatGrouping = #'(1 3 3)
+        \set beatGrouping = #'(1 3 3)
         f8 f f f f f f
       }
     }
index 84de7611ec81dabb2110fab4da1c4370c62fb44f..1ff8444f55d09245840be2912d5a2addecc70331 100644 (file)
@@ -31,7 +31,8 @@ In this manner, the most natural enharmonic notes are chosen.
 #(define  (naturalize-pitch p)
   (let* ((o (ly:pitch-octave p))
          (a (* 4 (ly:pitch-alteration p)))
-    ; alteration, a, in quarter tone steps, for historical reasons
+         ; alteration, a, in quarter tone steps,
+         ; for historical reasons
          (n (ly:pitch-notename p)))
     (cond
      ((and (> a 1) (or (eq? n 6) (eq? n 2)))
@@ -52,23 +53,23 @@ In this manner, the most natural enharmonic notes are chosen.
          (e (ly:music-property music 'element))
          (p (ly:music-property music 'pitch)))
     (if (pair? es)
-        (ly:music-set-property!
+       (ly:music-set-property!
          music 'elements
          (map (lambda (x) (naturalize x)) es)))
     (if (ly:music? e)
-        (ly:music-set-property!
+       (ly:music-set-property!
          music 'element
          (naturalize e)))
     (if (ly:pitch? p)
-        (begin
-          (set! p (naturalize-pitch p))
-          (ly:music-set-property! music 'pitch p)))
+       (begin
+         (set! p (naturalize-pitch p))
+         (ly:music-set-property! music 'pitch p)))
     music))
 
 naturalizeMusic =
 #(define-music-function (parser location m)
-                                       (ly:music?)
-                       (naturalize m))
+  (ly:music?)
+  (naturalize m))
 
 music = \relative c' { c4 d e g }
 
diff --git a/input/regression/SConscript b/input/regression/SConscript
deleted file mode 100644 (file)
index 708fea8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'collate')
-collate (title = 'LilyPond Regression Tests')
index cb7f369840f42547fd98f096da71f5ea78ef5829..44e5e529ecc5455a64ee20975ac785e9a33711f2 100644 (file)
@@ -1,5 +1,5 @@
 \header {
-  texidoc="Beams are place automatically; the last measure should have a single 
+  texidoc="Beams are placed automatically; the last measure should have a single
 beam."
 }
 
index 213031bb4dc79c54a047f14642b294add4ec9070..8e90e1d32514661ec80c1607146b14e6e07386fc 100644 (file)
@@ -8,11 +8,12 @@ time signatures. " }
 \relative c''{
 
   \time 1/2
+
   c8 c c c
   c16 c c c c c c c
   c32 c c c c c c c c c c c c c c c
   \time 1/4
-  c8 c 
+  c8 c
   c16 c c c
   c32 c c c c c c c
   \time 1/8
@@ -35,6 +36,7 @@ time signatures. " }
   \time 3/2
   c8 c c c c c c c c c c c
   c16 c c c c c c c c c c c c c c c c c c c c c c c
+  c32 c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
   \time 3/4
   c8 c c c c c
   c16 c c c c c c c c c c c
@@ -51,11 +53,21 @@ time signatures. " }
   c8 c c c
   c16 c c c c c c c
   c32 c c c c c c c c c c c c c c c
+  \time 4/16
+  c8 c
+  c16 c c c
+  c32 c c c c c c c
   \time 6/8
   c8 c c c c c
   c16 c c c c c c c c c c c
+  c32 c c c c c c c c c c c c c c c c c c c c c c c
   \time 9/8
   c8 c c c c c c c c
   c16 c c c c c c c c c c c c c c c c c
+  c32 c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
+  \time 12/8
+  c8 c c c c c c c c c c c
+  c16 c c c c c c c c c c c c c c c c c c c c c c c
+  c32 c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c
 }
 
index 94dd94820f6c5d08cbc2c52195685c892d2e7872..0f43098559b54abe8024ba76580a761a1e920df1 100644 (file)
@@ -8,8 +8,10 @@ dentro de un contexto @code{Staff}). Se puede elegir entre
 centrado) y @code{#DOWN} (o @code{#-1}, abajo).
 
 Como podemos ver, esta propiedad se puede cambiar tantas veces
-como queramos. Utilice @code{\\once \\override} si no quiere que el
+como queramos.  Utilice @code{\\once \\override} si no quiere que el
 truco se aplique a toda la partitura.
 
 "
   doctitlees = "Añadir un bajo cifrado encima o debajo de las notas"
+  
+  doctitlefr = "Ajout d'une basse chiffrée au-dessus ou au-dessous des notes"
index 123752aef25daa8a105fb7ab1d16f148d9854782..965a6e59bbae0eb5fba6feb1fb8fd8dd86235b2c 100644 (file)
@@ -9,3 +9,17 @@ de líneas.
 
 "
   doctitlees = "Escritura de partes de percusión"
+
+  texidocfr = "
+Grâce à la puissance des outils préconfigurés tels que la fonction
+@code{\\drummode} et le contexte @code{DrumStaff}, la saisie de 
+parties pour percussions est extrêmement simplifiée : chaque composant
+d'une batterie trouve sa place sur une portée dédiée (avec une clef 
+spécifique) et les têtes de note sont spécifiques à chaque élément.  
+Il est également possible d'affecter un symbole particulier à chaque 
+élément, tout comme de restreindre le nombre de lignes de la portée.
+
+"
+
+  doctitlefr = "Ajout de parties de batterie"
+
diff --git a/input/texidocs/adding-fingerings-to-tablatures.texidoc b/input/texidocs/adding-fingerings-to-tablatures.texidoc
new file mode 100644 (file)
index 0000000..4fc9caf
--- /dev/null
@@ -0,0 +1,6 @@
+  texidocfr = "Ajout de doigtés à des tablatures"
+
+  doctitlefr = "
+L'ajout de doigtés à des tablatures s'obtient en conjuguant des
+@code{\\markup} et des @code{\\finger}.
+"
index f71fe816317aca510ef20db6922c790b870c8789..4e6a67cdf7b77716643dae42cf2e08e34caf1f5a 100644 (file)
@@ -1,6 +1,12 @@
   texidoces = "
 Con algo de código de Scheme, se puede añadir fácilmente la fecha
 actual a una partitura.
-
 "
   doctitlees = "Añadir la fecha actual a una partitura"
+  
+  texidocfr = "
+Avec un peu de code Scheme, voici comment ajouter facilement
+la date du jour à votre partition.
+"
+  
+  doctitlefr = "Ajout de la date du jour à une partition"
index 3feb0bf56091fefb105d25943e98452758b7c835..f37ef0f2062026a5bf4865e9ef1034ec69511b1a 100644 (file)
@@ -4,3 +4,11 @@ letra más cerca del pentagrama.
 
 "
   doctitlees = "Ajuste del especiado vertical de la letra"
+
+  texidocfr = "
+Cet extrait illustre la manière de rapprocher la ligne de paroles 
+de la portée.
+
+"
+  doctitlefr = "Ajustement de l'espacement vertical des paroles"
+
index 2970ff6677c5cf0e2185cc30bc70664cd05184e3..a04f65fdd9816e4c84324f91ee492090e148b939 100644 (file)
@@ -5,3 +5,10 @@ antigua.
 "
 
   doctitlees = "Tipografía de música antigua"
+
+  texidocfr ="
+Voici comment graver la plupart, sinon tous les symboles que
+LilyPond prend en charge en matière de musique ancienne.
+
+"
+  doctitlefr = "Gravure de musique ancienne"
index 9907c88764b178739a9c2584064eeef0d2ce62aa..9bde0020852e29c8f88b8279740d10c63365d178 100644 (file)
@@ -22,3 +22,16 @@ Tatsächlich ändern sich die Rhythmen auch oft alle paar Noten. Als
 ein Kompromiss werden die Notenlinien nicht auf dem System, sondern 
 zwischen den Systemen geschrieben.
 "
+
+  texidocfr = "
+Lorsque l'on transcrit de la musique mensurale, il est d'usage 
+d'indiquer en début de partition,  par un « incipit », les tonalité 
+et tempo originaux.  De nos jours, les musiciens ont l'habitude de 
+voir des barres de mesure qui les aide à appréhender la structure 
+rythmique.  Ces barres n'existaient pas du temps où ces œuvres ont 
+été écrites ; en fait, la métrique évoluait au fil de la pièce.  Un 
+compromis consiste à imprimer des barres de mesure entre les portées 
+plutôt que sur la portée elle-même.
+
+"
+  doctitle = "Exemples de notation ancienne -- transcription moderne de musique mensurale"
index 77da596cffdd378ce8ffee8c4f85657176d8d826..89b0d4ba63171dcddd9a76d6c3659382c396d1ee 100644 (file)
@@ -8,3 +8,13 @@ predeterminado:
 
 "
   doctitlees = "Evitar colisiones entre digitaciones de acordes y barras de corchea"
+
+%% Translation of GIT committish: 98dc713cb34b498f145badf23d14957367a19ece
+  texidocfr = "
+Les doigtés et les numéros de cordes attachés à des notes seules
+évitent automatiquement les barres de ligature, mais ce n'est pas le cas par
+défaut pour les doigtés ou numéros de cordes attachés aux notes d'un
+accord. L'exemple qui suit montre comment ce comportement par défaut
+peut être corrigé.
+"
+  doctitlefr = "Éviter les collisions entre les doigtés d'accords et les ligatures"
diff --git a/input/texidocs/using-postscript-to-generate-special-note-head-shapes.texidoc b/input/texidocs/using-postscript-to-generate-special-note-head-shapes.texidoc
new file mode 100644 (file)
index 0000000..8007f8e
--- /dev/null
@@ -0,0 +1,8 @@
+  texidocfr = "
+Lorsqu'il est impossible d'obtenir facilement une allure particulière
+pour les têtes de note en recourant à la technique du @code{\\markup}, un
+code Postscript peut vous tirer d'embarras.  Voici comment générer des
+têtes ressemblant à des parallélogrammes.
+
+"
+  doctitlefr = "Utilisation de Postscript pour générer des têtes de note à l'allure particulière"
diff --git a/lily/SConscript b/lily/SConscript
deleted file mode 100644 (file)
index ebd623f..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'src_glob', 'install')
-
-outdir = Dir ('.').abspath
-
-cc_sources =  src_glob ('*.cc')
-sources = cc_sources + ['parser.yy', 'lexer.ll']
-includes = src_glob ('include/*.hh')
-
-e = env.Copy ()
-
-e.Append (
-       CPPPATH = [
-         '#/lily/include',
-         '#/flower/include',
-         outdir],
-       LEXFLAGS = ['-Cfe', '-p', '-p'],
-       LIBS = ['flower'],
-       )
-
-e.HH ('parser.hh', 'parser.yy')
-e.ParseConfig ('guile-config link')
-lily = e.Program ('lilypond', sources)
-install (lily, env['bindir'])
-
-# let's not, for now
-#po = env.Command ('lilypond.po', cc_sources + includes, env['pocommand'])
-#env.Alias ('po-update', po)
index 7fcea1ccfe003a658927816bee7927b495258dce..24340ed70f2057e7fae2964d77723c7df260b192 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Modified 2001--2002 by Rune Zedeler <rz@daimi.au.dk>
 */
 
index 3d4b9ef3ac840652ecd5b32e8c73d9e35e6689c8..f383a3ecc718c1b958c23ddbb4e47ea0fd59fbae 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index 1c2418500d750319a1ca67a76f21503c867f7bd5..0e81a6bea299105e2a66cf1459e2de6b8a03a588 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "accidental-interface.hh"
index 7f7b9c3cf645a9eb8df727129309f1039a29335d..27839aca920d46ce08dcce76b34271d064ac1168 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "align-interface.hh"
index 517b5a8725f04d81685f32421710001b2fb9f794..1391b1d8ff816ca7926c82682d0fec0d7796c9a6 100644 (file)
@@ -4,7 +4,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 96d8667c9dad4c18bf3478960a52b88c95745782..9721f8e8093af98b239f1e99c148c03fd7081950 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "all-font-metrics.hh"
index 79605c3b6d93094c227617e54a302fd35c17e82e..3753249d879f9089069a776453cdc2db4e69f577 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 
   Han-Wen Nienhuys <hanwen@xs4all.nl
 */
index e123538dfa2df315e52cfc59b309bcf439489b6c..85fb2978869c338590a47916ae1d4b2d93fcbdb6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "ambitus.hh"
index 3ed593be587a187b779a55199955a8a459d51cd0..7874509da21a69aeca96a8043a894ca87c6cf1d5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 062d6a816fa3cf3155eee6513329f51522f75d92..f5546ee5c607a268fce90000889f06b37787f732 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "engraver.hh"
index fcb32debcbdd6107ee5987b2427d49839f63135c..7873b5f39cc807bfe7055c9eb972855a26dd092e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "arpeggio.hh"
index 0b60edf6be790540bf8836c9e279079c6c8bffc7..4c24351aa40d2fdea2cbdcc3c1cf27e744e78c49 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "audio-column.hh"
index 9846ba54369742a8f3c355081684f09601b5d448..c3cda8b40eafefeb7bbd0b2989ea5b8001069440 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "audio-element-info.hh"
index d542bc5efc58cc38177752bb3892baa287bc5297..093724cee1605e9c4a330ed6a6998add4c19427d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #include <cassert> 
 
index b351a576252761a27f73ac45fb9e6bc70f962417..33e54d713a869b7bdfc1225fc2a9774b1ebdbe08 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "audio-item.hh"
index 73a56d6a62681569975184269b31874baa0bbcb4..bde50ae80abc7a779a00802a3a5a0e3ccf2631cf 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "audio-staff.hh"
index af4f1fc2d9fc6ae4fae6ad689fe39bcb6df0ea80..4c813a7038264d3fb0a30b14fbe29e1439a83aed 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "bar-line.hh"
index 04ed126556cc7b53d8620a13e47da5bbeeccd6db..8ac1ccf337f22eb77b702efc1ef3e2bc8a61125c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 82b5cfe37b2c3aea7378d1834a9b27bab17ecb20..4f19938ef8c3e90c3b45cc9bc7e53682fbe9be79 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "axis-group-engraver.hh"
index 98f42744b1d07e749da4e34b05e84f45b890ea4f..ff16505c7bfbf4586bad720a28b575aa0f145a22 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "axis-group-interface.hh"
index cc6ff24fc7d6a30fda4f7764b83cb9695bcface8..639c8b6267a12a6450cfe7739009e7e6b311cdbb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "axis-group-interface.hh"
index 328b4736ce2ecae8bc40d344653ee9d5ff31d26a..d13c527ef6835114b4910252dd8652fc1208aab4 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 5409bd52d556a1cf6ba6864c401293cbd94a9a80..0c82fdca8e4a35e00094b0d2f2fe5870d070c726 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "text-interface.hh"
index 5b518602ff852ffd4bb8c0cc017b2697f7903433..8ac67109bf20281ef05cb173537f6132292e13b5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 3d751ecf1282ef88d750761a2f71ddcc5424a55d..6bf118ae8b31a10ab4b06b6c5877be0adac594c2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index f13d8697c3621eb4a9e4b59a677767d5367b298c..c9d9159a4cfff26591f12404053947c623ef6cba 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "bar-line.hh"
index f5744ff76c6736b1e1bca366915d3caa34f345b9..61242297cde75b2d082373060a27a16a21150d4c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-column.hh"
index c1b9d54c30142029de847038957799090c62894b..43c1264741c186131dc34b54d72ec5f22f25db00 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "beam.hh"
index 907fcc4d1ad27acbac2242d12ece5ae127a9727c..bd85a6a1f1d40f69d730a05a6e7277e86a5f6283 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index cf933d500bc3d3071d1386fdb172e8391bb51465..ed1321450256aaa15a8a7345c7908e392a9dbb79 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index dcca55322795e4b58816788306f646a83f6d8fb2..83d82e3ccabb91e0725d06ef5053f92f184a2f80 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
@@ -341,6 +341,12 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
   Position_stem_segments_map stem_segments;
   Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
 
+  /* There are two concepts of "rank" that are used in the following code.
+     The beam_rank is the vertical position of the beam (larger numbers are
+     closer to the noteheads). Beam_stem_segment.rank_, on the other hand,
+     is the horizontal position of the segment (this is incremented by two
+     for each stem; the beam segment on the right side of the stem has
+     a higher rank (by one) than its neighbour to the left). */
   Slice ranks;
   for (vsize i = 0; i < stems.size (); i++)
     {
@@ -351,6 +357,10 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
       Direction d = LEFT;
       do
        {
+         // Find the maximum and minimum beam ranks.
+         // Given that RANKS is never reset to empty, the interval will always be
+         // smallest for the left beamlet of the first stem, and then it might grow.
+         // Do we really want this? (It only affects the tremolo gaps) --jneem
          for (SCM s = index_get_cell (beaming, d);
               scm_is_pair (s); s = scm_cdr (s))
            {
@@ -400,34 +410,51 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
 
       Beam_segment current;
 
+      // Iterate over all of the segments of the current beam rank,
+      // merging the adjacent Beam_stem_segments into one Beam_segment
+      // when appropriate.
       int vertical_count =  (*i).first;
       for (vsize j = 0; j < segs.size (); j++)
        {
-         /*
-           event_dir == LEFT: left edge of a beamsegment.
-          */
+         // Keeping track of the different directions here is a little tricky.
+         // segs[j].dir_ is the direction of the beam segment relative to the stem
+         // (ie. segs[j].dir_ == LEFT if the beam segment sticks out to the left of
+         // its stem) whereas event_dir refers to the edge of the beam segment that
+         // we are currently looking at (ie. if segs[j].dir_ == event_dir then we
+         // are looking at that edge of the beam segment that is furthest from its
+         // stem).
          Direction event_dir = LEFT;
+         Beam_stem_segment const& seg = segs[j];
          do
            {
-             bool on_line_bound = (segs[j].dir_ == LEFT) ? segs[j].stem_index_ == 0
-               : segs[j].stem_index_ == stems.size() - 1;
+             Beam_stem_segment const& neighbor_seg = segs[j + event_dir];
+             // TODO: make names clearer? --jneem
+             // on_line_bound: whether the current segment is on the boundary of the WHOLE beam
+             // on_beam_bound: whether the current segment is on the boundary of just that part
+             //   of the beam with the current beam_rank
+             bool on_line_bound = (seg.dir_ == LEFT) ? seg.stem_index_ == 0
+               : seg.stem_index_ == stems.size() - 1;
              bool on_beam_bound = (event_dir == LEFT) ? j == 0 :
                j == segs.size () - 1;
              bool inside_stem = (event_dir == LEFT)
-               ? segs[j].stem_index_ > 0
-               : segs[j].stem_index_ + 1 < stems.size () ;
+               ? seg.stem_index_ > 0
+               : seg.stem_index_ + 1 < stems.size () ;
                      
              bool event = on_beam_bound
-               || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
-               || (abs (vertical_count) >= segs[j].max_connect_
-                   || abs (vertical_count) >= segs[j + event_dir].max_connect_);
+               || abs (seg.rank_ - neighbor_seg.rank_) > 1
+               || (abs (vertical_count) >= seg.max_connect_
+                   || abs (vertical_count) >= neighbor_seg.max_connect_);
              
              if (!event)
+               // Then this edge of the current segment is irrelevent because it will
+               // be connected with the next segment in the event_dir direction.
                continue;
 
              current.vertical_count_ = vertical_count;
-             current.horizontal_[event_dir] = segs[j].stem_x_;
-             if (segs[j].dir_ == event_dir)
+             current.horizontal_[event_dir] = seg.stem_x_;
+             if (seg.dir_ == event_dir)
+               // then we are examining the edge of a beam segment that is furthest
+               // from its stem.
                {
                  if (on_line_bound
                      && me->get_bound (event_dir)->break_status_dir ())
@@ -439,38 +466,40 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
                    }
                  else
                    {
-                     Real notehead_width = 
-                       Stem::duration_log (segs[j].stem_) == 1
-                       ? 1.98
-                       : 1.32; // URG.
-
+                     Grob *stem = stems[seg.stem_index_];
+                     Drul_array<Real> beamlet_length =
+                       robust_scm2interval (stem->get_property ("beamlet-default-length"), Interval (1.1, 1.1));
+                     Drul_array<Real> max_proportion =
+                       robust_scm2interval (stem->get_property ("beamlet-max-length-proportion"), Interval (0.75, 0.75));
+                     Real length = beamlet_length[seg.dir_];
 
                      if (inside_stem)
                        {
-                         Grob *neighbor_stem = stems[segs[j].stem_index_ + event_dir];
-                         Real neighbor_stem_x
-                           = neighbor_stem->relative_coordinate (commonx, X_AXIS);
+                         Grob *neighbor_stem = stems[seg.stem_index_ + event_dir];
+                         Real neighbor_stem_x = neighbor_stem->relative_coordinate (commonx, X_AXIS);
 
-                         notehead_width = min (notehead_width,
-                                               fabs (neighbor_stem_x - segs[j].stem_x_)/2.5);
+                         length = min (length,
+                                       fabs (neighbor_stem_x - seg.stem_x_) * max_proportion[seg.dir_]);
                        }
-                     current.horizontal_[event_dir] += event_dir * notehead_width;
+                     current.horizontal_[event_dir] += event_dir * length;
                    }
                }
              else
+               // we are examining the edge of a beam segment that is closest
+               // (ie. touching, unless there is a gap) its stem.
                {
-                 current.horizontal_[event_dir] += event_dir * segs[j].width_/2;
-                 if (segs[j].gapped_)
+                 current.horizontal_[event_dir] += event_dir * seg.width_/2;
+                 if (seg.gapped_)
                    {
                      current.horizontal_[event_dir] -= event_dir * gap_length;
 
-                     if (Stem::is_invisible (segs[j].stem_))
+                     if (Stem::is_invisible (seg.stem_))
                        {
                          /*
                            Need to do this in case of whole notes. We don't want the
                            heads to collide with the beams.
                           */
-                         extract_grob_set (segs[j].stem_, "note-heads", heads);
+                         extract_grob_set (seg.stem_, "note-heads", heads);
 
                          for (vsize k = 0; k < heads.size (); k ++)
                            current.horizontal_[event_dir]
index c32666133ba84f9b5fbb244d4fd7a9d018070326..75dfc5a8c000954fa70d7e9f97192a0f922cde62 100644 (file)
@@ -10,7 +10,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "beaming-pattern.hh"
index 4545fb7297c0202c5105b926ec5ff99abbaa191b..3a08a4553298b8998d67658cdf615e1e2ceadb93 100644 (file)
@@ -1,7 +1,7 @@
 /*
   bend-engraver.cc -- implement Bend_engraver
 
-  (c) 2006--2008 Han-Wen Nienhuys
+  (c) 2006--2009 Han-Wen Nienhuys
 
   
 */
index c61d480803a8ac7630a041a697b836d82d7d3ae4..e3707c13909d7b64a9efbd1a186ce14b92d7ddf5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "misc.hh"
index 18d7836cbfe1d37762ccf8ce4d5134affe8f949e..3712b9213ef91c26ab1d5fb74d0fb56127dc5c06 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "bezier.hh"
index 7864736463ba0cdbd71ef372ba3240947ad1cce9..0c0896668fbe07f11bdf0c32a2820e2d27263e2e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "book.hh"
index fa961d36f3ace94ce618565ab9c60aa9aef7235b..001d647215372201007f87c688ef46cc72c1a0ee 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "book.hh"
index 5c2af4d317b41f871b215450cd1925e8ce7a064f..f35f935204dd68afbbaec80312c1f3ee4085f7fc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "box.hh"
index 155f34d9bc0acba3287d967b3a989b5776a88b9b..922978f2b1ca458c2a5ec6e29b09930c1997f01b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #include "engraver.hh"
 #include "protected-scm.hh"
index fdf0afb58aae1822d83ad204512694c71c2956fe..1d2b5f94474697c4998bc0ab10cee7d903cda834 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index 8326cee5eeb8f045a3bf1cbc46158c6432c2848a..e4d6a9a853d2a29a67d5d2934bb7a8834c8c3598 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstdio>
index 0850067b6946434328ad6975cbd9c8bce9f1eb9f..b65131579fb6769dedec81720ebb525abe1b7d84 100644 (file)
@@ -1,7 +1,7 @@
 /*
   breathing_sign-engraver.cc -- implement Breathing_sign_engraver
 
-  (c) 1999--2008 Michael Krause
+  (c) 1999--2009 Michael Krause
 
   written for the GNU LilyPond music typesetter
 
index 517b8f8f1c36ee7cb2256eca6b6b6e3fad5f853c..58c399bf708f0f6a567bc170e4976c75204ffd7e 100644 (file)
@@ -1,13 +1,13 @@
 /*
   breathing_sign.cc -- implement Breathing_sign
 
-  (c) 1999--2008 Michael Krause
+  (c) 1999--2009 Michael Krause
 
   written for the GNU LilyPond music typesetter
 
   TODO: --> see breathing-sign-engraver.cc
 
-  Extensions for ancient notation (c) 2003--2008 by Juergen Reuter
+  Extensions for ancient notation (c) 2003--2009 by Juergen Reuter
 */
 
 #include "breathing-sign.hh"
index 8b8f191006f90e4470d3c84831632fa7965b39d8..698c9e8a4a6f424ad49cf2a2892628982b37340e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "change-iterator.hh"
index a9a2744c9f3507de6c24aea19a156e7f07c22408..f8858998a1d963669bc18d37f1ccc3d0aa8b6d43 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "chord-name.hh"
index 586801c3919d7935dc38b080bae68f2b31ee9ccb..6cfe2def109a7e7f4fee0c21a1c615d98a95be09 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "chord-name.hh"
index 82eba5cec150bf6d743f63cd44d1bbbb80dc72e2..140ab102373d266347d8775914e0c4382ccdaea4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
                 Erik Sandberg <mandolaerik@gmail.com>
 */
 
index 191e92ac275fe5ed3dd9bfd8a2dfed4f13a630da..c5371a2c4d2c875a8bf907b190e39e25c56a0376 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
                 Erik Sandberg <mandolaerik@gmail.com>
 */
 
index c8e21f2ce86e10ad12e8df144fea7b8a6e54ec6b..52d094e243d2583410bc04778f7856337150c2c4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
 
   Mats Bengtsson <matsb@s3.kth.se>
 */
index eacc7335bdfb53ef9b64546064c4a88720abdc5f..80e480751d66ea44ee87a9d9f5e6776c6b78f140 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "clef.hh"
index ecf071b91836c1bc770030d637fad23633ad6962..bf25dce7b52408781f817fefd430bb2b141df53d 100644 (file)
@@ -1,7 +1,7 @@
 /*
   cluster-engraver.cc -- implement Cluster_engraver
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
index 8ec4a7befdf8e8bae28b6ef9f4b8b86451a09d8f..d872fca6be82eebac7f4ddfbe92d3d2071924abe 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
index df89149f2daba60e9cca3a1b6f4eb738fbd65f79..5b1ec9cdc862eab842e27253f232e52261f515a0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "coherent-ligature-engraver.hh"
index 52c811b6338bb13be863b459e5232e3858979a68..a645f36f7efc70df4701790d5882172693b85de0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 40e969e7288840472ad3a624559263fcacd43452..134f84b73b80f1d49915016287364d76136efbc8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "column-x-positions.hh"
index 1522dad8b3d4ada7bdb589003b6ae95dddd74ab4..b4c4afb0877a7a945e2c385d2eb6cb0fbee262be 100644 (file)
@@ -1,7 +1,7 @@
 /*
   completion-note-heads-engraver.cc -- Completion_heads_engraver
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cctype>
index 1e172fd492639c8565f81aebf1acf0b00bf0712c..3a56aa47541190b7bd2f6e2669d5292f7e4d1fac 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "constrained-breaking.hh"
index 37690fd61a096d7c8a21f7fe777924b36393d431..0b95a8b952e487178621abc61ecd402c23aacecb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 /* TODO: should junk this class an replace by
index ae613fb86b279cbc2f444d5c45ee7959c42479d4..42760fa59d4f3cb5a5b5abba22bf84ea5b0b660d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context-handle.hh"
index 08ade8f954391ab4eec71e482063fa370e523663..4645901b371afbae7d6e440e417dcef333bd4402 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 96193f65e7ccbe05eec5d147c876ee4036334557..9ce9a9baa0a2f88f3ffbd0d84efa32cbbb9da1a4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 7d092334963f983a54ec1af8053df1d19365132c..bb8851f5b2dddee7c2015413db53170033f8f0f0 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-wrapper-iterator.hh"
index a1456a1bbf71924e29b0c46b34e802910718a0d4..b2ada8fe7f19d3d71c1a565344e6ec3603e60f22 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 578f57266e8b37da7df0e9c65dc4d11836063d4b..8709c87f0ae9ebe710a30678e4349c95c8530ec3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Juergen Reuter <reuter@ipd.uka.de>,
+  (c) 2000--2009 Juergen Reuter <reuter@ipd.uka.de>,
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 5ef96c58683261633e54fd949fa8e98b87c34738..56259d56a57d768f6e8be72d1828f6121894bf42 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2000--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 /* TODO:
index 0b661134515dec44a5e641792de7ee7f2dbc2d6d..f36c18f68717dc7c77ca31a5513fd8278ca5aa71 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 90acd455ea989831c7610fe05ba634936e7d90cd..3eb0a89cb31c5e0f8cebcb6d90d3da58dba6fbec 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index 0f4b4a6b3b91c5fb184088661c412b04d1dc6400..af20945c73709ce36f4ec5d9758053a94cf79968 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "lily-guile.hh"
index c217677606119577b77c11e43a112973233ed257..98ea9b53f44a90d32cc3fb2f27cd5d4d584ff74b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "directional-element-interface.hh"
index 307152e23c8146ac730a5361d111c0e5f10c636b..b86232c48060cad5d6ab27c0c2698f78bbe1e74c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Erik Sandberg  <mandolaerik@gmail.com>
+  (c) 2006--2009 Erik Sandberg  <mandolaerik@gmail.com>
 */
 
 #include "dispatcher.hh"
index 1d6f937e92b9e4a15c444817a166df3111e00d7c..7be2bbdc9009553623ebeac2c4e25a98a86343d2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rhythmic-head.hh"
index 91c5f657c3bae6e542a59f5a4fa7cc6dc3c4c155..9536e97f308571e08da63943a0b997d6313ab8df 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "dot-column.hh"
index e82c17257ac93a35dbeda783aff7da490c3b3f4b..559f83be2e1a2ae9990e4ac636dba5ae1d8316c7 100644 (file)
@@ -5,7 +5,7 @@
   terms of the GNU General Public License.  LilyPond comes with NO
   WARRANTY.
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstdio>
index a3bd78cf2ee9b55779a5a9b934a94cbf730363bb..cd443a2e6c1876e9c92c83eec2060ec21bfa6bca 100644 (file)
@@ -4,7 +4,7 @@
 
    file of the GNU LilyPond music typesetter
    
-   (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+   (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index dba6fe6822d3099cb35bc0519f8446ea065c8890..9d1af7779b31d157b7bc8cb1636fb7f061f028e4 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index ff777b926aae1ebc772786d9ac88d16d903a71aa..f2a88b95e96f2ac14ede85be03279cf4bf36d02a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "dots.hh"
index 0c9bab76bcf194d9859964ff99b122e6d4257a67..1309f448d3c18cc7e806f0c6b4d3df3e709021c4 100644 (file)
@@ -1,7 +1,7 @@
 /*
   drum-note-engraver.cc
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cctype>
index 959d39eb9d01bca5877aecc2cb1afce034c12358..ee445f5ad89aac3d14db3c510a1e47e2e8adc206 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index fe027dcf26155f7f45f3627b1192af0802ebe31e..8ac8b2d6e3bb0dfcaf1f2498ef0f1b040e5ca284 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 755679fd71cf2d84469e69062efd4b7dabd71be9..af924bb4b17036df70c28d8ce7583c945002ddbe 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 77feb08628aef71e3284371c409c57530583b1bd..ac5e0e4c21ac6b7eed653a1dff9bff6e66500b9c 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2008--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 488bec75f5692aaf805a2a79c967461cd8dbaf48..b3da0e04a4c0f9e43c4144832f16cda50c0c414d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "axis-group-interface.hh"
index c80d64111ee1dad5dd034b07408d6881dc757d44..2e0ccc094432c05b7681a82cbb191ce9cd686209 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index 87325342306af13ab39f75ea4f41fee56b40590c..8838efee2dc2b849164ad97cda0d2aae92e10b5f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-head.hh"
index 69c3adcc641c806531293c7d9377643b17d3d99b..4bb732efdc5e02bfbb0096572d63f3065d4b000c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 8c5306f544c6e5737dde436ae22249e5e49b561c..44f0f538e5b78ad8d5a732f9f9b70868f4026883 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 9ac54f804ecb1bba74fc3db46c6380a44cb5eb4e..7724b1c395a5c68ec5b19398ce08b8bedf2d0cb4 100644 (file)
@@ -3,7 +3,7 @@
 
   Sourcefile of GNU LilyPond music type setter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index d6c7a26b9cf606b4abd9bc45125569f07d97c793..c678da031e71905b46056da957bafb3afb97f465 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "event-chord-iterator.hh"
index a2ec546a25a69097dc8bfa1cfaa6043ef37392d3..c29761a5d89b5cc52f1f621a87402f80a88f05da 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "event-iterator.hh"
index af1ae8503e7eedaf397c702320004189ca10a67f..f3f711de0f84d9efb31664bb04b43f3ce7f8086e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Glen Prideaux <glenprideaux@iname.com>,
+  (c) 1999--2009 Glen Prideaux <glenprideaux@iname.com>,
   Han-Wen Nienhuys <hanwen@xs4all.nl>,
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
index fcfddb94e6f4654ff48e3624e99b2da618792208..141bc5cc5decb8629f947140a7a3e1e012c14bce 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 8a06ea3a1b8471ef5fcfee3ab3229d25e1f3c3ee..f9ed3329f19a9a469de3798032145fe9f6141859 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 15d1278fbd691846593e3cdfc6e2db5ade8b5ba1..705bba24b791f0ee12f14f169ec8db0e57c56bde 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 6adb1e586336a05ce5ffd1433065682f671d0ed7..63ae7eced0e46bcb293c2c4ac07ead7a61b32a13 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <map>
index b48f38924f639f8e256254d95394531a03768105..235fdd666dfea51a3bbfd82729d9b2670ec6ccf3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 9de2cd112dd52a39ecd715e077e206fa54c22b73..65ad68fe43adeee11d88405a6420d59c3f682dd5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 96247f6f767cddb09db35a7597c1c8c59dce68a8..7737068c2eb1c55f215db09d79cf71d782162261 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "config.hh"
index a65a3c14bfb790b2bc9c4713c832c7b9e293acfa..9bd109545839de586198784106bd333585c0cf9e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "font-interface.hh"
index 7cdffddfd1c914624cb47c8dab8968b3aad5ada1..bb4dbd401c74a93bd43895f138dd11c29248ecc5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "font-metric.hh"
index d9ccecbc91430826aae2eb90db2fdd400ac35217..12d8807831d5d57023ef905de5bdb501a8d46972 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   Mats Bengtsson <matsb@s3.kth.se> (the ugly TeX parsing in text_dimension)
 */
index 5db047fc266fafee77643f04d13649a0ca03b80b..2de54e395581d652a43128e9b4eeb9f6711769fe 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index 9cb0397b7e4fb25b2b50eb5ac4908e902f381f7b..b9dfb058ef1d8e18138313b643b5b70a3f243623 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob.hh"
index ff62bee37ffe77b85b7fd7884f612aa3d8e24d3f..8e5d435bc676776e1dcd2e92a45612eff0e20c40 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index bcf8a3ca5face2787711f40104142800906f5e98..08d7733461d1c1d59e646fa5919559b5006a6d02 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "freetype.hh"
index 77b6133518374991fdbed8ff6b298ad5d304f2d8..87f6cd1019f9d19eb4b8b64bd08a589acf317881 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstring>
index 94c05ee6073a2ea03cf19b70f0de339f81069bc3..8b5766387e0de808afe9c81d567c5cd9dfc16844 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index da9c0a1156117ae984ce94494c010c433c5fa220..488d22e2f0db69d44779503ead11cdd291ca5b95 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "engraver.hh"
index 2281d268530c74bbd5ed1ff6f263725ce4805770..d672178a54c3fda156dcc294ac348839596edcda 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "cpu-timer.hh"
index d1bd6a45475777ab6d946296247dbe0fa9b29e62..13d9738cd03d0da06e30d2671de4b231221d622f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "global-context.hh"
index cfc75fb135e72b7b709b697d9ac791910ed73ab5..adf15fd614dc5edce83b7b30995d0dc8a357152b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "global-ctor.hh"
index 7fd5466895aa994da6750bd7ebf6f7561a80cf7d..c377166d63198ba5fbb905f3e5ba2a032df55616 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 1974f0d801722c71bc13c0752f9ca5b08343f514..3c0e8bb3b44fbb4adfff21659675ce08794f9c37 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grace-iterator.hh"
index 899dae7dcff1c55e582e93133db6da566845cc24..3445eab175ea4ecce02b89c296ba7ac0d74f089e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
index 3778f055373703530afb9cc988e4f9a84b13a476..a2a333c782cf88560ce9dd0f7579abba92dadec6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen <hanwen@lilypond.org>
 
 */
 
index 049d89d9cf9d1fdac01732705d744bf4ffe6a5da..fc2235bd6435ea8d03337c4e5c74e8401c9d92f5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "gregorian-ligature-engraver.hh"
index bb8896787304c3c09a2a45b103676f5f620be4db..4c84c89deeb9de97315b72a96a51ea039da33f52 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "gregorian-ligature.hh"
index 6401f6ef199a42e1e9d37186c99f182d057bfc7d..fd47291580c2fef8f2569b1eed32763ee79706d6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grid-line-interface.hh"
index a8a5906d2bed90ae87050d9c1026fac5d8759c41..15ce55a13debeca338534a4ba19a13c32bdd625a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 32490757f82dda114a28d6ce0aa53eeaa20e9dc4..95899aa25a7afdfd3fef9d3bda5f2163a142ce58 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 2f472af3e45e7945a83a9f5b536aff14c4c17228..62329e940ac84f40f7518125436a49a828712d71 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 281ae61e27cd71aa55342e6400fc8f3eb317ed09..9cf6e39e5f133a63fd4df150a78fab62196f809a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob-array.hh"
index be6fd79e17a290f57ca4a206b018a1710f89d259..68ca9f38802add8d629bbe5c56177a047a2f591f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 1ffa5d0779742c13df4dc89de77b441528b7f648..0472d5bef6794aeee6d76e19761725ebe41b7440 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "lily-guile.hh"
index 1e968ff421daa2082b4cb0ad181cd85fef9f411d..74cd104d376930b24c3be8be9aa83cf0a9ade35d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob-interface.hh"
index 6e6cead34eece87b2817658c6ab04e7a456e3092..eee3d7d7076e2201b511102e035138da01d7195b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 4d6ed8f69b1524236b81b8f32291382cf75846db..9c6f23889577afd696bb2656a3ec89b063fec81c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 590d299a503c41242c632a67bfa90b467eed6433..4cdccf63cfbea50ccc490b14f99d5c35f2367ca3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob.hh"
index 56000a0c129608c8a29767ce05fde61bad0c7088..698d40457c66a069132de3327f3e88fa78981d46 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob.hh"
index 4ba2bd7f2c8a6b0659583596c20836986328ed98..6c2422e76b9cbc7bf61d5ed16d70f95a2eef3cb5 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 6a98e55bf9bd4b3964787b4b0267220e366febcd..e5dea58244ae92033ca2d5c09cacf7dc9b224078 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "hairpin.hh"
index e911db54d94985e94fb677c7b44ff385b5ea47c8..9724d105fbfd1c84c68bb83744d9b20b9653289d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "axis-group-engraver.hh"
index 859ae78df4d98c18dbf9df3cf2813bfe68fd1c4b..acd65da2f12bde372440c3add767be353425a724 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 446c5ba27499650f9ebe9aaeebc41287b82575c5..52ec11e1d75a36b5a2e7a13c5d461b9faed9d81c 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 13eec0c3ff00664bfefd55b2d245700eb61d5ef2..c5594359a1a5415ba6b374c862dadc1f79ed9a64 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "horizontal-bracket.hh"       
index b4dbcefc8cdcbd557b3994438bd729cd1f0919d3..3a1684491b208f711d75bd491b8cefdbedaaf983 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Glen Prideaux <glenprideaux@iname.com>,
+  (c) 1999--2009 Glen Prideaux <glenprideaux@iname.com>,
   Han-Wen Nienhuys <hanwen@xs4all.nl>,
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
index b85d14211fcb90f870d339eeedf2af654912448b..0b0460c1ffbd1b21c25d908d485d313d9076cfeb 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "identifier-smob.hh"
index f0eed9eb6c48e9e2aea49f6b64a972f261d5b6ba..7d506373f32788674bf3c3fd8bc4f02720cdf33e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "includable-lexer.hh"
@@ -13,6 +13,7 @@ using namespace std;
 
 #include "config.hh"
 
+#include "file-name.hh"
 #include "file-path.hh"
 #include "international.hh"
 #include "main.hh"
@@ -36,6 +37,8 @@ using namespace std;
   (yy_buffer_stack != 0 ? yy_buffer_stack[yy_buffer_stack_top] : 0)
 #endif
 
+extern bool relative_includes;
+
 Includable_lexer::Includable_lexer ()
 {
 #if HAVE_FLEXLEXER_YY_CURRENT_BUFFER
@@ -47,13 +50,17 @@ Includable_lexer::Includable_lexer ()
 void
 Includable_lexer::new_input (string name, Sources *sources)
 {
-  Source_file *file = sources->get_file (&name);
+  string current_dir = dir_name (main_input_name_);
+  if (relative_includes)
+    current_dir = include_stack_.size () ? dir_name (include_stack_.back ()->name_string ()) : "";
+
+  Source_file *file = sources->get_file (name, current_dir);
   if (!file)
     {
       string msg = _f ("cannot find file: `%s'", name);
       msg += "\n";
       msg += _f ("(search path: `%s')",
-                sources->path_->to_string ().c_str ());
+                (current_dir.length () ? (current_dir + PATHSEP) : "") + sources->path_->to_string ().c_str ());
       LexerError (msg.c_str ());
       return;
     }
@@ -64,7 +71,7 @@ Includable_lexer::new_input (string name, Sources *sources)
     state_stack_.push_back (yy_current_buffer);
 
   if (be_verbose_global)
-    progress_indication (string ("[") + name);
+    progress_indication (string ("[") + file->name_string ());
 
   include_stack_.push_back (file);
 
index 440740b407f1bf152ecc50c55726a46cdfec7ed7..0764fb7f346f4bdbf326c5b4a658608dfcc0470b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ACCIDENTAL_INTERFACE_HH
index 3147e0d19bcbe663afb2ccc17fe776fe93f8133b..d5dd0c7c828eb925c954cc05ed31eb4fd685aca6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ACCIDENTAL_PLACEMENT_HH
index 8cec05324bbcdebc4e2013b973a231700d08c893..149ef321c1b2f449270621b9c4bbcc0802e9279c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ALIGN_INTERFACE_HH
index da1437bfacd3c32c0f3b24cc89b7f0ef63a3a4c9..184e4751d528bf2a06a646a8d22142f116ceea9c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ALL_FONTS_HH
index a72acba8fa9b332d767d37729aaba2e21fe7e9eb..dc8d3c9bfd6fc7c01d291f4b43b5300f596b1772 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2000--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #ifndef AMBITUS_HH
index 60313afdbeef7e729b00c202a31ab7bfab9c4ad9..a7a01dde6c99a5e394090c5fd8e616ab815cecc3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef ARPEGGIO_HH
index fa7654d86f22d39b379034861b5716d00b06fb0d..60cc824aa34365648578acf30256ade5369a4b3b 100644 (file)
@@ -1,7 +1,7 @@
 /*
   audio-column.hh -- declare Audio_column
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef AUDIO_COLUMN_HH
index a9d2107e22e5a7ea8faca689da5af804b527c6e4..6222db2587767926908f986f607c7957d2782156 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef AUDIO_ITEM_INFO_HH
index c0dbb3572de201e6e011718a5e5f39fe732a0f5b..54d6c7db72d1a0965be3a98a9187a19a52afb250 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef AUDIO_ELEMENT_HH
index a277b53a28cea3ce74fea7acacdda23d561b2fa5..0fc59fd960bb456535010eb55072b84be359753b 100644 (file)
@@ -1,7 +1,7 @@
 /*
   audio-item.hh -- declare Audio_items
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef AUDIO_ITEM_HH
index 86e6d4748f84860170de25e57f73e4dee707042e..d3e29e80bc72abf9a6b5a38f4377475d9cc041d2 100644 (file)
@@ -1,7 +1,7 @@
 /*
   audio-staff.hh -- declare Audio_staff
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef AUDIO_STAFF_HH
index 439db8634fa4fb39c03a21270857f0729d1589dd..fa9e3c91d994e4f04ccd31d4a4b9a88c400748a3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef AXIS_GROUP_ENGRAVER_HH
index 252059da8e4e474b8328aa04e5b1a6fd0e421408..6dd2e7b95c27ae404303030e9ff2e67b4b667ee1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef AXIS_GROUP_INTERFACE_HH
index 1ae1b59ae7ef2ce0bdadfdf07fc49f6b4fad5efb..51e6f9c005c6ca5a5256e1308d9fc346af61bfae 100644 (file)
@@ -1,7 +1,7 @@
 /*
   bar.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef BAR_HH
index 85d6d016e52e5e53f78e612652ef89a80a305fb2..fc62f6525e750866517e0ed3c2e806111af6cd9e 100644 (file)
@@ -1,7 +1,7 @@
 /*
   bar.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef BAR_HH
index a9b30b678668e1020b9b9e2f1a0aea2d8b552656..89a11a263b8cc326b6fb180d33efdd9cbcf1e337 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index f22cba2a2d4be1a609ffd29aa02895b7da5f3c14..36c63c75022a4562f987bafe0f8833cb55b63e31 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef BEAMING_PATTERN_HH
index c867ef7a1ca0b5f01f5df85b6b5563c86bbaf5f1..a04d449725ab17f346df4d20daa5286df7de0d4c 100644 (file)
@@ -1,7 +1,7 @@
 /*
   bezier.hh -- declare Bezier and Bezier_bow
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef BEZIER_HH
index 3f0c6248fa9c2e8930172303aaf7c28f43556588..d7ae2278010844495a8474497e9540ab2ae78339 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef BOOK_HH
index c93a5cfe3ecdc6590d6e04c0fa73b9dede37136c..128d4e2b12e8be4be9d55264937fce4e37fe4c1a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef BREAK_ALIGN_INTERFACE_HH
index 810421837266251d9cbdbef62d2bfad551abfc0e..271de504f92db754aca714d6feda14aa6ebbfe5f 100644 (file)
@@ -1,7 +1,7 @@
 /*
   breathing-sign.hh
 
-  Copyright (c) 1999--2008 Michael Krause
+  Copyright (c) 1999--2009 Michael Krause
 
   written for the GNU LilyPond music typesetter
 */
index 71aa7cb8d3abb2b4b98e00a8501c3523b6f72c7b..c7ecfda15cc3850bc5a9731927a5cb4772c45dee 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CHANGE_ITERATOR_HH
index 7f062799022df0a48370137288b9161d1bbaa071..bf4c6b62bf690dfebec5ccdff9d37746f68a2112 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef CHORD_NAME_HH
index 6dca4c6ef82915dc3e58646ec6159a420a8d130e..fe89ed661649b90015595608aa5bcdd15504b009 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CHORD_TREMOLO_ITERATOR_HH
index 4d6f3ea85778f0a06006c82025b9cf3f4c352651..038d21f7aa0c3acf0f8e36f8153a7301d6c66c89 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CLEF_HH
index 15dfca983f156ef5d39866f09ce7875549f6c4c5..a116bf0a9e3603d375793acd9d3c806997c878d3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #ifndef CLUSTER_HH
index 879f6ba5db0e8a1f0635f72535caa0a54f9c5e04..bacf575e43b766442dd8656238f9413ae9a2919c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 #ifndef COHERENT_LIGATURE_ENGRAVER_HH
 #define COHERENT_LIGATURE_ENGRAVER_HH
index 9a254a66f293d63d738a355da96c136251c35cce..f95b865d7ba59857e08c0406274df704cb546692 100644 (file)
@@ -1,7 +1,7 @@
 /*
   column-x-positions.hh -- part of GNU LilyPond
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef COLUMN_X_POSITIONS_HH
index ff60adf34cadea06f2726be8a1750d778268a153..157411a83c60f3545d818a56277922685111f55c 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef CONSTRAINED_BREAKING_HH
index bceb123ee2d06f016d981fbd4de09683f02512d1..b5ea240b70afa62595f7de88eef724a1a619a9b3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CONTEXT_DEF_HH
index 531affd1480a795e2ef1987d29c66fce953e48ac..91cc7222708755dc100e31adef7cab4a99b50bc5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CONTEXT_HANDLE_HH
index be2a4d79b16b15f21443c8c73f185c6d59523aa9..31c436a9367c9db1c448dbc5f9b12ad78f8cd51b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef CONTEXT_HH
index 90d35676aa3a76246e601f8c2433024cc959043f..c6295f6ff1fa6e41830a0d955304e7e2840d275e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2000--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #ifndef CUSTOS_HH
index f3b7b88eaab8aac406b851e1457818c11604e3ab..102139ac9bd7f10835d769dbb3a214e8c4ce55f9 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DIMENSION_CACHE_HH
index d0f351ff3035cef4d9b535ceeb34780ad9d160a1..6e55104c2a68073bf350d28c11fd9effba8461a3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DIRECTIONAL_ELEMENT_HH
index 0d94b9359483b0d25e3eb6669cf45ff03a5d18a2..ade16d25660c9d7c0c37cdc9b8495155392f64a8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DOT_COLUMN_HH
index eba99d8c56818559f71c3578c24ddc876d6512ed..3b01eb3c706448b24d15174832de54d6cb2c971d 100644 (file)
@@ -5,7 +5,7 @@
   terms of the GNU General Public License.  LilyPond comes with NO
   WARRANTY.
 
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DOT_CONFIGURATION_HH
index e9390a6adb1c66a2029eb4a6db29ba936d14105d..8d02561bafdac4f271edf340dd49a35d17b33910 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef DOTS_HH
index 3376f081c0d2aeba3d7cffd538ea84c3083d6473..69cbba5e9df8b7e3db2597312253722c01fe071a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef DURATION_HH
index 2a75741f765faf2582d6d9ebf5789d147415e4b9..99a59d17caf7038b6d5c3ca77934d29003e651f6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ENGRAVER_GROUP_HH
index e5b6aef6a084d7059ea8c77c9b56b68b034cfe99..fe9482c7e0bfd98c4080dde37ba52b9311505f87 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ENGRAVER_HH
index 458e152e2f35b7b5502fc951ca1cb0ecdb4946c9..e7d9bc3374bde359548808bfcfd4c5fa9bc4d9be 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef EVENT_CHORD_ITERATOR_HH
index fdc995cc9a92cc3878acc22813b5c8af36b0789a..9e6570c7be15b6706b48fa92c4919b13120f287e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
           Erik Sandberg <mandolaerik@gmail.com>
 */
 
index 328b26c11b56e79dda5f538bde253d4b38108644..78034c785ece52f1def5a4871c9dab1040d5bd45 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef FILE_NAME_MAP_HH
index 1fd400a4cefd8b90cdc83e1417051fea24e9b9d5..de502aa2eb1dedee7641e009528678ed66f8bd01 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef FONT_INTERFACE_HH
index f194dee35ebb1607ce4f88ce4a26c533e5b3a1c8..8346b4378a8c459a0b861a561c780552e25ce40e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef FONT_METRIC_HH
index 3b6d830977a8c815a5a8f54c5139c3e9d558aced..310e5893cdfd9c1e9c7c756b0018f9097da4895f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef FREETYPE_HH
index 3872ea0f3a20d0714e84f6c582d8bfc2e3563eb0..f291284d91f995e0b940b8377b2496bfa135cfec 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GLOBAL_CONTEXT_HH
index d15f28e93444ecdedad82a5b0d7c30f118d40c61..1355ad006d3797a33ea86b0bd43f6b83f2adb9de 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GLOBAL_CTOR_HH
index f9df29f47a0cdc2a1b96f555ebd8fed23c1e655e..5f27d3f9d5d3117e874d840ea08936155914e89f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GRACE_FIXUP_HH
index 610a15e810140ee944f5d9718ea7de066d6f385c..fd31117850632be524c394eb206934ea4227ee9f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef NEWGRACE_ITERATOR_HH
index e74c2cff2b6254cf356e8a062934caee56d33392..538d5aa17f494b119312be8460735cc52debfc1b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 #ifndef GREGORIAN_LIGATURE_ENGRAVER_HH
 #define GREGORIAN_LIGATURE_ENGRAVER_HH
index 51891ff6268c816d9ef0157235c2b743daf26513..e84ba674097abd84ead638216a1c782c2cd92747 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #ifndef GREGORIAN_LIGATURE_HH
index 4204a874cd90645ed755aa3a76e7e351c704257d..9fd1caddd53d3d3a8da5f177551592cd25670837 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GRID_LINE_INTERFACE_HH
index 80b6b373cddddc0c0198ec6d53074933fca83c86..f94f2d33cf40f1ae4b730d154db74801866283a0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GROB_ARRAY_HH
index e088d7216663c86c3332923d8c1e91cf45c815e5..30c8f558bf5fdc61f935c68c6af9c044052a0fbb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef STAFFELEMINFO_HH
index f9fd7a48fbd179fd46f2111d05b3d0013892cda6..fcb67ceeaa9b6ed241a1e8ab7fe7e1e84f25be66 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef INTERFACE_HH
index f8c8a04daeaff8ccbf2a03b230e1a8fdfb0513e1..66cc0530b73a0221f8f74cb93489bea5c80e0737 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef GROB_HH
index 2a94f0783adc9f7f1825f1eece178f8ed2f80ab3..c3ef881105b79acdb5d7394b9b90a0738eb309c7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef GROUP_INTERFACE_HH
index ede5ab1aef0b9d754aef786186afc491fd623980..d59934335cbfb425094c398973b166d313013a83 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef HAIRPIN_HH
index ec02a25b48ccc4d484983877edc53433765c2e7c..968257b4c643820129722e2f91e5800562ec1811 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef HARA_KIRI_VERTICAL_GROUP_SPANNER_HH
index 4597c5e83a3f27f9ec254229bd19a538dfd68e0e..eb2a579c4028fd2abecb66f18e3ef5c6a76d9e25 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef HORIZONTAL_BRACKET_HH
index 2802e28102da37334548fd5664d46a377f387db3..783025e3e66261cd5e31215e4fa8a25e3b3fadbe 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef IDENTIFIER_SMOB_HH
index 1e35012f335fe9c48fd357a34c2fcefe08ef7818..150c4d5c626c28007d2d559687c99379c7e7a791 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef INCLUDABLE_LEXER_HH
@@ -36,6 +36,7 @@ public:
 
   Includable_lexer ();
   ~Includable_lexer ();
+  string main_input_name_;
 
   /// store dependencies for Makefile stuff.
   vector<string> file_name_strings_;
index cc9d1bdee3ede39a67e47a45466bf7b60949030b..94e00527a22395a62d3fb3391f7982f29cf849f5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef INPUT_HH
index 1895910fb6c95ea21a45fbfa06cbbc6c79e0c80e..bfaa671ed516494bd01bf747fbdc604822414847 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #ifndef ITEM_HH
 #define ITEM_HH
index 628ac1f59593091fe31183bba4a73cb160155891..ca359ead5736915cd445d53b21c05d584c560fe0 100644 (file)
@@ -1,7 +1,7 @@
 /*
   keyword.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef KEYWORD_HH
index 0a2e2d1ffe742fd9069b8ad5855fd130f6c12de0..aa8bd84e46a6c97eb1bc7a0f91326a192b7193b2 100644 (file)
@@ -1,7 +1,7 @@
 /*
   leastsquare.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef LEASTSQUARE_HH
index f74cf6b6cedfcc2c7ac42a341f45ff442468b6f3..92cc15940eade975be5193a1a15b09f0ba92d211 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #ifndef LIGATURE_ENGRAVER_HH
index 495b86144f24188c20fab8d9f5b46f180da13a98..fa5b8a08e4b4c9963c750b3d156b03dc6beecac6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef LILY_GUILE_MACROS_HH
index 8c241aeb617f1b08a5e7a40cf3d86ce44419085a..797d22d0a58550a50c86b7274fcccc1914fe4a6a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef LILY_GUILE_HH
index 83a9f89b9353fa70257bf97b7d74c126dbabe118..4062e3410fe1a1e3e8d2c6f883140fe83f87e934 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MY_LILY_LEXER_HH
@@ -38,7 +38,6 @@ private:
   int hidden_state_;
 public:
   vector<int> extra_token_types_;
-  string main_input_name_;
   void *lexval;
   Input *lexloc;
   bool is_main_input_;
index c0943ccdbaba316907454897e0ecf307a2aee279..79d586f1e942942ce9139d1a5e8d3e5f7fb965e6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef LILY_PARSER_HH
index bc4f4c4c03cb112e220ef31bea163c04c39a96ff..40df1bfab3461ff7a74a93115f224ee6ee99b2cc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef LILY_PROTO_HH
index 7373779991965b5d4cef16ff6035d55b8441edd1..c6c93fce8f2d20b066e5d7a025ae5b6ae6e61eca 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef LILY_VERSION_HH
index 82399dc436163911161f36e1f8f862e7e1740c4d..3fd0f98fed21055d8e0b568df59be52e05c927dc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef LILYPOND_VERSION_HH
index 04efea0cab6e2eb6b22d9f31531c07ef30752116..1103a6121e91cadb880392f795aba2a2be53bb4d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef LINE_INTERFACE_HH
index 8de676f26254eedc6b29e22514a363894145d6ba..8f0844df71efb7a09f875171e77972034a84e9ee 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 48fe1239cd933350aa16cce8b49f0ee2a6a03b01..8b76533f54aaecf9121ddfc0ca7ed12814f81c7c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #ifndef LY_MODULE_HH
 #define LY_MODULE_HH
index efbdb0647b70ffa9de382348f29637aac14e8bc5..1cbd6ae389e1aae198bcea623489f0427abe29fc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef LY_SMOBS_ICC
index b5410bbdb300ea6a32142c8bfbbf2fcbacbaa8c3..121774446e807c98589ac83bea9e7e86783819d4 100644 (file)
@@ -2,7 +2,7 @@
 /*
   extender-spanner.hh -- part of GNU LilyPond
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef EXTENDER_SPANNER_HH
index 59da2203aa9fbd5a5293ccb1c36d39cc526ffd36..1551382e66fb27a5df9ae840daffa8dfdd5c4e37 100644 (file)
@@ -1,7 +1,7 @@
 /*
   hyphen-spanner.hh -- part of GNU LilyPond
 
-  (c) 1999--2008 Glen Prideaux <glenprideaux@iname.com>
+  (c) 1999--2009 Glen Prideaux <glenprideaux@iname.com>
 */
 
 #ifndef HYPHEN_SPANNER_HH
index fbd2aa3da946db7aa01540988ad396772c776c91..8b0df589a4cbd92766ab028f27a2f8a8fab2ec77 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #ifndef MAIN_HH
 #define MAIN_HH
index 8413b2eb33326741358cc22f51baf6e45bd5a9a4..a595ceece428091d54b9e45b380b3d18ad550eac 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MEASURE_GROUPING_SPANNER_HH
index d5cad577433b679e553f39c8b1bf6d5c56546966..ba51c486eaf1043d4e2bd269e33e1fa69927c38d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index b1dc33e9e95126a5e798145e0a861c037a85e82d..fdc4e30651f05c2fcb3331448ba07042f9f41708 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>,
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>,
   Pal Benko <benkop@freestart.hu>
 */
 
index ecd2fe260645012630d1804e0a6e0e4746155180..00cfb156755fba04b82a39cd6ebe75e1c0c39207 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index ae5d0998b81fd5105e13b62a84a3098cac6a61f0..15ca2f0292abc82a49674ad6e048522022ae806e 100644 (file)
@@ -1,7 +1,7 @@
 /*
   midi-item.hh -- declare Midi items
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef MIDI_ITEM_HH
index d5525295e2e510e5bd6bb747e17755f40bc1a3bc..6b9bd0c5732a98983991c36d4780e7674821ed55 100644 (file)
@@ -1,7 +1,7 @@
 /*
   midi-stream.hh -- declare Midi_stream
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef MIDI_STREAM_HH
index 86e82a009a0d99ee1042b79858b97367e79d8e74..2ee7cc941797ce75cbbc55d53663f21bab695ead 100644 (file)
@@ -1,7 +1,7 @@
 /*
   midi-walker.hh -- declare Midi_walker
 
-  (c) 1996--2008 Han-Wen Nienhuys  <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys  <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 62d39c8a89045945b32b9bcd910ff6c72e7a2b77..b32d047732177a9f839304f9d513eb5a182c83c6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2005--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef MINGW_COMPATIBILITY_HH
index 40c6a4915067f16c75f9eac57abe8e1725e47f3f..35dbae9d1405c103724fc43ef1fbf92556e7f45a 100644 (file)
@@ -5,7 +5,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Nicolas Sceaux <nicolas.sceaux@free.fr>
+  (c) 2007--2009 Nicolas Sceaux <nicolas.sceaux@free.fr>
 */
 
 #ifndef MINIMAL_PAGE_BREAKING_HH
index 088feb91c78cbfe2eb90d47ed731411115c87d01..e33d8363819a658267d0e15e62868fb1fe29e631 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MISC_HH
index 85882e86e8c9ce2a03263d6b67c6998f5cca8fea..101949674cd4d0680a775b4d60578baffe045aee 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MODIFIED_FONT_METRIC_HH
index ed7c7b0741d34da984936e12f8c568708ce88ebf..87bbdb9b31d7f8aeaa131b32a0a941da70b2b0b3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MOMENT_HH
index 38b6eba1326ce50c8f9cfd4b0d24d66c4b2638e0..ecc82974ac8b04db21a7a1fa7a94c028b1c1d29f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef MULTI_MEASURE_REST_HH
index cd720a9a49769ba5b080352c08e9f2b683757874..f5d44ff365aecc9e61a1c4381b79d9e97ee2b319 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_FUNCTION_HH
index 86b3bf379a0127d8dd1b300e9b608f1e2971dc15..90d870833e1c058d8e1fe9bf5abf9d63f0ab14e6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_ITERATOR_HH
index 7200e8725a4e1f7f99934a33f99b33ce0056a1e8..7ad760eb21653340146913b90842af8d5c780070 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_OUTPUT_HH
index 2e54de4e6cb1c6205d1ba2acd7f9718432b39db9..e01058bbfc8b3c8f511391b234054b730099f5eb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_SEQUENCE_HH
index 69188937c1a0a5f82496bf8d389c515d94a74994..b36fd6a97aad1c68391b0e3874016e559d4f348a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_WRAPPER_ITERATOR_HH
index 94b2a3165ec91167899c2cc49849d432934dfafa..4554a1d114a2f46fa367e4e4fb7ea30a12423af7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_WRAPPER_HH
index 9f244081d32c3994ca9eda68d90774d666d36552..00d6f1962cb171e3ca0cb01e249b18e4bb2d208e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_HH
index 0b2f29ebd931e6cd6d91947a91ba252651b9eb12..b416f1d153a9fbd57aff52257183170a6ab60d46 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef COLLISION_HH
index edf8b969d199b6e5261e38f64b15a2b5e8d0c68b..d745d686137f75d86e48e84534264dc6be4cd839 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef NOTE_COLUMN_HH
index de2d61a07df8e54eb004fbd27b3e6d6aed1159d7..6e759b1e9c372db4ca2c04801acf6d220a5c2264 100644 (file)
@@ -1,7 +1,7 @@
 /*
   note-head.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef NOTEHEAD_HH
index 2a86ed27d63823802dc82a51efccc0e699eb4589..f7d5dfb65fa7d09dee888a490a0751c2f80a737b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef NOTE_SPACING_HH
index 315113a27f1a66478a7ef8c8a31e1564ede0f71f..475cc4c169e40a4b79234fec3858303d1bd0aa5d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef OPEN_TYPE_FONT_HH
index 6dd4433cbc4047074a74e168b2d42261a24c6894..f47efa9f920ec75ca2f430c62961da88f7e93e60 100644 (file)
@@ -5,7 +5,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef OPTIMAL_PAGE_BREAKING_HH
index c7c4248ea4bb3a1a9ac4969ef46a8cead4495687..b683cc61f1797a4b8b9bb321745a43136ad22bec 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSIC_OUTPUT_DEF_HH
index 249693a05cc9b33631db6268c4cacf3f8127c776..0070a980ca42a41cb4da5b861837e07663684e5c 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef PAGE_BREAKING_HH
index 08a6b267fe6f7e05293afc267b67afa1291900d8..12ddb8ccdf1b6bba4806baebe777a483bf3b83e3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Nicolas Sceaux <nicolas.sceaux@free.fr>
+  (c) 2007--2009 Nicolas Sceaux <nicolas.sceaux@free.fr>
 */
 
 #ifndef PAGE_MARKER_HH
index 85c5f054c7159f9e2796d75144dac7ecbe069aaa..870fbda7e15fd080c51b1bed79ac05133b753c29 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 846fe1be3e12043f86db917733283eb0eacd345b..96dba0ffa6e90ccd9c3663c356024bcd3d21dfb0 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef PAGE_SPACING_HH
index 7c7ef8f47b93fd2e4ef5fc8aad9145416e013bcc..f5e7ada7611570efccf83014156515ed1d4acf4a 100644 (file)
@@ -5,7 +5,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef PAGE_TURN_PAGE_BREAKING_HH
index dc93324da84c084e4991fd42f70774e1d00fa0b5..09f3ff7fadf27cf84642322e9d0d539c8306d01b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PANGO_FONT_HH
index 9087fd7c177c4a4fb1dfebe231e6a2ce54544cc1..90e816f66da6257ae6d94af69736635bacffdd72 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008  Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009  Jan Nieuwenhuizen <janneke@gnu.org>
 */
 #ifndef PAPER_BOOK_HH
 #define PAPER_BOOK_HH
index d5472175c83796a54aaaac79fba4c847e383290c..d0b2a97bf1f998414dd067d69f7599f3230e1a23 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PAPER_COLUMN_ENGRAVER_HH
index cc2e2b90f1f530fe7ae14e077077d1381380c145..719e7d5e4945dbe4e7eade5cd74ed8d9c884c2c4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PAPER_COLUMN_HH
index 03c8879a99369e970400387e1775328ca7787d21..6779e1d942197575e2422c8a6b2d3d5a22d302e8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PAPER_OUTPUTTER_HH
index 7ec8fe8ce3c2f0af591533843f980cc8d9244ca3..b55fd9072704ccc4527384d6ad2aefc900e7d5b6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PAPER_SCORE_HH
index 71785b32e500b5bf849eb8976fa814ac569a3e11..25af72e025b9ce2787088901083786c2aa695bdc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008  Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009  Jan Nieuwenhuizen <janneke@gnu.org>
 */
 #ifndef PAPER_SYSTEM_HH
 #define PAPER_SYSTEM_HH
index a2b3d649988710203ffc0fa7a3cff5df9fc7bcd7..f6bff19a65ca526c300d38e5a15546c69ef6f6a9 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PARSE_SCM_HH
index fdc5e0b32f5c9428689522968baff83c24eda449..5f234737455e2009341d8bb7ddc40c7ab857b657 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PERCENT_REPEAT_ITEM_HH
index 84bb13bdff873d10d2fdcb2269dc48f78d44a6d3..2553131f10aa29d89455dcd16f4eb75e9714daae 100644 (file)
@@ -1,7 +1,7 @@
 /*
   performance.hh -- declare Performance
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef PERFORMANCE_HH
index 55bbf697508e6736e1746d9a5fecb4037f75123e..1a7d8087d8aba88a4a3fb0a5eb58a3ee8cb52e77 100644 (file)
@@ -1,7 +1,7 @@
 /*
   performer-group.hh -- declare Performer_group
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 3e7af707102fc26e9697c7f5940d1510f5e9e804..a94165a6bd825236b356419a07f5fc36fc6f69f3 100644 (file)
@@ -1,7 +1,7 @@
 /*
   performer.hh -- declare Performer
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index a10aed5c9cb4e5a4b69cb619c76ec1bbf168f71f..15df8ee933e4544f454541ba2cf5b29b0ca21ada 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PITCH_INTERVAL_HH
index 6e5465257cdc68117f3654f0801f645961f199b1..42a76522f4ae5948cf2aad97b0b65f850cdd79bd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef MUSICAL_PITCH_HH
index 02799135e13377a4b225a4900a532d03ef5c2e7b..54b0e5b9065a357017843130a273e59dce3ceeb6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef POINTER_GROUP_INTERFACE_HH
index 70c8b1abe0b24135453376df9bbf0d3f8becee0a..069aa07924ae769af3de55a49e584ee2e490a679 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008  Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009  Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef PROPERTY_OBJECT_HH
index 82c206c09cac6665a0aaa15244eba8d1a42803c4..53a7175eb7bca95af22a421955685374537b83d2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PROFILE_HH
index e3f42e2667ffe763fe8f3d9d82efae6d94077309..ec4103619e7ba999eb5329edd4801cf1cdea8f28 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2001--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 #ifndef SCM_OPTION_HH
 #define SCM_OPTION_HH
index bd5f28c280119d2727e2a6ad5f29edb9c2275d75..349929b7c5eec57410af46be17f057ed19931f60 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PROPERTY_ITERATOR_HH
index cb43afa7292a046d75d0cc3c2a6f0f8f98b32fa7..d5a6463bc04d5d52df9489575e4469c06e9c4e95 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef PROTECTED_SCM_HH
index 6a76a22e2fd5656c6ccae44107254d10c930bace..56ab9c50567e0fc421ae74880b64748671c8ece3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index ee79243e6ea625c88a56b170cf270214d1be390f..818d1c822f83665b3881ab62cbca6b77a0e3bc5a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef REPEATED_MUSIC_HH
index ce3765e65525af9bb1049249b8383a48d3a8479d..1d25a2cda56a3c7726dffc33f3247274559bbc99 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef REST_COLLISION_HH
index 138d34af2dcd4644b9557ad7ea349acce1b51aad..be31f3ae0f00cf28a445573dba9a6d1dd251cfd4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef REST_HH
index 164760a419c60e63b29ce6f3e3dadf041ddf5b15..f625bfd6e0577fe8a64294efaa20697cb2ee1089 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef RHYTHMIC_HEAD_HH
index ac00f8bcbbbbae9800ba6208cc90d012e2bb5032..d89b34f80239527175c9ad5ae9afcb70357464fa 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ROD_HH
index 7984a2d2333c224124f62ca1cd74c3b0211a0a11..14be01b9d2f2ce6a478b6004a51acc9940c2180e 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index c50f5c42aecf472b725520a94c67ed0a1e1431a0..d96c7d779a5b0bbcb7e0829bf57365eec41dedc8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Erik Sandberg  <mandolaerik@gmail.com>
+  (c) 2006--2009 Erik Sandberg  <mandolaerik@gmail.com>
 */
 
 #ifndef SCHEME_LISTENER_HH
index 976429682bee33d1b0715d94ecf3901f1120f63a..8bd8245b629ddd9e18b865911d0cbd8b94ca3a87 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SCM_HASH_HH
index c65c5980bceeaf88a22e0bfbfd65ce93f345cfd9..6afe354120d79f13f1c6d0a622fa0f7a937f9c4a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SCORE_ENGRAVER_HH
index 55f31b11231b73546dd9aef65bbcc7f68ded45bc..b77890c08c4dfb0f458599e957eb2c7278f8b5dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
   score-performer.hh -- declare Score_performer
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 7d4fa0142b96a08d2ee5000779f4ab42d1891e56..ab6fcca3b5c112fe9c846f941c3e953f59d08fa4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SCORE_HH
index e10936dc2511d826e08ea253495db7dc985e57dc..01c1b992a6bfb65b82421c8d1b925d2019f64b36 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef Script_COLUMN_HH
index 2aab348af5d325b58b1f504df9cb45e05b4c30e6..2032b88296d4b0599d5a1c45568b1c7d484708bc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SCRIPT_INTERFACE_HH
index 877998965cafffb0a55908ca96a474a8d2e21b71..c42f2f44116fc393806757e1f646cde2b74a5c4d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SELF_ALIGNMENT_INTERFACE_HH
index 09722c8faea80d4341fc0a0a321db946498f875c..8cc8063dfbe1e6cd53eeca9095929fef58d1da36 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 106d9e93bc8611b17c9c196c202b2a6a5c47c5f3..8b0c936e7d5845df30930880cf2978e30ec501a8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index c3c99ee5017c718f6afcca793921c48e8b1f2a3b..cba70b751c8797cd569152ee09c5054ea17967e0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SINGLE_MALT_GROUPING_ITEM_HH
index 9cf145a8da2e170ac15942482a89c26fdc078f8d..d53cf184c6268edc443fd95fa5c71b883c579b77 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SEQUENTIAL_ITERATOR_HH
index a19e27884773f7b6dcea22ec974373730a55fcdf..0febd15be3ce6d6094cf64a47f9477147d49d0f0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SIDE_POSITION_INTERFACE_HH
index d5f507f4558faf690cf5d25f4d6a7b8affe517de..2d4f83525ff8e2ad51917e9488d9e1fee1705389 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index fd6f5a26005fe880b90dbe3739f9b765ef68e1b7..dc453a7505173ca2d18ec0fb9dfadd7c6a72682f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SIMPLE_MUSIC_ITERATOR_HH
index 935cb94c6c260e72872b9261d34282f6432984ef..a0d5f0704bdbd034dd6d2b24d5ed7cbc3c3f63cc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SIMPLE_SPACER_HH
index 376c72ef1ec3463616b1e8c8d8e86059f10136bd..36698a1bdee0cb73b5d5f090920d9ae273f5900b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SIMULTANEOUS_MUSIC_ITERATOR_HH
index 08fe3c769e05a9c258b303b1840ca0669042e9bd..c7f9182108e3a20450465c1b97996bdc25dfd6e2 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2008--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index b84a5de953bcdafe0b9fb7c0c6500717ec901faa..26830b92c954062a029fc88892576c6e5e2031c0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #ifndef SKYLINE_HH
index c798d38bcad89617faa7d441d7a6abbb8b4d2fe8..850a4c0fa6ea107e6c711cfe5f797c50bdb47681 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SLUR_CONFIGURATION_HH
index 74a583ea01e3eb9ff972a17e6f765f5051f5da55..a1d2b4a5daf8bd3b9c6eaa31890036d3ae9a8c35 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 9cfa24acec20562c9f3fee5e3b91055aab7abcb9..6c4dd5da2f51f42e46794d496c439563548c13af 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SLUR_SCORING_HH
index 38bd195f9f796be3ed05bec82cb028cc26f315d3..ef7d1230901ab32a511fd358336dc958236df221 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SLUR_HH
index 3c760cf33969953db4d8a31b7a3ca9c9a2c8cf2e..12819f28f524a86aa5742c574834bf2eebdf713c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SMOBS_HH
index 6b5ccacb04a9a8cd22b36cf162438c9fb5a1e58e..2fd1bfc073b9959cb056cd6af6a6dfe08a31e131 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef SOURCE_FILE_HH
index fe55fe72ba82d45fbb3f2c2235e62be8fe267501..32dbb2ad458ae062ae40d30f5928625b014ea4e3 100644 (file)
@@ -1,7 +1,7 @@
 /*
   sources.hh -- part of LilyPond
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef SOURCES_HH
@@ -19,8 +19,7 @@ public:
   Sources ();
   ~Sources ();
 
-  Source_file *get_file (string *file_name);
-  Source_file *get_sourcefile (char const *);
+  Source_file *get_file (string file_name, string const& currentpath);
   void add (Source_file *sourcefile);
   void set_path (File_path *);
 
index 6a039bd8330855696d76c6edd76e36d07343c0d2..71768b7cb37421726e59cd981721c6302b2eac91 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SPACEABLE_GROB_HH
index 0f62ac9b0fabecc933353f795c0d3a2fc079fe30..32df5aeb3a64ff54937cc23a4f255513068dc86e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #include "grob-interface.hh"
 #include "lily-proto.hh"
index 9a64f1c279af831457b516205ad4b66430960ce8..7f52d458207448b2091cd6348ca55d11e95ad280 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index a993aae421eda1f5615dcdd8846936a5c0901eed..72848b898f7b8d6ae51174920c16cafff5a5f158 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SPACING_SPANNER_HH
index 780531ac1cdde429854227cfeff4c07518b303e6..d06b514afc7869b3ea66d5c8de7c4bf4d43b09f7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SPAN_BAR_HH
index 94e98760c0560a857517659a1a0ba20a8a2f50a0..24176326d3084e22f013a0b46fc49045e33c68a5 100644 (file)
@@ -1,7 +1,7 @@
 /*
   spanner.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef SPANNER_HH
index f4f943f899b5286cbabb18223cdaf40cc97dc846..c379889adb859b067bf6445b36d22ae90756243b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SPRING_HH
index 4e02adc73d5ecd2a6432a5ec49028b650e728d81..593c59af23d2b7ee8ff8e79b1b7a2d9fe7d7c1be 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef STAFF_SPACING_HH
index 29a46e6d8aec7ed2c4e2ca1186551954b49ef90f..434ff92d80828f5e6b95bbd31ac430f9bb12a26e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef STAFF_SYMBOL_REFERENCER_HH
index 3774ee3dc30af8077473d4db5cadfe0fc75b5a12..2529c005084416198dfeea4eb7ba1e74a949d841 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef STAFF_SYMBOL_HH
index 887c49988d6583d0b83ce6edbff687e06a3f66f2..1a67675d3aa6f6d46c197121089deed41e674279 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef STEM_INFO_HH
index ff86a838534477f4c6599fbe2aa1513b218935ea..9782c753f2803253d4ffdc5c754a431a3a50da06 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef ABBREV_HH
index cbb8f690948d00dbddcdf56f7802d4bb7bee5ce2..b404862ee923c1fdb043b65c2f831ede6204e2e4 100644 (file)
@@ -1,7 +1,7 @@
 /*
   stem.hh -- declare Stem
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef STEM_HH
index dfc40fc470c6e304d0450b846f59269008d3fec5..538d0acc04ac1c2547c39c1f17e6cef739209e38 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #ifndef STENCIL_HH
 #define STENCIL_HH
index 7e44506787ac0e9e0002b7efbc4e72ce6d19c968..9c3ab818dea44569a18831bd5a2250f870a2e961 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef STREAM_HH
index 426d733036e787c7c824d5fe22c492c4a4173636..0b966e442769dc72aa1c1483c9ae87cca03a2fd5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef SYSTEM_START_DELIMITER_HH
index e44db243cf22b8a69ea08d62799954a980dc0e4b..3fc805a959c1ea6ca6ad1ab16397ef2b3b3b404e 100644 (file)
@@ -1,7 +1,7 @@
 /*
   system.hh -- part of GNU LilyPond
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef SYSTEM_HH
index 4aa598cd154c7d140e2822f0127b841fa69953c8..fabcbbc516f4c937726ee66e1338b9b3c54f6721 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 619949f61792a0e195356052096407c9a772f686..48c5c42d8c7149068de156ed8ae44deab3395d30 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index b42c7d54dabb2bfddff96ba09cdcb394367521dc..07afd51859985529a639b4a9de6c7258a844dd8c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TIE_COLUMN_HH
index 7bc88d2762f3a5587635dc6427a89d5d30b60360..01e32b691343f70f429065c869326129179fd631 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index cd14c6cde0e2effa774be787c2ee39f9d2b50b61..ca24bd45995d6959581f9f2393c4421c735ee8ad 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 830ced2960b824847a49f3ffbb7b0490f4088251..35aa73817c0f7ae8b9af9b6dd6f876aa8b6c08d4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 37e81dca54fbf182be2c5cd789d8d3187e0cd63d..68734adc222aeab5868c49d2605355ad94bd13f6 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index bcce6c1265449b9529825197195ca35b3250ec95..172e02733f439be1cff8e8cf5fbf1cc30f3ea007 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TIE_HH
index 3f9982a899835759cdb2895410ee107fcefd2e21..379e202f03b977e56a9580b13f006f636cf097e5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
                  Erik Sandberg <mandolaerik@gmail.com>
 */
 
index 07c4968b3453c89254d6962a6fe3356bfcdae02f..ac327d653cccfe86211be5bc8448f6a202e5d4a3 100644 (file)
@@ -1,7 +1,7 @@
 /*
   time_signature.hh -- declare Time_signature
 
-  (c) 1996--2008 Han-Wen Nienhuys
+  (c) 1996--2009 Han-Wen Nienhuys
 */
 
 #ifndef METER_HH
index f30f596b919f519d4d88f93037a67425052197b4..8c85bcd1ef74036bac72eea76454ddd30ee42d5f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TIMING_TRANSLATOR_HH
index 43d5d133471db25aa7a17f7429d5a2f17b25c50c..ba041f4af679810b6c6bb355b061b1c9baf7e04f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TRANSLATOR_DISPATCH_LIST_HH
index b0e46d6f7ff90fb7eb1443d428d93121b2473bb6..237d0367c2a5a63189d797a0b9ddc2406c05b3f6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TRANSLATOR_GROUP_HH
index 67b1e51bb1c23cf9744f9958c788ca1304cbabe6..f5065f50b25e3f613bc61bcb107a149b3defd56b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TRANSLATOR_HH
index 775f5b9370b899c74e4114de68ada02ee5a7667e..f6c815fabcd54838f621918ef6a346de1f2feb0c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TRANSLATOR_ICC
index d3209a5d3a9af9e5e7a789f7bbe464cb78083857..794ac9524eb8554ed219add7b8369f675cb64371 100644 (file)
@@ -1,7 +1,7 @@
 /*
   tuplet-bracket.hh -- part of GNU LilyPond
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef Tuplet_bracket_HH
index bc1cd21fe7dcdca3eb8d81c862ce851aab2b1b14..7e798e043d3fc3d1adea1028347953ed182f332c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #ifndef TYPESWALLOW_TRANSLATOR_HH
index 17eb237ee25951a8fad3010c551c59c17533376f..70b820f31bccbdc34a12decd6ac8d4167133b01a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #ifndef VATICANA_LIGATURE_HH
index 6fc8daf2234446de20e09104729948d92d0e09d5..413e6f6aa13fab8bb14efa86e90d6d9231ae184d 100644 (file)
@@ -1,7 +1,7 @@
 /*
   volta-spanner.hh -- part of GNU LilyPond
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #ifndef VOLTA_SPANNER_HH
index ad2cdbeaed3d1aaadaf918e5e395eb2dc8b8965a..f313a3c27e023e4986cdbd4e17a4aa3bf5434893 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "std-string.hh"
index b6468bcb378a92ed2c33591c7da2a9496c493df2..8affedab7c49ca0984d67a9acc23a1026d0de101 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "input.hh"
index b6378af67f1d1761bfea7a44a29cb1a15da24b5c..084b1f3b643dd4ff9d2802bd3219929f49bcb25a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "input.hh"
index f38216f16e7d4980a5ecf1c1d3b5f17fb45647f7..d3ee12950e421888c65c0a19eb75169a43f45503 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 35a670d70ee2f9ae4503789f2a762c5e17e82529..a2830554ede8a30e50acfc5c8191815288d7e984 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
 
 */
 
index b8fab025280f94b36e55f5c3a23a6f3d922b9605..6e540a327d78c32533f7509bb26723e7103f50e3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index fc8028e7e42d9f17ed87fa931551b77f0dca6525..e559f6abed70559008846c4bd42909c6d1f29682 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "item.hh"
index 45300af68628efd9bbcf3c5c4321d2d4a3de07e9..4ca7a39f2b1c263268a9976d543ba7d20751cb2c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "bar-line.hh"
index 1f35d780c43f03eb6adcdd4137217d31f7ef873b..327a53c042d50f0eeecd804a398c673a9294cea1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "audio-item.hh"
index 621412396f84f3329c7ce20e97f3e6d61e5391eb..58f0abd95f479d2a71f5ab3b416fce6ffc280699 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   keyplacement by Mats Bengtsson
 */
index d25002b2bbb4e421d570117b8919ddd2788fdf24..762d56d9805580a8cd5092e5a022c1417174f1eb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 492f5ff65d47c9694f22fcc2b967d5f934eb879e..2e9382f503326140895b8a3319000f3dccd935e6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "least-squares.hh"
index fe769b70bb429fd62f2cbbecc2f4a8ba200e5b87..d5ba5da8c8c305440d1bb1727afe19b05b5f5fb7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "pointer-group-interface.hh"
index 59ae3e55c9b18290c7e043a7012dd8b95cf9bda5..ff2c4141a11af742f59594463d93ec326735bf2e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <map>
index 8dd76671456cebaf4341527c55254fe61844b494..1ad6b667da93a9b11e896be7958ab735a04738eb 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
            Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 98bd944e33e8e782faa06e40a11736f982c144ee..34218968316a2bd2131034949779348576cb10af 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "international.hh"
index 16b2222ab578243a4107e6cc697c6332ad4a73c6..c3830b4b02a2303ef78983f8f72b0cfe0fd1a64d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "ligature-engraver.hh"
index ccc87807f05852445f8e1e1b933ecffcf0ac0587..3753a77795f236312f3827da724352451c0da389 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 80c7086e7a5b916ab34d080daa103eeaa795eb2b..fa783bd1758bcb25341c23693f5c58b9c6cc2c09 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 8b61e6c3cbd8493cc390215a099dc89fb9f360a4..25d2c98c25230edc1c6715237f7a8f286af569c1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "lily-lexer.hh"
index fbeb7db5072d0f3aef51382291f377ed7e92dc11..7dfeab6057b7dd4e12799e90b401a3c62b3de0c6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <unistd.h>
@@ -47,8 +47,6 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
      file name.  */
   File_name out_file_name (file_name);
 
-  global_path.append (out_file_name.dir_);
-
   out_file_name.ext_ = "";
   out_file_name.root_ = "";
   if (ly_get_option (ly_symbol2scm ("gui")) != SCM_BOOL_T
index 21e2946d193cc7a9533717397bfbf0a1e5cd41ec..eb59e7bda331038f4c7d1ad7f695ae64831f39a3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 598943c2b3c22c2bcc3bc09d730caaf4211070f3..2163e0b472274df01a8a280837f20aae65bf159c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "lily-version.hh"
index 35c2afb1d2fccafe30cd54047f9c52306e90ab48..aa192a30c77dc3415368fee9e9109609aa95e312 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <ctype.h>
index 250d893bdfcf45c5011c64b6c7bbbf74e19d80c9..e85138e5a1b7d7d80c82541e636f20d237fb3938 100644 (file)
@@ -20,7 +20,7 @@ VS_VERSION_INFO VERSIONINFO
        VALUE "FileDescription", "LilyPond"
        VALUE "FileVersion", "@MAJOR_VERSION@.@MINOR_VERSION@.@PATCH_LEVEL@.@BUILD_VERSION@"
        VALUE "InternalName", "LilyPond@"
-       VALUE "LegalCopyright ", "Copyright (C) 1995--2008  Han-Wen Nienhuys and Jan Nieuwenhuizen, and others."
+       VALUE "LegalCopyright ", "Copyright (C) 1995--2009  Han-Wen Nienhuys and Jan Nieuwenhuizen, and others."
        VALUE "OriginalFilename", "lilypond.exe"
        VALUE "ProductName", "LilyPond"
        VALUE "ProductVersion", "@MAJOR_VERSION@.@MINOR_VERSION@.@PATCH_LEVEL@"
index 3d1bb02d6f3158cf9666541ca1ce6bf0e8b932af..2fa6d61bb718e9ff2faeada5956de522461a4025 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "line-interface.hh"
index bb9b2327445fb279e22cef4f234350055261fff5..d9c5f5683522d8708501ac106c217fa1778ac481 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "align-interface.hh"
index 4cef41f0616a44a85adaf238d18aa15127220eb9..014d2ec8aba399a8552c621cae16c6a296bf2240 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
index eb73cd68cd208babfb4051eec39d6fdcd117335f..ceb26ad85d91ae9835a103e45dd399b5fc44cd16 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "lily-guile.hh"
index b75d309f2a7c6c79bf7d66a2e1d5269d45023a69..8b5a4b4992accc41f491a50311d97dd5ea41c7e9 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "dispatcher.hh"
index c290ee2dd4d804b62df0a81e31306b41e5d8cd42..c47a6e3a99ffef56479f4539cd0a8a926db16262 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
index 1c206a81fd9fc9b16b24652f2aa03a98ed1d5d46..22449890d9aa47f4b87f607726a621e53b67a050 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index d543b27ada3eac61ad29765e5b133fff18a4874e..5e254b45ee3a89f9d56f70c4338e97c909662d84 100644 (file)
@@ -2,7 +2,7 @@
   lyric-extender.cc -- implement Lyric_extender
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys
 */
 
index 2c3816d1d4f1ce69afa2e68ce240c36a2055408e..3b2dab06f1dcada003de6137969d252a7c20889b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "lyric-hyphen.hh"
index 32e874ee7e25b1974993f89ce7c75f61a99dd236..b318ab90fe3c651e53feb2a5da7e362d739a92f6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "audio-item.hh"
index ab25e953ce44f9bb6f4f6200f1aaabe25331ec0b..2d293343c5662cc7553e21fe65c7e9dc4884f059 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "main.hh"
@@ -219,8 +219,8 @@ dir_info (FILE *out)
 static void
 copyright ()
 {
-  printf (_f ("Copyright (c) %s by\n%s  and others.",
-             "1996--2008",
+  /* Do not update the copyright years here, run grand-replace.sh.  */
+  printf (_f ("Copyright (c) %s by\n%s  and others.", "1996--2009",
              AUTHORS).c_str ());
   printf ("\n");
 }
index 8cd1b8051546511b7fdc6e00e44b9d09a5e60d46..76977f91c6f438ad7951ff55429434c8a409b6b2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <cctype>
index addbc5f454d00f4d94ba293856e543d9e91f5e5f..03192a1defd611e1895b2e53cbe614a0437540bc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "warn.hh"
index 48d00ded04f503feb57bfe52377e2d199c2b851f..1e407d17ccde587aac87f624505750b1073e6d10 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "measure-grouping-spanner.hh"
index 9957185f04d10c6e3a1f9f6b54e97d5072c75b92..3dc1d28448cbabed072b048e76473bcd116a8ff3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index 826364bb7e79c9f7d2c89cf07bc03893af2aac82..2dbcd56cabc5eba65d7d1a389ff39ffc2a9b9127 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 906ace106ca689f8f93082dae7b5418a541efc26..249506ed34fb26ba16ce8b8c964e530a56a54100 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>,
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>,
   Pal Benko <benkop@freestart.hu>
 */
 
index 1670de902b965df5c51bb1ed5cc40829bb62411e..4f9e64c96193291a4cd724e23c5d842e70b7d477 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>,
+  (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>,
   Pal Benko <benkop@freestart.hu>
 */
 
index 6191407a5a11b03899e9f7fd695f8395dd610e71..aa75bcb9934b48ec11ad9c55c0f455c0efe09f8e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <cctype>
index ffd267425a3051237d30812890a47a9fb9e0e57a..d6ad38e31555997a89e9f41b5855bdbc50cece37 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index b2f1231ae19559364e849f9e397be2f789df8a4b..b6838215f5c421c80936fec689a23fa93f660c5c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "midi-item.hh"
index 4c1aa564235ccc4365ea751949d0414353e015fd..8b84798f6200ec454577493aed020b6dff2c0dbc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "midi-stream.hh"
index 97a70252b385fb33fd69511088ba18ff78d4513c..70d3e31fd611d2c7c75327ae25652c7e3013bcdf 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index f26b4b5886ecb62619d196d7583b909bb5a2311d..4588dddc3a8a34f6a301c095fc6b4d14677b31c8 100644 (file)
@@ -5,7 +5,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Nicolas Sceaux <nicolas.sceaux@free.fr>
+  (c) 2007--2009 Nicolas Sceaux <nicolas.sceaux@free.fr>
 */
 
 #include "international.hh"
index 856f34038e433a5c5d98c8453d17bc79182169a2..ee55a00c7ecb2478a04fabdb77682b6ce8689dde 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index ac2c88c68cd3f3151635b1e50a8bb6827a02edbf..6972b44f926b95f6b9487ce3864aade4fb2f9cb6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #include <cctype>
 using namespace std;
index 627504d922c8cfcd65971eca37a625b29abb2e38..8938229e5952263eade2b9b9558cb37b337531d4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "ly-module.hh"
index f4c5a91e2777bf733f4367fbd82b0a8bb2f3f410..591fc38adca3887f22258b7cfe3d2bdca9bbacf2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "moment.hh"
index 30941e31d77cd59186191230eb2d43afbf95438f..3ca7e520db3be7dc3178abcc36bb9628b92eaf53 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "moment.hh"
index 9391aac0b880d9f56f5b4fc30e1c74a744857121..fa84af9c4bf85563a9048532441d01a00dbf43c8 100644 (file)
@@ -1,7 +1,7 @@
 /*
   multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index d94518db3abc5427327a6caeb5e0cc660f40def4..7ce96126f47aa6d698c059d4bec04ca0b6e7359a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "multi-measure-rest.hh"
index 109f6d019bf1c006df66bfbf05c069a8899ad60a..d093f25a9581a63045c3c6ca060668484f1427a9 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-function.hh"
index 99972ab6d607abdef5a3a2af92b497851012a918..057d4f01ebcf9618739b282b0d28e8b715b3aa9e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index a8dd05deff2b763680e68ff17d5eecfd5f58f70f..6a613feb5eaadf7f4798070c4b0c4296ad500bb0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-output.hh"
index b8b49e0fd2c867fa9a24b56a73a356da96807d87..c90acd5f17f68c968e204ae5e36876828f409f21 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
index c57e18353a568dc34d9b6bccf3037b6c3a933878..70a2eaa862c9c246dac7bc183511fa45ec1a4f65 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-sequence.hh"
index c96764a247c1403a1a94fc41b6242cb8f1d699c5..304497a4893589da0cfb528f8ab3338f81d70ced 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-wrapper-iterator.hh"
index 7635c731f624f7ffa1c8c825d169d6ea717d890e..3e6a7d7c0b34518bcf1d9fa19098f2b635c5a622 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-wrapper.hh"
index 9d87d3bec52cd009373ca817875f7785669ec94e..f96d424b212432c9badeafdfb6a82974bed719d6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
index be395fa2d1059dee50845a8fff526321d08c6aec..525823016668b2e4bd6007c5524b8bd3a5cc1ddc 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2008--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index cd9532206dca7892fb4fda3a39d6b52c982d6e22..1cd7cd10e294cbbed8e1629261095df8a7eea7a1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 7ac359b36f8a52f5576ebde0bf1817459d19cf5b..6946eac2fa786420e5e080a70ec65978f0a180b8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-collision.hh"
index 76bde1c3d60f632cae6a3c338f2009fef5504632..bb1cd21df142bb3cfcf28254d7b8513891ef00e9 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-column.hh"
index c14d06fffec50ad884a90aa676f58b6de3b7efe6..59151f695035b1180e6cdb0176fc110c5da0ea87 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "engraver.hh"
index 4fc931497702421b2be5b8709b84bb11a93faa0f..f3cd1f3d34b9677af7c75927e2330e4724ae73e6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
 
 */
 
index 17db761f2f88463a97463fc3b02a6abffa00a7ce..1a9196ecca8b8dc995c6cbf575039af177797677 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-head.hh"
index e3fce707fae3210d16c222c4a1b735ec8d349b65..426eb7d84489575c8976c7e17932ef12cf0a5906 100644 (file)
@@ -1,7 +1,7 @@
 /*
   note-heads-engraver.cc -- part of GNU LilyPond
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 7acf90e419226268f3aa7e5fa4c28336706057d1..1e1e01acb15db4eac0a86cfd6dee02333192f2e5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 7b664fd91ebb0dffef62bd9d1d42b2f8c0878fb4..0a9f79f08a378ef8a325ca6b21c26b8e0ea88ecb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index 8a5f5c7944228753efbc518241bf09773827fac6..1859344b948200728eaaf9282b635986f354c6f8 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 2cc5c70ae2369c38b47a87309ebf1ca715ca8218..24e79cd313b8c190fc72b911f705a76190b49e37 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-spacing.hh"
index 79fe34dcd64f75437eeba4d95c5c2faceca3f079..2d33394fc80be313fdfaf8114abf222e063a721e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "modified-font-metric.hh"
index 771a87561092afc643014baa78a0391d462752a3..3d007be81130ea1bf76063ab9da61252931bcf77 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "open-type-font.hh"
index c5a61335633c6790f8bbdba7d83238fb5c521c01..44e96602e8dce90423658e5e27352da8ee923fca 100644 (file)
@@ -5,7 +5,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "international.hh"
index 70757d91588da33b3aee287883e8e2e26756c9a4..3ea133e483570520878b805c5a545bd3c1919244 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "text-interface.hh"
index cfb88a2c3a69083c7966b68f077fde7f3303ef96..f4a8a8b91c839bbaefeea66eabf1aedd81844ec7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys
+  (c) 2000--2009 Han-Wen Nienhuys
 */
 
 #include "protected-scm.hh"
index 7a44a0d0824af53de2acb6bb7621f0c1beb5b053..f3b7a1cf0a1b36543072d5a5a5331a1353612b22 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "output-def.hh"
index 212731bd5f759193bbbccd8592e2efa3a72aedcc..f9fbda9fb6d3335dd90ad623ce917f5d06510f74 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "output-def.hh"
index 12a19539b47f6bde32c8e3b9c52cd49e914d5d5a..d7f075d32196eb2a502fd4fc4410040b81465223 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   
  */
 
index 5e4dc58fa9c6e0ece54be364da12898d77205de7..e258fe685690740ef60076b90d538ef705d69637 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "paper-book.hh"
index 33d43fda085c0606352b58dc179b3ade3b54b367..a5fe6278d0f99dc8f493b54af07e1425235d65f2 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "page-breaking.hh"
index ec5a31d29ffa78c080f5c2414eb50c56bf7bdb96..c0563c87d4835de6523007fc0ea3813bc7370396 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Nicolas Sceaux <nicolas.sceaux@free.fr>
+  (c) 2007--2009 Nicolas Sceaux <nicolas.sceaux@free.fr>
 */
 
 #include "page-marker.hh"
index 7bf691e29582b9b976f683cafa5acb41da73521b..08d58cd60c281eba949235d5b8b94e3129e52454 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Nicolas Sceaux <nicolas.sceaux@free.fr>
+  (c) 2007--2009 Nicolas Sceaux <nicolas.sceaux@free.fr>
 */
 
 #include "page-marker.hh"
index 02cb009b4332c713c051ba8973e8889ce71a4471..f3d5b21e22c82b818d7a24d00e8a7e9c3200bc52 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 97ff0e45d1c606ce61ebed8324ce78d31d0d7383..71e51fa685633383f409ffb963c917135cb1284d 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "page-spacing.hh"
index e5055f1da28bbafc8b510b8e0f22793910388bf8..82cb4dd1a9a54bb71ec612ce0ce9014d4de1bf26 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "engraver.hh"
index e239cc2f2854f3a5b416e554541f50e9813658d5..97b58467b60bab8ca34cdbd0b6d118dd9f082afd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "page-turn-page-breaking.hh"
index 2c6f13cc078a0c4c633ee17c961d5d3e2f30c45c..b8772bc4c9f2f7ae3a51a012538d7d9858abefb7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #define PANGO_ENABLE_BACKEND // ugh, why necessary?
index f6456dd826a2a6e9280229e392aaadb34a4978d4..d02b63ae7a01ac0a63358f637616d4733af0f4a6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #define PANGO_ENABLE_BACKEND // ugh, why necessary?
index a044b1cd2c337bded7f821dc7d784a07af23856b..e8f97d26a4817dd617aaa8e9fc500d5eedfa173c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "config.hh"
index 4637fa26b692eeb5a7c366e71367990bb28b8475..29686d44ddce44a8799fa59365870bd34723e3bd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "dimensions.hh"
index 8c2e493e0e091ef18166b588704e82772c65fab1..6714a46239a6406eeb59f41def4145b2b637d968 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-book.hh"
index 7b43799e996db98af25b9499f15cd1240d10050a..4307bb03eaa66880ac2fd9df18817978d43cc9ad 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "paper-book.hh"
index df3723fb79dd327ae318666e2fba568bc00360b8..06dd38d9b5376da12afb8ca30643105297a86990 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-column-engraver.hh"
index c6b7c9c85c1aec0f9f5f9957937bd2b785f6b495..a6e7fa6a35fe38a1d945cc075ad5235aba0ac550 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-column.hh"
index d0aa8fa88eb24cdb963073e8440094e245d317bb..0e6362a4d4d689b1b7faadb8dad25409350bddfb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "dimensions.hh"
index bc89a86016711343b857dc19d0fefe8a4c6013f5..15b9599a4f86680e494bf4431eacb89b0c00f3e1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-outputter.hh"
index d3b99055e9191d72a3e120d172697173d2acea6c..6aedacca91202ad7f5a05b6558ea3905d4d33ce8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index ab855e320adcdfe9372121732510421e5ec73469..6f26769f476cdb62d2b347f9b780af1a07092551 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-score.hh"
index b4252c82963bb13b35c53ea156758927093cd6ba..7ae0854e984c3283799b59754c3b2a2687ffdafb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "paper-score.hh"
index 69351106110980c61ca58bd7df7722bfd0b5313a..137cef0c5c2f22f6d0c22febf16324babaf34206 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2008--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 06a878d62b85925f39f91a8873c686d1d87f5041..6653b6ddc7deb9e60582752206eda332470d27f2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "paper-system.hh"
index e7f83de80cf8cb2e485dce5bbef8dacf723ec49d..d3382070e0af877b9e41cb565668b26bdc4aa657 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 409ba889450387ee7da28a806a055e14f30217f8..d1dad300e37a0b61169010bf17343f5b687bb7de 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "parse-scm.hh"
index 83eaf89ec235912c7bccb69ef2b44dd9bc6b3943..462a58de402ee1f8dac8dabd827919660e015005 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
                  Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index be9564685d2007314ab115236d45b3a7e2f515bb..23c4bf358d0b259973dd5c43519cc7fc1f97566d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
index fdbb0b1b9135b64d9c47d5330196f277012f4ebf..5f35a0bba4d2d18725d0b04078597fdcfd035f50 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys
+  (c) 2004--2009 Han-Wen Nienhuys
 */
 
 #include "context.hh"
index dff1f5aae4816ad1c2247522ba83eddfaac6e46e..ea77254cfc1d29cfbfa18b24b3945b3a7d4fbb24 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>, Erik Sandberg <mandolaerik@gmail.com>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>, Erik Sandberg <mandolaerik@gmail.com>
 */
 
 
index af527a87946a07a81fe17b342748425c8cb96b28..ae8910fca496c61353eb1991c8cffa54d8d824ab 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "percent-repeat-item.hh"
index 5573dc7609b988b99667b51b3304cb78169b70e3..7f3115c0a1f5ecce284c78a0d2b3150e05f446c8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
                   Erik Sandberg <mandolaerik@gmail.com>
 */
 
index fafd1d9db69c23617f044410b4ce003fc83f5311..f69bb7bb6246ffd678c97c2fbe4b30582f3f122e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "performance.hh"
index 4fa167d8261f93c14fed3f63ff14116ccad1a6df..46180d0e5d857a16a0445cd15af6733a42eb21a7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performance.hh"
index d4ead0648a2f8073db71ec824410eb201c163b75..1f9e9aee12f0117a3808cb9ef66d7e17f195afd0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index fa85fca91e8b8de0b25609941bbd951e8639d8b6..357e0df8d18998e72fc84d4b9da81b7a6144030d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index e699156fc914fd109b898c2fdd9a7d53e566caea..3d66f3e8a9b96431d1c13b0e413cc14efbfe52da 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstdlib>
index ef0b4287df1faae20a2b43f6a72ec649f87f5992..4cd0c6ee109bc7001ff7b8801e3334967a38b34a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 2f1db23648b77d4ecb156859a3c72f42e6640d07..c82cb7eae135d361571d7e169fa626fbb25094b5 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 75771247ff9742bb2faebbdeeb41a00e80a68ac2..a61474e51ba9a06bd291bbfc5ad5960a4db1330a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "stencil.hh"
index 29ca669ca2c77ac7f0306e061b6ec6d7f88c6591..fd141ed3710d38ca0227352311a8d3ccb4cfad63 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>,
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>,
                  Erik Sandberg <mandolaerik@gmail.com>
 
   Chris Jackson <chris@fluffhouse.org.uk> - extended to support
index 2552e6a32f3039ebce57d82be1c6b646ed5868c2..cb5919cabc0e57e6d51015c1df886abcbf7dcbb0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index 8c70cf4a09f1dee81582e7608b05ff374d4ace73..d06d8af713dfb3219b8dc9276ed27627fb87e329 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "pitch-interval.hh"
index b059c6f1abf669ddfbc9b06c1cc95046362b15c0..1ecc247ed13911110dfccf21463d739a718d0fe3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "pitch.hh"
@@ -25,10 +25,11 @@ LY_DEFINE (ly_pitch_transpose, "ly:pitch-transpose",
 LY_DEFINE (ly_make_pitch, "ly:make-pitch",
           2, 1, 0, (SCM octave, SCM note, SCM alter),
           "@var{octave} is specified by an integer, zero for the octave"
-          " containing middle@tie{}C.  @var{note} is a number from 0"
-          " to@tie{}6, with 0 corresponding to pitch@tie{}C and 6"
-          " corresponding to pitch@tie{}B.  @var{alter} is a rational"
-          " number of whole tones for alteration.")
+          " containing middle@tie{}C. @var{note} is a number indexing the"
+          " global default scale, with 0 corresponding to pitch@tie{}C"
+          " and 6 usually corresponding to pitch@tie{}B. @var{alter} is" 
+          " a rational number of 200-cent whole tones for alteration.")
+
 {
   LY_ASSERT_TYPE (scm_is_integer, octave, 1);
   LY_ASSERT_TYPE (scm_is_integer, note, 2);
index c12f9224a7f1603f7233d8cdd6f70a2716df0cc6..764566faab23d9630d4add101d7b3f5f2fa4e658 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 90d50d46e2ff43bafeeb90136f8f81ec55ce1251..590d13872f34ebc67b207983b4b6dc4a732446ae 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "pitch.hh"
index 817ae68724adbb66ef7a9fd4fd3ff322ec04873f..18482faabd4569f5b0b1ce40e13b950e00287153 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 537bc4b964f12d533bb3bfc5527adbc35b761b1f..a8ebb09ffcaa53dd13e10fbf36cf3bc126a86ffb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "pointer-group-interface.hh"
index be021afa4faf7da9473f4b3a6683ae5afdcb4a82..cc74f8ada128f525e6970b5d347fddaf709a7871 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "prob.hh"
index 9d75d744f381cc45ffb2b02f732ce1ab3e56a325..4d11d193f1b99f6068601131e75833276d15e3c6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "prob.hh"
index 02c7da9e9b60eb0339e5cfa1626605d878ff875f..856060e8bf770eb0e09734d37e1a723029d09656 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "profile.hh"
index 1dd74ff69e8a13495e943974898f3c73223302f0..1e03c5f951bae8e38a4d8d257205d206f60068e4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "program-option.hh"
@@ -23,6 +23,8 @@ bool debug_skylines;
 bool debug_property_callbacks;
 bool debug_page_breaking_scoring;
 
+bool relative_includes;
+
 /*
   Backwards compatibility.
 */
@@ -33,11 +35,14 @@ bool profile_property_accesses = false;
   crash if internally the wrong type is used for a grob property.
 */
 bool do_internal_type_checking_global;
-bool strict_infinity_checking = false; 
+bool strict_infinity_checking = false;
 
 static SCM option_hash;
 
-void internal_set_option (SCM var, SCM val)
+
+void
+internal_set_option (SCM var,
+                    SCM val)
 {
   if (0)
     ;
@@ -74,7 +79,7 @@ void internal_set_option (SCM var, SCM val)
   else if (var == ly_symbol2scm ("old-relative"))
     {
       lily_1_8_relative = to_boolean (val);
-      /*  Needs to be reset for each file that uses this option.  */
+      /* Needs to be reset for each file that uses this option. */
       lily_1_8_compatibility_used = to_boolean (val);
       val = scm_from_bool (to_boolean (val));
     }
@@ -103,15 +108,16 @@ void internal_set_option (SCM var, SCM val)
       /* ignore input value. */
       val = ly_string2scm (lilypond_datadir);
     }
-
+  else if (var == ly_symbol2scm ("relative-includes"))
+    {
+      relative_includes = to_boolean (val);
+      val = scm_from_bool (to_boolean (val));
+    }
 
   scm_hashq_set_x (option_hash, var, val);
-
-
 }
 
 
-
 ssize const HELP_INDENT = 30;
 ssize const INDENT = 2;
 ssize const SEPARATION = 5;
@@ -123,7 +129,7 @@ static string
 get_help_string ()
 {
   SCM alist = ly_hash2alist (option_hash);
-  SCM convertor = ly_lily_module_constant ("scm->string");
+  SCM converter = ly_lily_module_constant ("scm->string");
 
   vector<string> opts;
 
@@ -131,23 +137,21 @@ get_help_string ()
     {
       SCM sym = scm_caar (s);
       SCM val = scm_cdar (s);
-      string opt_spec
-       = String_convert::char_string (' ', INDENT)
-       + ly_symbol2string (sym)
-       + " ("
-       + ly_scm2string (scm_call_1 (convertor, val))
-       + ")";
+      string opt_spec = String_convert::char_string (' ', INDENT)
+                       + ly_symbol2string (sym)
+                       + " ("
+                       + ly_scm2string (scm_call_1 (converter, val))
+                       + ")";
 
       if (opt_spec.length () + SEPARATION > HELP_INDENT)
-       {
-         opt_spec += "\n"
-           + String_convert::char_string (' ', HELP_INDENT);
-       }
+       opt_spec += "\n" + String_convert::char_string (' ', HELP_INDENT);
       else
-       opt_spec += String_convert::char_string (' ', HELP_INDENT - opt_spec.length ());
+       opt_spec += String_convert::char_string (' ', HELP_INDENT
+                                                     - opt_spec.length ());
 
       SCM opt_help_scm
-       = scm_object_property (sym, ly_symbol2scm ("program-option-documentation"));
+       = scm_object_property (sym,
+                              ly_symbol2scm ("program-option-documentation"));
       string opt_help = ly_scm2string (opt_help_scm);
       replace_all (&opt_help,
                   string ("\n"),
@@ -157,12 +161,10 @@ get_help_string ()
       opts.push_back (opt_spec + opt_help + "\n");
     }
 
-  string help ("Options supported by ly:set-option\n\n");
+  string help ("Options supported by `ly:set-option':\n\n");
   vector_sort (opts, less<string> ());
   for (vsize i = 0; i < opts.size (); i++)
     help += opts[i];
-
-  help += string ("\n");
   return help;
 }
 
@@ -171,19 +173,18 @@ LY_DEFINE (ly_option_usage, "ly:option-usage", 0, 0, 0, (),
           "Print @code{ly:set-option} usage.")
 {
   string help = get_help_string ();
-  progress_indication (help);
+  puts (help.c_str());
 
   return SCM_UNSPECIFIED;
 }
 
+
 LY_DEFINE (ly_add_option, "ly:add-option", 3, 0, 0,
           (SCM sym, SCM val, SCM description),
           "Add a program option @var{sym} with default @var{val}.")
 {
   if (!option_hash)
-    {
-      option_hash = scm_permanent_object (scm_c_make_hash_table (11));
-    }
+    option_hash = scm_permanent_object (scm_c_make_hash_table (11));
   LY_ASSERT_TYPE (ly_is_symbol, sym, 1);
   LY_ASSERT_TYPE (scm_is_string, description, 3);
 
@@ -195,6 +196,7 @@ LY_DEFINE (ly_add_option, "ly:add-option", 3, 0, 0,
   return SCM_UNSPECIFIED;
 }
 
+
 LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val),
           "Set a program option.")
 {
@@ -206,7 +208,7 @@ LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val),
   string varstr = ly_scm2string (scm_symbol_to_string (var));
   if (varstr.substr (0, 3) == string ("no-"))
     {
-      var = ly_symbol2scm (varstr.substr (3, varstr.length () -3).c_str ());
+      var = ly_symbol2scm (varstr.substr (3, varstr.length () - 3).c_str ());
       val = scm_from_bool (!to_boolean (val));
     }
 
@@ -218,18 +220,21 @@ LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val),
   return SCM_UNSPECIFIED;
 }
 
+
 LY_DEFINE (ly_command_line_options, "ly:command-line-options", 0, 0, 0, (),
           "The Scheme options specified on command-line with @option{-d}.")
 {
-  return ly_string2scm (init_scheme_variables_global); 
+  return ly_string2scm (init_scheme_variables_global);
 }
 
+
 LY_DEFINE (ly_command_line_code, "ly:command-line-code", 0, 0, 0, (),
           "The Scheme code specified on command-line with @option{-e}.")
 {
-  return ly_string2scm (init_scheme_code_global); 
+  return ly_string2scm (init_scheme_code_global);
 }
 
+
 LY_DEFINE (ly_command_line_verbose_p, "ly:command-line-verbose?", 0, 0, 0, (),
           "Was @code{be_verbose_global} set?")
 {
@@ -237,7 +242,6 @@ LY_DEFINE (ly_command_line_verbose_p, "ly:command-line-verbose?", 0, 0, 0, (),
 }
 
 
-
 LY_DEFINE (ly_all_options, "ly:all-options",
           0, 0, 0, (),
           "Get all option settings in an alist.")
@@ -252,5 +256,3 @@ LY_DEFINE (ly_get_option, "ly:get-option", 1, 0, 0, (SCM var),
   LY_ASSERT_TYPE (ly_is_symbol, var, 1);
   return scm_hashq_ref (option_hash, var, SCM_BOOL_F);
 }
-
-
index a176df86da8b048a52c4521b59a48f09a9a2f355..81f2d5ab6d1708e7b9e7a226ec64118ac0c60b5b 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 97c76dfd7e5b5b82f1ce02186118981ac67a42c9..d4fa5749c6af03fd3ae03f3762eb9d0d1e1b6b3c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "property-iterator.hh"
index 1bcc83fbc90ccd812d28aa6b7ba4c5a10c83c4b8..3a8b19a9d07397e90ca998c990f416054e5600ad 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "protected-scm.hh"
index 3eaf002c0b9557d1705e777cf8f077fb2e73931f..58d4378d2543a9a55cc65cec2d6250dd655e2f41 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music-wrapper-iterator.hh"
index 8f997ee81a988ad14a0bf6df0a4b6d130f69ba79..e2ed2e6e0491c25d1067071f780d37f7e257d06a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "input.hh"
index 8d677c425b6b30ff3d43d64548fb06fb44e1ebc2..cbd7969fede54fffeca0f1c7871407e894c95ce2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
index fd6cf85c458f2fbac7dd76ae8c3bae1f8c8b3714..69b27a8d4b3e8a24e37f44bbde8524198bf33252 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index d61ef206ba83af8dd301227cf36de164587087c9..4e4b91e3a27104452df81d56e3ca29b28853d4a5 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 64c9916e879e480737088afe9e1589768cb08240..4766cb818611c2ee0b771643c631481056ccd9e8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index becbbfcb5b55f6c45cf0200234fd4fcaa49d8899..7a004c82633e03e16dc5d09ba254fb84179b0c20 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "repeated-music.hh"
index df1c486924e296d59aa5f2bb54fbba632fce2c12..d438566c02707e346154d10a2288fade48587c3c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "warn.hh"
index 29313f1ccbac720f4d64466c72e0b79eb75c55be..f18c63a10cc466be2d2cfe5099decb0a8599c610 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rest-collision.hh"
index f4e2b08ebf4a6ce2319b64b7e0905f3ddbcf3f65..12d1f84a2e727a7a00994334fb4199729b6ff1e1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 9caae1f5e93946030eb0adb2ae8b119932601599..7fd5101d84fbcd15e73c76a11996f2b086910e1b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rest.hh"
index 874dad834b8abe2fb8e310af0a5c2d147920ad3e..fa45a95ff373a3debbe0ff2d1702cd720f570b5a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 1ea09cce717e1c93f7e379947bf2b2917719e7a0..5919c9119b90e3545d8503f2804c7ce2d4ca81fa 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rhythmic-head.hh"
index a94bcb399671f3995b7cde709629862715a47fbb..be04a669ab728b1354376aa2ab420c84e3ab0ae8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rod.hh"
index 99cd6d91db8dacc686bf49558e0c41f302fdcbb3..c1f9a81f0550c394a8f9ec6dc06e9b06d5c68869 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
       2007--2008 Rune Zedeler
       2008       Joe Neeman <joeneeman@gmail.com>
 */
@@ -20,7 +20,8 @@ LY_DEFINE (ly_make_scale, "ly:make-scale",
           1, 0, 0, (SCM steps),
           "Create a scale."
           "  The argument is a vector of rational numbers, each of which"
-          " represents the number of tones of a pitch above the tonic.")
+          " represents the number of 200 cent tones of a pitch above the"
+          " tonic.")
 {
   bool type_ok = scm_is_vector (steps);
 
@@ -66,7 +67,12 @@ Scale * default_global_scale = 0;
 
 LY_DEFINE (ly_set_default_scale, "ly:set-default-scale",
           1, 0, 0, (SCM scale),
-          "Set the global default scale.")
+          "Set the global default scale. This determines the tuning of"
+          " pitches with no accidentals or key signatures.  The first"
+          " pitch is C. Alterations are calculated relative to this"
+          " scale.  The number of pitches in this scale determines the"
+          " number of scale steps that make up an octave.  Usually the"
+          " 7-note major scale.")
 {
   LY_ASSERT_SMOB (Scale, scale, 1);
 
index 0b4d39bd9afc42b819c1401ee667f6deebce215c..7b4f6991a3551d829a88aa1ee7e8da1cb6362f92 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Erik Sandberg  <mandolaerik@gmail.com>
+  (c) 2006--2009 Erik Sandberg  <mandolaerik@gmail.com>
 */
 
 #include "scheme-listener.hh"
index 80c43dfbc023250543eb978af0811d8fb154ced0..15ef78e9d2b6e707fd3a5501ce62cb45d1a89e41 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Erik Sandberg  <mandolaerik@gmail.com>
+  (c) 2006--2009 Erik Sandberg  <mandolaerik@gmail.com>
 */
 
 #include "scheme-listener.hh"
index d3a8d7f9bd474b5bc6072bc17225b0fdcbf72758..4013af327913b44da4b2dc38a0eb182d0f15a824 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "scm-hash.hh"
index 5fea2032105a7121880b626f3506fe01af051764..eff35efed4173fb2666a69a383970d569f5b495a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "score-engraver.hh"
index 4c905446ff47cc16842008254c429cae0bd22a64..9e5db10e88d7c374669423fc2fcac9aebbc11f5c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "score-performer.hh"
index 9881bf3d4a68f1b1bacf3e05f45e28cafc009efb..c3cf1224112d7111414fda00c1d954dab1183881 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "score.hh"
index 168194891812db86b2d0885749a614cc8d8073d5..ac79dd103fc656988ca26906a7ee2ae2b5f17e83 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "score.hh"
index 6821c51733b7a292c27e0ef833c28982caa06ad5..c7d623185dcf96b878bdd01d3354c5f1973ce23e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index ac4e9c72f01764195fb85fd9088351a1ea39541c..b3371e9fd5c81b0e6b1be104bd772e7ecfdd9511 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "script-column.hh"
index f460892c138124322ee6b6d3ea817b711a50caa7..ceb4a048f855d573894e3edeacd18c158bcc5571 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index af2b8f934dbba0e6e4549537c8a3befc5df2ffbd..59737b5ac49ff9ec84a0a6c3cf9f264ec82b9c5b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "script-interface.hh"
index 91d92f4cd742dccbb084c92ac7d9a9a3ffbe7ca2..21a227228cd76ee0dd1d7a8aa515310a85e96f86 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 1459c8c817e347c71adfdaaab717ee6cd9b964b8..71d2e1f96da987fccef3bbe4d43943ad503cad8b 100644 (file)
@@ -3,7 +3,7 @@
  
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "self-alignment-interface.hh"
index 6fe180a8ea1f1295701f20dc1f52c377c8aaf3a1..508df73a9f5fe8865ffe40e1fc45af929013b4b2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 996b36a02ec05313c65ea3c027b75e0ed1f25b73..a23ddd40f540d13950611fb33405cc3c52a92021 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 60b69dbbc9f00ecbd40e95b78bb685fc156813a4..38bb5a3b402a429d4ebe7e6779217089c80b55a3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 4a9eec3ea6291915d455a046a39792fccf69d0b0..5f8471a600083fd199a75215e81ff1c2c3764abf 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "separation-item.hh"
index 308be34d0c1c46d2a3e787595c17509b8413efb4..3fd7da3839de88a3084219081ed478f39b1b3a20 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "sequential-iterator.hh"
index dcd6f237d34e962f2456979dec476cb76a3d6bb9..ed3af0577a8a0e726adfb86f079a58d513a06dda 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "side-position-interface.hh"
index 2e81591eb75b80ff5587a89f9419f76a2a6eeabf..34bfd58f1bb6d06741b031a3d1cee0785d451e77 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 #include "simple-closure.hh"
index c89f0f52be1d45b270016b12904ebcc11319a375..706be56838662d54cad6a515e4b6d29a5b8f7a16 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "simple-music-iterator.hh"
index 04ceef94f6a5abb79206bc4e661f667509996637..7308de65846ea2b3c6fe4ec41dcee664d0a1378a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstdio>
index 9b0a322b1cb37e2e9e24560549d3990c2617b148..1d38d9a70fda59eab91069b691339bd6a7d6b98d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   TODO:
   - add support for different stretch/shrink constants?
index 271ae1dc7d59610b4a16ab7be3715fd3b3fd7886..0631ba9e8dba8ed7ab59284f8cf71f20a5755ffa 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "simultaneous-music-iterator.hh"
index 100061a19c01aeb1c59d1eb5e826c70fbafefa41..61573ee01d65508baaa592542597b91a491bd024 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2008--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 78c4e8cde0b66bf372929867c5c4f82ce17dea49..8c538e8a50e83107777605552ac7e0a72f223499 100644 (file)
@@ -2,7 +2,7 @@
 
    source file of the GNU LilyPond music typesetter
  
-   (c) 2006--2008 Joe Neeman <joeneeman@gmail.com>
+   (c) 2006--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "skyline.hh"
index dbb55c1b385fead81d12454a018ae40fa0765040..16af23613a61af626342ae4ea5b87c41a91d7e6c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>, Erik Sandberg
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>, Erik Sandberg
   <mandolaerik@gmail.com>
 */
 
index 3c39b457932072fc0636647061ec711e82aaf89f..ce368ab9eb2c62eca6aab62947128cc44848869b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "slur-configuration.hh"
index 348e9e2014f282eaa35533185ed108f01eefd41c..13ca895e2e1e52a586efbbaac3bf96ebda84ec19 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 815876963fe8c1b9bdbb6d1b01c3a2b074065bae..422f065fd261b0db60504472cee4688216d0c06e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1996--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index 5cd4b5858631475894482d6d37770e432c4ddb72..00b8effc0f05cc2100d3a08169ec3f47e81eb96d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 1973102650a063d3cefdc9cd9b7e14896abee52e..bb2b1f3b2bafed2593fd0ac688b3cecef440cb9e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 2bc0ea072c9909ac2da9f10837aeccea648f4788..b1794ad4014828bff6b1c9b8f62f89b944d3e10a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 247489e342b5c759d8638baccc82fb9b2a09ef68..ea2095c3a3f39bf69d35871b5903a91567aaec2a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "smobs.hh"
index 49d8eb4f214f7f669c94e282d5d1c233aa2e9c8f..fc5b03483d78cc85582d04bf7ad576c9bb681a64 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 05717455e0c4aa038b5b0fd93ff95838ed2c9a40..3bedc8cc676a5b9a82519bd14d1772d84651001b 100644 (file)
@@ -3,12 +3,14 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "sources.hh"
 
+#include "config.hh"
 #include "source-file.hh"
+#include "file-name.hh"
 #include "file-path.hh"
 
 Sources::Sources ()
@@ -30,22 +32,38 @@ Sources::set_path (File_path *f)
 }
 
 /**
-   open a file
+   Open a file. If the name is not absolute, look in CURRENT_DIR first.
+   Afterwards, check the rest of the path_.
 
-   File_string the file to be opened, name might be changed if it is
-   found in a search path.
+   FILE_STRING the name of the file to be opened.
+   CURRENT_DIR a path to a directory, either absolute or relative to the
+     working directory.
 */
 Source_file *
-Sources::get_file (string *file_string) //UGH
-{
-  if (*file_string != "-" && path_)
+Sources::get_file (string file_string, string const& current_dir)
+{  
+  if (file_string != "-")
     {
-      string file_string_o = path_->find (*file_string);
-      if ((file_string_o == "") && (*file_string != ""))
-       return 0;
-      *file_string = file_string_o;
+      // First, check for a path relative to the directory of the
+      // file currently being parsed.
+      if (current_dir.length ()
+         && file_string.length ()
+         && !File_name (file_string).is_absolute ()
+         && is_file (current_dir + DIRSEP + file_string))
+       file_string = current_dir + DIRSEP + file_string;
+
+      // Otherwise, check the rest of the path.
+      else if (path_)
+       {
+         string file_string_o = path_->find (file_string);
+         if ((file_string_o == "") && (file_string != ""))
+           return 0;
+
+         file_string = file_string_o;
+       }
     }
-  Source_file *f = new Source_file (*file_string);
+
+  Source_file *f = new Source_file (file_string);
   add (f);
   return f;
 }
index 2088284412eca98598941367477a85e3145fb8e2..0412edcf02a2b537d7172e0fffd9aa015f3ba6ff 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "spaceable-grob.hh"
index 40e0a16b4a152122ee3d88dabb7b7983ea9978a5..0f81619beda8b4584fee3cfc0432bf518396ccad 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "spacing-spanner.hh"
index ed706a6575460447c16d6eb2d2866d28dda3d3c2..20771542fb98c74053cdfa46dde2086867716e20 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "staff-spacing.hh"
index dffb21d638cab98b0c29d179998b339954692a0f..7051ae75c483568818a5f6cb89f5c14a110e3162 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index c5a7e000c1cc6199af743260142262b92ff0ad1e..f7d6b8d31fc90d3a925272eae629f84c48665775 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2007--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "spacing-interface.hh"
index 5aeb357b37bc739a874e88aa9c5af27ffd8312d3..302cccb13340361e72360e11fbc730a9d6edc7cf 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "system.hh"
index 1dc6991fd08db68d2c1517877a3c3e1ee77e063f..f78a94a6199fc1996b4602befa57437bd1a0b8ab 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
 
 */
 
index be0cd01a450883c1d3bb3dbe6e6a3226f8780c49..d5dcb01cc87ac8efb496038cdb96556638bf003e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "spacing-spanner.hh"
index 07958a8a3e8da03bc8b7ad07c64160bb94a61db4..4630bdc07e4c66eb5b2641738ba11c6b175e5cea 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
index 64f845551334bce03dc71c7745997894abf27d58..b3709e73363ef087ded28c6843203ef4b102dbc4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "bar-line.hh"
index 31d91b1fc7502bcf79d0a269a5ca90423b0d12b5..2c0273ea72621447332253f24ca77aff9d4948f4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "span-bar.hh"
index fb5fcfdd244edd33e7066acf2680f3a56595ba8d..baac8f83a219f923d1c4a6fb7f30e2b32a393462 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
 */
 
 
index 097bdf0290b6cd2717f452535db67388b7451b07..e756d69b0e98e496b903dd7de398e854e0b5fc20 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2007--2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2007--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
index 476f75d8c26e8da85be44c334e3ca6fd18641149..8533bc72fcbd1392b74aceb48e47085d770b3f53 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "pointer-group-interface.hh"
index a50c4bf92f7fde405dd9ddc8eb9f64d060459b6a..4b20641e95af80c166f99f0b0285547db241a2da 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "spring.hh"
index cd63afa6702bc4b4ba9c59ce6ecca61512a920e8..67d41c9c39640e0add681aa50728ec5e5f240861 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2007--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "spring.hh"
index 3ecee7ba23f172f9e6eeb335cc1ac04580b852a7..29b05f4da1282529f17f181d65fd213858d96a7b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "staff-symbol.hh"
index b2565b1913d897b6c26ee02cda7d7744b83f4ae0..756b5e3a8114a5fca147be2f6c6698ed2f76c07a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "warn.hh"
index 4e92bfce649282b51dc61a12bfa015b2ace7096a..3587f70c6354c0b1d89e0df627478f26377305dd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "staff-spacing.hh"
index 12bdfe24461670abf2fee90ac18e109646e11f18..5d70855273e152e87b134a8fd2f72f0e5694ff24 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index d58f5a50438967aea763bf80c13d8f7f3df1d4bf..ebf268677781f1bf56b23f5c96f1258356951d37 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob.hh"
index 85a6806e219ea01106624d837f0ae21e414103d5..17bd099fc64e97f415ed865894ec2d1cb1d09aa4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "staff-symbol-referencer.hh"
index c00c2338d407f3572096805cf78e6b1ad050ed4f..0f1d60aa626475db0ea2d4307ab9d6299722fbd0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "staff-symbol.hh"
index 9aa4e623ae6286426c94b85e139f3238b9ac017c..494e64842f62475cbfca8d7def42f5686b143bfd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 5baf68a2fc0968b0426f322b92d63f5dd505c0d5..3434f06167c81a40707a30152d9c7d2c51ef7236 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>, Glen Prideaux <glenprideaux@iname.com>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>, Glen Prideaux <glenprideaux@iname.com>
 */
 
 #include "engraver.hh"
index fdb61219f6b7f635b78575ebc4f24237a6e22aa2..7db456006cbca4d67d63d0245afc0f16e89a8a3c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 4c722c915dbf143c27805d2f2833a13ceebdcca9..ce9e3529b693746d51eea7ba6b75119f308b6a4a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "stem-tremolo.hh"
index 3380d0cc17b1b14aec7e5d05b0d878faefc369b5..8ba6f2b6c9cdba33022481ba5b0113d4abdecfbe 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 
   TODO: This is way too hairy
@@ -1051,6 +1051,8 @@ ADD_INTERFACE (Stem,
               "avoid-note-head "
               "beam "
               "beaming "
+              "beamlet-default-length "
+              "beamlet-max-length-proportion "
               "default-direction "
               "details "
               "direction "
index ea9c08871979a16620974b071798210c0b6c63b3..b1f47997dd8930a3551f932234a48dbe7ea757db 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "stencil.hh"
index c1db5284234f485e33cddbe46c50c7bea13ebd06..9b9ed4d6a383d940d6d6d893cd1f49df211f3f98 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "stencil.hh"
index 102fe5e6c90389e028033d26e84e2c2784ff100a..c2d9d8e9616a535df7015df57437c6ef2e082ec3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
index b550eb4f7fdcd01774557286fc2e7933b2302e9a..c241fa18c271b4b08169780c85f63eb4d1ddfef6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "stencil.hh"
index 3b08add66fa0d54552ab865348548b7a4f5f2cc6..6ce5477af354d34f49210d1a9886e3c13afc8543 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Erik Sandberg  <mandolaerik@gmail.com>
+  (c) 2006--2009 Erik Sandberg  <mandolaerik@gmail.com>
 */
 
 #include "stream-event.hh"
index 0e429a957b4e73dab1458501639fb97fc70cc464..3eb0b538afbc7335a0a566f82cb3056dd164769c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 1479f663658615e6f8cf52f4926694bc586913d1..4e2a8f529ca669d42e2b910a35b67a83e143ebd1 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 #include "grob.hh"
 #include "stencil.hh"
index 0b6a7248171fa702f5e917a5aef3b7beac58c08b..f6cf49cdcb5dcf652ec33e8e9fe04733f1ebdc25 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index d24b9339a490d8c5ad754146b171a2bedcfacbbc..f148699c867ca64687be176e2875f24d972032eb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "performer.hh"
index e5e43ae35e5f244e3b764dc29fe02e2dda7756e7..37ec8b05496a22ac1531ce90a6e81ea5a22ac11a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007--2008 Joe Neeman <joeneeman@gmail.com>
+  (c) 2007--2009 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "align-interface.hh"
index ed7e34a029034212649ffd60f912c909dca4e372..ea4fcf38a859a5930b2a1da7c5172fe8065e062a 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index c2683cb9a2a991dee691cb92aff02f9ccc92a730..62c2bb52716785070538055b10652297f22bd60c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "system-start-delimiter.hh"
index ece932bd766194ff9cfde580135e53bb3c99df6f..33b0f68f40810b872de9f96c08f208d3f4c2c3ac 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2006--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2006--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 9c38c7fa2fee25c11089be49fe4aa50051b41d78..9054988dabf75304d4445de9e2094586cd041706 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "system.hh"
index ba95e01ab9d949d8f0d21d8527d7e3e5488396cd..8c493048bc3c7d009f42fca25dd070d8faa34205 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index ae012d65131d5d9c1e656dfb54b2379ff7caabfe..f89dad11009e6271ecbffbc7e6f827c30b5f64e9 100644 (file)
@@ -1,7 +1,7 @@
 /*
   tab-note-heads-engraver.cc -- part of GNU LilyPond
 
-  (c) 2002--2008 Han-Wen Nienhuys, Jean-Baptiste Lamy <jiba@tuxfamily.org>,
+  (c) 2002--2009 Han-Wen Nienhuys, Jean-Baptiste Lamy <jiba@tuxfamily.org>,
 */
 
 #include <cctype>
index ad700a3ef36f1b2b00e72f0a82825534935daa04..03df300ea2d2493a73e05ff29c7bff019e34bdab 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 3584173cc6424ac21267bc675aecbe57fbc4f283..681812f8cadc74c70ac6b6adb456088182a240e2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "moment.hh"
index 557e03c1aa612817c297641c59c4f3996715305c..5387d49a3a4ca6233e997b2d1529fd3b020a1224 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "performer.hh"
index a7d8dfa875e036fe4d93e6f43a6fe6626c2813ea..f27a74bf84fa50bf79c6f41ed73459a37697aa39 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "directional-element-interface.hh"
index 480d2726a2f0282b0ffffe9caf33fd1ecd7720b6..9b28228dab5217e06b8c75b7f8bd1e364029de9a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
index 9c1ebdcf0f0f2a76e565e40c6366c39ca98c63f6..e5b9911810099f3100c24e5822fbb74e0e4399cc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "engraver.hh"
index 2017a5ce44ce7b72a74dc63f754c07367cc30cf8..c236e55bc1252c169f479133319c8b7a2121c874 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "tie-column.hh"
index c455c5ccc41200a57b8cf8d4be4ef8bee966210b..ba94725dc0a29929d03e2f1b9cf9ec5a668ebaf6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 2524599ad76172d2fd7f0a8221fb776a4f4ac27f..bc43d1cbd69e9f5a1232fdd1811e748e09914797 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 3d30e77738d9a4fe8403cda31830839f5052e866..1a397b3b7479d675dca9e4fe301f92a7503e5a2e 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index ba064bcd3d511e638d9c3643a2bef0cccc1ffb4b..7eb20666be348d15d9b856c6d4062de33cca12b6 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 9f6ae786696234f72e85bd004ded06c1bfbfe8d4..58bc879ec13bb3619ee7007fdf89f697e376c817 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "performer.hh"
index f02cddacf84a8f107cc637dcf72121c3c48332eb..5c64db64940522c4427a21a868e17fdcc5b9ea8a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "tie.hh"
index 8228b60eaaf62811be1e5d5c78d7cb3c182c428e..e70c44a4854a3dfabf5d0709bd5b4e3782d0fd2a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
                  Erik Sandberg <mandolaerik@gmail.com>
 */
 
index ec4ff28efc58ea7e8bc2dcb216b7d21b233fc08a..9d4343360475191038b51b32c6521d394b17d7f2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver-group.hh"
index 3d348931a49d02288651aa71445ddd864be00055..740aca82d39ac9b36b67d32123728e2ec45943d7 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "audio-item.hh"
index 6958de57eac19c70354649a82581aaa4cf634ee4..3635a84910186bb23b8f11664ca68ec2f2f1c4ed 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1996--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1996--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "time-signature.hh"
index 749aa18e47b3e80d5ea0aa16384f72e69130a76c..57998ace963d654a45cb598a5b8e6933556d3f24 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "timing-translator.hh"
index 147525cea4a70c766ecd8d3505f5a5daddf0ab33..5290743e2e3c29536303bfd1daa7ec0d2f9665bc 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "translator.hh"
index 5a6ce4a0a661e78779f293f60d64b64ef21bbb0d..bf8c70e0038975943bfcf13d6d2b47373398d9d0 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "translator-dispatch-list.hh"
index f787b94399cdc31c400e5a32d099f640a5e4c66f..d1d03f37f032c094860a63ef45e49aace58c0b64 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "score-engraver.hh"
index fb6d2580ed09bf2b50461104272e633bee972220..64c28ac83dc5ed57fc4addfbe1ad589ec8e8e43b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
                  Erik Sandberg <mandolaerik@gmail.com>
 */
 
index 4f920c8b1a6a003ad90c2f505f05752ff2683d23..775e47da0df2275246b19170a4b462ac5a9bbf4c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context-def.hh"
index 9ebe2cd4bf97fcc829030087c4b0e0713450e106..efa375549fba042301a1f4903b0c567113999573 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "translator.hh"
index 8288e78ddcfdedebff68df928d71a1f56cd17889..513a2ae6050d558709f37b180f1330fa6a73d5bf 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 /*
index 41363880c92ee269551a53e0d6b544395d45e19d..62c6d4695e1cba7e5af289a116a05f9fc0d2e54a 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstdio>
index 4edf3f3ba639425f438d458fe7cf476a208e93eb..4ddb09245ee236f98a17c5e7cb359f8b8711ffa2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
index 772b8db124e855b6d6a951d9a69a4ed02c5295c6..6ee50151d5cfc62bda458f3748728908e199148b 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "beam.hh"
index a08c37dd3e1d0a96b3485cda7102a8a4bf5b6e59..117179eb112a3f9464ac3604a6e8b68c091eaadd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index dfdf5d6d3bd828502e33a13bbf46e5147fa96f24..eb3167bd5b9b36fed8221c1308f8403ddd5a0e02 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
index 9aeae1ee6d6c6b2186f4d7b6cabb09953132c2a6..19d26eaa79c05c66e3c912ba74d8e71f027b94e4 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "translator.hh"
index 5bfab328f206a54001e7489d4ffcfd6144c133b3..b3247c0c818a64e68d8016f1ae27e99ecaf59881 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
index 53bec433d7c196be7b7fb5a9728ac273cd6e8685..0e91f1765a8deca0a953b496a6601d3c330c833c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "gregorian-ligature-engraver.hh"
index 4995aad2f04ddd0b8920c57789f36516f66bf5fd..3a37fb5dce57b1dcc30f727a79a54d54f41fda3f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2003--2008 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003--2009 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "vaticana-ligature.hh"
index 0d07a509dfbc864db37dffe53ed6ff8e7a6d5fac..365c35cb4870659be13a50f311e06dcd1a0b351c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "context.hh"
index 5c32c0fd8811b314d55f61a7e48b2c7aa4632d5f..750f2e3721c77e26e623513c2324a916dd99a4dd 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 494cbfb1c336ec74d2d62e56abbe92bee02f5402..d5f4bc6daaee71fe46c0a4611e6e3d05eba8c472 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <cstring>
index d2a45dd6c2e071b3ac06b9ae95888744c9c3cacd..bd8e9e2c39645bf6af5aaa7774b73eeb44521d5d 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "engraver.hh"
index 90cdb0dfd40b6cde6b0f284d181dfbc6eda0a6bd..e018fe74b1ca9b09a0e049c689a46ff6e9a5c1ac 100644 (file)
@@ -4,7 +4,7 @@
   source file of the GNU LilyPond music typesetter
 
 
-  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
diff --git a/ly/SConscript b/ly/SConscript
deleted file mode 100644 (file)
index a615862..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-sources = src_glob ('*.ly')
-install (sources, env['sharedir_package_version'] + '/ly')
index 0c5b7e6db5830e226615b86dcaab1e7e0c2e3997..1b4537290ed59f180086bc4472df0f4064427f86 100644 (file)
@@ -793,7 +793,7 @@ of Editio Vaticana."
   \Voice
   \name "GregorianTranscriptionVoice"
   \alias "Voice"
-  
+
   %% Removing ligature bracket engraver without replacing it by some
   %% other ligature engraver would cause a "Junking event: `LigatureEvent'"
   %% warning for every "\[" and "\]".  Therefore, we make the grob
@@ -847,7 +847,8 @@ accommodated for typesetting a piece in mensural style."
   \consists "Mensural_ligature_engraver"
 
   %% Set default head for notes outside of \[ \].
-  \override NoteHead #'style = #'petrucci
+  \override NoteHead #'style = #'mensural
+  \override Rest #'style = #'mensural
 
   %% There are no beams in mensural notation.
   autoBeaming = ##f
@@ -875,8 +876,8 @@ accommodated for typesetting a piece in mensural style."
   %% FIXME: unit on StaffSymbol's width should be \linewidth.
   %% \override StaffSymbol #'width = #60.0
 
-  %% Choose petrucci g clef on 2nd line as default.
-  clefGlyph = #"clefs.petrucci.g"
+  %% Choose mensural g clef on 2nd line as default.
+  clefGlyph = #"clefs.mensural.g"
   middleCClefPosition = #-6
   middleCPosition = #-6
   clefPosition = #-2
@@ -894,7 +895,7 @@ accommodated for typesetting a piece in mensural style."
   %% #(set-accidental-style 'forget))
   extraNatural = ##f
   autoAccidentals = #`(Staff ,(make-accidental-rule 'same-octave -1))
-  autoCautionaries = #'()  
+  autoCautionaries = #'()
   printKeyCancellation = ##f
 }
 
index df88ee79bf863665b0b4a7fe9828d6e41c8ce375..b4e8ec75f0181b427e253dfb18afc09a6d00e10c 100644 (file)
@@ -2,7 +2,7 @@
 %%%%
 %%%% source file of the GNU LilyPond music typesetter
 %%%%
-%%%% (c) 2008 Carl D. Sorensen <c_sorensen@byu.edu>
+%%%% (c) 2008--2009 Carl D. Sorensen <c_sorensen@byu.edu>
 
 \version "2.12.0"
 
index 84244b257c15b13243f483c12ab0c7383c1147bb..815b704417103aaf559738f7084058f57f5592a4 100644 (file)
@@ -2,7 +2,7 @@
 %%%%
 %%%% source file of the GNU LilyPond music typesetter
 %%%%
-%%%% (c) 2008 Carl D. Sorensen <c_sorensen@byu.edu>
+%%%% (c) 2008--2009 Carl D. Sorensen <c_sorensen@byu.edu>
 
 %%%  Add basic chordshapes
 
index fc0530f93bf85e33b34ba96a6de7c03cc9661d5b..159ad04c8e3a9d4f76379bd415895c754e2ce102 100644 (file)
@@ -4,7 +4,7 @@
 %
 %  This is part of the Lilypond distribution files
 %
-%  Copyright 2008 by Jonathan Kulp
+%  Copyright 2008--2009 by Jonathan Kulp
 %
 
 
index 8afe50af8442ffd541fc05052c3e00fead754aa0..3b97883dfd129fc3da7a85827ddcbc9736467d0b 100644 (file)
@@ -1,4 +1,4 @@
 default:
 
 local-WWW-2: $(OUT_HTML_FILES)
-       $(PYTHON) $(buildscript-dir)/mass-link.py --prepend-suffix .$(ISOLANG) hard $(outdir) $(top-build-dir)/Documentation/$(outdir) $(HTML_FILES)
+       $(buildscript-dir)/mass-link --prepend-suffix .$(ISOLANG) hard $(outdir) $(top-build-dir)/Documentation/$(outdir) $(HTML_FILES)
index 66a97cc22874b2ac12b126d852838ba4eaa07bc1..59bfe8b6f139c1e2688e644c5766879b8632f8c6 100644 (file)
@@ -17,7 +17,7 @@ $(outdir)/%-big-page.html: $(outdir)/%.texi
 endif
 
 $(outdir)/%.pdftexi: $(outdir)/%.texi
-       $(PYTHON) $(buildscript-dir)/texi-gettext.py $(ISOLANG) $<
+       $(buildscript-dir)/texi-gettext $(ISOLANG) $<
 
 $(outdir)/%.pdf: $(outdir)/%.pdftexi
        cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) $(TEXINFO_PAPERSIZE_OPTION) $(notdir $*).pdftexi
@@ -31,7 +31,7 @@ $(outdir)/%.png: $(top-build-dir)/Documentation/user/$(outdir)/%.png
        ln -f $< $@
 
 $(XREF_MAPS_DIR)/%.$(ISOLANG).xref-map: $(outdir)/%.texi
-       $(PYTHON) $(buildscript-dir)/extract_texi_filenames.py -o $(XREF_MAPS_DIR) $<
+       $(buildscript-dir)/extract_texi_filenames -o $(XREF_MAPS_DIR) $<
 
 $(MASTER_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES)
 
index 44c9a1a3d677a4d0afb6bc29ec0a7f8869376865..4bb7c5b9c9d78acacec8a1ac3badc3a2dce8061c 100644 (file)
@@ -3,9 +3,9 @@ default:
 local-WWW-1: $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAPS_FILES)
 
 local-WWW-2: $(DEEP_HTML_FILES) $(BIG_PAGE_HTML_FILES) $(DOCUMENTATION_LOCALE_TARGET)
-       find $(outdir) -name '*.html' | xargs grep -L 'UNTRANSLATED NODE: IGNORE ME' | xargs $(PYTHON) $(buildscript-dir)/html-gettext.py $(ISOLANG)
-       find $(outdir) -name '*.html' | xargs grep -L --label="" 'UNTRANSLATED NODE: IGNORE ME' | sed 's!$(outdir)/!!g' | xargs $(PYTHON) $(buildscript-dir)/mass-link.py --prepend-suffix .$(ISOLANG) hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir) $(TELY_FILES:%.tely=%.pdf)
-       find $(outdir) \( -name 'lily-*.png' -o -name 'lily-*.ly' \) | sed 's!$(outdir)/!!g' | xargs $(PYTHON) $(buildscript-dir)/mass-link.py hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir)
+       find $(outdir) -name '*.html' | xargs grep -L 'UNTRANSLATED NODE: IGNORE ME' | xargs $(buildscript-dir)/html-gettext $(ISOLANG)
+       find $(outdir) -name '*.html' | xargs grep -L --label="" 'UNTRANSLATED NODE: IGNORE ME' | sed 's!$(outdir)/!!g' | xargs $(buildscript-dir)/mass-link --prepend-suffix .$(ISOLANG) hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir) $(TELY_FILES:%.tely=%.pdf)
+       find $(outdir) \( -name 'lily-*.png' -o -name 'lily-*.ly' \) | sed 's!$(outdir)/!!g' | xargs $(buildscript-dir)/mass-link hard $(outdir) $(top-build-dir)/Documentation/user/$(outdir)
 
 $(DOCUMENTATION_LOCALE_TARGET):
        $(MAKE) -C $(depth)/Documentation/po out=www messages
index 428e5b900a939f4441e78c79710bc56ad64f9012..44cb80ccaaf055e0cbdb64c300ef6c62be8b7b73 100644 (file)
@@ -8,7 +8,9 @@
 # you do make dist
 #
 
-buildscript-dir = $(src-depth)/buildscripts
+buildscript-dir = $(top-build-dir)/scripts/build/$(outconfbase)
+auxpython-dir = $(src-depth)/python/auxiliar
+auxscript-dir = $(src-depth)/scripts/auxiliar
 script-dir = $(src-depth)/scripts
 input-dir = $(src-depth)/input
 
@@ -18,7 +20,7 @@ mi2mu-dir = $(src-depth)/mi2mu
 make-dir = $(src-depth)/make
 include-flower = $(src-depth)/flower/include
 
-export PYTHONPATH:=$(buildscript-dir):$(PYTHONPATH)
+export PYTHONPATH:=$(auxpython-dir):$(PYTHONPATH)
 
 LILYPOND_INCLUDES = $(include-flower) $(depth)/flower/$(outdir)
 
index 10b82d8d9fd78c8af991d68ae7b4c59f48bf6586..4faeb8fcd582d838515110355ec0e06388791969 100644 (file)
@@ -3,7 +3,7 @@
 ifeq ($(LILYPOND_EXTERNAL_BINARY),)
 
 # environment settings.
-export PATH:=$(top-build-dir)/lily/$(outconfbase):$(top-build-dir)/buildscripts/$(outconfbase):$(top-build-dir)/scripts/$(outconfbase):$(PATH):
+export PATH:=$(top-build-dir)/lily/$(outconfbase):$(buildscript-dir):$(top-build-dir)/scripts/$(outconfbase):$(PATH):
 export LILYPOND_BINARY=$(top-build-dir)/$(outconfbase)/bin/lilypond
 else
 
@@ -77,5 +77,5 @@ export LYDOC_LOCALEDIR:= $(top-build-dir)/Documentation/po/out-www
 #texi-html for www only:
 LILYPOND_BOOK_FORMAT=$(if $(subst out-www,,$(notdir $(outdir))),texi,texi-html)
 LY2DVI = $(LILYPOND_BINARY)
-LYS_TO_TELY = $(buildscript-dir)/lys-to-tely.py
+LYS_TO_TELY = $(buildscript-dir)/lys-to-tely
 
index 6dfa8e6f0b185d0e483ad38aa218479422b94a26..67458875144156866e71c8ccbc31121e529470c0 100644 (file)
@@ -1,3 +1,3 @@
 $(outdir)/collated-files.tely: $(COLLATED_FILES)
-       $(PYTHON)  $(LYS_TO_TELY) --name=$(outdir)/collated-files.tely --title="$(TITLE)" $^
+       $(LYS_TO_TELY) --name=$(outdir)/collated-files.tely --title="$(TITLE)" $^
 
index fc175ece72f684ee9ed462e76f0b93dfb91b24a2..74ba9f67d9455afba614e8652d7f4e00f36cb62d 100644 (file)
@@ -36,3 +36,5 @@ ATVARIABLES = \
   program_prefix\
   program_suffix\
   sharedstatedir\
+  src-dir\
+  top-src-dir\
index 898a4c245b132bce3aa155ee0260f6c3d837dc76..389f7b9baf88a3720e8e0f23ebf6a4ea929539ab 100644 (file)
@@ -120,8 +120,8 @@ $(outdir)/aybabtu.fontname:
 $(outdir)/aybabtu.subfonts:
        echo $(subst .mf,,$(call src-wildcard,feta-braces-[a-z].mf)) > $@
 
-$(PE_SCRIPTS): $(top-build-dir)/buildscripts/$(outdir)/gen-emmentaler-scripts
-       $(PYTHON) $< --dir=$(outdir)
+$(PE_SCRIPTS): $(buildscript-dir)/gen-emmentaler-scripts
+       $< --dir=$(outdir)
 
 ALL_FONTS = $(FETA_FONTS)
 PFB_FILES = $(ALL_FONTS:%=$(outdir)/%.pfb)
@@ -174,12 +174,12 @@ $(outdir)/%.lisp \
 $(outdir)/%.otf-gtable \
 $(outdir)/%.enc \
 $(outdir)/%.pe: $(outdir)/%.log
-       $(PYTHON) $(buildscript-dir)/mf-to-table.py \
-                 --global-lisp=$(outdir)/$(<F:.log=.otf-gtable) \
-                 --lisp=$(outdir)/$(<F:.log=.lisp) \
-                 --outdir=$(outdir) \
-                 --enc $(outdir)/$(<F:.log=.enc) \
-                 $<
+       $(buildscript-dir)/mf-to-table \
+               --global-lisp=$(outdir)/$(<F:.log=.otf-gtable) \
+               --lisp=$(outdir)/$(<F:.log=.lisp) \
+               --outdir=$(outdir) \
+               --enc $(outdir)/$(<F:.log=.enc) \
+               $<
 
 local-clean:
        rm -f mfplain.mem mfplain.log
@@ -190,9 +190,9 @@ $(outdir)/fonts.conf:
        echo '<fontconfig><dir>'$(shell cd $(outdir); pwd)'</dir></fontconfig>' > $@
 
 $(NCSB_OTFS): $(NCSB_SOURCE_FILES) \
-             $(buildscript-dir)/pfx2ttf.fontforge
+             $(auxscript-dir)/pfx2ttf.fontforge
        $(foreach i, $(basename $(NCSB_SOURCE_FILES)), \
-               $(FONTFORGE) -script $(buildscript-dir)/pfx2ttf.fontforge \
+               $(FONTFORGE) -script $(auxscript-dir)/pfx2ttf.fontforge \
                        $(i).pfb $(i).afm $(outdir)/ && ) true
 
 # eof
diff --git a/mf/SConscript b/mf/SConscript
deleted file mode 100644 (file)
index 1a5f281..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-# -*-python-*-
-
-import os
-import re
-import string
-
-Import ('env', 'base_glob', 'install')
-feta = reduce (lambda x, y: x + y,
-              map (lambda x: base_glob (x),
-                   ('feta[0-9]*.mf',
-                    'feta-alphabet*[0-9].mf',
-                    'feta-braces-[a-z]*.mf',
-                    'parmesan[0-9]*.mf',)))
-feta = base_glob ('feta[0-9][0-9]*.mf')
-feta_alphabet = base_glob ('feta-alphabet[0-9][0-9]*.mf')
-feta_braces = base_glob ('feta-braces-[a-z].mf')
-parmesan = base_glob ('parmesan[0-9][0-9]*.mf')
-
-fonts = feta + feta_alphabet + feta_braces + parmesan
-
-feta_sizes = map (lambda x: re.sub ('feta([0-9]+)', '\\1', x), feta)
-otfs = map (lambda x: 'emmentaler-' + x, feta_sizes) + ['aybabtu']
-
-t = map (env.TFM, fonts)
-g = map (env.GTABLE, fonts)
-p = map (env.PFA, fonts)
-e = map (lambda x: x + '.enc', fonts)
-s = map (lambda x: x + '.svg', fonts)
-o = map (env.OTF, otfs)
-
-# Emmentaler
-a = '''cat ${SOURCE} \
-$$(echo ${SOURCE} | grep -v brace | sed s/feta/parmesan/) \
-$$(echo ${SOURCE} | grep -v brace | sed s/feta/feta-alphabet/) \
-> ${TARGET}'''
-otf_table = Builder (action = a, suffix = '.otf-table',
-                    # barf
-                    src_suffix = '.lisp')
-env.Append (BUILDERS = {'OTF_TABLE': otf_table})
-f = map (env.OTF_TABLE, feta)
-g = map (env.OTF_TABLE, feta_braces)
-
-map (lambda x: env.Depends ('feta' + x + '.otf-table',
-                           ['parmesan' + x + '.lisp',
-                           'feta-alphabet' + x + '.lisp']), feta_sizes)
-
-map (lambda x: env.Depends ('emmentaler-' + x + '.otf',
-                           'feta' + x + '.otf-table'),
-     feta_sizes)
-
-map (lambda x: env.Depends ('emmentaler-' + x + '.otf',
-                           ['feta' + x + '.pfa',
-                            'parmesan' + x + '.pfa',
-                            'feta-alphabet' + x + '.pfa']), feta_sizes)
-
-for i in feta_sizes:
-       env.Command ('emmentaler-%(i)s.pe' % locals (),
-                    '$srcdir/buildscripts/gen-emmentaler-scripts.py',
-                    '$PYTHON $srcdir/buildscripts/gen-emmentaler-scripts.py --dir=${TARGET.dir}')
-
-map (lambda x: env.Depends (x + '.pfa', x + '.enc'), feta)
-
-
-# Aybabtu
-
-feta_braces_pfa = map (lambda x: x + '.pfa', feta_braces)
-
-env.AT_COPY ('aybabtu.pe.in')
-env.Command ('aybabtu.fontname', '', 'echo -n aybabtu > $TARGET')
-env.Command ('aybabtu.subfonts',
-            map (lambda x: x + '.mf', feta_braces),
-            'echo ${SOURCES.filebase} > $TARGET')
-
-env.Command ('aybabtu.otf-table',
-            map (lambda x: x + '.otf-table', feta_braces),
-            'cd ${TARGET.dir} && cat ${SOURCES.file} > ${TARGET.file}')
-
-env.Command ('aybabtu.otf-gtable',
-            map (lambda x: x + '.otf-gtable', feta_braces),
-            'echo "(design_size . 20)" > $TARGET')
-
-env.Depends ('aybabtu.otf',
-            feta_braces_pfa
-            + ['aybabtu.subfonts',
-               'aybabtu.fontname',
-               'aybabtu.otf-table',
-               'aybabtu.otf-gtable'])
-
-## FIXME: building only a few fonts does not seem to work anymore.
-## what is essential these days, aybabtu/emmentaler are needed always?
-mf_essential = ['feta16', 'feta20', 'parmesan16', ]
-pfa_essential = map (env.PFA, mf_essential) + ['emmentaler-20.otf']
-env.Alias ('mf-essential', pfa_essential)
-env.Alias ('mf-essential', 'fonts.cache-1')
-
-env['fonts'] = string.join (fonts)
-env['feta_sizes'] = string.join (feta_sizes)
-
-env.Alias ('mf', pfa_essential + p + map (lambda x: x[0], o))
-env.Alias ('mf', s)
-env.Alias ('mf', 'fonts.cache-1')
-
-install (t, env['sharedir_package_version'] + '/fonts/tfm')
-install (p, env['sharedir_package_version'] + '/fonts/type1')
-install (o, env['sharedir_package_version'] + '/fonts/otf')
-install (e, env['sharedir_package_version'] + '/ps')
-install (s, env['sharedir_package_version'] + '/fonts/svg')
-
index 749184e4d9176cc318caa0c7513c0557568c92e6..f1058000873bdf7039b5987b5ee1cbf80f5e4736 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the GNU LilyPond music typesetter
 %
-% (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 fet_begingroup ("accordion");
 
index 4dc742320d50f62269a51f7d7a8245a97886f74b..f0c39c783f18754894030d7e1c24b105f88cec52 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the GNU LilyPond music typesetter
 %
-% (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 fet_begingroup ("arrowheads");
 
index fe7467aca255712b0739804dc64f860577e7519f..24a0e1b9ddc410dc5f47e5b4a1908f5bb177a087 100644 (file)
@@ -4,7 +4,7 @@
 % source file of the Feta (not an acronym for Font-En-Tja)
 % pretty-but-neat music font
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %          Jan Nieuwenhuizen <janneke@gnu.org>
 %
 % These macros help create ascii logging output
index f593c6f36f9d7713538896c358fcb2c3b01b6ca8..46b3b0617b9c6102460b6d75328f687317ab1101 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the GNU LilyPond music typesetter
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 fet_begingroup ("flags");
 
index c3541aaf180eb44663f982eda02a51297fab999d..c61f756d38273c14a0300065c38c005dc6282dc8 100644 (file)
@@ -4,7 +4,7 @@
 % source file of the Feta (not an acronym for Font-En-Tja)
 % pretty-but-neat music font
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %                Jan Nieuwenhuizen <janneke@gnu.org>
 
 
index cae8c200a8e84c093803b7090bb3751001a383cd..fcda600978cc99541031ab051d7ed902cfdb48c2 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of LilyPond's pretty-but-neat music font
 %
-% (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 % & Han-Wen Nienhuys <hanwen@xs4all.nl>
 % & Juergen Reuter <reuter@ipd.uka.de>
 %
index 1d19320d3ea5a3548cde86703b0bc4b213e64fe8..9d8a9d83652343f81be6b47e8ea9c8f18411046d 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 0;
index 568d639e1fdc28c1b6df01cba6305fb378c1141f..e74606dcfb1b46889a4b7cdef04a77e0420c8fec 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 1;
index 9ffdddfb94b72321c542375a7025c20d441cfc5f..06a273ed6798c252802d90b705ab6a6347506b63 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 2;
index 14b66bab3170ad0a9405f118d2b1d7a40221b573..d926a595e643de0d45e30d98066aab934a9fe27c 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 3;
index 88420858a302ecc41b1fc436672c9711619deea5..ed89fc5a31d535439dfb59e5de6fee0498e979cf 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 4;
index 2abf13fc2fb5f25d5b318c6bb18192f5c5c7e54a..4a96744e3ba073e8d2ca9010a91e8d79b78505d6 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 5;
index 1036804aebfd848ed35d1c0867cb957f7e34d94f..3a12239cc0a152bdffbc7be5753f86d27605cb28 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 6;
index 98d8686882e1eec6620fb8d5c5ae27e8715db087..9d4988e792970a803d27b2b731cf0443fff6c567 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 7;
index bd67f898c02a6c995eb6386ec23a0fd66424f54b..7089e60c2af04c86c5193043dbe0d0ff7dac225d 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of the Feta (Font-En-Tja) music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 font_count := 8;
index ea6569acda54847eddb99fff4883a5e57d5c0a83..809227de450e8462e7fa94c16141e6e10da27586 100644 (file)
@@ -4,7 +4,7 @@
 %
 % source file of the Feta (not the Font-En-Tja) music font
 %
-% (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
 ex# := (dynamic_design_size / 2.4) * pt#;
index da6630d5ed0ff5fc3be7fc7b237d7b375451189b..de97f1867763cb4debb3200474fd4a28cd08bcc4 100644 (file)
@@ -4,7 +4,7 @@
 %
 % source file of the Feta (not the Font-En-Tja) music font
 %
-% (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 fet_begingroup ("rests");
 
index 6f6cb1ae0c018bc34e8aad4e469d16b5214e7927..f2c90cdf616c78fe03e19c1f4da2747477811d6b 100644 (file)
@@ -5,7 +5,7 @@
 % source file of the Feta (defintively not an abbreviation for Font-En-Tja)
 % music font
 % 
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 % 
 
 
index 97c88e97d56abc5b6c7077a01f7a258999d5c8e7..ddc01c0847015bfc2bd7724520d43744598541d4 100644 (file)
@@ -4,7 +4,7 @@
 %
 % source file of the Feta (not the Font-En-Tja) music font
 %
-% (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 fet_begingroup ("brackettips");
 
index 8f80dc553eea0d632e29ae53c89803b40dc8d895..15008d848eda96114025e53b0e4927bd65db4fdd 100644 (file)
@@ -4,7 +4,7 @@
 %
 % source file of the Feta (not the Font-En-Tja) music font
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
 % Jan Nieuwenhuizen <janneke@gnu.org>,
 % Juergen Reuter <reuter@ipd.uka.de>
 
index 49e61c359202cdf686ba0cade8a3acebfa06e4dd..19cc379a422933dbca915cc0e2062c4eac6d27e4 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the GNU LilyPond music typesetter
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
 %
index f562c4cad9953a9e7dce86e348d008f75b3feacd..ab8fe9f01179b83cfe2b001eb9941775590a0f05 100644 (file)
@@ -4,7 +4,7 @@
 %
 % source file of the Feta (not the Font-En-Tja) music font
 %
-% (c) 1997--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+% (c) 1997--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
 height# := number_design_size;
index 544251932cf67952c19ac1f6a65170e6a43b7cd0..96d9862897c280ad5600b618e3b894d4aaed787f 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the GNU LilyPond music typesetter
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 stafflines := 5;
 
index 202a96dea43dc5c013d4dc38a0e1867cb747fb6a..fded9ecb3e4496da1b11bfb4404850e932a49e8d 100644 (file)
@@ -5,7 +5,7 @@
 %
 % source file of the Feta (not the Font-En-Tja) music font
 %
-% (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+% (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 %
 % Voor Cup
 
index 020d432d7c2693f9a500a9f2af0ecb96736b41fb..a24e36938c9d1c68ec30c753c85f108d437837c7 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the GNU LilyPond music typesetter
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 fet_begingroup ("dots");
 
index 6c003c4685ba09ccbe5ca3490dcb167ef40e0759..5bb7c1abddd4bd732cb1ed7cb4cdbb975f728af1 100644 (file)
@@ -4,7 +4,7 @@
 % source file of the Feta (defintively not an abbreviation for Font-En-Tja)
 % music font
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %      Jan Nieuwenhuizen <janneke@gnu.org>
 %
 
index 101385cfec13c42082db4c51523bc6a40b847929..3b054103cd22f0ebcc5a7bdecb7efbb3939994bc 100644 (file)
@@ -4,7 +4,7 @@
 % source file of the Feta (definitely not an abbreviation for Font-En-Tja)
 % music font
 %
-% (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+% (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 %
 
 % this file is included by feta-scripts.mf
index 116a6764a4ee6a3225ccae17c4f9d1dbe71a9762..ffaa1883f99ed17bf4df7152fb32a5820c94ca32 100644 (file)
@@ -3,7 +3,7 @@
 %
 % source file of the Feta (not an abbreviation of Font-En-Tja) music font
 %
-% (c) 1998--2008 Mats Bengtsson <matsb@s3.kth.se>,
+% (c) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
 %               Christian Mondrup <scancm@biobase.dk>
 
 fet_begingroup ("timesig");
index ef536cae8269ebff3cd5b94fa5dd62529b0a4cbc..48061fcd0533eaae09d74208ce95addde680720e 100644 (file)
@@ -1,7 +1,7 @@
 %
 % feta-toevallig.mf -- implement Accidentals
 %
-% (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+% (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %
 
 
index 6d9e7b0ee7b64039922667b9f59501913c039ced..b5fe66306128aa5cc837cf5d242a38101a874c61 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2001--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 fet_begingroup ("accidentals");
index 7a5fbc1dec3d6cb73556e076c57b3af225df9c4b..afd5058e7da507709cc8a77d3e5a9eddb2ead8c9 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 %
-% (c) 2001--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
 %
 
 fet_begingroup ("clefs");
index adc702c279d0bb477cbae013cf7ce74e94a59d38..d1a2d6c7586eac332c5f92890eea8690a8c9a9a1 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2000--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2000--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 save black_notehead_width;
index 1a2d9517131169e8f0b78052d8380401de87bbb0..826dabe2c86cc6a5e68407b395e03e30c533b50a 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2006--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2006--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 fet_begingroup ("dots");
index 6b6343b42446be80404e7bab20611ff902635eaf..32a55df0e2fd9c4a808f36e71f029c80579a8362 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2001--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 fet_begingroup ("flags");
index 311b75d040fc5755ed96e758802f1a3ad3550421..6ffb53aad5134259919acc8de565f5aa14ccde85 100644 (file)
@@ -4,7 +4,7 @@
 %
 % source file of LilyPond's pretty-but-neat music font
 %
-% (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 %
 
 
index 6064a66bd6556e15448e0690b4f2c7bc69705c50..b897554d883a7f53b96aa2f281674e7e9e20429a 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2001--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 % Neo-mensural heads originally by
 % Christian Mondrup and Mats Bengtsson
index 25d8272177f30ea4612e3131b23d3c30529e0f12..94d728a3e225da548d288f4af953b6447f77a700 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2001--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 
index 540b7898de347017d9319bb9f7a1e3ad171f8f98..060307db7133da96b959cc07a812e8717c53a1d1 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2001--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2001--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 % Neo-mensural rests originally by
 % Christian Mondrup and Mats Bengtsson.
index fd260768a45dd6a3c13d05e83b601d85bc9e711c..3a43a46aecbb50f717807b7a76c8f45f73e209b4 100644 (file)
@@ -3,7 +3,7 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 fet_begingroup ("scripts");
index da077582e1d76cc402e3b793f2f1e2274843b9cd..8d0ab9d45cfb2ba9216b9c6deba36cbfecf8135f 100644 (file)
@@ -3,9 +3,9 @@
 % 
 % source file of LilyPond's pretty-but-neat music font
 % 
-% (c) 1998--2008 Mats Bengtsson <matsb@s3.kth.se>,
+% (c) 1998--2009 Mats Bengtsson <matsb@s3.kth.se>,
 %               Christian Mondrup <scancm@biobase.dk>
-% (c) 2002--2008 Juergen Reuter <reuter@ipd.uka.de>
+% (c) 2002--2009 Juergen Reuter <reuter@ipd.uka.de>
 % 
 
 fet_begingroup ("timesig");
diff --git a/po/SConscript b/po/SConscript
deleted file mode 100644 (file)
index ac2534b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'base_glob', 'install')
-pos = base_glob ('*.po')
-mos = map (env.MO, pos)
-
-install (mos, env['localedir'])
-
-env.Depends ('po', 'po-update')
-# map (lambda x: env.Depends (x + '.mo', x + '.pom'), pos)
-poms = map (env.POMERGE, pos)
-env.Alias ('po-update', poms)
-env.Alias ('po', mos)
-#env.Alias ('all', mos)
-
diff --git a/po/TODO b/po/TODO
index bf0e29e069f138680c7ba34afe082bf7a948ce9b..fd7f1c31e772d267c8c39c3401b1f8a9509624c7 100644 (file)
--- a/po/TODO
+++ b/po/TODO
@@ -27,8 +27,7 @@ FIX OR STANDARDISE TARGETS
   the file may accumulate the list of obsolete translations, which may 
   help to translate some changed entries and may be safely dropped out.
 
-* because I never install LilyPond, I (check-out buildscripts/set-lily.sh) 
-  made these links:
+* because I never install LilyPond, I made these links:
 
     ln -s $LILYPOND_SOURCEDIR/po/out/nl.mo 
         $PREFIX/usr/share/locale/nl/LC_MESSAGES/lilypond.mo
index f2a847a24b0d5c4786878171202b4263a42099c8..f4cd176669ef154910fb32cc75862dc48a1be472 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,10 +7,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.11.57\n"
+"Project-Id-Version: lilypond 2.12.0\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n"
-"POT-Creation-Date: 2008-08-23 18:49+0200\n"
-"PO-Revision-Date: 2008-12-08 21:17+0200\n"
+"POT-Creation-Date: 2008-12-20 11:58+0100\n"
+"PO-Revision-Date: 2008-12-31 17:51+0200\n"
 "Last-Translator: Till Rettig <till.rettig@gmx.de>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
 "MIME-Version: 1.0\n"
@@ -31,7 +31,7 @@ msgstr "Für Details Benutzerhandbuch lesen und manuell aktualisieren."
 msgid "%s has been replaced by %s"
 msgstr "%s wurde durch %s ersetzt"
 
-#: convertrules.py:24 musicexp.py:16 convert-ly.py:48 lilypond-book.py:82
+#: convertrules.py:24 musicexp.py:16 convert-ly.py:50 lilypond-book.py:94
 #: warn.cc:48 input.cc:90
 #, c-format, python-format
 msgid "warning: %s"
@@ -425,6 +425,22 @@ msgstr "Achse und Richtung jetzt vor die Beschriftung setzen:\n"
 msgid "\\put-adjacent axis dir markup markup."
 msgstr "\\put-adjacent Achse Richtung Beschriftung Beschriftung."
 
+#: convertrules.py:2832
+msgid "re-definition of InnerStaffGroup.\n"
+msgstr "Neudefinition von InnerStaffGroup.\n"
+
+#: convertrules.py:2838
+msgid "re-definition of InnerChoirStaff.\n"
+msgstr "Neudefinition von InnerChoirStaff.\n"
+
+#: convertrules.py:2851
+msgid "stringTuning must be added to addChordShape call.\n"
+msgstr "stringTuning·muss zu einem·addChordShape -Aufruf hinzugefügt werden.\n"
+
+#: convertrules.py:2857
+msgid "stringTuning must be added to chord-shape call.\n"
+msgstr "stringTuning muss zu dem·chord-shape -Aufruf hinzugefügt werden.\n"
+
 #: fontextract.py:25
 #, python-format
 msgid "Scanning %s"
@@ -440,56 +456,90 @@ msgstr "%s ausgepackt"
 msgid "Writing fonts to %s"
 msgstr "Schreiben der Schriftarten nach %s"
 
-#: lilylib.py:101 lilylib.py:152
+#: lilylib.py:91 lilylib.py:142
 #, python-format
 msgid "Invoking `%s'"
 msgstr "`%s' wird aufgerufen"
 
-#: lilylib.py:103 lilylib.py:154
+#: lilylib.py:93 lilylib.py:144
 #, python-format
 msgid "Running %s..."
 msgstr "%s wird ausgeführt..."
 
-#: lilylib.py:219
+#: lilylib.py:209
 #, python-format
 msgid "Usage: %s"
 msgstr "Aufruf: %s"
 
-#: musicexp.py:585
+#: musicexp.py:215 musicexp.py:220
+msgid "Language does not support microtones contained in the piece"
+msgstr "Die Sprache unterstützt nicht die Mikrotöne in diesem Stück"
+
+#: musicexp.py:482
+msgid "Tuplet brackets of curved shape are not correctly implemented"
+msgstr "N-tolen-Klammern mit gekrümmten Klammern sind nicht richtig implementiert"
+
+#. TODO: Implement this using actual_type and normal_type!
+#: musicexp.py:511
+msgid "Tuplet brackets displaying both note durations are not implemented, using default"
+msgstr "N-tolen-Klammern, die beide Notendauern darstellen, sind nicht implementiert, benutze Standard"
+
+#: musicexp.py:656
 #, python-format
 msgid "unable to set the music %(music)s for the repeat %(repeat)s"
 msgstr "kann die Noten %(music)s für die Wiederholung %(repeat)s nicht setzen"
 
-#: musicexp.py:594
+#: musicexp.py:665
 msgid "encountered repeat without body"
 msgstr "Wiederholung ohne Body angetroffen"
 
-#: musicxml.py:13 convert-ly.py:51 lilypond-book.py:85 warn.cc:54 input.cc:96
+#. no self.elements!
+#: musicexp.py:835
+#, python-format
+msgid "Grace note with no following music: %s"
+msgstr "Verzierungsnoten ohne folgende Noten: %s"
+
+#: musicexp.py:997
+#, python-format
+msgid "Invalid octave shift size found: %s. Using no shift."
+msgstr "Ungültige Oktavenversetzungsgröße gefunden: %s. Versetzung wird nicht angewendet."
+
+#: musicexp.py:1455
+#, python-format
+msgid "Unable to convert alteration %s to a lilypond expression"
+msgstr "Kann Alteration %s nicht in einen LilyPond-Ausdruck umwandeln"
+
+#: musicxml.py:13 convert-ly.py:53 lilypond-book.py:97 warn.cc:54 input.cc:96
 #: input.cc:104
 #, c-format, python-format
 msgid "error: %s"
 msgstr "Fehler: %s"
 
-#: musicxml.py:298
-msgid "requested time signature, but time sig is unknown"
-msgstr "Taktangabe angefragt, aber Taktart ist unbekannt"
+#. TODO: Handle pieces without a time signature!
+#: musicxml.py:357
+msgid "Senza-misura time signatures are not yet supported!"
+msgstr "Senza-misura-Taktarten sind noch nicht unterstützt!"
+
+#: musicxml.py:375
+msgid "Unable to interpret time signature! Falling back to 4/4."
+msgstr "Unfähig, die Taktart zu interpretieren! Benutze 4/4-Takt."
 
-#: musicxml.py:354
+#: musicxml.py:431
 #, python-format
-msgid "Encountered note at %s with %s duration (no <type> element):"
-msgstr "Note bei %s mit Dauer %s angetroffen (kein <type>-Element):"
+msgid "Key alteration octave given for a non-existing alteration nr. %s, available numbers: %s!"
+msgstr "Tonartalterationsoktave für eine nicht existente Alteration Nr. %s angegeben, mögliche Nummern: %s!"
 
-#: musicxml.py:388
+#: musicxml.py:519
 #, python-format
 msgid "Unable to find instrument for ID=%s\n"
 msgstr "Kann kein Instrument für ID=%s finden\n"
 
-#: abc2ly.py:1342 convert-ly.py:72 lilypond-book.py:109 midi2ly.py:846
+#: abc2ly.py:1341 convert-ly.py:74 lilypond-book.py:121 midi2ly.py:845
 #, python-format
 msgid "%s [OPTION]... FILE"
 msgstr "%s [OPTIONEN]... DATEI"
 
-#: abc2ly.py:1343
+#: abc2ly.py:1342
 #, python-format
 msgid ""
 "abc2ly converts ABC music files (see\n"
@@ -498,34 +548,39 @@ msgstr ""
 "abc2ly wandelt ABC-Musikdateien in LilyPond-Eingabe um\n"
 "(siehe auch %s).\n"
 
-#: abc2ly.py:1351 convert-ly.py:79 etf2ly.py:1190 lilypond-book.py:195
-#: midi2ly.py:882 musicxml2ly.py:2185 main.cc:161
+#: abc2ly.py:1350 convert-ly.py:81 etf2ly.py:1190 lilypond-book.py:207
+#: midi2ly.py:881 musicxml2ly.py:2590 main.cc:156
 msgid "show version number and exit"
 msgstr "Versionsnummer ausgeben und beenden"
 
-#: abc2ly.py:1355 convert-ly.py:83 etf2ly.py:1186 lilypond-book.py:126
-#: midi2ly.py:861 musicxml2ly.py:2167 main.cc:150
+#: abc2ly.py:1354 convert-ly.py:85 etf2ly.py:1186 lilypond-book.py:138
+#: midi2ly.py:860 musicxml2ly.py:2572 main.cc:145
 msgid "show this help and exit"
 msgstr "diese Hilfe anzeigen und beenden"
 
-#: abc2ly.py:1357 etf2ly.py:1191 midi2ly.py:865
+#: abc2ly.py:1356 etf2ly.py:1191 midi2ly.py:864
 msgid "write output to FILE"
 msgstr "Ausgabe in DATEI schreiben"
 
-#: abc2ly.py:1359
+#: abc2ly.py:1358
 msgid "be strict about success"
 msgstr "bzgl. Erfolg streng sein"
 
-#: abc2ly.py:1361
+#: abc2ly.py:1360
 msgid "preserve ABC's notion of beams"
 msgstr "ABCs Prinzip der Balken beibehalten"
 
-#: abc2ly.py:1363 convert-ly.py:120 etf2ly.py:1199 lilypond-book.py:202
-#: midi2ly.py:894 musicxml2ly.py:2240
-msgid "Report bugs via"
-msgstr "Melden Sie Fehler an"
+#. Translators, please translate this string as
+#. "Report bugs in English via %s",
+#. or if there is a LilyPond users list or forum in your language
+#. "Report bugs in English via %s or in YOUR_LANG via URI"
+#: abc2ly.py:1363 convert-ly.py:123 etf2ly.py:1200 lilypond-book.py:214
+#: midi2ly.py:894 musicxml2ly.py:2646 main.cc:265
+#, c-format, python-format
+msgid "Report bugs via %s"
+msgstr "Melden Sie Fehler an %s"
 
-#: convert-ly.py:31
+#: convert-ly.py:33
 msgid ""
 "Update LilyPond input to newer version.  By default, update from the\n"
 "version taken from the \\version command, to the current LilyPond version."
@@ -533,72 +588,72 @@ msgstr ""
 "LilyPond-Eingabe auf neuere Version bringen. Standardmäßig wird von der\n"
 "Version vom Kommando \\version zur aktuellen LilyPond-Version gegangen."
 
-#: convert-ly.py:33 lilypond-book.py:59
+#: convert-ly.py:35 lilypond-book.py:71
 msgid "Examples:"
 msgstr "Beispiele:"
 
-#: convert-ly.py:67 etf2ly.py:1173 lilypond-book.py:105 midi2ly.py:77
+#: convert-ly.py:69 etf2ly.py:1173 lilypond-book.py:117 midi2ly.py:76
 msgid "Distributed under terms of the GNU General Public License."
 msgstr "Vertrieben unter den Bedingungen der GNU General Public License."
 
-#: convert-ly.py:68 etf2ly.py:1174 lilypond-book.py:106 midi2ly.py:78
+#: convert-ly.py:70 etf2ly.py:1174 lilypond-book.py:118 midi2ly.py:77
 msgid "It comes with NO WARRANTY."
 msgstr "Es wird OHNE GARANTIE ausgeliefert."
 
-#: convert-ly.py:87 convert-ly.py:114
+#: convert-ly.py:89 convert-ly.py:116
 msgid "VERSION"
 msgstr "VERSION"
 
-#: convert-ly.py:89
+#: convert-ly.py:91
 msgid "start from VERSION [default: \\version found in file]"
 msgstr "bei VERSION anfangen [Standard: \\version in Datei gefunden]"
 
-#: convert-ly.py:92
+#: convert-ly.py:94
 msgid "edit in place"
 msgstr "vor Ort ändern"
 
-#: convert-ly.py:96
+#: convert-ly.py:98
 msgid "do not add \\version command if missing"
 msgstr "keinen \\version-Befehl hinzufügen, falls es fehlt"
 
-#: convert-ly.py:102
+#: convert-ly.py:104
 #, python-format
 msgid "force updating \\version number to %s"
 msgstr "erzwinge Aktualisierung von \\version nach %s"
 
-#: convert-ly.py:108
+#: convert-ly.py:110
 #, python-format
 msgid "show rules [default: -f 0, -t %s]"
 msgstr "Regeln anzeigen [Standard: -f 0, -t %s]"
 
-#: convert-ly.py:113
+#: convert-ly.py:115
 #, python-format
 msgid "convert to VERSION [default: %s]"
 msgstr "zu VERSION konvertieren [Standard: %s]"
 
-#: convert-ly.py:160
+#: convert-ly.py:163
 msgid "Applying conversion: "
 msgstr "Anwenden der Umwandlung: "
 
-#: convert-ly.py:173
+#: convert-ly.py:176
 msgid "Error while converting"
 msgstr "Fehler beim Umwandeln"
 
-#: convert-ly.py:175
-msgid "Stopping at last succesful rule"
+#: convert-ly.py:178
+msgid "Stopping at last successful rule"
 msgstr "Abbruch bei letzter erfolgreicher Regel"
 
-#: convert-ly.py:196
+#: convert-ly.py:199
 #, python-format
 msgid "Processing `%s'... "
 msgstr "»%s« wird verarbeitet..."
 
-#: convert-ly.py:286 relocate.cc:362 source-file.cc:59
+#: convert-ly.py:289 relocate.cc:362 source-file.cc:59
 #, c-format, python-format
 msgid "cannot open file: `%s'"
 msgstr "Datei kann nicht geöffnet werden: »%s«"
 
-#: convert-ly.py:293
+#: convert-ly.py:296
 #, python-format
 msgid "cannot determine version for `%s'.  Skipping"
 msgstr "Version für »%s« kann nicht erkannt werden. Wird übersprungen"
@@ -617,276 +672,276 @@ msgstr ""
 "verwendetes Format. etf2ly wandelt eine Teilmenge von ETF in\n"
 "eine von Lilypond verwendbare Datei um.\n"
 
-#: etf2ly.py:1192 midi2ly.py:866 musicxml2ly.py:2233 main.cc:154 main.cc:159
+#: etf2ly.py:1192 midi2ly.py:865 musicxml2ly.py:2638 main.cc:149 main.cc:154
 msgid "FILE"
 msgstr "DATEI"
 
-#: etf2ly.py:1194 lilypond-book.py:198 midi2ly.py:883 main.cc:163
+#: etf2ly.py:1194 lilypond-book.py:210 midi2ly.py:882 main.cc:158
 msgid "show warranty and copyright"
 msgstr "Informationen zu Gewährleistung und Copyright anzeigen"
 
-#: lilypond-book.py:57
+#: lilypond-book.py:69
 msgid "Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document."
 msgstr "LilyPond-Schnipsel in Mischdatei (HTML, LaTeX, texinfo oder DocBook) verarbeiten"
 
-#: lilypond-book.py:64
+#: lilypond-book.py:76
 msgid "BOOK"
 msgstr "BUCH"
 
-#: lilypond-book.py:72
+#: lilypond-book.py:84
 #, python-format
 msgid "Exiting (%d)..."
 msgstr "Beenden (%d)..."
 
-#: lilypond-book.py:103
+#: lilypond-book.py:115
 #, python-format
 msgid "Copyright (c) %s by"
 msgstr "Copyright (c) %s bei"
 
-#: lilypond-book.py:113
+#: lilypond-book.py:125
 msgid "FILTER"
 msgstr "FILTER"
 
-#: lilypond-book.py:116
+#: lilypond-book.py:128
 msgid "pipe snippets through FILTER [default: `convert-ly -n -']"
 msgstr "Auszüge durch FILTER [Standard: »convert-ly -n -«] leiten (Pipe)"
 
-#: lilypond-book.py:120
+#: lilypond-book.py:132
 msgid "use output format FORMAT (texi [default], texi-html, latex, html, docbook)"
 msgstr "Ausgabeformat FORMAT (texi [Vorgabe], texi-html, latex, html, docbook) verwenden"
 
-#: lilypond-book.py:121
+#: lilypond-book.py:133
 msgid "FORMAT"
 msgstr "FORMAT"
 
-#: lilypond-book.py:128
+#: lilypond-book.py:140
 msgid "add DIR to include path"
 msgstr "VERZ zum Einfügepfad hinzufügen"
 
-#: lilypond-book.py:129 lilypond-book.py:136 lilypond-book.py:154
-#: lilypond-book.py:160 lilypond-book.py:166 lilypond-book.py:172 main.cc:153
+#: lilypond-book.py:141 lilypond-book.py:148 lilypond-book.py:166
+#: lilypond-book.py:172 lilypond-book.py:178 lilypond-book.py:184 main.cc:148
 msgid "DIR"
 msgstr "VERZ"
 
-#: lilypond-book.py:134
+#: lilypond-book.py:146
 msgid "format Texinfo output so that Info will look for images of music in DIR"
 msgstr "Formatiere Texinfo-Ausgabe so, dass Info nach Bildern und Noten im VERZ suchen kann"
 
-#: lilypond-book.py:141
+#: lilypond-book.py:153
 msgid "run executable PROG instead of latex"
 msgstr "benutze ausführbare Datei PROG anstelle von latex"
 
-#: lilypond-book.py:142
+#: lilypond-book.py:154
 msgid "PROG"
 msgstr "PROG"
 
-#: lilypond-book.py:147
+#: lilypond-book.py:159
 msgid "PAD"
 msgstr "FÜLLUNG"
 
-#: lilypond-book.py:149
+#: lilypond-book.py:161
 msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)"
 msgstr "verschiebe linken Rand der Noten um an den Noten auszurichten, obwohl Taktnummer ungerade ist (in mm)"
 
-#: lilypond-book.py:153
+#: lilypond-book.py:165
 msgid "write output to DIR"
 msgstr "Ausgabe in DATEI schreiben"
 
-#: lilypond-book.py:159
+#: lilypond-book.py:171
 msgid "do not fail if no lilypond output is found"
 msgstr "nicht abbrechen wenn keine lilypond-Ausgabe gefunden wird"
 
-#: lilypond-book.py:165
+#: lilypond-book.py:177
 msgid "do not fail if no PNG images are found for EPS files"
 msgstr "nicht abbrechen wenn, keine PNG-Bilder für EPS-Dateien gefunden werden"
 
-#: lilypond-book.py:171
+#: lilypond-book.py:183
 msgid "write lily-XXX files to DIR, link into --output dir"
 msgstr "schreibe lily-XXX-Dateien nach VERZ, verlinke nach --output dir"
 
-#: lilypond-book.py:176
+#: lilypond-book.py:188
 msgid "COMMAND"
 msgstr "BEFEHL"
 
-#: lilypond-book.py:177
+#: lilypond-book.py:189
 msgid "process ly_files using COMMAND FILE..."
 msgstr "ly_files mit BEFEHL DATEI... verarbeiten"
 
-#: lilypond-book.py:184
+#: lilypond-book.py:196
 msgid "create PDF files for use with PDFTeX"
 msgstr "PDF-Dateien für Verwendung mit PDFTeX erzeugen"
 
-#: lilypond-book.py:187 midi2ly.py:876 musicxml2ly.py:2190 main.cc:162
+#: lilypond-book.py:199 midi2ly.py:875 musicxml2ly.py:2595 main.cc:157
 msgid "be verbose"
 msgstr "wortreich sein"
 
-#: lilypond-book.py:825
+#: lilypond-book.py:871
 #, python-format
 msgid "file not found: %s"
 msgstr "Datei `%s' nicht gefunden"
 
-#: lilypond-book.py:1087
+#: lilypond-book.py:1142
 #, python-format
 msgid "deprecated ly-option used: %s=%s"
 msgstr "veraltete ly-option verwendet: %s=%s"
 
-#: lilypond-book.py:1089
+#: lilypond-book.py:1144
 #, python-format
 msgid "compatibility mode translation: %s=%s"
 msgstr "Übersetzung im Kompatibilitätsmodus: %s=%s"
 
-#: lilypond-book.py:1092
+#: lilypond-book.py:1147
 #, python-format
 msgid "deprecated ly-option used: %s"
 msgstr "veraltete ly-option verwendet: %s"
 
-#: lilypond-book.py:1094
+#: lilypond-book.py:1149
 #, python-format
 msgid "compatibility mode translation: %s"
 msgstr "Übersetzung im Kompatibilitätsmodus: %s"
 
-#: lilypond-book.py:1112
+#: lilypond-book.py:1167
 #, python-format
 msgid "ignoring unknown ly option: %s"
 msgstr "unbekannte Option ignoriert: %s"
 
-#: lilypond-book.py:1538
+#: lilypond-book.py:1604
 #, python-format
 msgid "Opening filter `%s'"
 msgstr "Filter »%s« wird geöffnet"
 
-#: lilypond-book.py:1555
+#: lilypond-book.py:1621
 #, python-format
 msgid "`%s' failed (%d)"
 msgstr "»%s« gescheitert (%d)"
 
-#: lilypond-book.py:1556
+#: lilypond-book.py:1622
 msgid "The error log is as follows:"
 msgstr "Das Fehlerprotokoll lautet wie folgt:"
 
-#: lilypond-book.py:1618
+#: lilypond-book.py:1684
 msgid "cannot find \\begin{document} in LaTeX document"
 msgstr "\\begin{document} im LaTeX-Dokument kann nicht gefunden werden"
 
-#: lilypond-book.py:1718
+#: lilypond-book.py:1784
 msgid "Writing snippets..."
 msgstr "Auszüge werden geschrieben..."
 
-#: lilypond-book.py:1724
+#: lilypond-book.py:1790
 msgid "Processing..."
 msgstr "Verarbeiten..."
 
-#: lilypond-book.py:1730
+#: lilypond-book.py:1796
 msgid "All snippets are up to date..."
 msgstr "Alle Auszüge sind auf dem neuesten Stand..."
 
-#: lilypond-book.py:1764
+#: lilypond-book.py:1830
 #, python-format
 msgid "cannot determine format for: %s"
 msgstr "Format für %s kann nicht ermittelt werden"
 
-#: lilypond-book.py:1775
+#: lilypond-book.py:1841
 #, python-format
 msgid "%s is up to date."
 msgstr "%s ist aktuell."
 
-#: lilypond-book.py:1789
+#: lilypond-book.py:1855
 #, python-format
 msgid "Writing `%s'..."
 msgstr "»%s« wird geschrieben..."
 
-#: lilypond-book.py:1847
+#: lilypond-book.py:1913
 msgid "Output would overwrite input file; use --output."
 msgstr "Ausgabe würde Eingabedatei überschreiben; verwenden Sie --output."
 
-#: lilypond-book.py:1851
+#: lilypond-book.py:1917
 #, python-format
 msgid "Reading %s..."
 msgstr "%s lesen..."
 
-#: lilypond-book.py:1870
+#: lilypond-book.py:1937
 msgid "Dissecting..."
 msgstr "Zerlegen..."
 
-#: lilypond-book.py:1886
+#: lilypond-book.py:1953
 #, python-format
 msgid "Compiling %s..."
 msgstr "%s kompilieren..."
 
-#: lilypond-book.py:1895
+#: lilypond-book.py:1962
 #, python-format
 msgid "Processing include: %s"
 msgstr "Einfügung wird verarbeitet: %s"
 
-#: lilypond-book.py:1907
+#: lilypond-book.py:1974
 #, python-format
 msgid "Removing `%s'"
 msgstr "»%s« wird gelöscht"
 
-#: midi2ly.py:85 lily-library.scm:620 lily-library.scm:629
+#: midi2ly.py:84 lily-library.scm:634 lily-library.scm:643
 msgid "warning: "
 msgstr "Warnung: "
 
-#: midi2ly.py:88 midi2ly.py:907
+#: midi2ly.py:87 midi2ly.py:907
 msgid "error: "
 msgstr "Fehler: "
 
-#: midi2ly.py:89
+#: midi2ly.py:88
 msgid "Exiting... "
 msgstr "Beenden... "
 
-#: midi2ly.py:834
+#: midi2ly.py:833
 #, python-format
 msgid "%s output to `%s'..."
 msgstr "%s nach »%s« ausgeben..."
 
-#: midi2ly.py:847
+#: midi2ly.py:846
 #, python-format
 msgid "Convert %s to LilyPond input.\n"
 msgstr "%s in LilyPond-Quelltext umwandeln.\n"
 
-#: midi2ly.py:852
+#: midi2ly.py:851
 msgid "print absolute pitches"
 msgstr "Absolute Tonhöhen ausgeben"
 
-#: midi2ly.py:854 midi2ly.py:869
+#: midi2ly.py:853 midi2ly.py:868
 msgid "DUR"
 msgstr "DAUER"
 
-#: midi2ly.py:855
+#: midi2ly.py:854
 msgid "quantise note durations on DUR"
 msgstr "Notenlängen auf DAUER quantisieren"
 
-#: midi2ly.py:858
+#: midi2ly.py:857
 msgid "print explicit durations"
 msgstr "Explizite Notenlängen ausgeben"
 
-#: midi2ly.py:862
+#: midi2ly.py:861
 msgid "set key: ALT=+sharps|-flats; MINOR=1"
 msgstr "Tonart setzen: VORZ=+Kreuze|-B's; MOLL=1"
 
-#: midi2ly.py:863
+#: midi2ly.py:862
 msgid "ALT[:MINOR]"
 msgstr "VORZ[:MOLL]"
 
-#: midi2ly.py:868
+#: midi2ly.py:867
 msgid "quantise note starts on DUR"
 msgstr "Notenanfänge auf DAUER quantisieren"
 
-#: midi2ly.py:871
+#: midi2ly.py:870
 msgid "DUR*NUM/DEN"
 msgstr "DAUER*ZÄHLER/NENNER"
 
 # tuplet = Wertaufteilung nach: Peter Giger: Die Kunst des Rhythmus, Seite 25
-#: midi2ly.py:874
+#: midi2ly.py:873
 msgid "allow tuplet durations DUR*NUM/DEN"
 msgstr "Wertaufteilungsdauern DAUER*ZÄHLER/NENNER erlauben"
 
-#: midi2ly.py:886
+#: midi2ly.py:885
 msgid "treat every text as a lyric"
 msgstr "Jeden Text als Liedtext behandeln"
 
-#: midi2ly.py:889
+#: midi2ly.py:888
 msgid "Examples"
 msgstr "Beispiele"
 
@@ -894,96 +949,121 @@ msgstr "Beispiele"
 msgid "no files specified on command line."
 msgstr "Keine Dateien auf der Kommandozeile angegeben."
 
-#: musicxml2ly.py:213
+#: musicxml2ly.py:343
 msgid "Encountered file created by Dolet 3.4 for Sibelius, containing wrong beaming information. All beaming information in the MusicXML file will be ignored"
 msgstr "Die Datei wurde von Dolet 3.4 für SIbelius erstellt und enthält falsche Balkeninformation. Alle Balkeninformation in der MusicXML-Datei wird ignoriert"
 
-#: musicxml2ly.py:229 musicxml2ly.py:231
+#: musicxml2ly.py:346
+msgid "Encountered file created by Noteworthy Composer's nwc2xml, containing wrong beaming information. All beaming information in the MusicXML file will be ignored"
+msgstr "Die Datei wurde von Noteworthy·Composer's·nwc2xml erstellt und enthält falsche Balkeninformation. Alle Balkeninformation in der MusicXML-Datei wird ignoriert"
+
+#: musicxml2ly.py:362 musicxml2ly.py:364
 #, python-format
 msgid "Unprocessed PartGroupInfo %s encountered"
 msgstr "Unverarbeitetes PartGroupInfo %s angetroffen"
 
-#: musicxml2ly.py:471
+#: musicxml2ly.py:594
+#, python-format
+msgid "Encountered note at %s without type and duration (=%s)"
+msgstr "Note bei %s ohne Art und Dauer angetroffen (=%s)"
+
+#: musicxml2ly.py:613
 #, python-format
 msgid "Encountered rational duration with denominator %s, unable to convert to lilypond duration"
 msgstr "Rationale Dauer mit Nenner %s angetroffen, kann nicht in lilypond-Dauer umgewandelt werden"
 
-#: musicxml2ly.py:654
+#: musicxml2ly.py:868
+msgid "Unable to extract key signature!"
+msgstr "Kann die Tonart nicht extrahieren!"
+
+#: musicxml2ly.py:895
 #, python-format
-msgid "unknown mode %s, expecting 'major' or 'minor'"
-msgstr "unbekannter Modus %s, 'major' (Dur) oder 'minor' (Moll) wird erwartet"
+msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!"
+msgstr "unbekannter Modus %s, 'major' (Dur) oder 'minor' (Moll) oder eine Kirchentonart wird erwartet"
 
-#: musicxml2ly.py:692
+#: musicxml2ly.py:968
 #, python-format
 msgid "Encountered unprocessed marker %s\n"
 msgstr "Unverarbeiteter Marker %s angetroffen\n"
 
-#: musicxml2ly.py:786
+#: musicxml2ly.py:1062
 #, python-format
 msgid "unknown span event %s"
 msgstr "Unbekannte Spannerklasse »%s«"
 
-#: musicxml2ly.py:796
+#: musicxml2ly.py:1072
 #, python-format
 msgid "unknown span type %s for %s"
 msgstr "Unbekannter Spannertyp %s für %s"
 
-#: musicxml2ly.py:1222
+#: musicxml2ly.py:1498
 msgid "Unknown metronome mark, ignoring"
 msgstr "Unbekanntes Metronom-Zeichen, wird ignoriert"
 
 #. TODO: Implement the other (more complex) way for tempo marks!
-#: musicxml2ly.py:1227
+#: musicxml2ly.py:1503
 msgid "Metronome marks with complex relations (<metronome-note> in MusicXML) are not yet implemented."
 msgstr "Metronommakern mit komplexen Beziehungen (<metronome-note> in MusicXML) sind noch nicht implementiert."
 
-#: musicxml2ly.py:1383
+#: musicxml2ly.py:1703
 #, python-format
 msgid "Unable to convert chord type %s to lilypond."
 msgstr "Kann Akkordtyp %s nicht nach lilypond umwandeln"
 
-#: musicxml2ly.py:1529
+#: musicxml2ly.py:1849
 #, python-format
 msgid "drum %s type unknown, please add to instrument_drumtype_dict"
 msgstr "Schlagzeug %s Typ unbekannt, bitte zum instrument_drumtype_dict hinzufügen"
 
-#: musicxml2ly.py:1533
+#: musicxml2ly.py:1853
 msgid "cannot find suitable event"
 msgstr "passendes Ereignis kann nicht gefunden werden"
 
-#: musicxml2ly.py:1623
+#: musicxml2ly.py:1994
 #, python-format
-msgid "Negative skip %s"
-msgstr "Negativer Sprung (skip) %s"
+msgid "Negative skip %s (from position %s to %s)"
+msgstr "Negativer Sprung (skip) %s (von Position %s bis %s)"
 
-#: musicxml2ly.py:1775
+#: musicxml2ly.py:2134
 #, python-format
 msgid "Negative skip found: from %s to %s, difference is %s"
 msgstr "Negativer Sprung (skip) gefunden: von %s bis %s, Differenz ist %s"
 
-#: musicxml2ly.py:1802
+#: musicxml2ly.py:2205
 #, python-format
 msgid "unexpected %s; expected %s or %s or %s"
 msgstr "unerwartetes %s; %s oder %s oder %s erwartet"
 
-#: musicxml2ly.py:1912
-msgid "cannot have two simultaneous slurs"
-msgstr "Zwei gleichzeitige Legatobögen haben"
+#: musicxml2ly.py:2311
+msgid "Encountered closing slur, but no slur is open"
+msgstr "Auf schließenden Legatobogen gestoßen, aber es wurde kein Bogen begonnen"
 
-#: musicxml2ly.py:2050
+#: musicxml2ly.py:2314
+msgid "Cannot have two simultaneous (closing) slurs"
+msgstr "Zwei gleichzeitige (schließende) Legatobögen sind nicht möglich"
+
+#: musicxml2ly.py:2324
+msgid "Cannot have a slur inside another slur"
+msgstr "Ein Legatobogen innerhalb eines anderen Legatobogens ist nicht möglich"
+
+#: musicxml2ly.py:2327
+msgid "Cannot have two simultaneous slurs"
+msgstr "Zwei gleichzeitige Legatobögen sind nicht möglich"
+
+#: musicxml2ly.py:2455
 #, python-format
 msgid "cannot simultaneously have more than one mode: %s"
 msgstr "Kann nicht gleichzeitig mehr als einen Modus haben: %s"
 
-#: musicxml2ly.py:2148
+#: musicxml2ly.py:2553
 msgid "Converting to LilyPond expressions..."
 msgstr "In LilyPond-Ausdrücke umwandeln..."
 
-#: musicxml2ly.py:2159
+#: musicxml2ly.py:2564
 msgid "musicxml2ly [OPTION]... FILE.xml"
 msgstr "musicxml2ly [Optionen]... DATEI.xml"
 
-#: musicxml2ly.py:2161
+#: musicxml2ly.py:2566
 msgid ""
 "Convert MusicXML from FILE.xml to LilyPond input.\n"
 "If the given filename is -, musicxml2ly reads from the command line.\n"
@@ -991,83 +1071,83 @@ msgstr ""
 "Wandle MusicXML-Datei von DAT.xml nach LilyPond-Eingabe um.\n"
 "Wenn der angegebene Dateiname - ist, list musicxml2ly von der Kommandozeile.\n"
 
-#: musicxml2ly.py:2171
+#: musicxml2ly.py:2576
 msgid ""
-"Copyright (c) 2005--2008 by\n"
+"Copyright (c) 2005--2009 by\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> and\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
 msgstr ""
-"Copyright (c) 2005--2008\n"
+"Copyright (c) 2005--2009\n"
 "····Han-Wen·Nienhuys·<hanwen@xs4all.nl>,\n"
 "····Jan·Nieuwenhuizen·<janneke@gnu.org>·and\n"
 "····Reinhold·Kainhofer·<reinhold@kainhofer.com>\n"
 
-#: musicxml2ly.py:2196
+#: musicxml2ly.py:2601
 msgid "use lxml.etree; uses less memory and cpu time"
 msgstr "lxml.etree verwenden; benötigt weniger Speicher und Prozessorzeit"
 
-#: musicxml2ly.py:2202
+#: musicxml2ly.py:2607
 msgid "input file is a zip-compressed MusicXML file"
 msgstr "Eingabedatei ist eine zip-komprimierte MusicXML-Datei"
 
-#: musicxml2ly.py:2208
+#: musicxml2ly.py:2613
 msgid "convert pitches in relative mode (default)"
 msgstr "Tonhöhen im relativen Modus konvertieren (Standard)"
 
-#: musicxml2ly.py:2213
+#: musicxml2ly.py:2618
 msgid "convert pitches in absolute mode"
 msgstr "Tonhöhen im absoluten Modus konvertieren"
 
-#: musicxml2ly.py:2216
+#: musicxml2ly.py:2621
 msgid "LANG"
 msgstr "SPRA"
 
-#: musicxml2ly.py:2218
+#: musicxml2ly.py:2623
 msgid "use a different language file 'LANG.ly' and corresponding pitch names, e.g. 'deutsch' for deutsch.ly"
 msgstr "benutze eine andere Sprach-Datei 'SPRA.ly' und entsprechende Notenbezeichnungen, etwa 'deutsch' für deutsch.ly"
 
-#: musicxml2ly.py:2224
+#: musicxml2ly.py:2629
 msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc."
 msgstr "Richtungen (^, _ oder -) for Artikulationen, Dynamik usw. nicht konvertieren"
 
-#: musicxml2ly.py:2230
+#: musicxml2ly.py:2635
 msgid "do not convert beaming information, use lilypond's automatic beaming instead"
 msgstr "Balkeninformation nicht konvertieren, benutze die automatischen Balken von lilypond statt dessen"
 
-#: musicxml2ly.py:2238
+#: musicxml2ly.py:2643
 msgid "set output filename to FILE, stdout if -"
 msgstr "Ausgabedateiname auf DATEI setzen, stout if -"
 
-#: musicxml2ly.py:2320
+#: musicxml2ly.py:2726
 #, python-format
 msgid "unknown part in part-list: %s"
 msgstr "unbekannte Stimme in part-list (Stimmen-Liste): %s"
 
-#: musicxml2ly.py:2382
+#: musicxml2ly.py:2788
 msgid "Input is compressed, extracting raw MusicXML data from stdin"
 msgstr "Eingabedatei %s ist komprimiert, entpacke die MusicXML-Daten von stdin"
 
-#: musicxml2ly.py:2385
+#: musicxml2ly.py:2791
 #, python-format
 msgid "Input file %s is compressed, extracting raw MusicXML data"
 msgstr "Eingabedatei %s ist komprimiert, entpacke die MusicXML-Daten"
 
-#: musicxml2ly.py:2415
+#: musicxml2ly.py:2821
 msgid "Reading MusicXML from Standard input ..."
 msgstr "MusicXML von standard input lesen..."
 
-#: musicxml2ly.py:2417
+#: musicxml2ly.py:2823
 #, python-format
 msgid "Reading MusicXML from %s ..."
 msgstr "MusicXML aus %s lesen..."
 
-#: musicxml2ly.py:2450
+#: musicxml2ly.py:2856
 #, python-format
 msgid "Output to `%s'"
 msgstr "Ausgabe nach »%s«"
 
-#: musicxml2ly.py:2512
+#: musicxml2ly.py:2922
 #, python-format
 msgid "Unable to find input file %s"
 msgstr "Eingabedatei kann nicht gefunden werden %s"
@@ -1101,20 +1181,15 @@ msgstr "Programmierfehler: %s"
 msgid "continuing, cross fingers"
 msgstr "Fortsetzung, die Daumen drücken"
 
-#: accidental-engraver.cc:249
+#: accidental-engraver.cc:298
 #, c-format
 msgid "accidental typesetting list must begin with context-name: %s"
 msgstr "Versetzungszeichensatzliste muss mit Kontextnamen beginnen: %s"
 
-#: accidental-engraver.cc:276
+#: accidental-engraver.cc:328
 #, c-format
-msgid "ignoring unknown accidental rule: %s"
-msgstr "unbekannte Versetzungszeichenregel wird ignoriert: %s"
-
-#: accidental-engraver.cc:292
-#, c-format
-msgid "pair or context-name expected for accidental rule, found %s"
-msgstr "Paar oder Kontextname für Versetzungszeichenregel erwartet, %s gefunden"
+msgid "procedure or context-name expected for accidental rule, found %s"
+msgstr "Prozedur oder Kontextname für Versetzungszeichenregel erwartet, %s gefunden"
 
 #: accidental.cc:187
 #, c-format
@@ -1335,6 +1410,26 @@ msgstr "unbegrenztes (De-) Crescendo"
 msgid "unterminated extender"
 msgstr "unbegrenzter Textunterstrich"
 
+#: font-config-scheme.cc:140 font-config.cc:57
+#, c-format
+msgid "failed adding font directory: %s"
+msgstr "Schriftartverzeichnis konnte nicht hinzugefügt werden: %s"
+
+#: font-config-scheme.cc:142 font-config.cc:59
+#, c-format
+msgid "adding font directory: %s"
+msgstr "Schriftartverzeichnis wird hinzugefügt: %s"
+
+#: font-config-scheme.cc:156
+#, c-format
+msgid "failed adding font file: %s"
+msgstr "Schriftartdatei konnte nicht hinzugefügt werden: %s"
+
+#: font-config-scheme.cc:158
+#, c-format
+msgid "adding font file: %s"
+msgstr "Schriftartdatei wird hinzugefügt: %s"
+
 #: font-config.cc:28
 msgid "Initializing FontConfig..."
 msgstr "FontConfig wird initialisiert..."
@@ -1344,15 +1439,9 @@ msgstr "FontConfig wird initialisiert..."
 msgid "Rebuilding FontConfig cache %s, this may take a while..."
 msgstr "FontConfig-Cache %s wird erneuert. Dies kann eine Weile dauern..."
 
-#: font-config.cc:57
-#, c-format
-msgid "failed adding font directory: %s"
-msgstr "Schriftartverzeichnis konnte nicht hinzugefügt werden: %s"
-
-#: font-config.cc:59
-#, c-format
-msgid "adding font directory: %s"
-msgstr "Schriftartverzeichnis wird hinzugefügt: %s"
+#: font-config.cc:63
+msgid "Building font database."
+msgstr "Schriftartendatenbank aufbauen..."
 
 #: general-scheme.cc:202
 msgid "infinity or NaN encountered while converting Real number"
@@ -1362,7 +1451,7 @@ msgstr "Unendlichkeit oder NaN bei Umwandlung einer Realen Zahl gefunden"
 msgid "setting to zero"
 msgstr "auf Null gesetzt"
 
-#: general-scheme.cc:422 output-ps.scm:62
+#: general-scheme.cc:422 output-ps.scm:63
 msgid "Found infinity or nan in output. Substituting 0.0"
 msgstr "Unendlich oder NaN in Ausgabe gefunden. Wird durch 0.0 ersetzt"
 
@@ -1521,16 +1610,16 @@ msgstr "Zuweisung wird trotzdem durchgeführt"
 msgid "type check for `%s' failed; value `%s' must be of type `%s'"
 msgstr "Typprüfung für »%s« gescheitert; Wert »%s« muss vom Typ »%s« sein"
 
-#: lily-lexer.cc:251
+#: lily-lexer.cc:252
 msgid "include files are not allowed in safe mode"
 msgstr "eingefügte Dateien sind im abgesicherten Modus nicht erlaubt"
 
-#: lily-lexer.cc:270
+#: lily-lexer.cc:271
 #, c-format
 msgid "identifier name is a keyword: `%s'"
 msgstr "Bezeichnername ist ein Schlüsselwort: »%s«"
 
-#: lily-lexer.cc:285
+#: lily-lexer.cc:286
 #, c-format
 msgid "error at EOF: %s"
 msgstr "Fehler am Dateiende (EOF): %s"
@@ -1555,11 +1644,11 @@ msgstr "Init-Datei kann nicht gefunden werden: »%s«"
 msgid "Processing `%s'"
 msgstr "»%s« wird verarbeitet"
 
-#: lily-parser.cc:99
+#: lily-parser.cc:95
 msgid "Parsing..."
 msgstr "Analysieren..."
 
-#: lily-parser.cc:127
+#: lily-parser.cc:123
 msgid "braces do not match"
 msgstr "Klammern passen nicht zueinander"
 
@@ -1572,7 +1661,7 @@ msgstr "Stimme kann nicht gefunden werden: »%s«"
 msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice."
 msgstr "Textsilbe hat keine Note. \\lyricsto oder associatedVoice verwenden."
 
-#: main.cc:100
+#: main.cc:97
 #, c-format
 msgid ""
 "This program is free software.  It is covered by the GNU General Public\n"
@@ -1585,7 +1674,7 @@ msgstr ""
 "Bedingungen weitergeben. Rufen Sie »%s --warranty« für weitere\n"
 "Informationen auf.\n"
 
-#: main.cc:106
+#: main.cc:103
 msgid ""
 "    This program is free software; you can redistribute it and/or\n"
 "modify it under the terms of the GNU General Public License version 2\n"
@@ -1616,11 +1705,11 @@ msgstr ""
 "Sie bitte an die Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n"
 "Boston, MA 02111-1307, USA.\n"
 
-#: main.cc:137
+#: main.cc:134
 msgid "SYM[=VAL]"
 msgstr "SYM[=WERT]"
 
-#: main.cc:138
+#: main.cc:135
 msgid ""
 "set Scheme option SYM to VAL (default: #t).\n"
 "Use -dhelp for help."
@@ -1628,67 +1717,59 @@ msgstr ""
 "Scheme-Option SYM auf WERT setzen (Vorgabe: #t).\n"
 "-dhelp für Hilfe verwenden."
 
-#: main.cc:141
+#: main.cc:138
 msgid "EXPR"
 msgstr "AUSD"
 
-#: main.cc:141
+#: main.cc:138
 msgid "evaluate scheme code"
 msgstr "Scheme-Code auswerten"
 
 #. Bug in option parser: --output =foe is taken as an abbreviation
 #. for --output-format.
-#: main.cc:144
+#: main.cc:141
 msgid "FORMATs"
 msgstr "FORMATe"
 
-#: main.cc:144
+#: main.cc:141
 msgid "dump FORMAT,...  Also as separate options:"
 msgstr "dump FORMAT,... Auch als separate Optionen:"
 
-#: main.cc:145
-msgid "generate DVI (tex backend only)"
-msgstr "DVI erzeugen (nur TeX-Backend)"
-
-#: main.cc:146
+#: main.cc:142
 msgid "generate PDF (default)"
 msgstr "PDF erzeugen (Standard)"
 
-#: main.cc:147
+#: main.cc:143
 msgid "generate PNG"
 msgstr "PNG erzeugen"
 
-#: main.cc:148
+#: main.cc:144
 msgid "generate PostScript"
 msgstr "PostScript erzeugen"
 
-#: main.cc:149
-msgid "generate TeX (tex backend only)"
-msgstr "TeX erzeugen (nur TeX-Backend)"
-
-#: main.cc:151
+#: main.cc:146
 msgid "FIELD"
 msgstr "FELD"
 
-#: main.cc:151
+#: main.cc:146
 msgid ""
 "dump header field FIELD to file\n"
 "named BASENAME.FIELD"
 msgstr "Header-Feld FELD in Datei BASISNAME.FELD schreiben"
 
-#: main.cc:153
+#: main.cc:148
 msgid "add DIR to search path"
 msgstr "VERZ zum Suchpfad hinzufügen"
 
-#: main.cc:154
+#: main.cc:149
 msgid "use FILE as init file"
 msgstr "DATEI als Anfangsdatei verwenden"
 
-#: main.cc:156
+#: main.cc:151
 msgid "USER, GROUP, JAIL, DIR"
 msgstr "BENUTZER,GRUPPE,KERKER,VERZ"
 
-#: main.cc:156
+#: main.cc:151
 msgid ""
 "chroot to JAIL, become USER:GROUP\n"
 "and cd into DIR"
@@ -1696,15 +1777,15 @@ msgstr ""
 "chroot in KERKER, wird BENUTZER:GRUPPE\n"
 "und cd in VERZ"
 
-#: main.cc:159
+#: main.cc:154
 msgid "write output to FILE (suffix will be added)"
 msgstr "Ausgabe in DATEI schreiben (Endung wird hinzugefügt)"
 
-#: main.cc:160
+#: main.cc:155
 msgid "relocate using directory of lilypond program"
 msgstr "wiederfinden mit Hilfe des Lilypond-Programmverzeichnisses"
 
-#: main.cc:226
+#: main.cc:221
 #, c-format
 msgid ""
 "Copyright (c) %s by\n"
@@ -1714,82 +1795,77 @@ msgstr ""
 "%s und anderen."
 
 #. No version number or newline here.  It confuses help2man.
-#: main.cc:254
+#: main.cc:249
 #, c-format
 msgid "Usage: %s [OPTION]... FILE..."
 msgstr "Aufruf: %s [OPTION]... DATEI..."
 
-#: main.cc:256
+#: main.cc:251
 #, c-format
 msgid "Typeset music and/or produce MIDI from FILE."
 msgstr "Musiksatz und/oder MIDI aus DATEI erzeugen."
 
-#: main.cc:258
+#: main.cc:253
 #, c-format
 msgid "LilyPond produces beautiful music notation."
 msgstr "LilyPond erzeugt ansprechenden Notensatz."
 
-#: main.cc:260
+#: main.cc:255
 #, c-format
 msgid "For more information, see %s"
 msgstr "Für weitere Informationen siehe %s"
 
-#: main.cc:262
+#: main.cc:257
 #, c-format
 msgid "Options:"
 msgstr "Optionen:"
 
-#: main.cc:266
-#, c-format
-msgid "Report bugs via %s"
-msgstr "Melden Sie Fehler an %s"
-
-#: main.cc:312
+#: main.cc:311
 #, c-format
 msgid "expected %d arguments with jail, found: %u"
 msgstr "%d Argumente mit Kerker erwartet, %u gefunden"
 
-#: main.cc:326
+#: main.cc:325
 #, c-format
 msgid "no such user: %s"
 msgstr "kein solcher Benutzer: %s"
 
-#: main.cc:328
+#: main.cc:327
 #, c-format
 msgid "cannot get user id from user name: %s: %s"
 msgstr "Benutzer-ID von Benutzername kann nicht gefunden werden: %s: %s"
 
-#: main.cc:343
+#: main.cc:342
 #, c-format
 msgid "no such group: %s"
 msgstr "keine solche Gruppe: %s"
 
-#: main.cc:345
+#: main.cc:344
 #, c-format
 msgid "cannot get group id from group name: %s: %s"
 msgstr "Gruppen-ID kann nicht von Gruppenname ermittelt werden: %s: %s"
 
-#: main.cc:353
+#: main.cc:352
 #, c-format
 msgid "cannot chroot to: %s: %s"
 msgstr "kein chroot möglich nach: %s: %s"
 
-#: main.cc:360
+#: main.cc:359
 #, c-format
 msgid "cannot change group id to: %d: %s"
 msgstr "Gruppen-ID kann nicht geändert werden in: %d: %s"
 
-#: main.cc:366
+#: main.cc:365
 #, c-format
 msgid "cannot change user id to: %d: %s"
 msgstr "Benutzer-ID kann nicht geändert werden in: %d: %s"
 
-#: main.cc:372
+#: main.cc:371
 #, c-format
 msgid "cannot change working directory to: %s: %s"
 msgstr "aktuelles Verzeichnis kann nicht geändert werden in: %s: %s"
 
-#: main.cc:619
+#: main.cc:611
 #, c-format
 msgid "exception caught: %s"
 msgstr "Ausnahme gefangen: %s"
@@ -1874,9 +1950,13 @@ msgstr "Es kann nicht zum Schreiben geöffnet werden: %s: %s"
 msgid "cannot write to file: `%s'"
 msgstr "Es kann nicht in Datei geschrieben werden: »%s«"
 
-#: minimal-page-breaking.cc:42
-msgid "Computing page breaks..."
-msgstr "Seitenumbrüche werden berechnet..."
+#: minimal-page-breaking.cc:38 paper-score.cc:105
+msgid "Calculating line breaks..."
+msgstr "Zeilenumbrüche werden berechnet..."
+
+#: minimal-page-breaking.cc:42 layout-page-layout.scm:463
+msgid "Calculating page breaks..."
+msgstr "Zeilenumbrüche werden berechnet..."
 
 #: music-iterator.cc:171
 msgid "Sending non-event to context"
@@ -1892,7 +1972,7 @@ msgstr "Oktavenüberprüfung gescheitert; »%s« erwartet, »%s« gefunden"
 msgid "transposition by %s makes alteration larger than double"
 msgstr "Transponieren um %s erzeugt Vorzeichen größer als ein doppeltes"
 
-#: new-dynamic-engraver.cc:128
+#: new-dynamic-engraver.cc:129
 #, c-format
 msgid ""
 "unknown crescendo style: %s\n"
@@ -1970,21 +2050,21 @@ msgstr "FT_Get_Glyph_Name() Fehler: %s"
 msgid "Finding the ideal number of pages..."
 msgstr "Ideale Seitenanzahl wird gefunden..."
 
-#: optimal-page-breaking.cc:76
+#: optimal-page-breaking.cc:78
 msgid "Fitting music on 1 page..."
 msgstr "Musik wird auf eine Seite angepasst..."
 
-#: optimal-page-breaking.cc:78
+#: optimal-page-breaking.cc:80
 #, c-format
 msgid "Fitting music on %d pages..."
 msgstr "Musik wird auf %d Seiten angepasst..."
 
-#: optimal-page-breaking.cc:80
+#: optimal-page-breaking.cc:82
 #, c-format
 msgid "Fitting music on %d or %d pages..."
 msgstr "Musik wird auf %d oder %d Seiten angepasst..."
 
-#: optimal-page-breaking.cc:157 page-turn-page-breaking.cc:226
+#: optimal-page-breaking.cc:159 page-turn-page-breaking.cc:226
 #: paper-score.cc:146
 msgid "Drawing systems..."
 msgstr "Systeme erstellen..."
@@ -2055,10 +2135,6 @@ msgstr "erzwungener Umbruch war durch anderes Ereignis aufgehoben, sollten Takt
 msgid "Layout output to `%s'..."
 msgstr "Layout nach »%s« ausgeben..."
 
-#: paper-score.cc:105
-msgid "Calculating line breaks..."
-msgstr "Zeilenumbrüche werden berechnet..."
-
 #: paper-score.cc:118
 #, c-format
 msgid "Element count %d (spanners %d) "
@@ -2072,7 +2148,7 @@ msgstr "Vorverarbeitung der grafischen Elemente..."
 msgid "GUILE signaled an error for the expression beginning here"
 msgstr "GUILE signalisierte einen Fehler für den hier beginnenden Ausdruck"
 
-#: percent-repeat-engraver.cc:200
+#: percent-repeat-engraver.cc:202
 msgid "unterminated percent repeat"
 msgstr "unbegrenzte Prozentwiederholung"
 
@@ -2088,12 +2164,12 @@ msgstr "MIDI-Kanal zurückgesprungen"
 msgid "remapping modulo 16"
 msgstr "modulo 16 neu zuordnen"
 
-#: performance.cc:101
+#: performance.cc:100
 #, c-format
 msgid "MIDI output to `%s'..."
 msgstr "MIDI-Ausgabe nach »%s«..."
 
-#: phrasing-slur-engraver.cc:139
+#: phrasing-slur-engraver.cc:146
 msgid "unterminated phrasing slur"
 msgstr "nicht beendeter Phrasierungsbogen"
 
@@ -2260,7 +2336,7 @@ msgstr "unbegrenzter Legatobogen"
 msgid "cannot end slur"
 msgstr "Legatobogen kann nicht beendet werden"
 
-#: slur.cc:357
+#: slur.cc:359
 #, c-format
 msgid "Ignoring grob for slur: %s. avoid-slur not set?"
 msgstr "Grob für Legatobogen wird ignoriert: %s. avoid-slur nicht gesetzt?"
@@ -2297,12 +2373,12 @@ msgstr "vielleicht sollte die Eingabe mehrere Stimmen erstellen"
 msgid "weird stem size, check for narrow beams"
 msgstr "Eigenartige Notenhalslänge; auf enge Balken überprüfen"
 
-#: stem.cc:627
+#: stem.cc:623
 #, c-format
 msgid "flag `%s' not found"
 msgstr "Fähnchen »%s« nicht gefunden"
 
-#: stem.cc:638
+#: stem.cc:639
 #, c-format
 msgid "flag stroke `%s' not found"
 msgstr "Fähnchenstrich »%s« nicht gefunden"
@@ -2426,40 +2502,40 @@ msgstr "endende Textklammer auch bereits vorhanden"
 msgid "giving up"
 msgstr "aufgeben"
 
-#: parser.yy:729
+#: parser.yy:804
 msgid "\\paper cannot be used in \\score, use \\layout instead"
 msgstr "\\paper kann nicht in \\source verwendet werden; stattdessen \\layout verwenden"
 
-#: parser.yy:753
+#: parser.yy:828
 msgid "need \\paper for paper block"
 msgstr "Für Papier-Block wird \\paper benötigt"
 
-#: parser.yy:1224
+#: parser.yy:1299
 msgid "Grob name should be alphanumeric"
 msgstr "Grob-Name sollte alphanumerisch sein"
 
-#: parser.yy:1522
+#: parser.yy:1597
 msgid "second argument must be pitch list"
 msgstr "zweites Argument muss eine Tonhöhenliste sein"
 
-#: parser.yy:1549 parser.yy:1554 parser.yy:2026
+#: parser.yy:1624 parser.yy:1629 parser.yy:2101
 msgid "have to be in Lyric mode for lyrics"
 msgstr "muss in Liedtextmodus sein um Liedtext setzen zu können"
 
-#: parser.yy:1651
+#: parser.yy:1726
 msgid "expecting string as script definition"
 msgstr "Zeichenkette als Skriptdefinition erwartet"
 
-#: parser.yy:1806 parser.yy:1856
+#: parser.yy:1881 parser.yy:1931
 #, c-format
 msgid "not a duration: %d"
 msgstr "keine gültige Dauer: %d"
 
-#: parser.yy:1980
+#: parser.yy:2055
 msgid "have to be in Note mode for notes"
 msgstr "Muss im Notenmodus sein für Noten"
 
-#: parser.yy:2041
+#: parser.yy:2116
 msgid "have to be in Chord mode for chords"
 msgstr "Muss im Akkordmodus sein für Akkorde"
 
@@ -2519,26 +2595,26 @@ msgstr "Klammer am Ende des Auszugs gefunden. Haben Sie ein Leerzeichen vergesse
 msgid "invalid character: `%c'"
 msgstr "Ungültiges Zeichen: »%c«"
 
-#: lexer.ll:803 lexer.ll:804
+#: lexer.ll:803
 #, c-format
 msgid "unknown escaped string: `\\%s'"
 msgstr "Ungültige Fluchtsequenz: »\\%s«"
 
-#: lexer.ll:910 lexer.ll:911
+#: lexer.ll:910
 #, c-format
 msgid "file too old: %s (oldest supported: %s)"
 msgstr "Datei zu alt: %s (älteste unterstützte: %s)"
 
-#: lexer.ll:911 lexer.ll:912
+#: lexer.ll:911
 msgid "consider updating the input with the convert-ly script"
 msgstr "Erwägen Sie die Aktualisierung der Eingabe mit dem Skript convert-ly"
 
-#: lexer.ll:917 lexer.ll:918
+#: lexer.ll:917
 #, c-format
 msgid "program too old: %s (file requires: %s)"
 msgstr "Programm zu alt: %s (Datei erfordert: %s)"
 
-#: backend-library.scm:19 lily.scm:777 ps-to-png.scm:58
+#: backend-library.scm:19 lily.scm:761 ps-to-png.scm:58
 #, scheme-format
 msgid "Invoking `~a'..."
 msgstr "»~s« wird aufgerufen..."
@@ -2548,7 +2624,7 @@ msgstr "»~s« wird aufgerufen..."
 msgid "`~a' failed (~a)"
 msgstr "»~a« gescheitert (~a)"
 
-#: backend-library.scm:116 framework-tex.scm:344 framework-tex.scm:369
+#: backend-library.scm:116
 #, scheme-format
 msgid "Converting to `~a'..."
 msgstr "Konvertierung nach »~a«..."
@@ -2582,16 +2658,16 @@ msgstr "Ereignisklasse ~A scheint ungenutzt zu sein"
 msgid "translator listens to nonexisting event class ~A"
 msgstr "Übersetzer hört auf fehlende Ereignisklasse ~A"
 
-#: define-markup-commands.scm:599
+#: define-markup-commands.scm:569
 msgid "no systems found in \\score markup, does it have a \\layout block?"
 msgstr "keine Systeme in \\score-Markup gefunden, hat es einen \\layout-Block?"
 
-#: define-markup-commands.scm:2428
+#: define-markup-commands.scm:2387
 #, scheme-format
 msgid "Cannot find glyph ~a"
 msgstr "Kann kein Zeichen ~a finden"
 
-#: define-markup-commands.scm:2737
+#: define-markup-commands.scm:2696
 #, scheme-format
 msgid "not a valid duration string: ~a"
 msgstr "keine gültige Dauer: ~a"
@@ -2612,8 +2688,8 @@ msgid "unknown repeat type `~S'"
 msgstr "unbekannter Wiederholungstyp »~S«"
 
 #: define-music-types.scm:693
-msgid "See music-types.scm for supported repeats"
-msgstr "Siehe music-types.scm für unterstützte Wiederholungen"
+msgid "See define-music-types.scm for supported repeats"
+msgstr "Siehe define-music-types.scm für unterstützte Wiederholungen"
 
 #: document-backend.scm:99
 #, scheme-format
@@ -2630,57 +2706,57 @@ msgstr "Schnittstelle für Eigenschaft ~S kann nicht gefunden werden"
 msgid "unknown Grob interface: ~S"
 msgstr "Unbekannte Grob-Schnittstelle: ~S"
 
-#: documentation-lib.scm:48
+#: documentation-lib.scm:49
 #, scheme-format
 msgid "Processing ~S..."
 msgstr "~S wird verarbeitet..."
 
-#: documentation-lib.scm:164
+#: documentation-lib.scm:165
 #, scheme-format
 msgid "Writing ~S..."
 msgstr "~S wird geschrieben..."
 
-#: documentation-lib.scm:186
+#: documentation-lib.scm:187
 #, scheme-format
 msgid "cannot find description for property ~S (~S)"
 msgstr "Beschreibung für Eigenschaft ~S (~S) kann nicht gefunden werden"
 
+#: flag-styles.scm:145
+#, scheme-format
+msgid "flag stroke `~a' or `~a' not found"
+msgstr "Fähnchenstrich »~a«·or·»~a« nicht gefunden"
+
 #: framework-eps.scm:90
 #, scheme-format
 msgid "Writing ~a..."
 msgstr "~a wird geschrieben..."
 
-#: framework-ps.scm:282
+#: framework-ps.scm:277
 #, scheme-format
 msgid "cannot embed ~S=~S"
 msgstr "~S=~S kann nicht eingebettet werden"
 
-#: framework-ps.scm:335
+#: framework-ps.scm:330
 #, scheme-format
 msgid "cannot extract file matching ~a from ~a"
 msgstr "Eine zu ~a passende Datei kann nicht aus ~a gewonnen werden"
 
-#: framework-ps.scm:352
+#: framework-ps.scm:347
 #, scheme-format
 msgid "do not know how to embed ~S=~S"
 msgstr "Unbekannte Einbettung ~S=~S"
 
-#: framework-ps.scm:383
+#: framework-ps.scm:378
 #, scheme-format
 msgid "do not know how to embed font ~s ~s ~s"
 msgstr "Unbekannte Schriftsatzeinbettung ~s ~s ~s"
 
-#: framework-ps.scm:753
+#: framework-ps.scm:748
 #, scheme-format
 msgid "cannot convert <stdout> to ~S"
 msgstr "<stdout> kann nicht in ~S konvertiert werden"
 
-#: framework-ps.scm:772 framework-ps.scm:775
-#, scheme-format
-msgid "cannot generate ~S using the postscript back-end"
-msgstr "~S kann nicht mit PostScript-Backend erzeugt werden"
-
-#: framework-ps.scm:782
+#: framework-ps.scm:771
 msgid ""
 "\n"
 "The PostScript backend does not support the system-by-system \n"
@@ -2710,11 +2786,6 @@ msgstr ""
 "entfernt werden\n"
 "\n"
 
-#: framework-tex.scm:361
-#, scheme-format
-msgid "TeX file name must not contain whitespace: `~a'"
-msgstr "TeX-Dateiname darf keine Leerzeichen enthalten: »~a«"
-
 #: graphviz.scm:53
 #, scheme-format
 msgid "Writing graph `~a'..."
@@ -2730,44 +2801,40 @@ msgstr "Fehler bei Balkenzuschnitt. (~S,~S) erwartet, ~S gefunden."
 msgid "Error in beam quanting.  Expected ~S 0, found ~S."
 msgstr "Fehler bei Balkenzuschnitt. ~S 0 erwartet, ~S gefunden."
 
-#: layout-page-layout.scm:124
+#: layout-page-layout.scm:126
 msgid "Can't fit systems on page -- ignoring between-system-padding"
 msgstr "Systeme passen nicht auf Seite -- Zwischen-System-Abstand wird ignoriert"
 
-#: layout-page-layout.scm:458
-msgid "Calculating page breaks..."
-msgstr "Zeilenumbrüche werden berechnet..."
-
-#: lily-library.scm:588
+#: lily-library.scm:602
 #, scheme-format
 msgid "unknown unit: ~S"
 msgstr "unbekannte Einheit: ~S"
 
-#: lily-library.scm:622
+#: lily-library.scm:636
 #, scheme-format
 msgid "no \\version statement found, please add~afor future compatibility"
 msgstr "keine \\version-Anweisung gefunden, ~a für zukünftige Kompatibilität hinzufügen"
 
-#: lily-library.scm:630
+#: lily-library.scm:644
 msgid "old relative compatibility not used"
 msgstr "alte relative Kompatibilität nicht verwendet"
 
-#: lily.scm:178
+#: lily.scm:179
 #, scheme-format
 msgid "cannot find: ~A"
 msgstr "~A kann nicht gefunden werden"
 
-#: lily.scm:243
+#: lily.scm:228
 #, scheme-format
 msgid "wrong type for argument ~a.  Expecting ~a, found ~s"
 msgstr "falscher Typ für Argument ~a; ~a erwartet, ~s gefunden"
 
-#: lily.scm:641
+#: lily.scm:625
 #, scheme-format
 msgid "job ~a terminated with signal: ~a"
 msgstr "Auftrag ~a mit Signal ~a beendet"
 
-#: lily.scm:644
+#: lily.scm:628
 #, scheme-format
 msgid ""
 "logfile ~a (exit ~a):\n"
@@ -2776,12 +2843,12 @@ msgstr ""
 "Logdatei ~a (Ende ~a):\n"
 "~a"
 
-#: lily.scm:669 lily.scm:767
+#: lily.scm:653 lily.scm:751
 #, scheme-format
 msgid "failed files: ~S"
 msgstr "gescheiterte Dateien: ~S"
 
-#: lily.scm:757
+#: lily.scm:741
 #, scheme-format
 msgid "Redirecting output to ~a..."
 msgstr "Ausgabeumleitung nach ~a..."
@@ -2790,7 +2857,7 @@ msgstr "Ausgabeumleitung nach ~a..."
 msgid "Music head function must return Music object"
 msgstr "Musikkopf-Funktion muss Musikobjekt zurückliefern."
 
-#: ly-syntax-constructors.scm:150
+#: ly-syntax-constructors.scm:154
 #, scheme-format
 msgid "Invalid property operation ~a"
 msgstr "Ungültige Eigenschaftsoperation ~a"
@@ -2840,12 +2907,12 @@ msgstr "Taktüberprüfung gescheitert. bei ~a erwartet, stattdessen bei ~a"
 msgid "cannot find quoted music: `~S'"
 msgstr "zitierte Musik »~S« kann nicht gefunden werden"
 
-#: music-functions.scm:990
+#: music-functions.scm:1198
 #, scheme-format
 msgid "unknown accidental style: ~S"
 msgstr "unbekannter Versetzungszeichenstil: ~S"
 
-#: output-ps.scm:285
+#: output-ps.scm:294
 msgid "utf-8-string encountered in PS backend"
 msgstr "UTF-8-Zeichenkette in PostScript-Backend gefunden"
 
@@ -2859,28 +2926,23 @@ msgstr "nicht definiert: ~S"
 msgid "cannot decypher Pango description: ~a"
 msgstr "Pango-Beschreibung kann nicht entschlüsselt werden: ~a"
 
-#: output-tex.scm:96
-#, scheme-format
-msgid "cannot find ~a in ~a"
-msgstr "~a kann nicht in ~a gefunden werden"
-
-#: paper.scm:86
+#: paper.scm:104
 msgid "set-global-staff-size: not in toplevel scope"
 msgstr "set-global-staff-size: Nicht auf höchster Ebene im Gültigkeitsbereich"
 
-#: paper.scm:226
+#: paper.scm:244
 #, scheme-format
 msgid "This is not a \\layout {} object, ~S"
 msgstr "Dies ist kein \\layout {} Objekt, ~S"
 
-#: paper.scm:238
+#: paper.scm:256
 #, scheme-format
-msgid "Unknown papersize: ~a"
+msgid "Unknown paper size: ~a"
 msgstr "Unbekannte Papiergröße: ~a"
 
 #. TODO: should raise (generic) exception with throw, and catch
 #. that in parse-scm.cc
-#: paper.scm:253
+#: paper.scm:271
 msgid "Must use #(set-paper-size .. ) within \\paper { ... }"
 msgstr "#(set-paper-size ..) muss innerhalb von \\paper { ... } verwendet werden"
 
@@ -2904,6 +2966,36 @@ msgstr "~a mit Rückgabewert ~S beendet"
 msgid "assertion failed: ~S"
 msgstr "Behauptung gescheitert: ~S"
 
+#~ msgid "requested time signature, but time sig is unknown"
+#~ msgstr "Taktangabe angefragt, aber Taktart ist unbekannt"
+
+#~ msgid "Report bugs via"
+#~ msgstr "Melden Sie Fehler an"
+
+#~ msgid "Negative skip %s"
+#~ msgstr "Negativer Sprung (skip) %s"
+
+#~ msgid "ignoring unknown accidental rule: %s"
+#~ msgstr "unbekannte Versetzungszeichenregel wird ignoriert: %s"
+
+#~ msgid "generate DVI (tex backend only)"
+#~ msgstr "DVI erzeugen (nur TeX-Backend)"
+
+#~ msgid "generate TeX (tex backend only)"
+#~ msgstr "TeX erzeugen (nur TeX-Backend)"
+
+#~ msgid "Computing page breaks..."
+#~ msgstr "Seitenumbrüche werden berechnet..."
+
+#~ msgid "cannot generate ~S using the postscript back-end"
+#~ msgstr "~S kann nicht mit PostScript-Backend erzeugt werden"
+
+#~ msgid "TeX file name must not contain whitespace: `~a'"
+#~ msgstr "TeX-Dateiname darf keine Leerzeichen enthalten: »~a«"
+
+#~ msgid "cannot find ~a in ~a"
+#~ msgstr "~a kann nicht in ~a gefunden werden"
+
 #~ msgid "Bugs"
 #~ msgstr "Fehler"
 
index 4a6f5d717919937dc37019da2d76dace90716088..e93b1ddf46cb1e19d68b4775dc12da29c4b69fa6 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1075,12 +1075,12 @@ msgstr ""
 
 #: musicxml2ly.py:2576
 msgid ""
-"Copyright (c) 2005--2008 by\n"
+"Copyright (c) 2005--2009 by\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> and\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
 msgstr ""
-"Copyright (c) 2005--2008 por\n"
+"Copyright (c) 2005--2009 por\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> y\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
index 561104374807ec5fdf21a2c51368d0c6561ea083..c642c85aef68535a62e7d1d212b3e6fa4b3e7547 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -3,14 +3,14 @@
 # French translation of GNU/lilypond - http//lilypond.org
 # Copyright © 2004 Free Software Foundation, Inc.
 # Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996-2007.
-# Jean-Charles Malahieude <lolyfan@wanadoo.fr>, 2008
+# Jean-Charles Malahieude <lilyfan@orange.fr>, 2008
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.11.57\n"
+"Project-Id-Version: lilypond 2.12.0\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n"
-"POT-Creation-Date: 2008-08-23 18:49+0200\n"
-"PO-Revision-Date: 2008-08-31 23:33+0200\n"
+"POT-Creation-Date: 2008-12-20 11:58+0100\n"
+"PO-Revision-Date: 2008-12-31 13:53+0100\n"
 "Last-Translator: Jean-Charles Malahieude <lilyfan@orange.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
 "MIME-Version: 1.0\n"
@@ -34,7 +34,7 @@ msgstr ""
 msgid "%s has been replaced by %s"
 msgstr "%s a été remplacé par %s"
 
-#: convertrules.py:24 musicexp.py:16 convert-ly.py:48 lilypond-book.py:82
+#: convertrules.py:24 musicexp.py:16 convert-ly.py:50 lilypond-book.py:94
 #: warn.cc:48 input.cc:90
 #, c-format, python-format
 msgid "warning: %s"
@@ -431,6 +431,22 @@ msgstr "Axe et direction doivent précéder les étiquettes :\n"
 msgid "\\put-adjacent axis dir markup markup."
 msgstr "\\put-adjacent axe direction étiquette étiquette."
 
+#: convertrules.py:2832
+msgid "re-definition of InnerStaffGroup.\n"
+msgstr "redéfinition de InnerStaffGroup.\n"
+
+#: convertrules.py:2838
+msgid "re-definition of InnerChoirStaff.\n"
+msgstr "redéfinition de InnerChoirStaff.\n"
+
+#: convertrules.py:2851
+msgid "stringTuning must be added to addChordShape call.\n"
+msgstr "stringTuning est requis lors de l'appel à addChordShape. \n"
+
+#: convertrules.py:2857
+msgid "stringTuning must be added to chord-shape call.\n"
+msgstr "stringTuning est requis lors de l'appel à chord-shape.\n"
+
 #: fontextract.py:25
 #, python-format
 msgid "Scanning %s"
@@ -446,56 +462,92 @@ msgstr "Extraction de %s"
 msgid "Writing fonts to %s"
 msgstr "Écriture des fontes vers %s"
 
-#: lilylib.py:101 lilylib.py:152
+#: lilylib.py:91 lilylib.py:142
 #, python-format
 msgid "Invoking `%s'"
 msgstr "Appel de « %s »"
 
-#: lilylib.py:103 lilylib.py:154
+#: lilylib.py:93 lilylib.py:144
 #, python-format
 msgid "Running %s..."
 msgstr "Exécution de %s..."
 
-#: lilylib.py:219
+#: lilylib.py:209
 #, python-format
 msgid "Usage: %s"
 msgstr "Utilisation : %s"
 
-#: musicexp.py:585
+#: musicexp.py:215 musicexp.py:220
+msgid "Language does not support microtones contained in the piece"
+msgstr "Le langage ne prend pas en charge les microintervalles de ce morceau"
+
+#: musicexp.py:482
+msgid "Tuplet brackets of curved shape are not correctly implemented"
+msgstr "La courbure des crochets de nolet n'est pas implémentée de manière optimale"
+
+#. TODO: Implement this using actual_type and normal_type!
+#: musicexp.py:511
+msgid "Tuplet brackets displaying both note durations are not implemented, using default"
+msgstr "Les crochets de nolet indiquant le deux valeurs rythmiques ne sont pas implémentés ; utilisation du style par défaut"
+
+#: musicexp.py:656
 #, python-format
 msgid "unable to set the music %(music)s for the repeat %(repeat)s"
 msgstr "impossible d'affecter le fragment %(music)s à la répétition %(repeat)s"
 
-#: musicexp.py:594
+#: musicexp.py:665
 msgid "encountered repeat without body"
 msgstr "réprise vide détectée"
 
-#: musicxml.py:13 convert-ly.py:51 lilypond-book.py:85 warn.cc:54 input.cc:96
+#. no self.elements!
+#: musicexp.py:835
+#, python-format
+msgid "Grace note with no following music: %s"
+msgstr "Apoggiature non suivie de musique :%s"
+
+#: musicexp.py:997
+#, python-format
+msgid "Invalid octave shift size found: %s. Using no shift."
+msgstr "Décalage d'octave invalide : %s. Décalage non appliqué."
+
+#: musicexp.py:1455
+#, python-format
+msgid "Unable to convert alteration %s to a lilypond expression"
+msgstr "Impossible de convertir l'altération %s en expression LilyPond"
+
+#: musicxml.py:13 convert-ly.py:53 lilypond-book.py:97 warn.cc:54 input.cc:96
 #: input.cc:104
 #, c-format, python-format
 msgid "error: %s"
 msgstr "Erreur : %s"
 
-#: musicxml.py:298
-msgid "requested time signature, but time sig is unknown"
-msgstr "Une métrique est obligatoire, mais la définition trouvée est inconnue"
+#. TODO: Handle pieces without a time signature!
+#: musicxml.py:357
+msgid "Senza-misura time signatures are not yet supported!"
+msgstr "Les métriques « senza-misura » ne sont pas prises en charge."
+
+#: musicxml.py:375
+msgid "Unable to interpret time signature! Falling back to 4/4."
+msgstr "Métrique non interprétable ; retour au 4/4."
 
-#: musicxml.py:354
+#: musicxml.py:431
 #, python-format
-msgid "Encountered note at %s with %s duration (no <type> element):"
-msgstr "Une note se trouve en %s, avec une durée de %s (élément sans <type>) :"
+msgid "Key alteration octave given for a non-existing alteration nr. %s, available numbers: %s!"
+msgstr ""
+"Octave d'altération indiquée pour une altération numéro %s inexistante ;\n"
+"index d'altération disponibles : 1 à %s"
 
-#: musicxml.py:388
+#: musicxml.py:519
 #, python-format
 msgid "Unable to find instrument for ID=%s\n"
 msgstr "Aucun instrument ne correspond à l'ID=%s\n"
 
-#: abc2ly.py:1342 convert-ly.py:72 lilypond-book.py:109 midi2ly.py:846
+#: abc2ly.py:1341 convert-ly.py:74 lilypond-book.py:121 midi2ly.py:845
 #, python-format
 msgid "%s [OPTION]... FILE"
 msgstr "%s [OPTIONS]... FICHIER"
 
-#: abc2ly.py:1343
+#: abc2ly.py:1342
 #, python-format
 msgid ""
 "abc2ly converts ABC music files (see\n"
@@ -504,34 +556,41 @@ msgstr ""
 "abc2ly convertit les fichiers musicaux ABC (voir\n"
 "%s) au format LilyPond.\n"
 
-#: abc2ly.py:1351 convert-ly.py:79 etf2ly.py:1190 lilypond-book.py:195
-#: midi2ly.py:882 musicxml2ly.py:2185 main.cc:161
+#: abc2ly.py:1350 convert-ly.py:81 etf2ly.py:1190 lilypond-book.py:207
+#: midi2ly.py:881 musicxml2ly.py:2590 main.cc:156
 msgid "show version number and exit"
 msgstr "afficher le numéro de version et quitter"
 
-#: abc2ly.py:1355 convert-ly.py:83 etf2ly.py:1186 lilypond-book.py:126
-#: midi2ly.py:861 musicxml2ly.py:2167 main.cc:150
+#: abc2ly.py:1354 convert-ly.py:85 etf2ly.py:1186 lilypond-book.py:138
+#: midi2ly.py:860 musicxml2ly.py:2572 main.cc:145
 msgid "show this help and exit"
 msgstr "visualiser cette aide et quitter"
 
-#: abc2ly.py:1357 etf2ly.py:1191 midi2ly.py:865
+#: abc2ly.py:1356 etf2ly.py:1191 midi2ly.py:864
 msgid "write output to FILE"
 msgstr "produire la sortie dans le FICHIER"
 
-#: abc2ly.py:1359
+#: abc2ly.py:1358
 msgid "be strict about success"
 msgstr "être strict sur la réussite"
 
-#: abc2ly.py:1361
+#: abc2ly.py:1360
 msgid "preserve ABC's notion of beams"
 msgstr "préserver la notion de lien de croches propre à ABC"
 
-#: abc2ly.py:1363 convert-ly.py:120 etf2ly.py:1199 lilypond-book.py:202
-#: midi2ly.py:894 musicxml2ly.py:2240
-msgid "Report bugs via"
-msgstr "Rapporter toute anomalie à"
+#. Translators, please translate this string as
+#. "Report bugs in English via %s",
+#. or if there is a LilyPond users list or forum in your language
+#. "Report bugs in English via %s or in YOUR_LANG via URI"
+#: abc2ly.py:1363 convert-ly.py:123 etf2ly.py:1200 lilypond-book.py:214
+#: midi2ly.py:894 musicxml2ly.py:2646 main.cc:265
+#, c-format, python-format
+msgid "Report bugs via %s"
+msgstr ""
+"Signaler toute anomalie à \n"
+"%s"
 
-#: convert-ly.py:31
+#: convert-ly.py:33
 msgid ""
 "Update LilyPond input to newer version.  By default, update from the\n"
 "version taken from the \\version command, to the current LilyPond version."
@@ -540,72 +599,72 @@ msgstr ""
 "Par défaut, de la version indiquée par la commande \\version \n"
 "vers la version courante de LilyPond."
 
-#: convert-ly.py:33 lilypond-book.py:59
+#: convert-ly.py:35 lilypond-book.py:71
 msgid "Examples:"
 msgstr "Exemples :"
 
-#: convert-ly.py:67 etf2ly.py:1173 lilypond-book.py:105 midi2ly.py:77
+#: convert-ly.py:69 etf2ly.py:1173 lilypond-book.py:117 midi2ly.py:76
 msgid "Distributed under terms of the GNU General Public License."
 msgstr "Distribué selon les termes de la GNU General Public License."
 
-#: convert-ly.py:68 etf2ly.py:1174 lilypond-book.py:106 midi2ly.py:78
+#: convert-ly.py:70 etf2ly.py:1174 lilypond-book.py:118 midi2ly.py:77
 msgid "It comes with NO WARRANTY."
 msgstr "Le logiciel est distribué SANS GARANTIE."
 
-#: convert-ly.py:87 convert-ly.py:114
+#: convert-ly.py:89 convert-ly.py:116
 msgid "VERSION"
 msgstr "VERSION"
 
-#: convert-ly.py:89
+#: convert-ly.py:91
 msgid "start from VERSION [default: \\version found in file]"
 msgstr "partir de la VERSION [par défaut : \\version trouvée dans le fichier]"
 
-#: convert-ly.py:92
+#: convert-ly.py:94
 msgid "edit in place"
 msgstr "éditer le fichier d'origine"
 
-#: convert-ly.py:96
+#: convert-ly.py:98
 msgid "do not add \\version command if missing"
 msgstr "ne pas ajouter la commande \\version si elle est absente"
 
-#: convert-ly.py:102
+#: convert-ly.py:104
 #, python-format
 msgid "force updating \\version number to %s"
 msgstr "forcer la mise à jour de \\version à %s"
 
-#: convert-ly.py:108
+#: convert-ly.py:110
 #, python-format
 msgid "show rules [default: -f 0, -t %s]"
 msgstr "afficher les règles [par défaut : -f 0, -t %s]"
 
-#: convert-ly.py:113
+#: convert-ly.py:115
 #, python-format
 msgid "convert to VERSION [default: %s]"
 msgstr "convertir jusqu'à la VERSION [par défaut : %s]"
 
-#: convert-ly.py:160
+#: convert-ly.py:163
 msgid "Applying conversion: "
 msgstr "Conversion en cours : "
 
-#: convert-ly.py:173
+#: convert-ly.py:176
 msgid "Error while converting"
 msgstr "Erreur lors de la conversion"
 
-#: convert-ly.py:175
-msgid "Stopping at last succesful rule"
-msgstr "Arrêt après la dernière règle appliquée avec succès"
+#: convert-ly.py:178
+msgid "Stopping at last successful rule"
+msgstr "Arrêt à la dernière règle appliquée avec succès"
 
-#: convert-ly.py:196
+#: convert-ly.py:199
 #, python-format
 msgid "Processing `%s'... "
 msgstr "Traitement de « %s »..."
 
-#: convert-ly.py:286 relocate.cc:362 source-file.cc:59
+#: convert-ly.py:289 relocate.cc:362 source-file.cc:59
 #, c-format, python-format
 msgid "cannot open file: `%s'"
 msgstr "Impossible d'ouvrir le fichier : « %s »"
 
-#: convert-ly.py:293
+#: convert-ly.py:296
 #, python-format
 msgid "cannot determine version for `%s'.  Skipping"
 msgstr "impossible de déterminer la version  de « %s ». Au suivant !"
@@ -624,281 +683,281 @@ msgstr ""
 "etf2ly convertit partiellement un fichier ETF en un fichier LilyPond \n"
 "exploitable.\n"
 
-#: etf2ly.py:1192 midi2ly.py:866 musicxml2ly.py:2233 main.cc:154 main.cc:159
+#: etf2ly.py:1192 midi2ly.py:865 musicxml2ly.py:2638 main.cc:149 main.cc:154
 msgid "FILE"
 msgstr "FICHIER"
 
-#: etf2ly.py:1194 lilypond-book.py:198 midi2ly.py:883 main.cc:163
+#: etf2ly.py:1194 lilypond-book.py:210 midi2ly.py:882 main.cc:158
 msgid "show warranty and copyright"
 msgstr "afficher les notices de garantie et du droit d'auteur"
 
-#: lilypond-book.py:57
+#: lilypond-book.py:69
 msgid "Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document."
 msgstr ""
 "Traiter les extraits LilyPond dans un document HTML hybride, LaTeX, \n"
 "texinfo ou Docbook."
 
-#: lilypond-book.py:64
+#: lilypond-book.py:76
 msgid "BOOK"
 msgstr "LIVRE"
 
-#: lilypond-book.py:72
+#: lilypond-book.py:84
 #, python-format
 msgid "Exiting (%d)..."
 msgstr "Fin d'exécution (%d)..."
 
-#: lilypond-book.py:103
+#: lilypond-book.py:115
 #, python-format
 msgid "Copyright (c) %s by"
 msgstr "Copyright (c) %s détenu par"
 
-#: lilypond-book.py:113
+#: lilypond-book.py:125
 msgid "FILTER"
 msgstr "FILTRE"
 
-#: lilypond-book.py:116
+#: lilypond-book.py:128
 msgid "pipe snippets through FILTER [default: `convert-ly -n -']"
 msgstr "passer les extraits à travers le FILTRE [par défaut : `convert-ly -n -']"
 
-#: lilypond-book.py:120
+#: lilypond-book.py:132
 msgid "use output format FORMAT (texi [default], texi-html, latex, html, docbook)"
 msgstr ""
 "utiliser le format de sortie FORMAT (texi (par défaut), texi-html, latex, \n"
 "html, docbook)"
 
-#: lilypond-book.py:121
+#: lilypond-book.py:133
 msgid "FORMAT"
 msgstr "FORMAT"
 
-#: lilypond-book.py:128
+#: lilypond-book.py:140
 msgid "add DIR to include path"
 msgstr "ajouter le RÉPERTOIRE au chemin de recherche des inclusions"
 
-#: lilypond-book.py:129 lilypond-book.py:136 lilypond-book.py:154
-#: lilypond-book.py:160 lilypond-book.py:166 lilypond-book.py:172 main.cc:153
+#: lilypond-book.py:141 lilypond-book.py:148 lilypond-book.py:166
+#: lilypond-book.py:172 lilypond-book.py:178 lilypond-book.py:184 main.cc:148
 msgid "DIR"
 msgstr "RÉP"
 
-#: lilypond-book.py:134
+#: lilypond-book.py:146
 msgid "format Texinfo output so that Info will look for images of music in DIR"
 msgstr "formater la sortie Texinfo pour qu'Info cherche les images dans RÉP"
 
-#: lilypond-book.py:141
+#: lilypond-book.py:153
 msgid "run executable PROG instead of latex"
 msgstr "lancer l'exécutable PROG plutôt que latex"
 
-#: lilypond-book.py:142
+#: lilypond-book.py:154
 msgid "PROG"
 msgstr "PROG"
 
-#: lilypond-book.py:147
+#: lilypond-book.py:159
 msgid "PAD"
 msgstr "PAD"
 
-#: lilypond-book.py:149
+#: lilypond-book.py:161
 msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)"
 msgstr ""
 "Tasser la musique par la gauche pour la répartir en dépit du nombre irrégulier \n"
 "de mesures (en mm)"
 
-#: lilypond-book.py:153
+#: lilypond-book.py:165
 msgid "write output to DIR"
 msgstr "produire la sortie dans le RÉPERTOIRE"
 
-#: lilypond-book.py:159
+#: lilypond-book.py:171
 msgid "do not fail if no lilypond output is found"
 msgstr "poursuivre même s'il n'y a pas de sortie lilypond"
 
-#: lilypond-book.py:165
+#: lilypond-book.py:177
 msgid "do not fail if no PNG images are found for EPS files"
 msgstr "poursuivre même s'il n'y a pas d'image PNG pour les fichiers EPS"
 
-#: lilypond-book.py:171
+#: lilypond-book.py:183
 msgid "write lily-XXX files to DIR, link into --output dir"
 msgstr "écrire les fichiers lily-XXX dans RÉP, et lier à --output rép"
 
-#: lilypond-book.py:176
+#: lilypond-book.py:188
 msgid "COMMAND"
 msgstr "COMMANDE"
 
-#: lilypond-book.py:177
+#: lilypond-book.py:189
 msgid "process ly_files using COMMAND FILE..."
 msgstr "Traîter ly_files en utilisant COMMANDE FICHIER..."
 
-#: lilypond-book.py:184
+#: lilypond-book.py:196
 msgid "create PDF files for use with PDFTeX"
 msgstr "Créer des fichiers PDF pour utilisation par PDFTeX"
 
-#: lilypond-book.py:187 midi2ly.py:876 musicxml2ly.py:2190 main.cc:162
+#: lilypond-book.py:199 midi2ly.py:875 musicxml2ly.py:2595 main.cc:157
 msgid "be verbose"
 msgstr "Passer en mode verbeux"
 
-#: lilypond-book.py:825
+#: lilypond-book.py:871
 #, python-format
 msgid "file not found: %s"
 msgstr "fichier non trouvé : %s"
 
-#: lilypond-book.py:1087
+#: lilypond-book.py:1142
 #, python-format
 msgid "deprecated ly-option used: %s=%s"
 msgstr "option ly-option obsolète : %s=%s"
 
-#: lilypond-book.py:1089
+#: lilypond-book.py:1144
 #, python-format
 msgid "compatibility mode translation: %s=%s"
 msgstr "bascule en mode de compatibilité : %s=%s"
 
-#: lilypond-book.py:1092
+#: lilypond-book.py:1147
 #, python-format
 msgid "deprecated ly-option used: %s"
 msgstr "option ly-option obsolète : %s"
 
-#: lilypond-book.py:1094
+#: lilypond-book.py:1149
 #, python-format
 msgid "compatibility mode translation: %s"
 msgstr "bascule en mode de compatibilité : %s"
 
-#: lilypond-book.py:1112
+#: lilypond-book.py:1167
 #, python-format
 msgid "ignoring unknown ly option: %s"
 msgstr "option ly inconnue et ignorée : %s"
 
-#: lilypond-book.py:1538
+#: lilypond-book.py:1604
 #, python-format
 msgid "Opening filter `%s'"
 msgstr "Ouverture du filtre « %s »"
 
-#: lilypond-book.py:1555
+#: lilypond-book.py:1621
 #, python-format
 msgid "`%s' failed (%d)"
 msgstr "« %s » a échoué (%d)"
 
-#: lilypond-book.py:1556
+#: lilypond-book.py:1622
 msgid "The error log is as follows:"
 msgstr "Voici le journal d'erreurs :"
 
-#: lilypond-book.py:1618
+#: lilypond-book.py:1684
 msgid "cannot find \\begin{document} in LaTeX document"
 msgstr "Impossible de trouver \\begin{document} dans le document LaTeX."
 
-#: lilypond-book.py:1718
+#: lilypond-book.py:1784
 msgid "Writing snippets..."
 msgstr "Écriture des extraits..."
 
-#: lilypond-book.py:1724
+#: lilypond-book.py:1790
 msgid "Processing..."
 msgstr "Traitement..."
 
-#: lilypond-book.py:1730
+#: lilypond-book.py:1796
 msgid "All snippets are up to date..."
 msgstr "Tous les extraits sont à jour..."
 
-#: lilypond-book.py:1764
+#: lilypond-book.py:1830
 #, python-format
 msgid "cannot determine format for: %s"
 msgstr "format indéterminé pour %s"
 
-#: lilypond-book.py:1775
+#: lilypond-book.py:1841
 #, python-format
 msgid "%s is up to date."
 msgstr "%s est à jour."
 
-#: lilypond-book.py:1789
+#: lilypond-book.py:1855
 #, python-format
 msgid "Writing `%s'..."
 msgstr "Écriture de « %s »..."
 
-#: lilypond-book.py:1847
+#: lilypond-book.py:1913
 msgid "Output would overwrite input file; use --output."
 msgstr "La sortie va écraser le fichier d'entrée ; utiliser --output"
 
-#: lilypond-book.py:1851
+#: lilypond-book.py:1917
 #, python-format
 msgid "Reading %s..."
 msgstr "Lecture en cours de %s..."
 
-#: lilypond-book.py:1870
+#: lilypond-book.py:1937
 msgid "Dissecting..."
 msgstr "Dissection en cours..."
 
-#: lilypond-book.py:1886
+#: lilypond-book.py:1953
 #, python-format
 msgid "Compiling %s..."
 msgstr "Compilation de %s..."
 
-#: lilypond-book.py:1895
+#: lilypond-book.py:1962
 #, python-format
 msgid "Processing include: %s"
 msgstr "Traitement d'inclusion : %s"
 
-#: lilypond-book.py:1907
+#: lilypond-book.py:1974
 #, python-format
 msgid "Removing `%s'"
 msgstr "Suppression de « %s »"
 
-#: midi2ly.py:85 lily-library.scm:620 lily-library.scm:629
+#: midi2ly.py:84 lily-library.scm:634 lily-library.scm:643
 msgid "warning: "
 msgstr "Avertissement : "
 
-#: midi2ly.py:88 midi2ly.py:907
+#: midi2ly.py:87 midi2ly.py:907
 msgid "error: "
 msgstr "Erreur : "
 
-#: midi2ly.py:89
+#: midi2ly.py:88
 msgid "Exiting... "
 msgstr "Fin d'exécution... "
 
-#: midi2ly.py:834
+#: midi2ly.py:833
 #, python-format
 msgid "%s output to `%s'..."
 msgstr "%s reproduit dans « %s »..."
 
-#: midi2ly.py:847
+#: midi2ly.py:846
 #, python-format
 msgid "Convert %s to LilyPond input.\n"
 msgstr "Convertir %s au format source LilyPond.\n"
 
-#: midi2ly.py:852
+#: midi2ly.py:851
 msgid "print absolute pitches"
 msgstr "afficher des tons absolus"
 
-#: midi2ly.py:854 midi2ly.py:869
+#: midi2ly.py:853 midi2ly.py:868
 msgid "DUR"
 msgstr "DUR"
 
-#: midi2ly.py:855
+#: midi2ly.py:854
 msgid "quantise note durations on DUR"
 msgstr "quantifier les durées de note d'après DUR"
 
-#: midi2ly.py:858
+#: midi2ly.py:857
 msgid "print explicit durations"
 msgstr "écrire des durées explicites"
 
-#: midi2ly.py:862
+#: midi2ly.py:861
 msgid "set key: ALT=+sharps|-flats; MINOR=1"
 msgstr "définir l'armure : ALT=+dièse|-bémol; MINEUR=1"
 
-#: midi2ly.py:863
+#: midi2ly.py:862
 msgid "ALT[:MINOR]"
 msgstr "ALT[:MINEUR]"
 
-#: midi2ly.py:868
+#: midi2ly.py:867
 msgid "quantise note starts on DUR"
 msgstr "quantifier les débuts de note sur DUR"
 
-#: midi2ly.py:871
+#: midi2ly.py:870
 msgid "DUR*NUM/DEN"
 msgstr "DUR*NUM/DEN"
 
-#: midi2ly.py:874
+#: midi2ly.py:873
 msgid "allow tuplet durations DUR*NUM/DEN"
 msgstr "permettre des n-olets de durée DUR*NUM/DEN"
 
-#: midi2ly.py:886
+#: midi2ly.py:885
 msgid "treat every text as a lyric"
 msgstr "traiter chaque texte comme des paroles"
 
-#: midi2ly.py:889
+#: midi2ly.py:888
 msgid "Examples"
 msgstr "Exemples"
 
@@ -906,105 +965,133 @@ msgstr "Exemples"
 msgid "no files specified on command line."
 msgstr "aucun fichier spéficié sur la ligne de commande."
 
-#: musicxml2ly.py:213
+#: musicxml2ly.py:343
 msgid "Encountered file created by Dolet 3.4 for Sibelius, containing wrong beaming information. All beaming information in the MusicXML file will be ignored"
 msgstr ""
 "Détection d'un fichier créé par Dolet 3.4 pour Sibelius et contenant des \n"
 "informations de lien erronées. Toutes les informations de ligature du fichier \n"
 "MusicXML seront ignorées"
 
-#: musicxml2ly.py:229 musicxml2ly.py:231
+#: musicxml2ly.py:346
+msgid "Encountered file created by Noteworthy Composer's nwc2xml, containing wrong beaming information. All beaming information in the MusicXML file will be ignored"
+msgstr ""
+"Détection d'un fichier créé par Noteworthy Composer's nwc2xml et contenant des \n"
+"informations de lien erronées. Toutes les informations de ligature du fichier \n"
+"MusicXML seront ignorées"
+
+#: musicxml2ly.py:362 musicxml2ly.py:364
 #, python-format
 msgid "Unprocessed PartGroupInfo %s encountered"
 msgstr "PartGroupInfo %s détecté, mais non traité"
 
-#: musicxml2ly.py:471
+#: musicxml2ly.py:594
+#, python-format
+msgid "Encountered note at %s without type and duration (=%s)"
+msgstr "Une note se trouve en %s, sans type ni durée (=%s)"
+
+#: musicxml2ly.py:613
 #, python-format
 msgid "Encountered rational duration with denominator %s, unable to convert to lilypond duration"
 msgstr ""
 "Durée rationnelle au dénominateur de %s détectée ; \n"
 "impossible de traduire en durée LilyPond"
 
-#: musicxml2ly.py:654
+#: musicxml2ly.py:868
+msgid "Unable to extract key signature!"
+msgstr "Impossible de trouver l'armure."
+
+#: musicxml2ly.py:895
 #, python-format
-msgid "unknown mode %s, expecting 'major' or 'minor'"
-msgstr "%s : mode inconnu. Devrait être « majeur » ou « mineur »"
+msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!"
+msgstr "%s : mode inconnu. Devrait être « majeur », « mineur » ou « mode d'église »"
 
-#: musicxml2ly.py:692
+#: musicxml2ly.py:968
 #, python-format
 msgid "Encountered unprocessed marker %s\n"
 msgstr "Détection d'un marqueur non traité : %s\n"
 
-#: musicxml2ly.py:786
+#: musicxml2ly.py:1062
 #, python-format
 msgid "unknown span event %s"
 msgstr "Événement de prolongation inconnu : « %s »"
 
-#: musicxml2ly.py:796
+#: musicxml2ly.py:1072
 #, python-format
 msgid "unknown span type %s for %s"
 msgstr "%s n'est pas un type de prolongateur reconnu pour %s"
 
-#: musicxml2ly.py:1222
+#: musicxml2ly.py:1498
 msgid "Unknown metronome mark, ignoring"
 msgstr "Indication métronomique inconnue et ignorée."
 
 #. TODO: Implement the other (more complex) way for tempo marks!
-#: musicxml2ly.py:1227
+#: musicxml2ly.py:1503
 msgid "Metronome marks with complex relations (<metronome-note> in MusicXML) are not yet implemented."
 msgstr ""
 "Les indications métronomiques aux relations complexes (<metronome-note> pour \n"
 "MusicXML) n'ont pas encore été implémentées."
 
-#: musicxml2ly.py:1383
+#: musicxml2ly.py:1703
 #, python-format
 msgid "Unable to convert chord type %s to lilypond."
 msgstr "Impossible de convertir le type d'accord %s au format LilyPond"
 
-#: musicxml2ly.py:1529
+#: musicxml2ly.py:1849
 #, python-format
 msgid "drum %s type unknown, please add to instrument_drumtype_dict"
 msgstr ""
 "%s n'est pas un type de percussion connu. \n"
 "L'ajouter à instrument_drumtype_dict"
 
-#: musicxml2ly.py:1533
+#: musicxml2ly.py:1853
 msgid "cannot find suitable event"
 msgstr "Aucun événement correspondant"
 
-#: musicxml2ly.py:1623
+#: musicxml2ly.py:1994
 #, python-format
-msgid "Negative skip %s"
-msgstr "Retour en arrière de %s"
+msgid "Negative skip %s (from position %s to %s)"
+msgstr "Retour en arrière de %s (partant de %s et jusqu'à %s)"
 
-#: musicxml2ly.py:1775
+#: musicxml2ly.py:2134
 #, python-format
 msgid "Negative skip found: from %s to %s, difference is %s"
 msgstr "Retour en arrière, de %s à %s ; différence = %s"
 
-#: musicxml2ly.py:1802
+#: musicxml2ly.py:2205
 #, python-format
 msgid "unexpected %s; expected %s or %s or %s"
 msgstr "%s détecté, au lieu de %s, %s ou %s"
 
-#: musicxml2ly.py:1912
-msgid "cannot have two simultaneous slurs"
+#: musicxml2ly.py:2311
+msgid "Encountered closing slur, but no slur is open"
+msgstr "Terminaison d'une liaison qui n'a pas été débutée"
+
+#: musicxml2ly.py:2314
+msgid "Cannot have two simultaneous (closing) slurs"
+msgstr "deux liaisons ne peuvent se terminer simultanément"
+
+#: musicxml2ly.py:2324
+msgid "Cannot have a slur inside another slur"
+msgstr "des liaisons ne peuvent s'imbriquer"
+
+#: musicxml2ly.py:2327
+msgid "Cannot have two simultaneous slurs"
 msgstr "deux liaisons ne peuvent intervenir simultanément"
 
-#: musicxml2ly.py:2050
+#: musicxml2ly.py:2455
 #, python-format
 msgid "cannot simultaneously have more than one mode: %s"
 msgstr "SVP, un seul mode à la fois : %s"
 
-#: musicxml2ly.py:2148
+#: musicxml2ly.py:2553
 msgid "Converting to LilyPond expressions..."
 msgstr "Conversion en expressions LilyPond..."
 
-#: musicxml2ly.py:2159
+#: musicxml2ly.py:2564
 msgid "musicxml2ly [OPTION]... FILE.xml"
 msgstr "musicxml2ly [options]... FICHIER.xml"
 
-#: musicxml2ly.py:2161
+#: musicxml2ly.py:2566
 msgid ""
 "Convert MusicXML from FILE.xml to LilyPond input.\n"
 "If the given filename is -, musicxml2ly reads from the command line.\n"
@@ -1012,93 +1099,93 @@ msgstr ""
 "Convertit FICHIER.xml (MusicXML) au format LilyPnd.\n"
 "Si le nom du fichier est « - », musicxml2ly lira la ligne de commande.\n"
 
-#: musicxml2ly.py:2171
+#: musicxml2ly.py:2576
 msgid ""
-"Copyright (c) 2005--2008 by\n"
+"Copyright (c) 2005--2009 by\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> and\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
 msgstr ""
-"Copyright (c) 2005--2008 by\n"
+"Copyright (c) 2005--2009 by\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> and\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
 
-#: musicxml2ly.py:2196
+#: musicxml2ly.py:2601
 msgid "use lxml.etree; uses less memory and cpu time"
 msgstr ""
 "Utiliser lxml.etree pour consommer moins de mémoire \n"
 "et de temps processeur."
 
-#: musicxml2ly.py:2202
+#: musicxml2ly.py:2607
 msgid "input file is a zip-compressed MusicXML file"
 msgstr "le fichier d'entrée est un fichier MusicXML compressé"
 
-#: musicxml2ly.py:2208
+#: musicxml2ly.py:2613
 msgid "convert pitches in relative mode (default)"
 msgstr "convertir les hauteurs en mode relatif (par défaut)"
 
-#: musicxml2ly.py:2213
+#: musicxml2ly.py:2618
 msgid "convert pitches in absolute mode"
 msgstr "convertir les hauteurs en mode absolu"
 
-#: musicxml2ly.py:2216
+#: musicxml2ly.py:2621
 msgid "LANG"
 msgstr "LANG"
 
-#: musicxml2ly.py:2218
+#: musicxml2ly.py:2623
 msgid "use a different language file 'LANG.ly' and corresponding pitch names, e.g. 'deutsch' for deutsch.ly"
 msgstr ""
 "utiliser un autre fichier linguistique « lang.ly » et ses noms de notes, \n"
 "comme « deutsch » pour deutsch.ly"
 
-#: musicxml2ly.py:2224
+#: musicxml2ly.py:2629
 msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc."
 msgstr ""
 "ne pas convertir les emplacements (^, _ ou -) des articulations, \n"
 "nuances, etc."
 
-#: musicxml2ly.py:2230
+#: musicxml2ly.py:2635
 msgid "do not convert beaming information, use lilypond's automatic beaming instead"
 msgstr ""
 "ne pas convertir les informations de ligature ; \n"
 "laisser LilyPond gérer les ligatures automatiques"
 
-#: musicxml2ly.py:2238
+#: musicxml2ly.py:2643
 msgid "set output filename to FILE, stdout if -"
 msgstr "produire la sortie dans FICHIER (stdout si -)"
 
-#: musicxml2ly.py:2320
+#: musicxml2ly.py:2726
 #, python-format
 msgid "unknown part in part-list: %s"
 msgstr "la partie %s n'est pas mentionnée dans part-list"
 
-#: musicxml2ly.py:2382
+#: musicxml2ly.py:2788
 msgid "Input is compressed, extracting raw MusicXML data from stdin"
 msgstr "Le fichier d'entrée est compressé. Extraction des données MusicXML brutes"
 
-#: musicxml2ly.py:2385
+#: musicxml2ly.py:2791
 #, python-format
 msgid "Input file %s is compressed, extracting raw MusicXML data"
 msgstr ""
 "Le fichier d'entrée (%s) est compressé. \n"
 "Extraction des données MusicXML brutes"
 
-#: musicxml2ly.py:2415
+#: musicxml2ly.py:2821
 msgid "Reading MusicXML from Standard input ..."
 msgstr "Lecture du fichier MusicXML à partir de l'entrée standard..."
 
-#: musicxml2ly.py:2417
+#: musicxml2ly.py:2823
 #, python-format
 msgid "Reading MusicXML from %s ..."
 msgstr "Lecture du fichier MusicXML %s..."
 
-#: musicxml2ly.py:2450
+#: musicxml2ly.py:2856
 #, python-format
 msgid "Output to `%s'"
 msgstr "Fichier de sortie : « %s »"
 
-#: musicxml2ly.py:2512
+#: musicxml2ly.py:2922
 #, python-format
 msgid "Unable to find input file %s"
 msgstr "impossible de trouver le fichier d'entrée : « %s »"
@@ -1132,23 +1219,18 @@ msgstr "erreur de programmation : %s"
 msgid "continuing, cross fingers"
 msgstr "poursuite ; croisons les doigts."
 
-#: accidental-engraver.cc:249
+#: accidental-engraver.cc:298
 #, c-format
 msgid "accidental typesetting list must begin with context-name: %s"
 msgstr ""
 "La saisie d'une liste d'altérations accidentelles doit débuter \n"
 "par un nom de contexte : %s"
 
-#: accidental-engraver.cc:276
+#: accidental-engraver.cc:328
 #, c-format
-msgid "ignoring unknown accidental rule: %s"
-msgstr "altération accidentelle inconnue, donc ignorée : %s"
-
-#: accidental-engraver.cc:292
-#, c-format
-msgid "pair or context-name expected for accidental rule, found %s"
+msgid "procedure or context-name expected for accidental rule, found %s"
 msgstr ""
-"paire ou nom de contexte requis pour la règle d'altération accidentelle,\n"
+"procédure ou nom de contexte requis pour la règle d'altération accidentelle,\n"
 "%s trouvé"
 
 #: accidental.cc:187
@@ -1374,6 +1456,26 @@ msgstr "(de)crescendo non terminé"
 msgid "unterminated extender"
 msgstr "prolongation non terminée"
 
+#: font-config-scheme.cc:140 font-config.cc:57
+#, c-format
+msgid "failed adding font directory: %s"
+msgstr "échec lors de l'ajout d'un répertoire de fontes : « %s »"
+
+#: font-config-scheme.cc:142 font-config.cc:59
+#, c-format
+msgid "adding font directory: %s"
+msgstr "ajout d'un répertoire de fontes : « %s »"
+
+#: font-config-scheme.cc:156
+#, c-format
+msgid "failed adding font file: %s"
+msgstr "échec lors de l'ajout d'un fichier de fontes : « %s »"
+
+#: font-config-scheme.cc:158
+#, c-format
+msgid "adding font file: %s"
+msgstr "ajout d'un fichier de fontes : « %s »"
+
 #: font-config.cc:28
 msgid "Initializing FontConfig..."
 msgstr "Initialisation de FontConfig..."
@@ -1383,15 +1485,9 @@ msgstr "Initialisation de FontConfig..."
 msgid "Rebuilding FontConfig cache %s, this may take a while..."
 msgstr "Reconstitution du cache FontConfig %s. Patientez..."
 
-#: font-config.cc:57
-#, c-format
-msgid "failed adding font directory: %s"
-msgstr "échec lors de l'ajout d'un répertoire de fontes : « %s »"
-
-#: font-config.cc:59
-#, c-format
-msgid "adding font directory: %s"
-msgstr "ajout d'un répertoire de fontes : « %s »"
+#: font-config.cc:63
+msgid "Building font database."
+msgstr "Construction de la base de donnée des fontes."
 
 #: general-scheme.cc:202
 msgid "infinity or NaN encountered while converting Real number"
@@ -1401,7 +1497,7 @@ msgstr "Infini ou valeur non numérique rencontré lors de la conversion d'un no
 msgid "setting to zero"
 msgstr "initialisation à zéro"
 
-#: general-scheme.cc:422 output-ps.scm:62
+#: general-scheme.cc:422 output-ps.scm:63
 msgid "Found infinity or nan in output. Substituting 0.0"
 msgstr ""
 "La sortie contient l'infini ou une valeur non numérique. \n"
@@ -1564,16 +1660,16 @@ msgstr ""
 "la vérification du type de « %s » a échoué ; \n"
 "   la valeur « %s » doit être du type « %s »"
 
-#: lily-lexer.cc:251
+#: lily-lexer.cc:252
 msgid "include files are not allowed in safe mode"
 msgstr "l'inclusion de fichiers n'est pas permise en mode sans échec"
 
-#: lily-lexer.cc:270
+#: lily-lexer.cc:271
 #, c-format
 msgid "identifier name is a keyword: `%s'"
 msgstr "Le nom de l'identificateur est un mot clé : « %s »"
 
-#: lily-lexer.cc:285
+#: lily-lexer.cc:286
 #, c-format
 msgid "error at EOF: %s"
 msgstr "erreur à la fin du fichier (EOF) : %s"
@@ -1598,11 +1694,11 @@ msgstr "impossible de trouver le fichier d'initialisation : « %s »"
 msgid "Processing `%s'"
 msgstr "Traitement de « %s »"
 
-#: lily-parser.cc:99
+#: lily-parser.cc:95
 msgid "Parsing..."
 msgstr "Analyse..."
 
-#: lily-parser.cc:127
+#: lily-parser.cc:123
 msgid "braces do not match"
 msgstr "accolades non pairées"
 
@@ -1615,7 +1711,7 @@ msgstr "impossible de repérer la voix (Voice) « %s »"
 msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice."
 msgstr "Syllabe sans note de rattachement. Utiliser \\lyricsto ou associatedVoice."
 
-#: main.cc:100
+#: main.cc:97
 #, c-format
 msgid ""
 "This program is free software.  It is covered by the GNU General Public\n"
@@ -1628,7 +1724,7 @@ msgstr ""
 "sous certaines conditions.\n"
 "Invoquez « %s --warranty » pour plus d'informations.\n"
 
-#: main.cc:106
+#: main.cc:103
 msgid ""
 "    This program is free software; you can redistribute it and/or\n"
 "modify it under the terms of the GNU General Public License version 2\n"
@@ -1658,11 +1754,11 @@ msgstr ""
 " écrire à la Free Software Foundation, Inc., 59 Temple Place - Suite 330, \n"
 "Boston, MA 02111-1307, USA.\n"
 
-#: main.cc:137
+#: main.cc:134
 msgid "SYM[=VAL]"
 msgstr "SYM[=VAL]"
 
-#: main.cc:138
+#: main.cc:135
 msgid ""
 "set Scheme option SYM to VAL (default: #t).\n"
 "Use -dhelp for help."
@@ -1671,51 +1767,43 @@ msgstr ""
 "à l'option Scheme SYM.\n"
 "Utiliser -dhelp pour avoir de l'aide."
 
-#: main.cc:141
+#: main.cc:138
 msgid "EXPR"
 msgstr "EXPR"
 
-#: main.cc:141
+#: main.cc:138
 msgid "evaluate scheme code"
 msgstr "évaluation du code Scheme"
 
 #. Bug in option parser: --output =foe is taken as an abbreviation
 #. for --output-format.
-#: main.cc:144
+#: main.cc:141
 msgid "FORMATs"
 msgstr "FORMATs"
 
-#: main.cc:144
+#: main.cc:141
 msgid "dump FORMAT,...  Also as separate options:"
 msgstr ""
 "produire FORMAT,...\n"
 "Aussi comme options séparées :"
 
-#: main.cc:145
-msgid "generate DVI (tex backend only)"
-msgstr "générer le DVI (uniquement pour tex)"
-
-#: main.cc:146
+#: main.cc:142
 msgid "generate PDF (default)"
 msgstr "générer le PDF (par défaut)"
 
-#: main.cc:147
+#: main.cc:143
 msgid "generate PNG"
 msgstr "générer le PNG"
 
-#: main.cc:148
+#: main.cc:144
 msgid "generate PostScript"
 msgstr "générer le PostScript"
 
-#: main.cc:149
-msgid "generate TeX (tex backend only)"
-msgstr "générer le TeX (uniquement pour tex)"
-
-#: main.cc:151
+#: main.cc:146
 msgid "FIELD"
 msgstr "CHAMP"
 
-#: main.cc:151
+#: main.cc:146
 msgid ""
 "dump header field FIELD to file\n"
 "named BASENAME.FIELD"
@@ -1723,21 +1811,21 @@ msgstr ""
 "écrire le champ d'en-tête CHAMP dans le\n"
 "fichier nommé BASENAME.CHAMP"
 
-#: main.cc:153
+#: main.cc:148
 msgid "add DIR to search path"
 msgstr "ajouter RÉPERTOIRE au chemin de recherche"
 
-#: main.cc:154
+#: main.cc:149
 msgid "use FILE as init file"
 msgstr ""
 "utiliser FICHIER comme\n"
 "fichier d'initialisation"
 
-#: main.cc:156
+#: main.cc:151
 msgid "USER, GROUP, JAIL, DIR"
 msgstr "USER,GROUP,CAGE,RÉP"
 
-#: main.cc:156
+#: main.cc:151
 msgid ""
 "chroot to JAIL, become USER:GROUP\n"
 "and cd into DIR"
@@ -1745,19 +1833,19 @@ msgstr ""
 "chroot dans CAGE, devenir UTILISATEUR:GROUPE\n"
 "et cd dans RÉPERTOIRE"
 
-#: main.cc:159
+#: main.cc:154
 msgid "write output to FILE (suffix will be added)"
 msgstr ""
 "produire la sortie dans FICHIER \n"
 "(adjonction automatique du suffixe)"
 
-#: main.cc:160
+#: main.cc:155
 msgid "relocate using directory of lilypond program"
 msgstr ""
 "redétermine le chemin d'exécution\n"
 "des composants de LilyPond"
 
-#: main.cc:226
+#: main.cc:221
 #, c-format
 msgid ""
 "Copyright (c) %s by\n"
@@ -1767,88 +1855,81 @@ msgstr ""
 "%s et autres."
 
 #. No version number or newline here.  It confuses help2man.
-#: main.cc:254
+#: main.cc:249
 #, c-format
 msgid "Usage: %s [OPTION]... FILE..."
 msgstr "Utilisation : %s [OPTIONS]... FICHIER..."
 
-#: main.cc:256
+#: main.cc:251
 #, c-format
 msgid "Typeset music and/or produce MIDI from FILE."
 msgstr "Composer la musique ou jouer en format MIDI à partir du FICHIER"
 
-#: main.cc:258
+#: main.cc:253
 #, c-format
 msgid "LilyPond produces beautiful music notation."
 msgstr "LilyPond produit une jolie notation musicale"
 
-#: main.cc:260
+#: main.cc:255
 #, c-format
 msgid "For more information, see %s"
 msgstr "Pour plus d'informations, voir %s"
 
-#: main.cc:262
+#: main.cc:257
 #, c-format
 msgid "Options:"
 msgstr "Options :"
 
-#: main.cc:266
-#, c-format
-msgid "Report bugs via %s"
-msgstr ""
-"Signaler toute anomalie à \n"
-"%s"
-
-#: main.cc:312
+#: main.cc:311
 #, c-format
 msgid "expected %d arguments with jail, found: %u"
 msgstr "une cage requiert %d arguments, il y en a %u"
 
-#: main.cc:326
+#: main.cc:325
 #, c-format
 msgid "no such user: %s"
 msgstr "utilisateur inconnu : « %s »"
 
-#: main.cc:328
+#: main.cc:327
 #, c-format
 msgid "cannot get user id from user name: %s: %s"
 msgstr ""
 "impossible de repérer l'identifiant utilisateur à partir du nom d'utilisateur :\n"
 "%s : %s"
 
-#: main.cc:343
+#: main.cc:342
 #, c-format
 msgid "no such group: %s"
 msgstr "groupe inconnu : %s"
 
-#: main.cc:345
+#: main.cc:344
 #, c-format
 msgid "cannot get group id from group name: %s: %s"
 msgstr ""
 "impossible de repérer l'identifiant groupe à partir du nom de groupe :\n"
 "%s : %s "
 
-#: main.cc:353
+#: main.cc:352
 #, c-format
 msgid "cannot chroot to: %s: %s"
 msgstr "impossible de chrooter vers : %s : %s"
 
-#: main.cc:360
+#: main.cc:359
 #, c-format
 msgid "cannot change group id to: %d: %s"
 msgstr "impossible de changer l'identifiant de groupe en : %d : %s"
 
-#: main.cc:366
+#: main.cc:365
 #, c-format
 msgid "cannot change user id to: %d: %s"
 msgstr "impossible de changer l'identifiant utilisateur en : %d : %s"
 
-#: main.cc:372
+#: main.cc:371
 #, c-format
 msgid "cannot change working directory to: %s: %s"
 msgstr "impossible de changer le répertoire de travail en : %s : %s"
 
-#: main.cc:619
+#: main.cc:611
 #, c-format
 msgid "exception caught: %s"
 msgstr "exception capturée : %s"
@@ -1933,8 +2014,12 @@ msgstr "impossible d'ouvrir le fichier en écriture : %s : %s"
 msgid "cannot write to file: `%s'"
 msgstr "impossible d'écrire dans le fichier : « %s »"
 
-#: minimal-page-breaking.cc:42
-msgid "Computing page breaks..."
+#: minimal-page-breaking.cc:38 paper-score.cc:105
+msgid "Calculating line breaks..."
+msgstr "Calcul des sauts de ligne..."
+
+#: minimal-page-breaking.cc:42 layout-page-layout.scm:463
+msgid "Calculating page breaks..."
 msgstr "Calcul des sauts de page..."
 
 #: music-iterator.cc:171
@@ -1951,7 +2036,7 @@ msgstr "Échec de vérification d'octave. Aurait dû être \"%s\", \"%s\" obtenu
 msgid "transposition by %s makes alteration larger than double"
 msgstr "La transposition de %s crée des altérations supérieures aux doubles"
 
-#: new-dynamic-engraver.cc:128
+#: new-dynamic-engraver.cc:129
 #, c-format
 msgid ""
 "unknown crescendo style: %s\n"
@@ -2029,21 +2114,21 @@ msgstr "FT_Get_Glyph_Name () erreur : %s"
 msgid "Finding the ideal number of pages..."
 msgstr "Détermination du nombre optimal de pages..."
 
-#: optimal-page-breaking.cc:76
+#: optimal-page-breaking.cc:78
 msgid "Fitting music on 1 page..."
 msgstr "Répartition de la musique sur une page..."
 
-#: optimal-page-breaking.cc:78
+#: optimal-page-breaking.cc:80
 #, c-format
 msgid "Fitting music on %d pages..."
 msgstr "Répartition de la musique sur %d pages..."
 
-#: optimal-page-breaking.cc:80
+#: optimal-page-breaking.cc:82
 #, c-format
 msgid "Fitting music on %d or %d pages..."
 msgstr "Répartition de la musique sur %d ou %d pages..."
 
-#: optimal-page-breaking.cc:157 page-turn-page-breaking.cc:226
+#: optimal-page-breaking.cc:159 page-turn-page-breaking.cc:226
 #: paper-score.cc:146
 msgid "Drawing systems..."
 msgstr "Dessin des systèmes..."
@@ -2118,10 +2203,6 @@ msgstr ""
 msgid "Layout output to `%s'..."
 msgstr "Sortie mise en page vers « %s »..."
 
-#: paper-score.cc:105
-msgid "Calculating line breaks..."
-msgstr "Calcul des sauts de ligne..."
-
 #: paper-score.cc:118
 #, c-format
 msgid "Element count %d (spanners %d) "
@@ -2135,7 +2216,7 @@ msgstr "Pré-traitement des éléments graphiques..."
 msgid "GUILE signaled an error for the expression beginning here"
 msgstr "GUILE a signalé une erreur pour l'expression débutant ici"
 
-#: percent-repeat-engraver.cc:200
+#: percent-repeat-engraver.cc:202
 msgid "unterminated percent repeat"
 msgstr "répétition en pourcent non terminée"
 
@@ -2151,12 +2232,12 @@ msgstr "Bouclage du canal MIDI"
 msgid "remapping modulo 16"
 msgstr "réaffectation modulo 16"
 
-#: performance.cc:101
+#: performance.cc:100
 #, c-format
 msgid "MIDI output to `%s'..."
 msgstr "Sortie MIDI vers « %s »..."
 
-#: phrasing-slur-engraver.cc:139
+#: phrasing-slur-engraver.cc:146
 msgid "unterminated phrasing slur"
 msgstr "liaison de phrasé non terminée"
 
@@ -2323,7 +2404,7 @@ msgstr "liaison non terminée"
 msgid "cannot end slur"
 msgstr "impossible de terminer la liaison"
 
-#: slur.cc:357
+#: slur.cc:359
 #, c-format
 msgid "Ignoring grob for slur: %s. avoid-slur not set?"
 msgstr ""
@@ -2362,12 +2443,12 @@ msgstr "la source devrait spécifier des voix polyphoniques"
 msgid "weird stem size, check for narrow beams"
 msgstr "taille de hampe bizarre ; vérifier la présence de liens étroits"
 
-#: stem.cc:627
+#: stem.cc:623
 #, c-format
 msgid "flag `%s' not found"
 msgstr "crochet inconnu : « %s »"
 
-#: stem.cc:638
+#: stem.cc:639
 #, c-format
 msgid "flag stroke `%s' not found"
 msgstr "type de crochet inconnu : « %s »"
@@ -2493,40 +2574,40 @@ msgstr "a déjà une extension terminée"
 msgid "giving up"
 msgstr "abandon"
 
-#: parser.yy:729
+#: parser.yy:804
 msgid "\\paper cannot be used in \\score, use \\layout instead"
 msgstr "dans la section \\score, utiliser \\layout au lieu de \\paper"
 
-#: parser.yy:753
+#: parser.yy:828
 msgid "need \\paper for paper block"
 msgstr "\\paper est nécessaire pour définir les paramètres de la page"
 
-#: parser.yy:1224
+#: parser.yy:1299
 msgid "Grob name should be alphanumeric"
 msgstr "Un nom de Grob devrait être alphanumérique"
 
-#: parser.yy:1522
+#: parser.yy:1597
 msgid "second argument must be pitch list"
 msgstr "le second argument doit être une liste de hauteurs"
 
-#: parser.yy:1549 parser.yy:1554 parser.yy:2026
+#: parser.yy:1624 parser.yy:1629 parser.yy:2101
 msgid "have to be in Lyric mode for lyrics"
 msgstr "doit être en mode Lyric pour des paroles"
 
-#: parser.yy:1651
+#: parser.yy:1726
 msgid "expecting string as script definition"
 msgstr "chaîne requise pour définir un script"
 
-#: parser.yy:1806 parser.yy:1856
+#: parser.yy:1881 parser.yy:1931
 #, c-format
 msgid "not a duration: %d"
 msgstr "%d n'est pas une durée"
 
-#: parser.yy:1980
+#: parser.yy:2055
 msgid "have to be in Note mode for notes"
 msgstr "doit être en mode Note pour des notes"
 
-#: parser.yy:2041
+#: parser.yy:2116
 msgid "have to be in Chord mode for chords"
 msgstr "doit être en mode Chord pour des accords"
 
@@ -2586,28 +2667,28 @@ msgstr "Accolade repérée à la fin d'un \"markup\". Manquerait-il un espace ?"
 msgid "invalid character: `%c'"
 msgstr "caractère invalide : « %c »"
 
-#: lexer.ll:803 lexer.ll:804
+#: lexer.ll:803
 #, c-format
 msgid "unknown escaped string: `\\%s'"
 msgstr "chaîne d'échappement inconnue : « \\%s »"
 
-#: lexer.ll:910 lexer.ll:911
+#: lexer.ll:910
 #, c-format
 msgid "file too old: %s (oldest supported: %s)"
 msgstr ""
 "%s est plus qu'obsolète ; \n"
 "le plus ancien pouvant être supporté est : %s"
 
-#: lexer.ll:911 lexer.ll:912
+#: lexer.ll:911
 msgid "consider updating the input with the convert-ly script"
 msgstr "Envisagez la mise à jour de la source à l'aide du script convert-ly"
 
-#: lexer.ll:917 lexer.ll:918
+#: lexer.ll:917
 #, c-format
 msgid "program too old: %s (file requires: %s)"
 msgstr "Programme plus qu'obsolète : %s (le fichier requiert %s)"
 
-#: backend-library.scm:19 lily.scm:777 ps-to-png.scm:58
+#: backend-library.scm:19 lily.scm:761 ps-to-png.scm:58
 #, scheme-format
 msgid "Invoking `~a'..."
 msgstr "Appel de « ~a »..."
@@ -2617,7 +2698,7 @@ msgstr "Appel de « ~a »..."
 msgid "`~a' failed (~a)"
 msgstr "échec de « ~a » (~a)"
 
-#: backend-library.scm:116 framework-tex.scm:344 framework-tex.scm:369
+#: backend-library.scm:116
 #, scheme-format
 msgid "Converting to `~a'..."
 msgstr "Conversion à « ~a »..."
@@ -2651,16 +2732,16 @@ msgstr "la classe d'événement ~A semble être inutilisée"
 msgid "translator listens to nonexisting event class ~A"
 msgstr "le traducteur écoute la classe d'événements ~A inexistante"
 
-#: define-markup-commands.scm:599
+#: define-markup-commands.scm:569
 msgid "no systems found in \\score markup, does it have a \\layout block?"
 msgstr "pas de système trouvé dans le bloc \\score, contient-il un bloc \\layout ?"
 
-#: define-markup-commands.scm:2428
+#: define-markup-commands.scm:2387
 #, scheme-format
 msgid "Cannot find glyph ~a"
 msgstr "impossible de trouver le glyphe ~a"
 
-#: define-markup-commands.scm:2737
+#: define-markup-commands.scm:2696
 #, scheme-format
 msgid "not a valid duration string: ~a"
 msgstr "chaîne de durée invalide : ~a"
@@ -2681,8 +2762,8 @@ msgid "unknown repeat type `~S'"
 msgstr "type de répétition inconnu : « ~S »"
 
 #: define-music-types.scm:693
-msgid "See music-types.scm for supported repeats"
-msgstr "Consulter music-types.scm pour connaître les types de répétitions reconnus"
+msgid "See define-music-types.scm for supported repeats"
+msgstr "Consulter define-music-types.scm pour connaître les répétitions prises en charge"
 
 #: document-backend.scm:99
 #, scheme-format
@@ -2699,57 +2780,57 @@ msgstr "impossible de trouver l'interface pour la propriété ~S"
 msgid "unknown Grob interface: ~S"
 msgstr "interface d'objet graphique (Grob) inconnue : ~S"
 
-#: documentation-lib.scm:48
+#: documentation-lib.scm:49
 #, scheme-format
 msgid "Processing ~S..."
 msgstr "Traitement de ~S..."
 
-#: documentation-lib.scm:164
+#: documentation-lib.scm:165
 #, scheme-format
 msgid "Writing ~S..."
 msgstr "Écriture de ~S..."
 
-#: documentation-lib.scm:186
+#: documentation-lib.scm:187
 #, scheme-format
 msgid "cannot find description for property ~S (~S)"
 msgstr "impossible de trouver une description de la propriété ~S (~S)"
 
+#: flag-styles.scm:145
+#, scheme-format
+msgid "flag stroke `~a' or `~a' not found"
+msgstr "type de crochet inconnu : « ~a » ou « ~a »"
+
 #: framework-eps.scm:90
 #, scheme-format
 msgid "Writing ~a..."
 msgstr "Écriture de ~a..."
 
-#: framework-ps.scm:282
+#: framework-ps.scm:277
 #, scheme-format
 msgid "cannot embed ~S=~S"
 msgstr "intégration impossible : ~S=~S"
 
-#: framework-ps.scm:335
+#: framework-ps.scm:330
 #, scheme-format
 msgid "cannot extract file matching ~a from ~a"
 msgstr "impossible d'extraire le fichier ~a à partir de ~a"
 
-#: framework-ps.scm:352
+#: framework-ps.scm:347
 #, scheme-format
 msgid "do not know how to embed ~S=~S"
 msgstr "imposible de réaliser l'intégration ~S=~S"
 
-#: framework-ps.scm:383
+#: framework-ps.scm:378
 #, scheme-format
 msgid "do not know how to embed font ~s ~s ~s"
 msgstr "impossible d'intégrer les fontes ~s ~s ~s"
 
-#: framework-ps.scm:753
+#: framework-ps.scm:748
 #, scheme-format
 msgid "cannot convert <stdout> to ~S"
 msgstr "impossible de convertir <stdout> en ~S"
 
-#: framework-ps.scm:772 framework-ps.scm:775
-#, scheme-format
-msgid "cannot generate ~S using the postscript back-end"
-msgstr "impossible de générer ~S à l'aide du support postscript"
-
-#: framework-ps.scm:782
+#: framework-ps.scm:771
 msgid ""
 "\n"
 "The PostScript backend does not support the system-by-system \n"
@@ -2778,11 +2859,6 @@ msgstr ""
 "  %% ****************************************************************\n"
 "\n"
 
-#: framework-tex.scm:361
-#, scheme-format
-msgid "TeX file name must not contain whitespace: `~a'"
-msgstr "un nom de fichier TeX ne peut contenir d'espace : « ~a »"
-
 #: graphviz.scm:53
 #, scheme-format
 msgid "Writing graph `~a'..."
@@ -2798,46 +2874,42 @@ msgstr "Erreur de définition du lien : attendait (~S,~S), ~S trouvé."
 msgid "Error in beam quanting.  Expected ~S 0, found ~S."
 msgstr "Erreur de définition du lien : attendait ~S 0, repéré ~S."
 
-#: layout-page-layout.scm:124
+#: layout-page-layout.scm:126
 msgid "Can't fit systems on page -- ignoring between-system-padding"
 msgstr "Les système ne tiennent pas sur la page ; between-system-padding ignoré"
 
-#: layout-page-layout.scm:458
-msgid "Calculating page breaks..."
-msgstr "Calcul des sauts de page..."
-
-#: lily-library.scm:588
+#: lily-library.scm:602
 #, scheme-format
 msgid "unknown unit: ~S"
 msgstr "unité inconnue : ~S"
 
-#: lily-library.scm:622
+#: lily-library.scm:636
 #, scheme-format
 msgid "no \\version statement found, please add~afor future compatibility"
 msgstr ""
 "déclaration de \\version absente ;\n"
 "ajoutez ~a pour une compatibilité future"
 
-#: lily-library.scm:630
+#: lily-library.scm:644
 msgid "old relative compatibility not used"
 msgstr "compatibilité avec l'ancien mode relatif non utilisée"
 
-#: lily.scm:178
+#: lily.scm:179
 #, scheme-format
 msgid "cannot find: ~A"
 msgstr "impossible de trouver ~A"
 
-#: lily.scm:243
+#: lily.scm:228
 #, scheme-format
 msgid "wrong type for argument ~a.  Expecting ~a, found ~s"
 msgstr "type d'argument erroné pour ~a. Attendait ~a, ~s trouvé"
 
-#: lily.scm:641
+#: lily.scm:625
 #, scheme-format
 msgid "job ~a terminated with signal: ~a"
 msgstr "le travail ~a s'est terminé avec le signal ~a"
 
-#: lily.scm:644
+#: lily.scm:628
 #, scheme-format
 msgid ""
 "logfile ~a (exit ~a):\n"
@@ -2846,12 +2918,12 @@ msgstr ""
 "fichier journal ~a (sortie ~a) :\n"
 "~a"
 
-#: lily.scm:669 lily.scm:767
+#: lily.scm:653 lily.scm:751
 #, scheme-format
 msgid "failed files: ~S"
 msgstr "erreur sur les fichiers : ~S"
 
-#: lily.scm:757
+#: lily.scm:741
 #, scheme-format
 msgid "Redirecting output to ~a..."
 msgstr "Redirection de la sortie vers ~a..."
@@ -2860,7 +2932,7 @@ msgstr "Redirection de la sortie vers ~a..."
 msgid "Music head function must return Music object"
 msgstr "Une fonction musicale primitive devrait renvoyer un objet Music"
 
-#: ly-syntax-constructors.scm:150
+#: ly-syntax-constructors.scm:154
 #, scheme-format
 msgid "Invalid property operation ~a"
 msgstr "Opération de propriété invalide : ~a"
@@ -2914,12 +2986,12 @@ msgstr ""
 msgid "cannot find quoted music: `~S'"
 msgstr "impossible de trouver la citation de musique « ~S »"
 
-#: music-functions.scm:990
+#: music-functions.scm:1198
 #, scheme-format
 msgid "unknown accidental style: ~S"
 msgstr "style d'altération inconnu : ~S"
 
-#: output-ps.scm:285
+#: output-ps.scm:294
 msgid "utf-8-string encountered in PS backend"
 msgstr "le support PS a rencontré une chaîne utf8"
 
@@ -2933,28 +3005,23 @@ msgstr "~S indéfini(e)"
 msgid "cannot decypher Pango description: ~a"
 msgstr "la description de Pango ne peut être déchiffrée : ~a"
 
-#: output-tex.scm:96
-#, scheme-format
-msgid "cannot find ~a in ~a"
-msgstr "impossible de trouver ~a dans ~a"
-
-#: paper.scm:86
+#: paper.scm:104
 msgid "set-global-staff-size: not in toplevel scope"
 msgstr "set-global-staff-size n'est pas à un niveau de portée globale"
 
-#: paper.scm:226
+#: paper.scm:244
 #, scheme-format
 msgid "This is not a \\layout {} object, ~S"
 msgstr "~S n'est pas un objet de \\layout {}"
 
-#: paper.scm:238
+#: paper.scm:256
 #, scheme-format
-msgid "Unknown papersize: ~a"
+msgid "Unknown paper size: ~a"
 msgstr "Taille de papier inconnue : ~a"
 
 #. TODO: should raise (generic) exception with throw, and catch
 #. that in parse-scm.cc
-#: paper.scm:253
+#: paper.scm:271
 msgid "Must use #(set-paper-size .. ) within \\paper { ... }"
 msgstr "#(set-paper-size ..) doit être dans la section \\paper { ... }"
 
@@ -2977,3 +3044,33 @@ msgstr "~a s'est terminé avec le statut ~S"
 #, scheme-format
 msgid "assertion failed: ~S"
 msgstr "erreur d'assertion : ~S"
+
+#~ msgid "requested time signature, but time sig is unknown"
+#~ msgstr "Une métrique est obligatoire, mais la définition trouvée est inconnue"
+
+#~ msgid "Report bugs via"
+#~ msgstr "Rapporter toute anomalie à"
+
+#~ msgid "Negative skip %s"
+#~ msgstr "Retour en arrière de %s"
+
+#~ msgid "ignoring unknown accidental rule: %s"
+#~ msgstr "altération accidentelle inconnue, donc ignorée : %s"
+
+#~ msgid "generate DVI (tex backend only)"
+#~ msgstr "générer le DVI (uniquement pour tex)"
+
+#~ msgid "generate TeX (tex backend only)"
+#~ msgstr "générer le TeX (uniquement pour tex)"
+
+#~ msgid "Computing page breaks..."
+#~ msgstr "Calcul des sauts de page..."
+
+#~ msgid "cannot generate ~S using the postscript back-end"
+#~ msgstr "impossible de générer ~S à l'aide du support postscript"
+
+#~ msgid "TeX file name must not contain whitespace: `~a'"
+#~ msgstr "un nom de fichier TeX ne peut contenir d'espace : « ~a »"
+
+#~ msgid "cannot find ~a in ~a"
+#~ msgstr "impossible de trouver ~a dans ~a"
index 8a6be7ffcd0c74c0e538add08961a53201bc0ded..3ab8e15a72bd149df6d411703b49b3b27596e20c 100644 (file)
@@ -1,5 +1,5 @@
 # Translation of LilyPond.
-# Copyright (C) 2008 Han-Wen Nienhuys, Jan Nieuwenhuizen
+# Copyright (C) 2008--2009 Han-Wen Nienhuys, Jan Nieuwenhuizen
 # This file is distributed under the same license as lilypond package.
 #
 msgid ""
@@ -1038,7 +1038,7 @@ msgstr ""
 
 #: musicxml2ly.py:2576
 msgid ""
-"Copyright (c) 2005--2008 by\n"
+"Copyright (c) 2005--2009 by\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> and\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
index 2f0cbc43c6e274c160823368d392e79af93208ae..4640fa8528bda9885672789f585958c16844343c 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -1,6 +1,6 @@
 # Ukrainian translations for lilypond package
 # Переклад українською для пакету lilypond.
-# Copyright (C) 2007--2008 THE PACKAGE'S COPYRIGHT HOLDER
+# Copyright (C) 2007--2009 THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # Youri Bulka <jblk@icmail.net>, 2007.
 #
index b2dd24cf717c8a20e45ddc86a06f9fc2188e0e72..aa97f34456e8f51bb56ed0a0450c624c8e11b8c8 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -993,7 +993,7 @@ msgstr ""
 
 #: musicxml2ly.py:2171
 msgid ""
-"Copyright (c) 2005--2008 by\n"
+"Copyright (c) 2005--2009 by\n"
 "    Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
 "    Jan Nieuwenhuizen <janneke@gnu.org> and\n"
 "    Reinhold Kainhofer <reinhold@kainhofer.com>\n"
diff --git a/ps/SConscript b/ps/SConscript
deleted file mode 100644 (file)
index 917e9f9..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-# -*-python-*-
-
-Import ('env')
-
-dir = env['DESTDIR'] + env['sharedir_package_version'] + '/ps'
-env.Install (dir, ['lilyponddefs.ps',])
-env.Alias ('install', dir)
-
-dir = env['DESTDIR'] + env['sharedir_package_version'] + '/tex'
-env.Install (dir, ['music-drawing-routines.ps',])
-env.Alias ('install', dir)
index a520a5efd6504e16a20d2078a93b24085bc1f86e..14060aed61dc35bbf482c003fbfbb06b527e54dc 100644 (file)
@@ -1,5 +1,7 @@
 depth = ..
 
+SUBDIRS=auxiliar
+
 STEPMAKE_TEMPLATES=c python-module install-out po
 
 include $(depth)/make/stepmake.make
diff --git a/python/SConscript b/python/SConscript
deleted file mode 100644 (file)
index 52c4e1d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-py = src_glob ('*.py')
-c = src_glob ('*.c')
-
-cm = map (env.SharedObject, c)
-
-py
-cm
-
-install (py, env['sharedir_package_version'] + '/python')
-install (cm, env['libdir_package_version'] + '/python')
diff --git a/python/auxiliar/GNUmakefile b/python/auxiliar/GNUmakefile
new file mode 100644 (file)
index 0000000..665812d
--- /dev/null
@@ -0,0 +1,10 @@
+depth=../..
+
+EXTRA_DIST_FILES = $(call src-wildcard,*.py)
+
+include $(depth)/make/stepmake.make
+
+default:
+
+local-clean:
+       rm -f *.pyc
diff --git a/python/auxiliar/buildlib.py b/python/auxiliar/buildlib.py
new file mode 100644 (file)
index 0000000..cd99586
--- /dev/null
@@ -0,0 +1,42 @@
+#!@PYTHON@
+
+import subprocess
+import re
+import sys
+
+verbose = False
+
+def read_pipe (command):
+    child = subprocess.Popen (command,
+                              stdout = subprocess.PIPE,
+                              stderr = subprocess.PIPE,
+                              shell = True)
+    (output, error) = child.communicate ()
+    code = str (child.wait ())
+    if not child.stdout or child.stdout.close ():
+        print "pipe failed: %(command)s" % locals ()
+    if code != '0':
+        error = code + ' ' + error
+    return (output, error)
+
+revision_re = re.compile ('GIT [Cc]ommittish:\s+([a-f0-9]+)')
+vc_diff_cmd = 'git diff %(color_flag)s %(revision)s HEAD -- %(original)s | cat'
+
+def check_translated_doc (original, translated_file, translated_contents, color=False):
+    m = revision_re.search (translated_contents)
+    if not m:
+        sys.stderr.write ('error: ' + translated_file + \
+                          ": no 'GIT committish: <hash>' found.\nPlease check " + \
+                          'the whole file against the original in English, then ' + \
+                          'fill in HEAD committish in the header.\n')
+        sys.exit (1)
+    revision = m.group (1)
+
+    if color:
+        color_flag = '--color'
+    else:
+        color_flag = '--no-color'
+    c = vc_diff_cmd % vars ()
+    if verbose:
+        sys.stderr.write ('running: ' + c)
+    return read_pipe (c)
diff --git a/python/auxiliar/manuals_definitions.py b/python/auxiliar/manuals_definitions.py
new file mode 100644 (file)
index 0000000..e8e6d50
--- /dev/null
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+
+# This module is imported by check_texi_refs.py
+
+references_dict = {
+    'lilypond': 'ruser',
+    'lilypond-learning': 'rlearning',
+    'lilypond-program': 'rprogram',
+    'lilypond-snippets': 'rlsr',
+    'music-glossary': 'rglos',
+    'lilypond-internals': 'rinternals' }
diff --git a/python/auxiliar/mirrortree.py b/python/auxiliar/mirrortree.py
new file mode 100644 (file)
index 0000000..0aa0bc8
--- /dev/null
@@ -0,0 +1,62 @@
+#!@PYTHON@
+
+import re
+import os
+
+def new_link_path (link, dir, r):
+    l = link.split ('/')
+    d = dir.split ('/')
+    i = 0
+    while i < len(d) and i < len(l) and l[i] == '..':
+        if r.match (d[i]):
+            del l[i]
+        else:
+            i += 1
+    return '/'.join ([x for x in l if not r.match (x)])
+
+def walk_tree (tree_roots = [],
+               process_dirs = '.*',
+               exclude_dirs = '',
+               find_files = '.*',
+               exclude_files = ''):
+    """Walk directory trees and.returns (dirs, symlinks, files, extra_files) tuple.
+
+    Arguments:
+     tree_roots=DIRLIST      use DIRLIST as tree roots list
+     process_dir=PATTERN      only process files in directories named PATTERN
+     exclude_dir=PATTERN      don't recurse into directories named PATTERN
+     find_files=PATTERN    filters files which are hardlinked
+     exclude_files=PATTERN    exclude files named PATTERN
+    """
+    find_files_re = re.compile (find_files)
+    exclude_dirs_re = re.compile (exclude_dirs)
+    exclude_files_re = re.compile (exclude_files)
+    process_dirs_re = re.compile (process_dirs)
+
+    dirs_paths = []
+    symlinks_paths = []
+    files_paths = []
+
+    for d in tree_roots:
+        for current_dir, dirs, files in os.walk(d):
+            i = 0
+            while i < len(dirs):
+                if exclude_dirs_re.search (os.path.join (current_dir, dirs[i])):
+                    del dirs[i]
+                else:
+                    p = os.path.join (current_dir, dirs[i])
+                    if os.path.islink (p):
+                        symlinks_paths.append (p)
+                    i += 1
+            if not process_dirs_re.search (current_dir):
+                continue
+            dirs_paths.append (current_dir)
+            for f in files:
+                if exclude_files_re.match (f):
+                    continue
+                p = os.path.join (current_dir, f)
+                if os.path.islink (p):
+                    symlinks_paths.append (p)
+                elif find_files_re.match (f):
+                    files_paths.append (p)
+    return (dirs_paths, symlinks_paths, files_paths)
diff --git a/python/auxiliar/postprocess_html.py b/python/auxiliar/postprocess_html.py
new file mode 100644 (file)
index 0000000..e94da79
--- /dev/null
@@ -0,0 +1,361 @@
+#!@PYTHON@
+
+"""
+Postprocess HTML files:
+add footer, tweak links, add language selection menu.
+"""
+import re
+import os
+import time
+import operator
+
+import langdefs
+
+# This is to try to make the docball not too big with almost duplicate files
+# see process_links()
+non_copied_pages = ['Documentation/user/out-www/lilypond-big-page',
+                    'Documentation/user/out-www/lilypond-internals-big-page',
+                    'Documentation/user/out-www/lilypond-learning-big-page',
+                    'Documentation/user/out-www/lilypond-program-big-page',
+                    'Documentation/user/out-www/music-glossary-big-page',
+                    'out-www/examples',
+                    'Documentation/topdocs',
+                    'Documentation/bibliography',
+                    'Documentation/out-www/THANKS',
+                    'Documentation/out-www/DEDICATION',
+                    'Documentation/out-www/devel',
+                    'input/']
+
+def _doc (s):
+    return s
+
+header = r"""
+"""
+
+footer = '''
+<div class="footer">
+<p class="footer_version">
+%(footer_name_version)s
+</p>
+<p class="footer_report">
+%(footer_report_links)s
+</p>
+</div>
+'''
+footer_name_version = _doc ('This page is for %(package_name)s-%(package_version)s (%(branch_str)s).')
+# ugh, must not have "_doc" in strings because it is naively replaced with "_" in hacked gettext process
+footer_report_links = _doc ('Your <a href="%(suggest_Docs_url)s">suggestions for the documentation</a> are welcome, please report errors to our <a href="%(mail_address_url)s">bug list</a>.')
+
+
+mail_address = 'http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs'
+suggest_Docs_url = 'http://lilypond.org/web/devel/participating/documentation-adding'
+
+header_tag = '<!-- header_tag -->'
+header_tag_re = re.compile (header_tag)
+
+footer_tag = '<!-- footer_tag -->'
+footer_tag_re = re.compile (footer_tag)
+
+lang_available = _doc ("Other languages: %s.")
+browser_lang = _doc ('About <A HREF="%s">automatic language selection</A>.')
+browser_language_url = "/web/about/browser-language"
+
+LANGUAGES_TEMPLATE = '''
+<p id="languages">
+ %(language_available)s
+ <br/>
+ %(browser_language)s
+</p>
+'''
+
+
+html_re = re.compile ('(.*?)(?:[.]([^/.]*))?[.]html$')
+pages_dict = {}
+
+def build_pages_dict (filelist):
+    """Build dictionary of available translations of each page"""
+    global pages_dict
+    for f in filelist:
+        m = html_re.match (f)
+        if m:
+            g = m.groups()
+            if len (g) <= 1 or g[1] == None:
+                e = ''
+            else:
+                e = g[1]
+            if not g[0] in pages_dict:
+                pages_dict[g[0]] = [e]
+            else:
+                pages_dict[g[0]].append (e)
+
+def source_links_replace (m, source_val):
+    return 'href="' + os.path.join (source_val, m.group (1)) + '"'
+
+splitted_docs_re = re.compile ('(input/lsr/out-www/lilypond-snippets|\
+Documentation/user/out-www/(lilypond|music-glossary|lilypond-program|\
+lilypond-learning))/')
+
+snippets_ref_re = re.compile (r'href="(\.\./)?lilypond-snippets')
+user_ref_re = re.compile ('href="(?:\.\./)?lilypond\
+(-internals|-learning|-program|(?!-snippets))')
+
+docindex_link_re = re.compile (r'href="index.html"')
+
+
+## Windows does not support symlinks.
+# This function avoids creating symlinks for splitted HTML manuals
+# Get rid of symlinks in GNUmakefile.in (local-WWW-post)
+# this also fixes missing PNGs only present in translated docs
+def hack_urls (s, prefix):
+    if splitted_docs_re.match (prefix):
+        s = re.sub ('(href|src)="(../lily-.*?|.*?[.]png)"', '\\1="../\\2"', s)
+
+    # fix xrefs between documents in different directories ad hoc
+    if 'user/out-www/lilypond' in prefix:
+        s = snippets_ref_re.sub ('href="source/input/lsr/lilypond-snippets', s)
+    elif 'input/lsr' in prefix:
+        s = user_ref_re.sub ('href="source/Documentation/user/lilypond\\1', s)
+    
+    # we also need to replace in the lsr, which is already processed above!
+    if 'input/' in prefix or 'Documentation/topdocs' in prefix:
+        # fix the link from the regtest, lsr and topdoc pages to the doc index 
+        # (rewrite prefix to obtain the relative path of the doc index page)
+        rel_link = re.sub (r'out-www/.*$', '', prefix)
+        rel_link = re.sub (r'[^/]*/', '../', rel_link)
+        if 'input/regression' in prefix:
+            indexfile = "Documentation/devel"
+        else:
+            indexfile = "index"
+        s = docindex_link_re.sub ('href="' + rel_link + indexfile + '.html\"', s)
+
+    source_path = os.path.join (os.path.dirname (prefix), 'source')
+    if not os.path.islink (source_path):
+        return s
+    source_val = os.readlink (source_path)
+    return re.sub ('href="source/(.*?)"', lambda m: source_links_replace (m, source_val), s)
+
+body_tag_re = re.compile ('(?i)<body([^>]*)>')
+html_tag_re = re.compile ('(?i)<html>')
+doctype_re = re.compile ('(?i)<!DOCTYPE')
+doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n'
+css_re = re.compile ('(?i)<link rel="stylesheet" type="text/css" ([^>]*)href="[^">]*?lilypond.*\.css"([^>]*)>')
+end_head_tag_re = re.compile ('(?i)</head>')
+css_link = """    <link rel="stylesheet" type="text/css" title="Patrick McCarty's design" href="%(rel)sDocumentation/lilypond-mccarty.css">
+    <link rel="alternate stylesheet" type="text/css" href="%(rel)sDocumentation/lilypond.css" title="Andrew Hawryluk's design">
+    <link rel="alternate stylesheet" type="text/css" href="%(rel)sDocumentation/lilypond-blue.css" title="Kurt Kroon's blue design">
+    <!--[if lte IE 7]>
+    <link href="%(rel)sDocumentation/lilypond-ie-fixes.css" rel="stylesheet" type="text/css">
+    <![endif]-->
+"""
+
+
+def add_header (s, prefix):
+    """Add header (<body>, doctype and CSS)"""
+    if header_tag_re.search (s) == None:
+        body = '<body\\1>'
+        (s, n) = body_tag_re.subn (body + header, s, 1)
+        if not n:
+            (s, n) = html_tag_re.subn ('<html>' + header, s, 1)
+            if not n:
+                s = header + s
+
+        s = header_tag + '\n' + s
+
+        if doctype_re.search (s) == None:
+            s = doctype + s
+
+        if css_re.search (s) == None:
+            depth = (prefix.count ('/') - 1) * '../'
+            s = end_head_tag_re.sub ((css_link % {'rel': depth}) + '</head>', s)
+    return s
+
+title_tag_re = re.compile ('.*?<title>(.*?)</title>', re.DOTALL)
+AT_web_title_re = re.compile ('@WEB-TITLE@')
+
+def add_title (s):
+    # urg
+    # maybe find first node?
+    fallback_web_title = '-- --'
+    m = title_tag_re.match (s)
+    if m:
+        fallback_web_title = m.group (1)
+    s = AT_web_title_re.sub (fallback_web_title, s)
+    return s
+
+footer_insert_re = re.compile ('<!--\s*FOOTER\s*-->')
+end_body_re = re.compile ('(?i)</body>')
+end_html_re = re.compile ('(?i)</html>')
+
+def add_footer (s, footer_text):
+    """add footer"""
+    (s, n) = footer_insert_re.subn (footer_text + '\n' + '<!-- FOOTER -->', s, 1)
+    if not n:
+        (s, n) = end_body_re.subn (footer_text + '\n' + '</body>', s, 1)
+    if not n:
+        (s, n) = end_html_re.subn (footer_text + '\n' + '</html>', s, 1)
+    if not n:
+        s += footer_text + '\n'
+    return s
+
+def find_translations (prefix, lang_ext):
+    """find available translations of a page"""
+    available = []
+    missing = []
+    for l in langdefs.LANGUAGES:
+        e = l.webext
+        if lang_ext != e:
+            if e in pages_dict[prefix]:
+                available.append (l)
+            elif lang_ext == '' and l.enabled and reduce (operator.and_,
+                                                          [not prefix.startswith (s)
+                                                           for s in non_copied_pages]):
+                # English version of missing translated pages will be written
+                missing.append (e)
+    return available, missing
+
+online_links_re = re.compile ('''(href|src)=['"]\
+((?!Compiling-from-source.html")[^/][.]*[^.:'"]*)\
+([.]html)(#[^"']*|)['"]''')
+offline_links_re = re.compile ('href=[\'"]\
+((?!Compiling-from-source.html")[^/][.]*[^.:\'"]*)([.]html)(#[^"\']*|)[\'"]')
+big_page_name_re = re.compile ('''(.+?)-big-page''')
+
+def process_i18n_big_page_links (match, prefix, lang_ext):
+    big_page_name = big_page_name_re.match (match.group (1))
+    if big_page_name:
+        destination_path = os.path.normpath (os.path.join (os.path.dirname (prefix),
+                                                           big_page_name.group (0)))
+        if not lang_ext in pages_dict[destination_path]:
+            return match.group (0)
+    return 'href="' + match.group (1) + '.' + lang_ext \
+        + match.group (2) + match.group (3) + '"'
+
+def process_links (s, prefix, lang_ext, file_name, missing, target):
+    page_flavors = {}
+    if target == 'online':
+        # Strip .html, suffix for auto language selection (content
+        # negotiation).  The menu must keep the full extension, so do
+        # this before adding the menu.
+        page_flavors[file_name] = \
+            [lang_ext, online_links_re.sub ('\\1="\\2\\4"', s)]
+    elif target == 'offline':
+        # in LANG doc index: don't rewrite .html suffixes
+        # as not all .LANG.html pages exist;
+        # the doc index should be translated and contain links with the right suffixes
+        if prefix == 'Documentation/out-www/index':
+            page_flavors[file_name] = [lang_ext, s]
+        elif lang_ext == '':
+            page_flavors[file_name] = [lang_ext, s]
+            for e in missing:
+                page_flavors[langdefs.lang_file_name (prefix, e, '.html')] = \
+                    [e, offline_links_re.sub ('href="\\1.' + e + '\\2\\3"', s)]
+        else:
+            # For saving bandwidth and disk space, we don't duplicate big pages
+            # in English, so we must process translated big pages links differently.
+            if 'big-page' in prefix:
+                page_flavors[file_name] = \
+                    [lang_ext,
+                     offline_links_re.sub \
+                         (lambda match: process_i18n_big_page_links (match, prefix, lang_ext),
+                          s)]
+            else:
+                page_flavors[file_name] = \
+                    [lang_ext,
+                     offline_links_re.sub ('href="\\1.' + lang_ext + '\\2\\3"', s)]
+    return page_flavors
+
+def add_menu (page_flavors, prefix, available, target, translation):
+    for k in page_flavors:
+        language_menu = ''
+        languages = ''
+        if page_flavors[k][0] != '':
+            t = translation[page_flavors[k][0]]
+        else:
+            t = _doc
+        for lang in available:
+            lang_file = lang.file_name (os.path.basename (prefix), '.html')
+            if language_menu != '':
+                language_menu += ', '
+            language_menu += '<a href="%s">%s</a>' % (lang_file, t (lang.name))
+        if target == 'offline':
+            browser_language = ''
+        elif target == 'online':
+            browser_language = t (browser_lang) % browser_language_url
+        if language_menu:
+            language_available = t (lang_available) % language_menu
+            languages = LANGUAGES_TEMPLATE % vars ()
+        page_flavors[k][1] = add_footer (page_flavors[k][1], languages)
+    return page_flavors
+
+
+def process_html_files (package_name = '',
+                        package_version = '',
+                        target = 'offline',
+                        name_filter = lambda s: s):
+    """Add header, footer and tweak links to a number of HTML files
+
+    Arguments:
+     package_name=NAME         set package_name to NAME
+     package_version=VERSION   set package version to VERSION
+     targets=offline|online    set page processing depending on the target
+          offline is for reading HTML pages locally
+          online is for hosting the HTML pages on a website with content
+            negotiation
+     name_filter               a HTML file name filter
+    """
+    translation = langdefs.translation
+    localtime = time.strftime ('%c %Z', time.localtime (time.time ()))
+
+    if "http://" in mail_address:
+        mail_address_url = mail_address
+    else:
+        mail_address_url= 'mailto:' + mail_address
+
+    versiontup = package_version.split ('.')
+    branch_str = _doc ('stable-branch')
+    if int (versiontup[1]) %  2:
+        branch_str = _doc ('development-branch')
+
+    # Initialize dictionaries for string formatting
+    subst = {}
+    subst[''] = dict ([i for i in globals ().items() if type (i[1]) is str])
+    subst[''].update (dict ([i for i in locals ().items() if type (i[1]) is str]))
+    for l in translation:
+        e = langdefs.LANGDICT[l].webext
+        if e:
+            subst[e] = {}
+            for name in subst['']:
+                subst[e][name] = translation[l] (subst[''][name])
+    # Do deeper string formatting as early as possible,
+    # so only one '%' formatting pass is needed later
+    for e in subst:
+        subst[e]['footer_name_version'] = subst[e]['footer_name_version'] % subst[e]
+        subst[e]['footer_report_links'] = subst[e]['footer_report_links'] % subst[e]
+
+    for prefix, ext_list in pages_dict.items ():
+        for lang_ext in ext_list:
+            file_name = langdefs.lang_file_name (prefix, lang_ext, '.html')
+            in_f = open (file_name)
+            s = in_f.read()
+            in_f.close()
+
+            s = s.replace ('%', '%%')
+            s = hack_urls (s, prefix)
+            s = add_header (s, prefix)
+
+            ### add footer
+            if footer_tag_re.search (s) == None:
+                s = add_footer (s, footer_tag + footer)
+
+                available, missing = find_translations (prefix, lang_ext)
+                page_flavors = process_links (s, prefix, lang_ext, file_name, missing, target)
+                # Add menu after stripping: must not have autoselection for language menu.
+                page_flavors = add_menu (page_flavors, prefix, available, target, translation)
+            for k in page_flavors:
+                page_flavors[k][1] = page_flavors[k][1] % subst[page_flavors[k][0]]
+                out_f = open (name_filter (k), 'w')
+                out_f.write (page_flavors[k][1])
+                out_f.close()
+        # if the page is translated, a .en.html symlink is necessary for content negotiation
+        if target == 'online' and ext_list != ['']:
+            os.symlink (os.path.basename (prefix) + '.html', name_filter (prefix + '.en.html'))
index 8aa8d295534bd9294628dbdb4a2cfdab2eb40ebf..ad2c0cdd96500bb361b89f155717df6b8d8c468f 100644 (file)
@@ -374,7 +374,7 @@ def conv (str):
     return str
 
 
-# TODO: lots of other syntax change should be done here as well
+# TODO: lots of other syntax changes should be done here as well
 @rule ((1, 3, 92), 'basicXXXProperties -> XXX, Repeat_engraver -> Volta_engraver')
 def conv (str):
     str = re.sub ('basicCollisionProperties', 'NoteCollision', str)
@@ -418,7 +418,7 @@ def conv (str):
     str = re.sub ('\\\\voicefour', '\\\\voiceFour', str)
 
     # I don't know exactly when these happened...
-    # ugh, we loose context setting here...
+    # ugh, we lose context setting here...
     str = re.sub ('\\\\property *[^ ]*verticalDirection[^=]*= *#?"?(1|(\\\\up))"?', '\\\\stemUp\\\\slurUp\\\\tieUp', str)
     str = re.sub ('\\\\property *[^ ]*verticalDirection[^=]*= *#?"?((-1)|(\\\\down))"?', '\\\\stemDown\\\\slurDown\\\\tieDown', str)
     str = re.sub ('\\\\property *[^ ]*verticalDirection[^=]*= *#?"?(0|(\\\\center))"?', '\\\\stemBoth\\\\slurBoth\\\\tieBoth', str)
@@ -431,7 +431,7 @@ def conv (str):
     str = re.sub ('\\\\property *[^ .]*[.]?([a-z]+)VerticalDirection[^=]*= *#?"?((-1)|(\\\\down))"?', '\\\\\\1Down', str)
     str = re.sub ('\\\\property *[^ .]*[.]?([a-z]+)VerticalDirection[^=]*= *#?"?(0|(\\\\center))"?', '\\\\\\1Both', str)
 
-    # (lacks capitalisation slur -> Slur)
+    # (lacks capitalization slur -> Slur)
     str = re.sub ('([a-z]+)VerticalDirection[^=]*= *#?"?(1|(\\\\up))"?', '\\1 \\\\override #\'direction = #1', str)
     str = re.sub ('([a-z]+)VerticalDirection[^=]*= *#?"?((-1)|(\\\\down))"?', '\\1 \\override #\'direction = #-1', str)
     str = re.sub ('([a-z]+)VerticalDirection[^=]*= *#?"?(0|(\\\\center))"?', '\\1 \\\\override #\'direction = #0', str)
@@ -2650,7 +2650,7 @@ def conv (str):
     return str
 
 
-@rule ((2, 11, 15), "#'edge-height -> #'bound-details #'right/left #'text = ...")
+@rule ((2, 11, 15), "TextSpanner #'edge-height -> #'bound-details #'right/left #'text = ...")
 def conv (str):
     def sub_edge_height (m):
         s = ''
@@ -2658,20 +2658,22 @@ def conv (str):
                          ('right', m.group (4))]:
 
             if h and float (h):
-                once = m.group(1)
+                once = m.group (1)
                 if not once:
                     once = ''
+                context = m.group (2)
+                if not context:
+                    context = ''
                     
-                s += (r"%s \override %s #'bound-details #'%s #'text = \markup { \draw-line #'(0 . %s) }"
-                      % (once, m.group (2), var, h))
+                s += (r"%s \override %sTextSpanner #'bound-details #'%s #'text = \markup { \draw-line #'(0 . %s) }"
+                      % (once, context, var, h))
 
                 s += '\n'
             
         return s
     
                   
-    str = re.sub (r"(\\once)?\s*\\override\s*([a-zA-Z.]+)\s*#'edge-height\s*=\s*#'\(([0-9.-]+)\s+[.]\s+([0-9.-]+)\)",
-                  sub_edge_height, str)
+    str = re.sub (r"(\\once)?\s*\\override\s*([a-zA-Z]+\s*[.]\s*)?TextSpanner\s*#'edge-height\s*=\s*#'\(\s*([0-9.-]+)\s+[.]\s+([0-9.-]+)\s*\)", sub_edge_height, str)
     return str
 
 
index e46141bb682e75a622a8ff814ff0e439ebd7c38e..b34c632f36100846b6068c0c04083e456acee735 100644 (file)
@@ -3,7 +3,7 @@
 # 
 # source file of the GNU LilyPond music typesetter
 #
-# (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+# (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 #                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 import __main__
index 0c698ded7054104224927abe6fbe8b2e0968e858..ec57ef72841f0cb2b3721e2918ec8c1ff9ca7a7f 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
             Jan Nieuwenhuizen <janneke@gnu.org>
 
 */
diff --git a/scm/SConscript b/scm/SConscript
deleted file mode 100644 (file)
index 396bafb..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-sources = src_glob ('*.scm')
-install (sources, env['sharedir_package_version'] + '/scm')
index 5af3af086c689b09628f795c88e6d69c3ddc5928..6479969eb8deb1c2b39b2387f8da0600df5ceb1f 100644 (file)
@@ -1,10 +1,10 @@
 ;;;; auto-beam.scm -- Auto-beam-engraver settings
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
-;;;; 
-;;;; (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;;
+;;;; (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
-;;; specify generic beam begin and end times
+;;; specify generic beam end times
 
 ;;; format:
 ;;;
 
 (define-public default-auto-beam-settings
   `(
-    ;; in 3 2 time:
-    ;;   end beams each 1 2 note
-    ;;   end beams with 16th notes each 1 4 note
-    ;;   end beams with 32nd notes each 1 8 note
+    ;; in 2 2 time:
+    ;;  use beatLength for all except 32nd notes
+    ;;  end beams with 32nd notes each 1 4 beat
 
-    ((end * * 3 2) . ,(ly:make-moment 1 2))
-    ((end * * 3 2) . ,(ly:make-moment 2 2))
+    ((end 1 32 2 2) . ,(ly:make-moment 1 4))
+    ((end 1 32 2 2) . ,(ly:make-moment 2 4))
+    ((end 1 32 2 2) . ,(ly:make-moment 3 4))
+
+    ;; in 3 2 time:
+    ;;   use beatLength for all except 16th and 32nd notes
+    ;;   end beams with 16th notes each 1 4 beat
+    ;;   end beams with 32nd notes each 1 8 beat
 
     ((end 1 16 3 2) . ,(ly:make-moment 1 4))
-    ((end 1 16 3 2) . ,(ly:make-moment 1 2))
+    ((end 1 16 3 2) . ,(ly:make-moment 2 4))
     ((end 1 16 3 2) . ,(ly:make-moment 3 4))
+    ((end 1 16 3 2) . ,(ly:make-moment 4 4))
     ((end 1 16 3 2) . ,(ly:make-moment 5 4))
 
     ((end 1 32 3 2) . ,(ly:make-moment 1 8))
-    ((end 1 32 3 2) . ,(ly:make-moment 1 4))
+    ((end 1 32 3 2) . ,(ly:make-moment 2 8))
     ((end 1 32 3 2) . ,(ly:make-moment 3 8))
-    ((end 1 32 3 2) . ,(ly:make-moment 1 2))
+    ((end 1 32 3 2) . ,(ly:make-moment 4 8))
     ((end 1 32 3 2) . ,(ly:make-moment 5 8))
-    ((end 1 32 3 2) . ,(ly:make-moment 3 4))
+    ((end 1 32 3 2) . ,(ly:make-moment 6 8))
     ((end 1 32 3 2) . ,(ly:make-moment 7 8))
+    ((end 1 32 3 2) . ,(ly:make-moment 8 8))
     ((end 1 32 3 2) . ,(ly:make-moment 9 8))
-    ((end 1 32 3 2) . ,(ly:make-moment 5 4))
+    ((end 1 32 3 2) . ,(ly:make-moment 10 8))
     ((end 1 32 3 2) . ,(ly:make-moment 11 8))
 
-    ((end * * 3 4) . ,(ly:make-moment 3 4))
+    ;; in 2 4 time:
+    ;;   use beatLength for all except 32nd notes
+    ;;   end beams with 32nd notes each 1 8 beat
 
-    ((end 1 16 3 4) . ,(ly:make-moment 1 4))
-    ((end 1 16 3 4) . ,(ly:make-moment 1 2))
+    ((end 1 32 2 4) . ,(ly:make-moment 1 8))
+    ((end 1 32 2 4) . ,(ly:make-moment 2 8))
+    ((end 1 32 2 4) . ,(ly:make-moment 3 8))
+
+    ;; in 3 4 time:
+    ;;   override beatLength which would end beams at 1 4 beats
+    ;;   end beams with 16th notes each 1 4 beat
+    ;;   end beams with 32nd notes each 1 8 beat
 
+    ((end * * 3 4) . ,(ly:make-moment 3 4))
+    ((end 1 16 3 4) . ,(ly:make-moment 1 4))
+    ((end 1 16 3 4) . ,(ly:make-moment 2 4))
     ((end 1 32 3 4) . ,(ly:make-moment 1 8))
-    ((end 1 32 3 4) . ,(ly:make-moment 1 4))
+    ((end 1 32 3 4) . ,(ly:make-moment 2 8))
     ((end 1 32 3 4) . ,(ly:make-moment 3 8))
-    ((end 1 32 3 4) . ,(ly:make-moment 1 2))
+    ((end 1 32 3 4) . ,(ly:make-moment 4 8))
     ((end 1 32 3 4) . ,(ly:make-moment 5 8))
 
-    ((end * * 3 8) . ,(ly:make-moment 3 8))
-
     ;; in common time:
-    ;;   end beams each 1 2 note
-    ;;   end beams with 32nd notes each 1 8 note
-    ;;   end beams with 1 8 triplets each 1 4 note
+    ;;   override beatLength which would end beams at 1 4 beats
+    ;;   end all beams at 1 2 beat
+    ;;   end beams with 8th triplets each 1 4 beat
+    ;;   end beams with 16th notes each 1 4 beat
+    ;;   end beams with 32nd notes each 1 8 beat
 
     ((end * * 4 4) . ,(ly:make-moment 1 2))
+
     ((end 1 12 4 4) . ,(ly:make-moment 1 4))
     ((end 1 12 4 4) . ,(ly:make-moment 3 4))
 
     ((end 1 16 4 4) . ,(ly:make-moment 3 4))
 
     ((end 1 32 4 4) . ,(ly:make-moment 1 8))
-    ((end 1 32 4 4) . ,(ly:make-moment 1 4))
+    ((end 1 32 4 4) . ,(ly:make-moment 2 8))
     ((end 1 32 4 4) . ,(ly:make-moment 3 8))
     ((end 1 32 4 4) . ,(ly:make-moment 5 8))
-    ((end 1 32 4 4) . ,(ly:make-moment 3 4))
+    ((end 1 32 4 4) . ,(ly:make-moment 6 8))
     ((end 1 32 4 4) . ,(ly:make-moment 7 8))
 
-    ((end * * 2 4) . ,(ly:make-moment 1 4))
-    ((end 1 32 2 4) . ,(ly:make-moment 1 8))
-    ((end 1 32 2 4) . ,(ly:make-moment 3 8))
+    ;; in 3 8 time:
+    ;;   override beatLength which would end beams at 1 8 beats
+
+    ((end * * 3 8) . ,(ly:make-moment 3 8))
+
+    ;; in 4 8 time
+    ;;   override beatLength which would end beams at 1 8 beats
+    ;;   end all beams at 1 4 beat
+    ;;   end beams with 32nd notes each 1 8 beat
 
     ((end * * 4 8) . ,(ly:make-moment 1 4))
     ((end 1 32 4 8) . ,(ly:make-moment 1 8))
     ((end 1 32 4 8) . ,(ly:make-moment 3 8))
 
-    ((end * * 4 16) . ,(ly:make-moment 1 8))
-
     ;; in 6 8, 9 8 and 12 8 time:
-    ;;   use beatGrouping for all except 32nd notes
-    ;;   end beams with 32nd notes every 1 8 note
+    ;;   use beatGrouping for all except 32nd notes
+    ;;   end beams with 32nd notes each 1 8 beat
 
     ((end 1 32 6 8) . ,(ly:make-moment 1 8))
     ((end 1 32 6 8) . ,(ly:make-moment 2 8))
     ((end 1 32 12 8) . ,(ly:make-moment 9 8))
     ((end 1 32 12 8) . ,(ly:make-moment 10 8))
     ((end 1 32 12 8) . ,(ly:make-moment 11 8))
+
+    ;; in 4 16 time
+    ;;   end all beams each 1 8 beat
+
+    ((end * * 4 16) . ,(ly:make-moment 1 8))
+
     ))
 
 (define (override-property-setting context property setting value)
index 67f66598300e19dc84c537bae6a680a9dca4d44b..6be7b13e937c0bd5d7028b8777c2dd2430a7e48c 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2005--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2005--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
index 8e5fc8d447d8774b81857bb0d27781729bc99419..b6ec6a4ee7602c31e8daca2ac365102bd64a12e7 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;                 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;;; Note: this file can't be used without LilyPond executable
index 243052106a5b0232c794fcd3860aa34b3333f6c0..45c395ba4e6081d929580f0450a1825bcf98102d 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-public (construct-chord-elements root duration modifications)
   " Build a chord on root using modifiers in MODIFICATIONS. NoteEvents
index 9ee26dee584fff50df16c5f48d9ca809863e14c9..190ef7d43736cc9bc173a141cdc92c9ce261030d 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2003--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2003--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
 ;;;; NOTE: this is experimental code
index 25e9c1a07af4b5f11960ef8e717b518808fcb5ab..0621716d17e7c12094b8c64140e0dd2845fb7526 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
 
index 7fd484d89750289549fd0fb4a772ce3a74f7c008..718a3c9e3b35cc3cd99bbc1f9de4bf5116ab474f 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;                 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define (natural-chord-alteration p)
index d45150f10f153d67cd5cb06ebd4c2fbb16affb66..9dfef89e2d557ebcdb47b313d7d55212b88a5307 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                  Jan Nieuwenhuizen <janneke@gnu.org>
 
 
index f223f5552e3574009a11abdc1aa8306e1eb62cc5..f62fa8867dcfc885b6e1a7bf1b0d43788c6ddd06 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 1998--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
index 33c21171ac9dcca96c6c2654529af7a94711345e..302f26f1a7c2e473796c1716d44203879048cacf 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define (define-grob-property symbol type? description)
@@ -79,6 +79,14 @@ specifies which beams to make.  @code{0}@tie{}is the central beam,
 @code{1}@tie{}is the next beam toward the note, etc.  This
 information is used to determine how to connect the beaming patterns
 from stem to stem inside a beam.")
+     (beamlet-default-length ,pair? "A pair of numbers. The first number
+specifies the default length of a beamlet that sticks out of the left hand
+side of this stem; the second number specifies the default length of the
+beamlet to the right. The actual length of a beamlet is determined by
+taking either the default length or the length specified by
+@code{beamlet-max-length-proportion}, whichever is smaller.")
+     (beamlet-max-length-proportion ,pair? "The maximum length of a beamlet,
+as a proportion of the distance between two adjacent stems.")
      (before-line-breaking ,boolean? "Dummy property, used to trigger
 a callback function.")
      (between-cols ,pair? "Where to attach a loose column to.")
index c7059d0ff39d268821e57a6e351ccacf6a08e334..d7ed47f363f5946bed4155b01c48bc1e9a964eb0 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;;;; distances are given in line-thickness (thicknesses) and
        (thickness . 1.3)
        (cross-staff . ,ly:stem::calc-cross-staff)
        (flag . ,ly:stem::calc-flag)
+       (beamlet-default-length . (1.1 . 1.1))
+       (beamlet-max-length-proportion . (0.75 . 0.75))
        (details
         . (
            ;; 3.5 (or 3 measured from note head) is standard length
index 311faf463ed8613cc77127a49434b78cd85f8f74..9b5c5c5c82ac75bfb74b7994ff06b40c7a2ee9cf 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                  Jan Nieuwenhuizen <janneke@gnu.org>
 
 
index 4133fa6443b7ba95277d591be7ffa88ff65efd47..f76b335af2d3a0ae95dcd7275a313c842f0faec8 100644 (file)
@@ -1,7 +1,7 @@
 ;;; define-music-display-methods.scm -- data for displaying music
 ;;; expressions using LilyPond notation.
 ;;;
-;;; (c) 2005--2008 Nicolas Sceaux  <nicolas.sceaux@free.fr>
+;;; (c) 2005--2009 Nicolas Sceaux  <nicolas.sceaux@free.fr>
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
index 6150a2ad040027a81ba6bc5fb1f9dba14c99b0c6..c89a519576f82e2945ba3178b8c842f293df20d7 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 1998--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define (music-property-description symbol type? description)
index ba4459b8a32a671404fd62ce0c446f3cb4606954..c454cfd3a61a07b1ae33dea76393f3237cf3f15c 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;; TODO: should link back into user manual.
index 66659a902d71ecf72f9739de644edccd6a605f68..2e816ccaa2fff4846138ac9e62fe5e9c91c3d9c2 100644 (file)
@@ -3,7 +3,7 @@
 ;;
 ;; source file of the GNU LilyPond music typesetter
 ;;
-;; (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;; (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;
 
 (map ly:register-stencil-expression
index e85159059df198020dba621b003d713de156040f..21ed3a93f65597c1418b71f0d2a5e59f593a9d09 100644 (file)
@@ -2,7 +2,7 @@
 ;;;
 ;;;
 ;;;
-;;; (c) 2005--2008 Nicolas Sceaux  <nicolas.sceaux@free.fr>
+;;; (c) 2005--2009 Nicolas Sceaux  <nicolas.sceaux@free.fr>
 ;;;
 
 ;;; - This file defines the procedures used to define display methods for each
index b70b1d6969b249b4a887a0b5fb5cc8f3ea94fba8..d77a194d3194c3d79e0d1387d31e05bc444c27bb 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;; Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define (interface-doc-string interface grob-description)
index 585ae13471e59923f94a1e25e57aee4da6960474..34d406f89fca40763d05f36fd5bef0c704a5bfa3 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (use-modules
index e595de132033f0ba0038ae8b190a2c4405a58044..af4a65d7c67cd51f10714d78226652e75d625562 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
index 1491a30cad343f4d7b783afcfb75401cb242ba23..b8190d95f441967bf17cf7ab654af91943b95f03 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define (music-props-doc)
index 821eea401024a48282f162752df7f48861cb6021..5bfc83a5383ba166cc6048e4c7d8fb47c9b03fcc 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define (engraver-makes-grob? name-symbol grav)
index 56f86e00d6c459cd5b138d6e7cde0a966032a490..04b0a599426c6db713491b2d1056910cf4f8d0cf 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;; Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;;; File entry point for generated documentation
@@ -98,7 +98,7 @@
 @titlefont{Internals Reference}
 @author The LilyPond development team
 
-Copyright @copyright{} 1999--2008 by the authors
+Copyright @copyright{} 1999--2009 by the authors
 
 @vskip 20pt
 
index 0c9a1f117b37cadb1f7876f40a7e7516f654aed7..ba434f1947e89bcbbb907c18ffa97371e290274b 100644 (file)
@@ -3,7 +3,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (use-modules (oop goops)
index 94bc0ae70882cde5e06f09d36416923dd6728a2d..01e924476197f5329a2f2d17feb0b00820483b49 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2005--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2005--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define-module (scm editor))
 
index d500c0c270b20c9f6302bd9ee8e9579961f5d298..9a441ac8816aa8ce1a58a4e84f9823b60fbb66e8 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define-public latin1-coding-vector
   #(.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef
index fda853fa618734b04cdf9d5306c7ccaf4f16c8c4..7df106891e0c53ef9ae8d5693bf35db2ffbb27ae 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
 (define cache-hash-tab  (make-hash-table 11))
index d05cc2fd78efdeddf3d85b7fdc19602bf6e393a3..c29258860c2a6cabedf3623a3ec7c25da3fb21d8 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;; TODO:
 ;;
index 4983874048c50485fdfc199859dff280f49be967..7383f3181cbef2111efabe0e0bc39c168b964369 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-module (scm framework-eps))
 
             (srfi srfi-13)
             (lily))
 
-(define format ergonomic-simple-format)
-
-(define framework-eps-module (current-module))
+(define format
+  ergonomic-simple-format)
 
+(define framework-eps-module
+  (current-module))
 
 (define (widen-left-stencil-edges stencils)
   "Change STENCILS to use the union for the left extents in every
-stencil, so LaTeX includegraphics doesn't fuck up the alignment."
-
+stencil so that LaTeX's \\includegraphics command doesn't modify the
+alignment."
   (define left
     (if (pair? stencils)
-
        (apply min
               (map (lambda (stc)
                      (interval-start (ly:stencil-extent stc X)))
                    stencils))
        0.0))
-    
+
   (map (lambda (stil)
-        
         (ly:make-stencil
          (ly:stencil-expr stil)
-         (cons
-          left
-          (cdr (ly:stencil-extent stil X)))
-         (ly:stencil-extent stil Y)
-         ))
+         (cons left
+               (cdr (ly:stencil-extent stil X)))
+         (ly:stencil-extent stil Y)))
        stencils))
 
 (define (dump-stencils-as-EPSes stencils book basename)
-  (define do-pdf (member  "pdf" (ly:output-formats)))
-  (define paper (ly:paper-book-paper book))
+  (define do-pdf
+    (member  "pdf" (ly:output-formats)))
+
+  (define paper
+    (ly:paper-book-paper book))
+
   (define (dump-infinite-stack-EPS stencils)
     (let* ((dump-me (stack-stencils Y DOWN 2.0 stencils)))
       (dump-stencil-as-EPS paper dump-me basename #t)))
 
   (define (dump-counted-stencil stencil-count-pair)
-    "Return EPS filename" 
-    (let*
-       ((stencil (car stencil-count-pair))
-        (number (cdr stencil-count-pair))
-        (name (format "~a-~a" basename number)))
-
-      (dump-stencil-as-EPS
-       paper stencil name
-       (ly:get-option 'include-eps-fonts))
-
+    "Return EPS filename."
+    (let* ((stencil (car stencil-count-pair))
+          (number (cdr stencil-count-pair))
+          (name (format "~a-~a" basename number)))
+      (dump-stencil-as-EPS paper stencil name
+                          (ly:get-option 'include-eps-fonts))
       (string-append name ".eps")))
-  
+
   (define (dump-stencils-as-separate-EPS stencils count)
     (if (pair? stencils)
        (let* ((line (car stencils))
               (rest (cdr stencils))
-              (system-base-name (format "~a-~a" basename count))
-              )
-
-         (dump-stencil-as-EPS
-          paper line system-base-name)
-
+              (system-base-name (format "~a-~a" basename count)))
+         (dump-stencil-as-EPS paper line system-base-name)
          (if do-pdf
-             (postscript->pdf  0 0  (string-append system-base-name ".eps")))
+             (postscript->pdf 0 0
+                              (string-append system-base-name ".eps")))
          (dump-stencils-as-separate-EPS rest (1+ count)))))
 
-  ;; main body 
+  ;; main body
   (let* ((write-file (lambda (str-port ext)
-                      (let*
-                          ((name (format "~a-systems.~a" basename ext))
-                           (port (open-output-file name)))
+                      (let* ((name (format "~a-systems.~a" basename ext))
+                             (port (open-output-file name)))
                         (ly:message (_ "Writing ~a...") name)
                         (display (get-output-string str-port) port)
-                        (close-output-port port)
-                        )))
-        
+                        (close-output-port port))))
         (tex-system-port (open-output-string))
         (texi-system-port (open-output-string))
         (count-system-port (open-output-string))
         (widened-stencils (widen-left-stencil-edges stencils))
         (counted-systems  (count-list widened-stencils))
-        (eps-files (map dump-counted-stencil  counted-systems))
-        )
-    
+        (eps-files (map dump-counted-stencil counted-systems)))
     (if do-pdf
-
-       ;; par-for-each: a bit faster ...  
-       (for-each
-        (lambda (y)
-          (postscript->pdf 0 0 y))
-        eps-files))
-
+       ;; par-for-each: a bit faster ...
+       (for-each (lambda (y)
+                   (postscript->pdf 0 0 y))
+                 eps-files))
     (for-each (lambda (c)
                (if (< 0 c)
-                   (display (format "\\ifx\\betweenLilyPondSystem \\undefined
+                   (display (format
+                             "\\ifx\\betweenLilyPondSystem \\undefined
   \\linebreak
 \\else
-  \\betweenLilyPondSystem{~a}
+  \\expandafter\\betweenLilyPondSystem{~a}%
 \\fi
-" c) tex-system-port))
-               (display (format "\\includegraphics{~a-~a}\n"
+" c)
+                            tex-system-port))
+               (display (format "\\includegraphics{~a-~a}%\n"
                                 basename (1+ c)) tex-system-port)
                (display (format "@image{~a-~a}\n"
                                 basename (1+ c)) texi-system-port))
              (iota (length stencils)))
-    
-    (display "@c eof." texi-system-port)
-    (display "% eof. " tex-system-port)
+    (display "@c eof\n" texi-system-port)
+    (display "% eof\n" tex-system-port)
     (display (format "~a" (length stencils)) count-system-port)
     (dump-infinite-stack-EPS stencils)
     (postprocess-output book framework-eps-module
                        (format "~a.eps" basename) (ly:output-formats))
-
     (write-file texi-system-port "texi")
     (write-file tex-system-port "tex")
-
     ;; do this as the last action so we know the rest is complete if
     ;; this file is present.
-    (write-file count-system-port "count")
-    ))
-
-
+    (write-file count-system-port "count")))
 
 (define-public (output-classic-framework basename book scopes fields)
   (output-scopes scopes fields basename)
-
   (if (ly:get-option 'dump-signatures)
       (write-system-signatures basename (ly:paper-book-systems book) 1))
-  
-  (dump-stencils-as-EPSes
-   (map paper-system-stencil (ly:paper-book-systems book))
-   book
-   basename))
+  (dump-stencils-as-EPSes (map paper-system-stencil
+                              (ly:paper-book-systems book))
+                         book
+                         basename))
 
 (define-public (output-framework basename book scopes fields)
   (output-scopes scopes fields basename)
   (if (ly:get-option 'clip-systems)
       (clip-system-EPSes basename book))
-
-  (dump-stencils-as-EPSes
-   (map page-stencil (ly:paper-book-pages book)) book basename))
-  
+  (dump-stencils-as-EPSes (map page-stencil
+                              (ly:paper-book-pages book))
+                         book
+                         basename))
 
 ; redefine to imports from framework-ps
-(define convert-to-pdf convert-to-pdf)
-(define convert-to-ps convert-to-ps)
-(define convert-to-png convert-to-png)
+(define convert-to-pdf
+  convert-to-pdf)
+
+(define convert-to-ps
+  convert-to-ps)
+
+(define convert-to-png
+  convert-to-png)
index cfd72cf041be283e68984afdca24bcc1f7f549a1..c183fb0de5a463616bafc262d107eceb3131c627 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-module (scm framework-ps))
 
           (if (and (not embed)
                    (equal? 'regular (stat:type (stat full-name)))
                    (equal? name (ly:ttf-ps-name full-name)))
-              (set! embed (font-file-as-ps-string name full-name)))
+              (set! embed (font-file-as-ps-string name full-name 0)))
           (if (or (equal? "." f)
                   (equal? ".." f))
               #t
         (paper (ly:paper-book-paper book))
         (systems (ly:paper-book-systems book))
         (page-stencils (map page-stencil (ly:paper-book-pages book)))
-       
         (landscape? (eq? (ly:output-def-lookup paper 'landscape) #t))
         (page-number (1- (ly:output-def-lookup paper 'first-page-number)))
         (page-count (length page-stencils))
         (port (ly:outputter-port outputter)))
-
-
     (if (ly:get-option 'clip-systems)
        (clip-system-EPSes basename book))
-
     (if (ly:get-option 'dump-signatures)
        (write-system-signatures basename (ly:paper-book-systems book) 1))
-
     (output-scopes scopes fields basename)
     (display (file-header paper page-count #t) port)
-
     ;; don't do BeginDefaults PageMedia: A4
     ;; not necessary and wrong
-
     (write-preamble paper #t port)
-
     (for-each
      (lambda (page)
        (set! page-number (1+ page-number))
        (dump-page outputter page page-number page-count landscape?))
      page-stencils)
-
     (display "%%Trailer\n%%EOF\n" port)
     (ly:outputter-close outputter)
     (postprocess-output book framework-ps-module filename
-                        (ly:output-formats))))
+                       (ly:output-formats))))
 
 (define-public (dump-stencil-as-EPS paper dump-me filename
                                    load-fonts)
-
-  (let*
-      ((xext (ly:stencil-extent dump-me X))
-       (yext (ly:stencil-extent dump-me Y))
-       (padding (ly:get-option 'eps-box-padding))
-       (left-overshoot (if (number? padding)
-                          (* -1 padding (ly:output-def-lookup paper 'mm))
-                          #f))
-       (bbox
-       (map
-        (lambda (x)
-          (if (or (nan? x) (inf? x)
+  (let* ((xext (ly:stencil-extent dump-me X))
+        (yext (ly:stencil-extent dump-me Y))
+        (padding (ly:get-option 'eps-box-padding))
+        (left-overshoot (if (number? padding)
+                            (* -1 padding (ly:output-def-lookup paper 'mm))
+                            #f))
+        (bbox
+         (map
+          (lambda (x)
+            (if (or (nan? x) (inf? x)
                     ;; FIXME: huh?
-                  (equal? (format #f "~S" x) "+#.#")
-                  (equal? (format #f "~S" x) "-#.#"))
-              0.0 x))
+                    (equal? (format #f "~S" x) "+#.#")
+                    (equal? (format #f "~S" x) "-#.#"))
+                0.0 x))
 
           ;; the left-overshoot is to make sure that
           ;; bar numbers stick out of margin uniformly.
           ;;
           (list
-       
            (if (number? left-overshoot)
                (min left-overshoot (car xext))
                (car xext))
            (car yext) (cdr xext) (cdr yext)))))
+    (dump-stencil-as-EPS-with-bbox paper dump-me filename load-fonts bbox)))
 
-       (dump-stencil-as-EPS-with-bbox paper dump-me filename load-fonts bbox)
-       ))
-       
-       
 (define-public (dump-stencil-as-EPS-with-bbox paper dump-me filename
                                              load-fonts
                                              bbox)
-  "Create an EPS file from stencil DUMP-ME to FILENAME. BBOX has format
-   (left-x, lower-y, right x, up-y).  If LOAD-FONTS set, include fonts inline."
-
+  "Create an EPS file from stencil DUMP-ME to FILENAME. BBOX has
+format (left-x, lower-y, right x, up-y).  If LOAD-FONTS set, include
+fonts inline."
   (define (to-rounded-bp-box box)
     "Convert box to 1/72 inch with rounding to enlarge the box."
     (let* ((scale (ly:output-def-lookup paper 'output-scale))
           (strip-non-number (lambda (x)
-                              (if (or (nan? x) (inf? x)) 0.0 x)))
+                              (if (or (nan? x)
+                                      (inf? x))
+                                  0.0
+                                  x)))
           (directed-round (lambda (x rounder)
                             (inexact->exact
                              (rounder (/ (* (strip-non-number x) scale)
       (list (directed-round (car box) floor)
            (directed-round (cadr box) floor)
            (directed-round (max (1+ (car box)) (caddr box)) ceiling)
-           (directed-round (max (1+ (cadr box)) (cadddr box)) ceiling)
-         )))
+           (directed-round (max (1+ (cadr box)) (cadddr box)) ceiling))))
 
   (let* ((outputter (ly:make-paper-outputter
                     ;; FIXME: better wrap open/open-file,
                     ;; MINGW hack: need to have "b"inary for embedding CFFs
                     (open-file (format "~a.eps" filename) "wb")
                     'ps))
-
         (port (ly:outputter-port outputter))
         (rounded-bbox (to-rounded-bp-box bbox))
         (port (ly:outputter-port outputter))
         (header (eps-header paper rounded-bbox load-fonts)))
-
     (display header port)
     (write-preamble paper load-fonts port)
     (display "gsave set-ps-scale-to-lily-scale\n" port)
     (display "stroke grestore\n%%Trailer\n%%EOF\n" port)
     (ly:outputter-close outputter)))
 
-
-
-(define (clip-systems-to-region
-        basename paper systems region
-        do-pdf)
-
-  (let*
-      ((extents-system-pairs
-       (filtered-map
-        (lambda (paper-system)
-          (let*
-              ((x-ext (system-clipped-x-extent
-                       (paper-system-system-grob paper-system)
-                       region)))
-
-            (if x-ext
-                (cons x-ext paper-system)
-                #f)))
-       
-        systems))
-       (count 0))
-
+(define (clip-systems-to-region basename paper systems region do-pdf)
+  (let* ((extents-system-pairs
+         (filtered-map (lambda (paper-system)
+                         (let* ((x-ext (system-clipped-x-extent
+                                        (paper-system-system-grob paper-system)
+                                        region)))
+                           (if x-ext
+                               (cons x-ext paper-system)
+                               #f)))
+                       systems))
+        (count 0))
     (for-each
      (lambda (ext-system-pair)
-       (let*
-          ((xext (car ext-system-pair))
-           (paper-system (cdr ext-system-pair))
-           (yext (paper-system-extent paper-system Y))
-           (bbox (list (car xext) (car yext)
-                       (cdr xext) (cdr yext)))
-           (filename (if (< 0 count)
-                         (format "~a-~a" basename count)
-                         basename)))
-
+       (let* ((xext (car ext-system-pair))
+             (paper-system (cdr ext-system-pair))
+             (yext (paper-system-extent paper-system Y))
+             (bbox (list (car xext) (car yext)
+                         (cdr xext) (cdr yext)))
+             (filename (if (< 0 count)
+                           (format "~a-~a" basename count)
+                           basename)))
         (set! count (1+ count))
-        (dump-stencil-as-EPS-with-bbox
-         paper
-         (paper-system-stencil paper-system)
-         filename
-         (ly:get-option 'include-eps-fonts)
-         bbox)
-
+        (dump-stencil-as-EPS-with-bbox paper
+                                       (paper-system-stencil paper-system)
+                                       filename
+                                       (ly:get-option 'include-eps-fonts)
+                                       bbox)
         (if do-pdf
-            (postscript->pdf 0 0 (format "~a.eps" filename)))
-        ))
-
-     extents-system-pairs)
-    ))
-
+            (postscript->pdf 0 0 (format "~a.eps" filename)))))
+     extents-system-pairs)))
 
 (define-public (clip-system-EPSes basename paper-book)
-  (define do-pdf (member "pdf" (ly:output-formats)))
+  (define do-pdf
+    (member "pdf" (ly:output-formats)))
 
   (define (clip-score-systems basename systems)
-    (let*
-       ((layout (ly:grob-layout (paper-system-system-grob (car systems))))
-        (regions (ly:output-def-lookup layout 'clip-regions)))
-
+    (let* ((layout (ly:grob-layout (paper-system-system-grob (car systems))))
+          (regions (ly:output-def-lookup layout 'clip-regions)))
       (for-each
        (lambda (region)
         (clip-systems-to-region
                  (rhythmic-location->file-string (cdr region)))
          layout systems region
          do-pdf))
-
        regions)))
 
-
   ;; partition in system lists sharing their layout blocks
-  (let*
-      ((systems (ly:paper-book-systems paper-book))
-       (count 0)
-       (score-system-list '()))
-
+  (let* ((systems (ly:paper-book-systems paper-book))
+        (count 0)
+        (score-system-list '()))
     (fold
      (lambda (system last-system)
-
-
        (if (not (and last-system
                     (equal? (paper-system-layout last-system)
                             (paper-system-layout system))))
           (set! score-system-list (cons '() score-system-list)))
-
        (if (paper-system-layout system)
           (set-car! score-system-list (cons system (car score-system-list))))
-
        ;; pass value.
        system)
-
      #f
      systems)
-
-    (for-each
-     (lambda (system-list)
-       (clip-score-systems
-       (if (> count 0)
-           (format "~a-~a" basename count)
-           basename)
-       system-list))
-
-     score-system-list)))
-
+    (for-each (lambda (system-list)
+               (clip-score-systems
+                (if (> count 0)
+                    (format "~a-~a" basename count)
+                    basename)
+                system-list))
+             score-system-list)))
 
 (define-public (output-preview-framework basename book scopes fields)
   (let* ((paper (ly:paper-book-paper book))
         (systems (ly:paper-book-systems book))
         (scale (ly:output-def-lookup paper 'output-scale))
         (to-dump-systems '()))
-
     ;; skip booktitles.
-    (if (and
-        (not (ly:get-option 'include-book-title-preview))
-        (pair? systems)
-        (ly:prob-property (car systems) 'is-book-title #f))
-
+    (if (and (not (ly:get-option 'include-book-title-preview))
+            (pair? systems)
+            (ly:prob-property (car systems) 'is-book-title #f))
        (set! systems (cdr systems)))
-
     (for-each
      (lambda (sys)
-       (if (or
-           (paper-system-title? sys)
-           (not (pair? to-dump-systems))
-           (paper-system-title? (car to-dump-systems)))
+       (if (or (paper-system-title? sys)
+              (not (pair? to-dump-systems))
+              (paper-system-title? (car to-dump-systems)))
           (set! to-dump-systems (cons sys to-dump-systems))))
      systems)
-
-    (dump-stencil-as-EPS
-     paper
-     (stack-stencils Y DOWN 0.0
-                    (map paper-system-stencil (reverse to-dump-systems)))
-     (format "~a.preview" basename)
-     #t)
-
+    (dump-stencil-as-EPS paper
+                        (stack-stencils Y DOWN 0.0
+                                        (map paper-system-stencil
+                                             (reverse to-dump-systems)))
+                        (format "~a.preview" basename)
+                        #t)
     (postprocess-output book framework-ps-module
                        (format "~a.preview.eps" basename)
                        (cons "png" (ly:output-formats)))))
 
 (if #f
     (define-public (output-preview-framework basename book scopes fields)
-
       (let* ((paper (ly:paper-book-paper book))
             (systems (ly:paper-book-systems book))
             (scale (ly:output-def-lookup paper 'output-scale))
        (dump-stencil-as-EPS paper dump-me
                             (format "~a.preview" basename)
                             #t)
-
        (postprocess-output book framework-ps-module
                            (format "~a.preview.eps" basename)
-                            (ly:output-formats)))))
+                           (ly:output-formats)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
   (let* ((defs (ly:paper-book-paper book))
         (landscape (ly:output-def-lookup defs 'landscape))
         (output-scale (ly:output-def-lookup defs 'output-scale))
-        (convert (lambda (x) (* x output-scale (/ (ly:bp 1)))))
-       
+        (convert (lambda (x)
+                   (* x output-scale (/ (ly:bp 1)))))
         (paper-width (convert (ly:output-def-lookup defs 'paper-width)))
         (paper-height (convert (ly:output-def-lookup defs 'paper-height)))
-
         (w (if landscape paper-height paper-width))
-        (h (if landscape paper-width paper-height))
-        )
-
+        (h (if landscape paper-width paper-height)))
     (if (equal? (basename name ".ps") "-")
        (ly:warning (_ "cannot convert <stdout> to ~S" "PDF"))
        (postscript->pdf w h name))))
         (paper-width (ly:output-def-lookup defs 'paper-width))
         (paper-height (ly:output-def-lookup defs 'paper-height))
         (output-scale (ly:output-def-lookup defs 'output-scale)))
-
     (postscript->png resolution
                     (* paper-width output-scale (/ (ly:bp 1)))
                     (* paper-height output-scale (/ (ly:bp 1)))
   #t)
 
 (define-public (output-classic-framework basename book scopes fields)
-
-  (ly:error (_ "\nThe PostScript backend does not support the system-by-system
-output.  For that, use the EPS backend instead,
+  (ly:error (_ "\nThe PostScript backend does not support the
+system-by-system output.  For that, use the EPS backend instead,
 
   lilypond -dbackend=eps FILE
 
index 9b74aef9fe1cd32f03fd288e90eb12be7517077d..b2e0b5604d8edbfd599c0e4af6b5f72ca44451cd 100644 (file)
@@ -3,7 +3,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define-module (scm framework-svg))
 
index ebd79049a1396971bc6d81359f29ecb147b8d201..fab6868fd3d4f39712a703d6be8e4b328535c5ae 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Carl D. Sorensen <c_sorensen@byu.edu>
+;;;; (c) 2004--2009 Carl D. Sorensen <c_sorensen@byu.edu>
 
 ;
 ;  Utility functions
index bc17f6185ebbfa79b8b8327504aba4dd345d6bcf..5144977644d7536de0656ffb6898a3df8968a595 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2007--2008 Joe Neeman <joeneeman@gmail.com>
+;;;; (c) 2007--2009 Joe Neeman <joeneeman@gmail.com>
 
 
 (define-module (scm graphviz)
index 9af6e04dd2f98c4781574281e2a9a9a18878eb03..876e392bf0597ab16e89c09626dfd86eb22ceee3 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2008 Reinhold Kainhofer <reinhold@kainhofer.com>
+;;;; (c) 2008--2009 Reinhold Kainhofer <reinhold@kainhofer.com>
 
 
 
index d9cb71c87f378ecec87befde7478616b63ddf5a5..5b655f6cb6115b1a4b1a553af044ecd82c15dc65 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; source file of the GNU LilyPond music typesetter
 ;;
-;; (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;; (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;
 
 (define-module (scm kpathsea))
index 040421a98bdc90cdfa426ac38847abc61f7fbca9..09dc09fd8e379407cf1087f214f59fe0e359cbee 100644 (file)
@@ -3,7 +3,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;
 
 (define ((check-beam-quant posl posr) beam posns)
index 715629c3b36b36d622950b8eb50b446980d37485..ffd6d632c4d2d8e4bdd4ba4536eb0652e6b9d6fd 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;         Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-module (scm layout-page-layout)
index 6b80a586ec5b2cc91e412c4006359e3d1782d463..e153c0cf79d2370d013d4c578983a2cfa6354e5a 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
                                ;
 ; this is put into the slur-details property of Slur and PhrasingSlur
 (define default-slur-details
index 8176db1d7b66ee31ec1ebd4f881709e662cc8545..3cc4c5201bea4c9028dcf7106d9b2eb61f6e40cc 100644 (file)
@@ -3,7 +3,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -586,11 +586,19 @@ possibly turned off."
 ;; don't confuse users with #<procedure .. > syntax. 
 ;; 
 (define-public (scm->string val)
-  (if (and (procedure? val) (symbol? (procedure-name val)))
+  (if (and (procedure? val)
+          (symbol? (procedure-name val)))
       (symbol->string (procedure-name val))
       (string-append
-       (if (self-evaluating? val) "" "'")
-       (call-with-output-string (lambda (port) (display val port))))))
+       (if (self-evaluating? val)
+          (if (string? val)
+              "\""
+              "")
+          "'")
+       (call-with-output-string (lambda (port) (display val port)))
+       (if (string? val)
+          "\""
+          ""))))
 
 (define-public (!= lst r)
   (not (= lst r)))
index 900c347c26aefd9abf303a6a8812e1a7143e505c..c39b243648613d4a0f475f8e40aca3a0b8dfa17c 100644 (file)
@@ -1,17 +1,19 @@
-;;;; lily.scm -- toplevel Scheme stuff
+;;;; lily.scm -- top-level Scheme stuff
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
-;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;;
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;; Internationalisation: (_i "to be translated") gets an entry in the
-;; POT file (gettext ) must be invoked explicitely to do the actual
+;; POT file; (gettext ...) must be invoked explicitly to do the actual
 ;; "translation".
-;;(define-macro (_i x) x)
-;;(define-macro-public _i (x) x)
-;;(define-public-macro _i (x) x)
+;;
+;; (define-macro (_i x) x)
+;; (define-macro-public _i (x) x)
+;; (define-public-macro _i (x) x)
 ;; Abbrv-PWR!
+
 (defmacro-public _i (x) x)
 
 (read-enable 'positions)
 
 (define scheme-options-definitions
   `(
-
     ;; NAMING: either
 
     ;; - [subject-]object-object-verb +"ing"
     ;; - [subject-]-verb-object-object
 
-    (anti-alias-factor 1 "render at higher resolution and scale down result\nto prevent jaggies in PNG")
-    (backend ps "which backend to use by default; Options: eps, null, ps [default], scm, svg)")
-    (check-internal-types #f "check every property assignment for types")
-    (clip-systems #f "Generate cut-out snippets of a score")
-    (datadir #f "LilyPond prefix for data files (Readonly).")
-    (debug-gc #f "dump memory debugging statistics")
-    (debug-gc-assert-parsed-dead #f "for memory debugging:
-ensure that all refs to parsed objects are dead.  This is an internal option, and is switched on automatically for -ddebug-gc.") 
-    (debug-lexer #f "debug the flex lexer")
-    (debug-page-breaking-scoring #f "dump scores for many different page breaking configurations")
-    (debug-parser #f "debug the bison parser")
-    (debug-property-callbacks #f "debug cyclic callback chains")
-    (debug-skylines #f "debug skylines")
+    ;; Avoid overlong lines in `lilypond -dhelp'!  Strings should not
+    ;; be longer than 48 characters per line.
+
+    (anti-alias-factor 1
+"Render at higher resolution (using given factor)
+and scale down result to prevent jaggies in
+PNG images.")
+    (backend ps
+"Select backend.  Possible values: 'eps, 'null,
+'ps, 'scm, 'svg.")
+    (check-internal-types #f
+"Check every property assignment for types.")
+    (clip-systems #f
+"Generate cut-out snippets of a score.")
+    (datadir #f
+"LilyPond prefix for data files (read-only).")
+    (debug-gc #f
+"Dump memory debugging statistics.")
+    (debug-gc-assert-parsed-dead #f
+"For memory debugging: Ensure that all
+references to parsed objects are dead.  This is
+an internal option, and is switched on
+automatically for `-ddebug-gc'.")
+    (debug-lexer #f
+"Debug the flex lexer.")
+    (debug-page-breaking-scoring #f
+"Dump scores for many different page breaking
+configurations.")
+    (debug-parser #f
+"Debug the bison parser.")
+    (debug-property-callbacks #f
+"Debug cyclic callback chains.")
+    (debug-skylines #f
+"Debug skylines.")
     (delete-intermediate-files #f
-                              "delete unusable PostScript files")
-    (dump-profile #f "dump memory and time information for each file")
-    (dump-cpu-profile #f "dump timing information (system-dependent)")
-    (dump-signatures #f "dump output signatures of each system.  Used for regression testing.")
-    
-    (eps-box-padding #f "Pad EPS bounding box left edge.  Guarantee alignment between systems in LaTeX.")
+"Delete unusable, intermediate PostScript files.")
+    (dump-profile #f
+"Dump memory and time information for each file.")
+    (dump-cpu-profile #f
+"Dump timing information (system-dependent).")
+    (dump-signatures #f
+"Dump output signatures of each system.  Used for
+regression testing.")
+    (eps-box-padding #f
+"Pad left edge of the output EPS bounding box by
+given amount (in mm).")
     (gs-load-fonts #f
-                  "load fonts via Ghostscript.")
+"Load fonts via Ghostscript.")
     (gs-load-lily-fonts #f
-                       "load only lilypond fonts via Ghostscript.")
-    (gui #f "running from gui; redirect stderr to log file")
-    (help #f "show this help.") 
-    (include-book-title-preview #t "include book-titles in preview images.")
-    (include-eps-fonts #t "Include fonts in separate-system EPS files.")
-    (job-count #f "Process in parallel") 
-    (log-file #f "redirect output to log FILE.log")
+"Load only LilyPond fonts via Ghostscript.")
+    (gui #f
+"Run LilyPond from a GUI and redirect stderr to
+a log file.")
+    (help #f
+"Show this help.")
+    (include-book-title-preview #t
+"Include book titles in preview images.")
+    (include-eps-fonts #t
+"Include fonts in separate-system EPS files.")
+    (job-count #f
+"Process in parallel, using the given number of
+jobs.")
+    (log-file #f
+"If string FOO is given as argument, redirect
+output to log file `FOO.log'.")
     (midi-extension ,(if (eq? PLATFORM 'windows)
                         "mid"
                         "midi")
-                   "set the default file extension for MIDI")
-
+"Set the default file extension for MIDI output
+file to given string.")
     (old-relative #f
-                 "relative for simultaneous music works
-similar to chord syntax")
-    (point-and-click #t "use point & click")
-    (paper-size "a4" "the default paper size")
-    (pixmap-format "png16m" "GS format to use for pixel images")
-    (preview #f "make a incipit image. ")
-    (print-pages #t "print pages normally. ")
-    (protected-scheme-parsing #t "continue when finding errors in inline
-scheme are caught in the parser. If off, halt 
-on errors, and print a stack trace.")
-    (profile-property-accesses #f "keep statistics of get_property() calls.")
-    
-    (resolution 101 "resolution for generating PNG bitmaps")
-    (read-file-list #f "Read files to be processed from command line arguments")
-
-    (safe #f "Run safely")
-    (strict-infinity-checking #f "If yes, crash on encountering Inf/NaN.")
-    (strip-output-dir #t "If yes, strip directories from input files.")
-    (separate-log-files #f "Output to FILE.log per file.")
-    (trace-memory-frequency #f "Record Scheme cell usage this many times per second, and dump to file.")
-    (trace-scheme-coverage #f "Record coverage of Scheme files") 
+"Make \\relative mode for simultaneous music work
+similar to chord syntax.")
+    (point-and-click #t
+"Add point & click links to PDF output.")
+    (paper-size "a4"
+"Set default paper size.")
+    (pixmap-format "png16m"
+"Set GhostScript's output format for pixel images.")
+    (preview #f
+"Create PNG and EPS preview images also.")
+    (print-pages #t
+"Print pages in the normal way.")
+    (protected-scheme-parsing #t
+"Continue when errors in inline scheme are caught
+in the parser.  If #f, halt on errors and print
+a stack trace.")
+    (profile-property-accesses #f
+"Keep statistics of get_property() calls.")
+    (resolution 101
+"Set resolution for generating PNG pixmaps to
+given value (in dpi).")
+    (read-file-list #f
+"Specify name of a file which contains a list of
+input files to be processed.")
+    (relative-includes #f
+"When processing an \\include command, look for
+the included file relative to the current file
+(instead of the root file)")
+    (safe #f
+"Run in safer mode.")
+    (strict-infinity-checking #f
+"Force a crash on encountering Inf and NaN
+floating point exceptions.")
+    (strip-output-dir #t
+"Don't use directories from input files while
+constructing output file names.")
+    (separate-log-files #f
+"For input files `FILE1.ly', `FILE2.ly', ...
+output log data to files `FILE1.log',
+`FILE2.log', ...")
+    (trace-memory-frequency #f
+"Record Scheme cell usage this many times per
+second.  Dump results to `FILE.stacks' and
+`FILE.graph'.")
+    (trace-scheme-coverage #f
+"Record coverage of Scheme files in `FILE.cov'.")
     (show-available-fonts #f
-                         "List font names available.")
-    (verbose ,(ly:command-line-verbose?) "value for the --verbose flag")
+"List available font names.")
+    (verbose ,(ly:command-line-verbose?)
+"Value of the --verbose flag (read-only).")
     ))
 
-;; need to do this in the beginning. Other parts of the
-;; Scheme init depend on these options.
-;;
-(for-each
- (lambda (x)
-   (ly:add-option (car x) (cadr x) (caddr x)))
- scheme-options-definitions)
+;; Need to do this in the beginning.  Other parts of the Scheme
+;; initialization depend on these options.
 
-(for-each
- (lambda (x)
-   (ly:set-option (car x) (cdr x)))
- (eval-string (ly:command-line-options)))
+(for-each (lambda (x)
+           (ly:add-option (car x) (cadr x) (caddr x)))
+         scheme-options-definitions)
+
+(for-each (lambda (x)
+           (ly:set-option (car x) (cdr x)))
+         (eval-string (ly:command-line-options)))
 
 (debug-set! stack 0)
 
@@ -123,41 +183,46 @@ on errors, and print a stack trace.")
             (srfi srfi-14)
             (scm clip-region)
             (scm memory-trace)
-            (scm coverage)
-            )
-(define-public fancy-format format)
+            (scm coverage))
+
+(define-public fancy-format
+  format)
+
 (define-public (ergonomic-simple-format dest . rest)
   "Like ice-9 format, but without the memory consumption."
-  
   (if (string? dest)
       (apply simple-format (cons #f (cons dest rest)))
       (apply simple-format (cons dest rest))))
 
-(define format ergonomic-simple-format)
+(define format
+  ergonomic-simple-format)
 
 ;; my display
-(define-public (myd k v) (display k) (display ": ") (display v) (display ", ")
+(define-public (myd k v)
+  (display k)
+  (display ": ")
+  (display v)
+  (display ", ")
   v)
 
 (define-public (print . args)
   (apply format (cons (current-output-port) args)))
 
 
-;;; General settings
-;;; debugging evaluator is slower.  This should
-;;; have a more sensible default.
+;;; General settings.
+;;;
+;;; Debugging evaluator is slower.  This should have a more sensible
+;;; default.
 
 (if (or (ly:get-option 'verbose)
        (ly:get-option 'trace-memory-frequency)
-       (ly:get-option 'trace-scheme-coverage)
-       )
+       (ly:get-option 'trace-scheme-coverage))
     (begin
       (ly:set-option 'protected-scheme-parsing #f)
       (debug-enable 'debug)
       (debug-enable 'backtrace)
       (read-enable 'positions)))
 
-
 (if (ly:get-option 'trace-scheme-coverage)
     (coverage:enable))
 
@@ -187,17 +252,23 @@ on errors, and print a stack trace.")
 
 (case PLATFORM
   ((windows)
-   (define native-getcwd getcwd)
+   (define native-getcwd
+     getcwd)
+
    (define (slashify x)
      (if (string-index x #\\)
         x
         (string-regexp-substitute
          "//*" "/"
          (string-regexp-substitute "\\\\" "/" x))))
+
    ;; FIXME: this prints a warning.
    (define-public (ly-getcwd)
      (slashify (native-getcwd))))
-  (else (define-public ly-getcwd getcwd)))
+
+  (else
+   (define-public ly-getcwd
+     getcwd)))
 
 (define-public (is-absolute? file-name)
   (let ((file-name-length (string-length file-name)))
@@ -212,13 +283,11 @@ on errors, and print a stack trace.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (define (type-check-list location signature arguments)
-  "Typecheck a list of arguments against a list of type
-predicates. Print a message at LOCATION if any predicate failed."
-
-  (define (recursion-helper signature arguments count) 
-    (define (helper pred? arg count) 
+  "Typecheck a list of arguments against a list of type predicates.
+Print a message at LOCATION if any predicate failed."
+  (define (recursion-helper signature arguments count)
+    (define (helper pred? arg count)
       (if (not (pred? arg))
-
          (begin
            (ly:input-message
             location
@@ -232,14 +301,12 @@ predicates. Print a message at LOCATION if any predicate failed."
        #t
        (and (helper (car signature) (car arguments) count)
             (recursion-helper (cdr signature) (cdr arguments) (1+ count)))))
-
   (recursion-helper signature arguments 1))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  output
 
-
-;;(define-public (output-framework) (write "hello\n"))
+;; (define-public (output-framework) (write "hello\n"))
 
 (define output-ps-module
   (make-module 1021 (list (resolve-interface '(scm output-ps)))))
@@ -249,15 +316,18 @@ predicates. Print a message at LOCATION if any predicate failed."
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Safe definitions utility
-(define safe-objects (list))
+
+(define safe-objects
+  (list))
 
 (define-macro (define-safe-public arglist . body)
-  "Define a variable, export it, and mark it as safe, ie usable in LilyPond safe mode.
-The syntax is the same as `define*-public'."
+  "Define a variable, export it, and mark it as safe, i.e. usable in
+LilyPond safe mode.  The syntax is the same as `define*-public'."
   (define (get-symbol arg)
     (if (pair? arg)
         (get-symbol (car arg))
         arg))
+
   (let ((safe-symbol (get-symbol arglist)))
     `(begin
        (define*-public ,arglist
@@ -279,70 +349,63 @@ The syntax is the same as `define*-public'."
 
 (ly:set-default-scale (ly:make-scale #(0 1 2 5/2 7/2 9/2 11/2)))
 
-
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; other files.
 
-
-(define
-  init-scheme-files
+(define init-scheme-files
   '("lily-library.scm"
-           "file-cache.scm"
-           "define-event-classes.scm"
-           "define-music-types.scm"
-           "output-lib.scm"
-           "c++.scm"
-           "chord-ignatzek-names.scm"
-           "chord-entry.scm"
-           "chord-generic-names.scm"
-           "stencil.scm"
-           "markup.scm"
-           "music-functions.scm"
-           "part-combiner.scm"
-           "autochange.scm"
-           "define-music-properties.scm"
-           "auto-beam.scm"
-           "chord-name.scm"
-
-           "parser-ly-from-scheme.scm"
-           "ly-syntax-constructors.scm"
-           
-           "define-context-properties.scm"
-           "translation-functions.scm"
-           "script.scm"
-           "midi.scm"
-           "layout-beam.scm"
-           "parser-clef.scm"
-           "layout-slur.scm"
-           "font.scm"
-           "encoding.scm"
-           
-           "flag-styles.scm"
-           "fret-diagrams.scm"
-           "harp-pedals.scm"
-           "predefined-fretboards.scm"
-            "define-markup-commands.scm"
-           "define-grob-properties.scm"
-           "define-grobs.scm"
-           "define-grob-interfaces.scm"
-           "define-stencil-commands.scm"
-           "titling.scm"
-           
-           "paper.scm"
-           "backend-library.scm"
-           "x11-color.scm"
-
-           ;; must be after everything has been defined
-           "safe-lily.scm"))
-
+    "file-cache.scm"
+    "define-event-classes.scm"
+    "define-music-types.scm"
+    "output-lib.scm"
+    "c++.scm"
+    "chord-ignatzek-names.scm"
+    "chord-entry.scm"
+    "chord-generic-names.scm"
+    "stencil.scm"
+    "markup.scm"
+    "music-functions.scm"
+    "part-combiner.scm"
+    "autochange.scm"
+    "define-music-properties.scm"
+    "auto-beam.scm"
+    "chord-name.scm"
+
+    "parser-ly-from-scheme.scm"
+    "ly-syntax-constructors.scm"
+
+    "define-context-properties.scm"
+    "translation-functions.scm"
+    "script.scm"
+    "midi.scm"
+    "layout-beam.scm"
+    "parser-clef.scm"
+    "layout-slur.scm"
+    "font.scm"
+    "encoding.scm"
+
+    "flag-styles.scm"
+    "fret-diagrams.scm"
+    "harp-pedals.scm"
+    "predefined-fretboards.scm"
+    "define-markup-commands.scm"
+    "define-grob-properties.scm"
+    "define-grobs.scm"
+    "define-grob-interfaces.scm"
+    "define-stencil-commands.scm"
+    "titling.scm"
+
+    "paper.scm"
+    "backend-library.scm"
+    "x11-color.scm"
+
+    ;; must be after everything has been defined
+    "safe-lily.scm"))
 
 (for-each ly:load init-scheme-files)
 
-
 (set! type-p-name-alist
-      `(
-       (,boolean-or-symbol? . "boolean or symbol")
+      `((,boolean-or-symbol? . "boolean or symbol")
        (,boolean? . "boolean")
        (,char? . "char")
        (,grob-list? . "list of grobs")
@@ -369,7 +432,7 @@ The syntax is the same as `define*-public'."
        (,number-or-string? . "number or string")
        (,number-pair? . "pair of numbers")
        (,number? . "number")
-       (,output-port? . "output port")   
+       (,output-port? . "output port")
        (,pair? . "pair")
        (,procedure? . "procedure")
        (,rhythmic-location? . "rhythmic location")
@@ -384,77 +447,67 @@ The syntax is the same as `define*-public'."
 (define (profile-measurements)
   (let* ((t (times))
         (stats (gc-stats)))
-    
-    (list
-     (- (+ (tms:cutime t)
-          (tms:utime t))
-       (ly:assoc-get 'gc-time-taken stats))
-     
-     (ly:assoc-get 'total-cells-allocated  stats 0)
-     )))
+    (list (- (+ (tms:cutime t)
+               (tms:utime t))
+            (ly:assoc-get 'gc-time-taken stats))
+         (ly:assoc-get 'total-cells-allocated  stats 0))))
 
 (define (dump-profile base last this)
-  (let*
-      ((outname (format "~a.profile" (dir-basename base ".ly")))
-       (diff (map (lambda (y) (apply - y)) (zip this last))))
-    
+  (let* ((outname (format "~a.profile" (dir-basename base ".ly")))
+        (diff (map (lambda (y) (apply - y)) (zip this last))))
     (ly:progress "\nWriting timing to ~a..." outname)
     (format (open-file outname "w")
            "time: ~a\ncells: ~a\n"
            (if (ly:get-option 'dump-cpu-profile)
                (car diff)
                0)
-           (cadr diff)
-           )))
-
+           (cadr diff))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; debug mem leaks
+;; debug memory leaks
+
+(define gc-dumping
+  #f)
 
-(define gc-dumping #f)
-(define gc-protect-stat-count 0)
+(define gc-protect-stat-count
+  0)
 
 (define-public (dump-live-object-stats outfile)
-  (for-each
-   (lambda (x)
-     (format outfile "~a: ~a\n" (car x) (cdr x)))
-   (sort (gc-live-object-stats)
-        (lambda (x y)
-          (string<? (car x) (car y))))))
+  (for-each (lambda (x)
+             (format outfile "~a: ~a\n" (car x) (cdr x)))
+           (sort (gc-live-object-stats)
+                 (lambda (x y)
+                   (string<? (car x) (car y))))))
 
 (define-public (dump-gc-protects)
   (set! gc-protect-stat-count (1+ gc-protect-stat-count))
-  (let* ((protects (sort
-                   (hash-table->alist (ly:protects))
-                   (lambda (a b)
-                     (< (object-address (car a))
-                        (object-address (car b))))))
-
+  (let* ((protects (sort (hash-table->alist (ly:protects))
+                        (lambda (a b)
+                          (< (object-address (car a))
+                             (object-address (car b))))))
         (out-file-name (string-append
                         "gcstat-" (number->string gc-protect-stat-count)
                         ".scm"))
-        (outfile    (open-file  out-file-name  "w")))
-
+        (outfile (open-file out-file-name "w")))
     (set! gc-dumping #t)
     (display (format "Dumping GC statistics ~a...\n" out-file-name))
-    (display
-     (map (lambda (y)
-           (let ((x (car y))
-                 (c (cdr y)))
-             (display 
-              (format "~a (~a) = ~a\n" (object-address x) c x)
-              outfile)))
-         (filter
-          (lambda (x)
-            (not (symbol? (car x))))
-          protects))
-     outfile)
-
+    (display (map (lambda (y)
+                   (let ((x (car y))
+                         (c (cdr y)))
+                     (display
+                      (format "~a (~a) = ~a\n" (object-address x) c x)
+                      outfile)))
+                 (filter
+                  (lambda (x)
+                    (not (symbol? (car x))))
+                  protects))
+            outfile)
     (format outfile "\nprotected symbols: ~a\n"
-           (apply + (map (lambda (obj-count) (if (symbol? (car obj-count))
-                                                 (cdr obj-count)
-                                                 0))
-                            protects)))             
+           (apply + (map (lambda (obj-count)
+                           (if (symbol? (car obj-count))
+                               (cdr obj-count)
+                               0))
+                         protects)))
 
     ;; (display (ly:smob-protects))
     (newline outfile)
@@ -468,188 +521,146 @@ The syntax is the same as `define*-public'."
          (ly:set-option 'debug-gc-assert-parsed-dead #t)
          (gc)
          (ly:set-option 'debug-gc-assert-parsed-dead #f)
-
          (set! stats (gc-live-object-stats))
          (display "Dumping live object statistics.\n")
          (dump-live-object-stats outfile)))
-
     (newline outfile)
-    (let*
-       ((stats (gc-stats)))
-      
-      (for-each
-       (lambda (sym)
-        (display
-         (format "~a ~a ~a\n"
-                 gc-protect-stat-count
-                 sym
-                 (let ((sym-stat (assoc sym stats)))
-                   (if sym-stat 
-                       (cdr sym-stat)
-                       "?")))
-         outfile))
-       '(protected-objects bytes-malloced cell-heap-size
-                          
-                          )))
-
+    (let* ((stats (gc-stats)))
+      (for-each (lambda (sym)
+                 (display
+                  (format "~a ~a ~a\n"
+                          gc-protect-stat-count
+                          sym
+                          (let ((sym-stat (assoc sym stats)))
+                            (if sym-stat
+                                (cdr sym-stat)
+                                "?")))
+                  outfile))
+               '(protected-objects bytes-malloced cell-heap-size)))
     (set! gc-dumping #f)
-    (close-port outfile)
-    
-    ))
-
+    (close-port outfile)))
 
 (define (check-memory)
-  "read /proc/self to check up on memory use." 
+  "Read `/proc/self' to check up on memory use."
   (define (gulp-file name)
     (let* ((file (open-input-file name))
           (text (read-delimited "" file)))
       (close file)
       text))
-  (let*
-      ((stat (gulp-file "/proc/self/status"))
-       (lines (string-split stat #\newline))
-       (interesting (filter identity
-                           (map
-                            (lambda (l)
-                              (string-match "^VmData:[ \t]*([0-9]*) kB" l))
-                            lines)))
-       (mem (string->number (match:substring (car interesting) 1)))
-       )
-
-    
+
+  (let* ((stat (gulp-file "/proc/self/status"))
+        (lines (string-split stat #\newline))
+        (interesting (filter identity
+                             (map
+                              (lambda (l)
+                                (string-match "^VmData:[ \t]*([0-9]*) kB" l))
+                              lines)))
+        (mem (string->number (match:substring (car interesting) 1))))
     (display (format  "VMDATA: ~a\n" mem))
     (display (gc-stats))
     (if (> mem 100000)
-       (begin
-         (dump-gc-protects)
-         (raise 1)))
-    
-    ))
+       (begin (dump-gc-protects)
+              (raise 1)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-
 (define (multi-fork count)
-  "Split this process in COUNT helpers. Returns either a list of pids,
-or the number of the process."
+  "Split this process into COUNT helpers.  Returns either a list of
+PIDs or the number of the process."
   (define (helper count acc)
     (if (> count 0)
-      (let*
-         ((pid  (primitive-fork)))
-       (if (= pid 0)
-           (1- count)
-           (helper (1- count) (cons pid acc))))
-      acc))
+       (let* ((pid (primitive-fork)))
+         (if (= pid 0)
+             (1- count)
+             (helper (1- count) (cons pid acc))))
+       acc))
+
   (helper count '()))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (define-public (lilypond-main files)
   "Entry point for LilyPond."
-
   (eval-string (ly:command-line-code))
-
   (if (ly:get-option 'help)
-      (begin
-       (ly:option-usage)
-       (exit 0)))
-
+      (begin (ly:option-usage)
+            (exit 0)))
   (if (ly:get-option 'show-available-fonts)
-      (begin
-       (ly:font-config-display-fonts)
-       (exit 0)
-       ))
-  
-  
+      (begin (ly:font-config-display-fonts)
+            (exit 0)))
   (if (ly:get-option 'gui)
       (gui-main files))
-
   (if (null? files)
-      (begin
-       (ly:usage)
-       (exit 2)))
-
+      (begin (ly:usage)
+            (exit 2)))
   (if (ly:get-option 'read-file-list)
       (set! files
            (filter (lambda (s)
                      (> (string-length s) 0))
                    (apply append
-                          (map (lambda (f) (string-split (ly:gulp-file f) #\nl))
-                               files)))
-           ))
-  
+                          (map (lambda (f)
+                                 (string-split (ly:gulp-file f) #\nl))
+                               files)))))
   (if (and (number? (ly:get-option 'job-count))
           (>= (length files) (ly:get-option 'job-count)))
-      (let*
-         ((count (ly:get-option 'job-count))
-          (split-todo (split-list files count)) 
-          (joblist (multi-fork count))
-          (errors '()))
-
+      (let* ((count (ly:get-option 'job-count))
+            (split-todo (split-list files count))
+            (joblist (multi-fork count))
+            (errors '()))
        (if (not (string-or-symbol? (ly:get-option 'log-file)))
            (ly:set-option 'log-file "lilypond-multi-run"))
-       
        (if (number? joblist)
-           (begin
-             (ly:set-option
-              'log-file (format "~a-~a"
-                                (ly:get-option 'log-file) joblist))
-             (set! files (vector-ref split-todo joblist)))
-
-           (begin
-             (ly:progress "\nForking into jobs:  ~a\n" joblist)
-             (for-each
-              (lambda (pid)
-                (let* ((stat (cdr (waitpid pid))))
-                  
-                  (if (not (= stat 0))
-                      (set! errors
-                            (acons (list-element-index joblist pid)
-                                   stat errors)))))
-              joblist)
-
-             (for-each
-              (lambda (x)
-                (let* ((job (car x))
-                       (state (cdr x))
-                       (logfile (format "~a-~a.log"
-                                         (ly:get-option 'log-file) job))
-                       (log (ly:gulp-file logfile))
-                       (len (string-length log))
-                       (tail (substring  log (max 0 (- len 1024)))))
-
-                  (if (status:term-sig state)
-                      (ly:message
-                       "\n\n~a\n"
-                       (format (_ "job ~a terminated with signal: ~a")
-                               job (status:term-sig state)))
-                      (ly:message
-                       (_ "logfile ~a (exit ~a):\n~a")
-                       logfile (status:exit-val state) tail))))
-
-              errors)
-
-             (if (pair? errors)
-                 (ly:error "Children ~a exited with errors." (map car errors)))
-
-             ;; must overwrite individual entries
-             (if (ly:get-option 'dump-profile)
-                 (dump-profile "lily-run-total" '(0 0) (profile-measurements)))
-
-           (exit (if (null? errors) 0 1))))))
-          
+           (begin (ly:set-option
+                   'log-file (format "~a-~a"
+                                     (ly:get-option 'log-file) joblist))
+                  (set! files (vector-ref split-todo joblist)))
+           (begin (ly:progress "\nForking into jobs:  ~a\n" joblist)
+                  (for-each
+                   (lambda (pid)
+                     (let* ((stat (cdr (waitpid pid))))
+                       (if (not (= stat 0))
+                           (set! errors
+                                 (acons (list-element-index joblist pid)
+                                        stat errors)))))
+                   joblist)
+                  (for-each
+                   (lambda (x)
+                     (let* ((job (car x))
+                            (state (cdr x))
+                            (logfile (format "~a-~a.log"
+                                             (ly:get-option 'log-file) job))
+                            (log (ly:gulp-file logfile))
+                            (len (string-length log))
+                            (tail (substring  log (max 0 (- len 1024)))))
+                       (if (status:term-sig state)
+                           (ly:message
+                            "\n\n~a\n"
+                            (format (_ "job ~a terminated with signal: ~a")
+                                    job (status:term-sig state)))
+                           (ly:message
+                            (_ "logfile ~a (exit ~a):\n~a")
+                            logfile (status:exit-val state) tail))))
+                   errors)
+                  (if (pair? errors)
+                      (ly:error "Children ~a exited with errors."
+                                (map car errors)))
+                  ;; must overwrite individual entries
+                  (if (ly:get-option 'dump-profile)
+                      (dump-profile "lily-run-total"
+                                    '(0 0) (profile-measurements)))
+                  (exit (if (null? errors)
+                            0
+                            1))))))
   (if (string-or-symbol? (ly:get-option 'log-file))
       (ly:stderr-redirect (format "~a.log" (ly:get-option 'log-file)) "w"))
-  
   (let ((failed (lilypond-all files)))
     (if (ly:get-option 'trace-scheme-coverage)
        (begin
-         (coverage:show-all (lambda (f) (string-contains f "lilypond"))
-                            )))
-    
+         (coverage:show-all (lambda (f)
+                              (string-contains f "lilypond")))))
     (if (pair? failed)
-       (begin
-         (ly:error (_ "failed files: ~S") (string-join failed))
-         (exit 1))
+       (begin (ly:error (_ "failed files: ~S") (string-join failed))
+              (exit 1))
        (begin
          ;; HACK: be sure to exit with single newline
          (ly:message "")
@@ -666,59 +677,44 @@ or the number of the process."
         (do-measurements (ly:get-option 'dump-profile))
         (handler (lambda (key failed-file)
                    (set! failed (append (list failed-file) failed)))))
-
     (gc)
     (for-each
      (lambda (x)
-       (let*
-          ((start-measurements (if do-measurements
-                                   (profile-measurements)
-                                   #f))
-           (base (dir-basename x ".ly"))
-           (all-settings (ly:all-options)))
-
+       (let* ((start-measurements (if do-measurements
+                                     (profile-measurements)
+                                     #f))
+             (base (dir-basename x ".ly"))
+             (all-settings (ly:all-options)))
         (if separate-logs
             (ly:stderr-redirect (format "~a.log" base) "w"))
         (if ping-log
             (format ping-log "Procesing ~a\n" base))
-             
-        (if (ly:get-option 'trace-memory-frequency) 
+        (if (ly:get-option 'trace-memory-frequency)
             (mtrace:start-trace  (ly:get-option 'trace-memory-frequency)))
-        
         (lilypond-file handler x)
         (if start-measurements
             (dump-profile x start-measurements (profile-measurements)))
-
         (if (ly:get-option 'trace-memory-frequency)
-            (begin
-              (mtrace:stop-trace)
-              (mtrace:dump-results base)))
-                
-        (for-each
-         (lambda (s)
-           (ly:set-option (car s) (cdr s)))
-         all-settings)
-
+            (begin (mtrace:stop-trace)
+                   (mtrace:dump-results base)))
+        (for-each (lambda (s)
+                    (ly:set-option (car s) (cdr s)))
+                  all-settings)
         (ly:clear-anonymous-modules)
         (ly:set-option 'debug-gc-assert-parsed-dead #t)
         (gc)
         (ly:set-option 'debug-gc-assert-parsed-dead #f)
-
-        
         (if (ly:get-option 'debug-gc)
             (dump-gc-protects)
             (if (= (random 40) 1)
                 (ly:reset-all-fonts)))))
-
      files)
 
     ;; we want the failed-files notice in the aggregrate logfile.
     (if ping-log
        (format ping-log "Failed files: ~a\n" failed))
-        
     (if (ly:get-option 'dump-profile)
        (dump-profile "lily-run-total" '(0 0) (profile-measurements)))
-
     failed))
 
 (define (lilypond-file handler file-name)
@@ -731,7 +727,6 @@ or the number of the process."
 (define-public (gui-main files)
   (if (null? files)
       (gui-no-files-handler))
-
   (if (not (string? (ly:get-option 'log-file)))
       (let* ((base (dir-basename (car files) ".ly"))
             (log-name (string-append base ".log")))
@@ -739,17 +734,16 @@ or the number of the process."
            (ly:message (_ "Redirecting output to ~a...") log-name))
        (ly:stderr-redirect log-name "w")
        (ly:message "# -*-compilation-*-"))
-    
-    (let ((failed (lilypond-all files)))
-      (if (pair? failed)
-         (begin
-           ;; ugh
-           (ly:stderr-redirect "foo" "r")
-           (system (get-editor-command log-name 0 0 0))
-           (ly:error (_ "failed files: ~S") (string-join failed))
-           ;; not reached?
-           (exit 1))
-         (exit 0)))))
+      (let ((failed (lilypond-all files)))
+       (if (pair? failed)
+           (begin
+             ;; ugh
+             (ly:stderr-redirect "foo" "r")
+             (system (get-editor-command log-name 0 0 0))
+             (ly:error (_ "failed files: ~S") (string-join failed))
+             ;; not reached?
+             (exit 1))
+           (exit 0)))))
 
 (define (gui-no-files-handler)
   (let* ((ly (string-append (ly:effective-prefix) "/ly/"))
index 5987ad2f4bdd5a1133023e300b402c0da2432af2..89eba1a42bf93a3beee192e80398b6ac94011aa8 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 "
 Internally markup is stored as lists, whose head is a function.
index 9a7bcb5e68492f981dea1e01046ae77b178bd0e4..cb0c0e6262259bc2f3d873b309ac65ab3e09fbed 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
 
index f425eb17385f63edcc5bca8b2677b488155a6dd9..f9599af572b51782c6d390608c21e3e8f730f843 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;                 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;; (use-modules (ice-9 optargs)) 
@@ -735,9 +735,18 @@ Syntax:
   (define-music-function (parser location arg1 arg2 ...) (arg1-type? arg2-type? ...)
     ...function body...)
 "
-  `(ly:make-music-function (list ,@signature)
-                          (lambda (,@args)
-                            ,@body)))
+  (if (and (pair? body) (pair? (car body)) (eqv? '_i (caar body)))
+      ;; When the music function definition contains a i10n doc string,
+      ;; (_i "doc string"), keep the literal string only
+      (let ((docstring (cadar body))
+           (body (cdr body)))
+       `(ly:make-music-function (list ,@signature)
+                                (lambda (,@args)
+                                  ,docstring
+                                  ,@body)))
+      `(ly:make-music-function (list ,@signature)
+                              (lambda (,@args)
+                                ,@body))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
index 6a547776b5ac6c394e42b7d0a389c06fab935bad..c33aff028d8ed8ff7e98f06ce7ce1a0b3f097ec1 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
index 3766fa6a4ea5f2b1790fff9b5b784894b7bc1332..6b2e3cff6bc9e98c8ce6f942599a44bced56ea89 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;                 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;;;; Note: currently misused as testbed for titles with markup, see
index b6bdb2721c56abc52ee406bf07c4a4bb900e2ec5..716f0f13559aa794d6e96da97f93ca4c98dc3d57 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2002--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2002--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;;;; http://www.w3.org/TR/SVG11
 ;;;; http://www.w3.org/TR/SVG12/ -- page, pageSet in draft
index 81f1fa78ce85095a8707f051bbfdcfc683647a63..d3e299ddd80c4bd4d0646b16101067f9e014620d 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-public (set-paper-dimension-variables mod)
   (module-define! mod 'dimension-variables
index d733d7c1d2b52244c649efb398162b475ae448cf..b3de9fc405876ce6fe7212b2e3d158210cded146 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
 ;; (name . (glyph clef-position octavation))
index 0bc41722cc821d54a9ef6fce097856c0b209cdf1..cfbdcd7cffa6b023f0137c0a82bfe9672c297e12 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2004--2008  Nicolas Sceaux  <nicolas.sceaux@free.fr>
+;;;; (c) 2004--2009  Nicolas Sceaux  <nicolas.sceaux@free.fr>
 ;;;;           Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define gen-lily-sym
index ddaa17033fc8a9540651efd31306eeaef2e688f6..81beaf6ae7d83c6dab583c1297dcd061fe775f3c 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2004--2008    Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009    Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;; todo: figure out how to make module,
 ;; without breaking nested ly scopes
index c08aa07a8eba0c6a428770b6769b7387a0a774b7..6db63bd90a9ca3205f627b985757e2ca76eea9d0 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPOnd music typesetter
 ;;;;
-;;;; (c) 2008 Carl D. Sorensen <c_sorensen@byu.edu>
+;;;; (c) 2008--2009 Carl D. Sorensen <c_sorensen@byu.edu>
 
 
 (define-public (parse-terse-string terse-definition)
index c70dbf8628572ad6f6125b2d583a39034351b836..cb20163c01e2062f495a7b95fa076e8975c74f5b 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2005--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2005--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define-module (scm ps-to-png))
 
index 443e8017b2227381b7632700e68e1bedddd0a9e1..43442c975fc697da16b44ac8aaa6102d507f44a2 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2004--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (map
  (lambda (sym)
index 5e2a2a9ca066c34b56f21583aac99302334f7adb..2a7bbd9755da66185b7d803b5285976640053cba 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-public default-script-alist
   '(("thumb" .
index 7ca15f7608b839a327be8bc5a74c7d812e67a7ba..e7617816417a22365f87729370f1997b048d6407 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;                 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
index 9067e0974e56262af5ca09db4032e7e298a55d77..8513c6389a3bd95499315bf6ea54e743719e1485 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-public (translate-stencil stencil coordinate-pair)
   "Translate @code{stencil} by the distances specified in
index d34b7113d46aa89eee62234d4c45f1db76832f4f..66f45fc8a5566e2d5de7dfbb0f460abde6db5e8c 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2004--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2004--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;;          Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-public (layout-extract-page-properties layout)
index e65f48f0cb59cf2814607c51ae3525ba66528aad..82c563da6b33d72dffebcd559b604d13bbb05d12 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2003--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 (define-module (scm to-xml))
index db392017898b890637a763555bc438c8556094fb..902da1287d3390fc0fdd757df6773ca1bfbecb48 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;; metronome marks
index 0183384f264f7f717df1bf423cdcc6bab61bc29d..dee58506bee36a4f0c0df307a042372d68cfff80 100644 (file)
@@ -3,7 +3,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2005--2008 Bernard Hurley <bernard@fong-hurley.org.uk>
+;;;; (c) 2005--2009 Bernard Hurley <bernard@fong-hurley.org.uk>
 ;;;;
 
 (define x11-color-list             
index bae147532ade79d073169488ffc97e07ad888164..b3170cdbf95ad51766b98e4f88d8a6d5da8238de 100644 (file)
@@ -1,5 +1,7 @@
 depth = ..
 
+SUBDIRS=auxiliar build
+
 SEXECUTABLES=convert-ly lilypond-book abc2ly etf2ly midi2ly lilypond-invoke-editor musicxml2ly lilysong lilymidi
 
 STEPMAKE_TEMPLATES=script help2man po
diff --git a/scripts/SConscript b/scripts/SConscript
deleted file mode 100644 (file)
index a69a637..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-sources = src_glob ('*.py')
-scripts = map (env.AT_COPY, sources)
-
-install (scripts, env['bindir'])
-
-po = env.Command ('lilypond.po', sources, env['pocommand'])
-env.Alias ('po-update', po)
diff --git a/scripts/auxiliar/GNUmakefile b/scripts/auxiliar/GNUmakefile
new file mode 100644 (file)
index 0000000..a80126d
--- /dev/null
@@ -0,0 +1,8 @@
+depth=../..
+
+EXTRA_DIST_FILES = $(call src-wildcard,*.sh) $(call src-wildcard,*.py)
+EXTRA_DIST_FILES += pfx2ttf.fontforge
+
+include $(depth)/make/stepmake.make
+
+default:
diff --git a/scripts/auxiliar/build-coverage.sh b/scripts/auxiliar/build-coverage.sh
new file mode 100755 (executable)
index 0000000..f61ff64
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+if test "$1" == "--fresh"; then
+  fresh=yes
+fi
+
+if test ! -f config-cov.make; then
+  fresh=yes
+fi
+
+if test "$fresh" = "yes";
+then
+  ./configure --enable-config=cov --disable-optimising \
+   &&   make conf=cov -j2 clean \
+   &&   perl -i~ -pe 's/-pipe /-fprofile-arcs -ftest-coverage -pipe /g' config-cov.make \
+   &&   perl -i~ -pe 's/ -ldl / -lgcov -ldl /g' config-cov.make
+else
+  find -name '*.gcda' -exec rm  '{}' ';'
+fi
+
+mkdir -p scripts/out-cov/
+touch scripts/out-cov/midi2ly scripts/out-cov/midi2ly.1
+make conf=cov -j2 &&  \
+  make conf=cov test-clean OUT_TEST=testcov LILYPOND_JOBS= && \
+  make conf=cov test OUT_TEST=testcov LILYPOND_JOBS='-dtrace-scheme-coverage '
+
+if test "$?" != "0"; then
+  tail -100 out-cov/test-run.log
+  exit 1
+fi
+
+depth=../..
+resultdir=out/coverage-results
+
+rm -rf $resultdir
+mkdir $resultdir
+cd $resultdir
+
+ln $depth/lily/* .
+ln $depth/scm/*.scm .
+mv $depth/input/regression/out-testcov/*.scm.cov .
+ln $depth/ly/*.ly .
+ln $depth/lily/out-cov/*[ch] .
+mkdir include
+ln $depth/lily/include/* include/
+ln $depth/flower/include/* include/
+for a in *[cl] *.yy
+do
+   gcov -o $depth/lily/out-cov/  -p $a > $a.gcov-summary
+done 
+
+$depth/scripts/auxiliar/coverage.py --uncovered *.cc > uncovered.txt
+$depth/scripts/auxiliar/coverage.py --hotspots *.cc > hotspots.txt
+$depth/scripts/auxiliar/coverage.py --summary *.cc > summary.txt
+$depth/scripts/auxiliar/coverage.py --uncovered *.scm > uncovered-scheme.txt
+
+head -20 summary.txt
+
+cat <<EOF
+results in
+
+  out/coverage-results/summary.txt
+  out/coverage-results/uncovered.txt
+  out/coverage-results/uncovered-scheme.txt
+  out/coverage-results/hotspots.txt
+
+EOF
diff --git a/scripts/auxiliar/build-profile.sh b/scripts/auxiliar/build-profile.sh
new file mode 100755 (executable)
index 0000000..072cf64
--- /dev/null
@@ -0,0 +1,87 @@
+#!/bin/sh
+
+if test "$1" == "--fresh"; then
+  fresh=yes
+fi
+
+if test ! -f config-prof.make; then
+  fresh=yes
+fi
+
+if test "$fresh" = "yes";
+then
+  ./configure --enable-config=prof --enable-optimising \
+   &&   perl -i~ -pe 's/-pipe /-pg -pipe /g' config-prof.make \
+   &&   perl -i~ -pe 's/ -ldl / -pg -ldl /g' config-prof.make
+fi
+
+make conf=prof -j2
+
+if test "$?" != "0"; then
+  exit 2
+fi
+
+depth=../..
+resultdir=out/profile-results
+
+rm -rf $resultdir
+mkdir $resultdir
+cd $resultdir
+
+
+cat > long-score.ly << EOF
+\version "2.10.0"
+foo = \new Staff \new Voice \repeat unfold 50 \relative { c4 d8[ d16( e]~ e16[ e e) f] g8  }
+\score { 
+  \new ChoirStaff << 
+    \foo \foo \foo \foo 
+    \foo \foo \foo \foo 
+
+  >>
+  \midi {}
+  \layout {}
+}
+EOF
+
+rm gmon.sum
+
+exe=$depth/out-prof/bin/lilypond
+
+## todo: figure out representative sample.
+files="wtk1-fugue2 wtk1-fugue2 wtk1-fugue2 wtk1-fugue2 mozart-hrn-3  mozart-hrn-3  long-score"
+
+
+
+$exe -ddump-profile --formats=ps -I $depth/input/ -I  $depth/input/mutopia/J.S.Bach/ \
+    -I $depth/input/mutopia/W.A.Mozart/ \
+    $files
+
+
+for a in *.profile; do
+  echo $a
+  cat $a
+done
+
+echo 'running gprof' 
+gprof $exe > profile
+
+exit 0
+
+
+## gprof -s takes forever.
+for a in seq 1 3; do
+  for f in $files ; do
+    $exe -ddump-profile --formats=ps -I $depth/input/ -I  $depth/input/mutopia/J.S.Bach/ \
+       -I $depth/input/mutopia/W.A.Mozart/ \
+       $f
+
+    echo 'running gprof' 
+    if test -f gmon.sum ; then
+      gprof -s $exe gmon.out gmon.sum
+    else
+      mv gmon.out gmon.sum
+    fi
+  done
+done
+
+gprof $exe gmon.sum > profile
diff --git a/scripts/auxiliar/check_texi_refs.py b/scripts/auxiliar/check_texi_refs.py
new file mode 100755 (executable)
index 0000000..dff7e33
--- /dev/null
@@ -0,0 +1,521 @@
+#!/usr/bin/env python
+
+"""
+check_texi_refs.py
+Interactive Texinfo cross-references checking and fixing tool
+
+"""
+
+
+import sys
+import re
+import os
+import optparse
+import imp
+
+outdir = 'out-www'
+
+log = sys.stderr
+stdout = sys.stdout
+
+file_not_found = 'file not found in include path'
+
+warn_not_fixed = '*** Warning: this broken x-ref has not been fixed!\n'
+
+opt_parser = optparse.OptionParser (usage='check_texi_refs.py [OPTION]... FILE',
+                                    description='''Check and fix \
+cross-references in a collection of Texinfo
+documents heavily cross-referenced each other.
+''')
+
+opt_parser.add_option ('-a', '--auto-fix',
+                       help="Automatically fix cross-references whenever \
+it is possible",
+                       action='store_true',
+                       dest='auto_fix',
+                       default=False)
+
+opt_parser.add_option ('-b', '--batch',
+                       help="Do not run interactively",
+                       action='store_false',
+                       dest='interactive',
+                       default=True)
+
+opt_parser.add_option ('-c', '--check-comments',
+                       help="Also check commented out x-refs",
+                       action='store_true',
+                       dest='check_comments',
+                       default=False)
+
+opt_parser.add_option ('-p', '--check-punctuation',
+                       help="Check punctuation after x-refs",
+                       action='store_true',
+                       dest='check_punctuation',
+                       default=False)
+
+opt_parser.add_option ("-I", '--include', help="add DIR to include path",
+                       metavar="DIR",
+                       action='append', dest='include_path',
+                       default=[os.path.abspath (os.getcwd ())])
+
+(options, files) = opt_parser.parse_args ()
+
+class InteractionError (Exception):
+    pass
+
+
+manuals_defs = imp.load_source ('manuals_defs', files[0])
+manuals = {}
+
+def find_file (name, prior_directory='.'):
+    p = os.path.join (prior_directory, name)
+    out_p = os.path.join (prior_directory, outdir, name)
+    if os.path.isfile (p):
+        return p
+    elif os.path.isfile (out_p):
+        return out_p
+
+    # looking for file in include_path
+    for d in options.include_path:
+        p = os.path.join (d, name)
+        if os.path.isfile (p):
+            return p
+
+    # file not found in include_path: looking in `outdir' subdirs
+    for d in options.include_path:
+        p = os.path.join (d, outdir, name)
+        if os.path.isfile (p):
+            return p
+
+    raise EnvironmentError (1, file_not_found, name)
+
+
+exit_code = 0
+
+def set_exit_code (n):
+    global exit_code
+    exit_code = max (exit_code, n)
+
+
+if options.interactive:
+    try:
+        import readline
+    except:
+        pass
+
+    def yes_prompt (question, default=False, retries=3):
+        d = {True: 'y', False: 'n'}.get (default, False)
+        while retries:
+            a = raw_input ('%s [default: %s]' % (question, d) + '\n')
+            if a.lower ().startswith ('y'):
+                return True
+            if a.lower ().startswith ('n'):
+                return False
+            if a == '' or retries < 0:
+                return default
+            stdout.write ("Please answer yes or no.\n")
+            retries -= 1
+
+    def search_prompt ():
+        """Prompt user for a substring to look for in node names.
+
+If user input is empty or matches no node name, return None,
+otherwise return a list of (manual, node name, file) tuples.
+
+"""
+        substring = raw_input ("Enter a substring to search in node names \
+(press Enter to skip this x-ref):\n")
+        if not substring:
+            return None
+        substring = substring.lower ()
+        matches = []
+        for k in manuals:
+            matches += [(k, node, manuals[k]['nodes'][node][0])
+                        for node in manuals[k]['nodes']
+                        if substring in node.lower ()]
+        return matches
+
+else:
+    def yes_prompt (question, default=False, retries=3):
+        return default
+
+    def search_prompt ():
+        return None
+
+
+ref_re = re.compile \
+    ('@(ref|ruser|rlearning|rprogram|rglos)(?:\\{(?P<ref>[^,\\\\\\}]+?)|\
+named\\{(?P<refname>[^,\\\\]+?),(?P<display>[^,\\\\\\}]+?))\\}(?P<last>.)',
+     re.DOTALL)
+node_include_re = re.compile (r'(?m)^@(node|include)\s+(.+?)$')
+
+whitespace_re = re.compile (r'\s+')
+line_start_re = re.compile ('(?m)^')
+
+def which_line (index, newline_indices):
+    """Calculate line number of a given string index
+
+Return line number of string index index, where
+newline_indices is an ordered iterable of all newline indices.
+"""
+    inf = 0
+    sup = len (newline_indices) - 1
+    n = len (newline_indices)
+    while inf + 1 != sup:
+        m = (inf + sup) / 2
+        if index >= newline_indices [m]:
+            inf = m
+        else:
+            sup = m
+    return inf + 1
+
+
+comments_re = re.compile ('(?<!@)(@c(?:omment)? \
+.*?\\n|^@ignore\\n.*?\\n@end ignore\\n)', re.M | re.S)
+
+def calc_comments_boundaries (texinfo_doc):
+    return [(m.start (), m.end ()) for m in comments_re.finditer (texinfo_doc)]
+
+
+def is_commented_out (start, end, comments_boundaries):
+    for k in range (len (comments_boundaries)):
+        if (start > comments_boundaries[k][0]
+            and end <= comments_boundaries[k][1]):
+            return True
+        elif end <= comments_boundaries[k][0]:
+            return False
+    return False
+
+
+def read_file (f, d):
+    s = open (f).read ()
+    base = os.path.basename (f)
+    dir = os.path.dirname (f)
+
+    d['contents'][f] = s
+
+    d['newline_indices'][f] = [m.end () for m in line_start_re.finditer (s)]
+    if options.check_comments:
+        d['comments_boundaries'][f] = []
+    else:
+        d['comments_boundaries'][f] = calc_comments_boundaries (s)
+
+    for m in node_include_re.finditer (s):
+        if m.group (1) == 'node':
+            line = which_line (m.start (), d['newline_indices'][f])
+            d['nodes'][m.group (2)] = (f, line)
+
+        elif m.group (1) == 'include':
+            try:
+                p = find_file (m.group (2), dir)
+            except EnvironmentError, (errno, strerror):
+                if strerror == file_not_found:
+                    continue
+                else:
+                    raise
+            read_file (p, d)
+
+
+def read_manual (name):
+    """Look for all node names and cross-references in a Texinfo document
+
+Return a (manual, dictionary) tuple where manual is the cross-reference
+macro name defined by references_dict[name], and dictionary
+has the following keys:
+
+  'nodes' is a dictionary of `node name':(file name, line number),
+
+  'contents' is a dictionary of file:`full file contents',
+
+  'newline_indices' is a dictionary of
+file:[list of beginning-of-line string indices],
+
+  'comments_boundaries' is a list of (start, end) tuples,
+which contain string indices of start and end of each comment.
+
+Included files that can be found in the include path are processed too.
+
+"""
+    d = {}
+    d['nodes'] = {}
+    d['contents'] = {}
+    d['newline_indices'] = {}
+    d['comments_boundaries'] = {}
+    manual = manuals_defs.references_dict.get (name, '')
+    try:
+        f = find_file (name + '.tely')
+    except EnvironmentError, (errno, strerror):
+        if not strerror == file_not_found:
+            raise
+        else:
+            try:
+                f = find_file (name + '.texi')
+            except EnvironmentError, (errno, strerror):
+                if strerror == file_not_found:
+                    sys.stderr.write (name + '.{texi,tely}: ' +
+                                      file_not_found + '\n')
+                    return (manual, d)
+                else:
+                    raise
+
+    log.write ("Processing manual %s (%s)\n" % (f, manual))
+    read_file (f, d)
+    return (manual, d)
+
+
+log.write ("Reading files...\n")
+
+manuals = dict ([read_manual (name)
+                 for name in manuals_defs.references_dict.keys ()])
+
+ref_fixes = set ()
+bad_refs_count = 0
+fixes_count = 0
+
+def add_fix (old_type, old_ref, new_type, new_ref):
+    ref_fixes.add ((old_type, old_ref, new_type, new_ref))
+
+
+def lookup_fix (r):
+    found = []
+    for (old_type, old_ref, new_type, new_ref) in ref_fixes:
+        if r == old_ref:
+            found.append ((new_type, new_ref))
+    return found
+
+
+def preserve_linebreak (text, linebroken):
+    if linebroken:
+        if ' ' in text:
+            text = text.replace (' ', '\n', 1)
+            n = ''
+        else:
+            n = '\n'
+    else:
+        n = ''
+    return (text, n)
+
+
+def choose_in_numbered_list (message, string_list, sep=' ', retries=3):
+    S = set (string_list)
+    S.discard ('')
+    string_list = list (S)
+    numbered_list = sep.join ([str (j + 1) + '. ' + string_list[j]
+                               for j in range (len (string_list))]) + '\n'
+    t = retries
+    while t > 0:
+        value = ''
+        stdout.write (message +
+                      "(press Enter to discard and start a new search)\n")
+        input = raw_input (numbered_list)
+        if not input:
+            return ''
+        try:
+            value = string_list[int (input) - 1]
+        except IndexError:
+            stdout.write ("Error: index number out of range\n")
+        except ValueError:
+            matches = [input in v for v in string_list]
+            n = matches.count (True)
+            if n == 0:
+                stdout.write ("Error: input matches no item in the list\n")
+            elif n > 1:
+                stdout.write ("Error: ambiguous input (matches several items \
+in the list)\n")
+            else:
+                value = string_list[matches.index (True)]
+        if value:
+            return value
+        t -= 1
+    raise InteractionError ("%d retries limit exceeded" % retries)
+
+refs_count = 0
+
+def check_ref (manual, file, m):
+    global fixes_count, bad_refs_count, refs_count
+    refs_count += 1
+    bad_ref = False
+    fixed = True
+    type = m.group (1)
+    original_name = m.group ('ref') or m.group ('refname')
+    name = whitespace_re.sub (' ', original_name). strip ()
+    newline_indices = manuals[manual]['newline_indices'][file]
+    line = which_line (m.start (), newline_indices)
+    linebroken = '\n' in original_name
+    original_display_name = m.group ('display')
+    next_char = m.group ('last')
+    if original_display_name: # the xref has an explicit display name
+        display_linebroken = '\n' in original_display_name
+        display_name = whitespace_re.sub (' ', original_display_name). strip ()
+    commented_out = is_commented_out \
+        (m.start (), m.end (), manuals[manual]['comments_boundaries'][file])
+    useful_fix = not outdir in file
+
+    # check puncuation after x-ref
+    if options.check_punctuation and not next_char in '.,;:!?':
+        stdout.write ("Warning: %s: %d: `%s': x-ref \
+not followed by punctuation\n" % (file, line, name))
+
+    # validate xref
+    explicit_type = type
+    new_name = name
+
+    if type != 'ref' and type == manual and not commented_out:
+        if useful_fix:
+            fixed = False
+            bad_ref = True
+            stdout.write ("\n%s: %d: `%s': external %s x-ref should be internal\n"
+                          % (file, line, name, type))
+            if options.auto_fix or yes_prompt ("Fix this?"):
+                type = 'ref'
+
+    if type == 'ref':
+        explicit_type = manual
+
+    if not name in manuals[explicit_type]['nodes'] and not commented_out:
+        bad_ref = True
+        fixed = False
+        stdout.write ('\n')
+        if type == 'ref':
+            stdout.write ("\e[1;31m%s: %d: `%s': wrong internal x-ref\e[0m\n"
+                          % (file, line, name))
+        else:
+            stdout.write ("\e[1;31m%s: %d: `%s': wrong external `%s' x-ref\e[0m\n"
+                          % (file, line, name, type))
+        # print context
+        stdout.write ('--\n' + manuals[manual]['contents'][file]
+                      [newline_indices[max (0, line - 2)]:
+                       newline_indices[min (line + 3,
+                                            len (newline_indices) - 1)]] +
+                      '--\n')
+
+        # try to find the reference in other manuals
+        found = []
+        for k in [k for k in manuals if k != explicit_type]:
+            if name in manuals[k]['nodes']:
+                if k == manual:
+                    found = ['ref']
+                    stdout.write ("\e[1;32m  found as internal x-ref\e[0m\n")
+                    break
+                else:
+                    found.append (k)
+                    stdout.write ("\e[1;32m  found as `%s' x-ref\e[0m\n" % k)
+
+        if (len (found) == 1
+            and (options.auto_fix or yes_prompt ("Fix this x-ref?"))):
+            add_fix (type, name, found[0], name)
+            type = found[0]
+            fixed = True
+
+        elif len (found) > 1 and useful_fix:
+            if options.interactive or options.auto_fix:
+                stdout.write ("* Several manuals contain this node name, \
+cannot determine manual automatically.\n")
+            if options.interactive:
+                t = choose_in_numbered_list ("Choose manual for this x-ref by \
+index number or beginning of name:\n", found)
+                if t:
+                    add_fix (type, name, t, name)
+                    type = t
+                    fixed = True
+
+        if not fixed:
+            # try to find a fix already made
+            found = lookup_fix (name)
+
+            if len (found) == 1:
+                stdout.write ("Found one previous fix: %s `%s'\n" % found[0])
+                if options.auto_fix or yes_prompt ("Apply this fix?"):
+                    type, new_name = found[0]
+                    fixed = True
+
+            elif len (found) > 1:
+                if options.interactive or options.auto_fix:
+                    stdout.write ("* Several previous fixes match \
+this node name, cannot fix automatically.\n")
+                if options.interactive:
+                    concatened = choose_in_numbered_list ("Choose new manual \
+and x-ref by index number or beginning of name:\n", [''.join ([i[0], ' ', i[1]])
+                                                     for i in found],
+                                                    sep='\n')
+                    if concatened:
+                        type, new_name = concatenated.split (' ', 1)
+                        fixed = True
+
+        if not fixed:
+            # all previous automatic fixing attempts failed,
+            # ask user for substring to look in node names
+            while True:
+                node_list = search_prompt ()
+                if node_list == None:
+                    if options.interactive:
+                        stdout.write (warn_not_fixed)
+                    break
+                elif not node_list:
+                    stdout.write ("No matched node names.\n")
+                else:
+                    concatenated = choose_in_numbered_list ("Choose \
+node name and manual for this x-ref by index number or beginning of name:\n", \
+                            [' '.join ([i[0], i[1], '(in %s)' % i[2]])
+                             for i in node_list],
+                                                            sep='\n')
+                    if concatenated:
+                        t, z = concatenated.split (' ', 1)
+                        new_name = z.split (' (in ', 1)[0]
+                        add_fix (type, name, t, new_name)
+                        type = t
+                        fixed = True
+                        break
+
+    if fixed and type == manual:
+        type = 'ref'
+    bad_refs_count += int (bad_ref)
+    if bad_ref and not useful_fix:
+        stdout.write ("*** Warning: this file is automatically generated, \
+please fix the code source instead of generated documentation.\n")
+
+    # compute returned string
+    if new_name == name:
+        if bad_ref and (options.interactive or options.auto_fix):
+            # only the type of the ref was fixed
+            fixes_count += int (fixed)
+        if original_display_name:
+            return ('@%snamed{%s,%s}' % (type, original_name, original_display_name)) + next_char
+        else:
+            return ('@%s{%s}' % (type, original_name)) + next_char
+    else:
+        fixes_count += int (fixed)
+        (ref, n) = preserve_linebreak (new_name, linebroken)
+        if original_display_name:
+            if bad_ref:
+                stdout.write ("Current display name is `%s'\n")
+                display_name = raw_input \
+                    ("Enter a new display name or press enter to keep the existing name:\n") \
+                    or display_name
+                (display_name, n) = preserve_linebreak (display_name, display_linebroken)
+            else:
+                display_name = original_display_name
+            return ('@%snamed{%s,%s}' % (type, ref, display_name)) + \
+                next_char + n
+        else:
+            return ('@%s{%s}' % (type, ref)) + next_char + n
+
+
+log.write ("Checking cross-references...\n")
+
+try:
+    for key in manuals:
+        for file in manuals[key]['contents']:
+            s = ref_re.sub (lambda m: check_ref (key, file, m),
+                            manuals[key]['contents'][file])
+            if s != manuals[key]['contents'][file]:
+                open (file, 'w').write (s)
+except KeyboardInterrupt:
+    log.write ("Operation interrupted, exiting.\n")
+    sys.exit (2)
+except InteractionError, instance:
+    log.write ("Operation refused by user: %s\nExiting.\n" % instance)
+    sys.exit (3)
+
+log.write ("\e[1;36mDone: %d x-refs found, %d bad x-refs found, fixed %d.\e[0m\n" %
+           (refs_count, bad_refs_count, fixes_count))
diff --git a/scripts/auxiliar/check_translation.py b/scripts/auxiliar/check_translation.py
new file mode 100755 (executable)
index 0000000..090b1fb
--- /dev/null
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+
+import __main__
+import optparse
+import os
+import sys
+
+import langdefs
+import buildlib
+
+verbose = 0
+use_colors = False
+lang = 'C'
+C = lang
+
+def dir_lang (file, lang, lang_dir_index):
+    path_components = file.split ('/')
+    path_components[lang_dir_index] = lang
+    return os.path.join (*path_components)
+
+def do_file (file_name, lang_codes, buildlib):
+    if verbose:
+        sys.stderr.write ('%s...\n' % file_name)
+    split_file_name = file_name.split ('/')
+    d1, d2 = split_file_name[0:2]
+    if d1 in lang_codes:
+        check_lang = d1
+        lang_dir_index = 0
+    elif d2 in lang_codes:
+        check_lang = d2
+        lang_dir_index = 1
+    else:
+        check_lang = lang
+    if check_lang == C:
+        raise Exception ('cannot determine language for ' + file_name)
+    
+    original = dir_lang (file_name, '', lang_dir_index)
+    translated_contents = open (file_name).read ()
+    (diff_string, error) \
+        = buildlib.check_translated_doc (original,
+                                         file_name,
+                                         translated_contents,
+                                         color=use_colors and not update_mode)
+
+    if error:
+        sys.stderr.write ('warning: %s: %s' % (file_name, error))
+
+    if update_mode:
+        if error or len (diff_string) >= os.path.getsize (original):
+            buildlib.read_pipe (text_editor + ' ' + file_name + ' ' + original)
+        elif diff_string:
+            diff_file = original + '.diff'
+            f = open (diff_file, 'w')
+            f.write (diff_string)
+            f.close ()
+            buildlib.read_pipe (text_editor + ' ' + file_name + ' ' + diff_file)
+            os.remove (diff_file)
+    else:
+        sys.stdout.write (diff_string)
+
+def usage ():
+    sys.stdout.write (r'''
+Usage:
+check-translation [--language=LANG] [--verbose] [--update] FILE...
+
+This script is licensed under the GNU GPL.
+''')
+
+def do_options ():
+    global lang, verbose, update_mode, use_colors
+
+    p = optparse.OptionParser (usage="check-translation [--language=LANG] [--verbose] FILE...",
+                               description="This script is licensed under the GNU GPL.")
+    p.add_option ("--language",
+                  action='store',
+                  default='site',
+                  dest="language")
+    p.add_option ("--no-color",
+                  action='store_false',
+                  default=True,
+                  dest="color",
+                  help="do not print ANSI-cooured output")
+    p.add_option ("--verbose",
+                  action='store_true',
+                  default=False,
+                  dest="verbose",
+                  help="print details, including executed shell commands")
+    p.add_option ('-u', "--update",
+                  action='store_true',
+                  default=False,
+                  dest='update_mode',
+                  help='call $EDITOR to update the translation')
+    
+    (options, files) = p.parse_args ()
+    verbose = options.verbose
+    lang = options.language
+    use_colors = options.color
+    update_mode = options.update_mode
+    
+    return files
+
+def main ():
+    global update_mode, text_editor
+
+    files = do_options ()
+    if 'EDITOR' in os.environ:
+        text_editor = os.environ['EDITOR']
+    else:
+        update_mode = False
+    
+    buildlib.verbose = verbose
+
+    for i in files:
+        do_file (i, langdefs.LANGDICT.keys (), buildlib)
+
+if __name__ == '__main__':
+    main ()
diff --git a/scripts/auxiliar/coverage.py b/scripts/auxiliar/coverage.py
new file mode 100755 (executable)
index 0000000..9ff86b0
--- /dev/null
@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+
+import os
+import glob
+import re
+import sys
+import optparse
+
+#File 'accidental-engraver.cc'
+#Lines executed:87.70% of 252
+
+def summary (args):
+    results = []
+    for f in args:
+        str = open (f).read ()
+        m = re.search ("File '([^']+.cc)'\s*Lines executed:([0-9.]+)% of ([0-9]+)", str)
+
+        if m and '/usr/lib' in m.group (1):
+            continue
+
+        if m:
+            cov = float (m.group (2))
+            lines = int (m.group (3))
+            pain = lines * (100.0 - cov)
+            file = m.group (1)
+            tup = (pain, locals ().copy())
+
+            results.append(tup)
+
+    results.sort ()
+    results.reverse()
+
+    print 'files sorted by number of untested lines (decreasing)'
+    print
+    print '%5s (%6s): %s' % ('cov %', 'lines', 'file')
+    print '----------------------------------------------'
+
+    for (pain, d) in results:
+        print '%(cov)5.2f (%(lines)6d): %(file)s' % d
+
+class Chunk:
+    def __init__ (self, range, coverage_count, all_lines, file):
+        assert coverage_count >= 0
+        assert type (range) == type (())
+        
+        self.coverage_count = coverage_count
+        self.range = range
+        self.all_lines = all_lines
+        self.file = file
+
+    def length (self):
+        return self.range[1] - self.range[0]
+
+    def text (self):
+        return ''.join ([l[2] for l in self.lines()])
+        
+    def lines (self):
+        return self.all_lines[self.range[0]:
+                              self.range[1]]
+    def widen (self):
+        self.range = (min (self.range[0] -1, 0),
+                      self.range[0] +1)
+    def write (self):
+        print 'chunk in', self.file
+        for (c, n, l) in self.lines ():
+            cov = '%d' % c
+            if c == 0:
+                cov = '#######'
+            elif c < 0:
+                cov = ''
+            sys.stdout.write ('%8s:%8d:%s' % (cov, n, l))
+            
+    def uncovered_score (self):
+        return self.length ()
+    
+class SchemeChunk (Chunk):
+    def uncovered_score (self):
+        text = self.text ()
+        if (text.startswith  ('(define ')
+            and not text.startswith ('(define (')):
+            return 0
+
+        if text.startswith  ('(use-modules '):
+            return 0
+
+        if (text.startswith  ('(define-public ')
+            and not text.startswith ('(define-public (')):
+            return 0
+
+        return len ([l for (c,n,l) in self.lines() if (c == 0)]) 
+
+def read_gcov (f):
+    ls = []
+
+    in_lines = [l for l in open (f).readlines ()]
+    (count_len, line_num_len) = tuple (map (len, in_lines[0].split (':')[:2]))
+    
+    for l in in_lines:
+        c = l[:count_len].strip ()
+        l = l[count_len+1:]
+        n = int (l[:line_num_len].strip ())
+
+        if n == 0:
+            continue
+
+        if '#' in c:
+            c = 0
+        elif c == '-':
+            c = -1
+        else:
+            c = int (c)
+        
+        l = l[line_num_len+1:]
+
+        ls.append ((c,n,l))
+        
+    return ls
+
+def get_c_chunks (ls, file):
+    chunks = []
+    chunk = []
+
+    last_c = -1
+    for (c, n, l) in ls:
+        if not (c == last_c or c < 0 and l != '}\n'):
+            if chunk and last_c >= 0:
+                nums = [n-1 for (n, l) in chunk]
+                chunks.append (Chunk ((min (nums), max (nums)+1),
+                                      last_c, ls, file))
+                chunk = []
+
+        chunk.append ((n,l))
+        if c >= 0:
+            last_c = c
+            
+    return chunks
+
+def get_scm_chunks (ls, file):
+    chunks = []
+    chunk = []
+
+    def new_chunk ():
+        if chunk:
+            nums = [n-1 for (n, l) in chunk]
+            chunks.append (SchemeChunk ((min (nums), max (nums)+1),
+                                        max (last_c, 0), ls, file))
+            chunk[:] = []
+        
+    last_c = -1
+    for (cov_count, line_number, line) in ls:
+        if line.startswith ('('):
+            new_chunk ()
+            last_c = -1
+        
+        chunk.append ((line_number, line))
+        if cov_count >= 0:
+            last_c = cov_count
+
+    return chunks
+
+def widen_chunk (ch, ls):
+    a -= 1
+    b += 1
+
+    return [(n, l)  for (c, n, l) in ls[a:b]]
+    
+
+def extract_chunks (file):
+    try:
+        ls = read_gcov (file)
+    except IOError, s :
+        print s
+        return []
+        
+    cs = []
+    if 'scm' in file:
+        cs = get_scm_chunks (ls, file)
+    else:
+        cs = get_c_chunks (ls, file)
+    return cs
+
+
+def filter_uncovered (chunks):
+    def interesting (c):
+        if c.coverage_count > 0:
+            return False
+        
+        t = c.text()
+        for stat in  ('warning', 'error', 'print', 'scm_gc_mark'):
+            if stat in t:
+                return False
+        return True
+   
+    return [c for c in chunks if interesting (c)]
+    
+
+def main ():
+    p = optparse.OptionParser (usage="usage coverage.py [options] files",
+                               description="")
+    p.add_option ("--summary",
+                  action='store_true',
+                  default=False,
+                  dest="summary")
+    
+    p.add_option ("--hotspots",
+                  default=False,
+                  action='store_true',
+                  dest="hotspots")
+    
+    p.add_option ("--uncovered",
+                  default=False,
+                  action='store_true',
+                  dest="uncovered")
+
+    
+    (options, args) = p.parse_args ()
+    
+
+    if options.summary:
+        summary (['%s.gcov-summary' % s for s in args])
+
+    if options.uncovered or options.hotspots:
+        chunks = []
+        for a in args:
+            name = a
+            if name.endswith ('scm'):
+                name += '.cov'
+            else:
+                name += '.gcov'
+            
+            chunks += extract_chunks  (name)
+
+        if options.uncovered:
+            chunks = filter_uncovered (chunks)
+            chunks = [(c.uncovered_score (), c) for c in chunks if c.uncovered_score() > 0]
+        elif options.hotspots:
+            chunks = [((c.coverage_count, -c.length()), c) for c in chunks]
+            
+            
+        chunks.sort ()
+        chunks.reverse ()
+        for (score, c) in chunks:
+            c.write ()
+
+            
+        
+if __name__ == '__main__':
+    main ()
diff --git a/scripts/auxiliar/find-superfluous-includes.py b/scripts/auxiliar/find-superfluous-includes.py
new file mode 100755 (executable)
index 0000000..de40df0
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+import sys
+import re
+import os
+
+
+full_paths = {}
+incs = {}
+inc_re = re.compile ('^#include "([^"]+)"')
+def parse_file (fn):
+    lst = []
+
+    lc = 0
+    for l in open (fn).readlines():
+        lc += 1
+        m = inc_re.search (l)
+        if m:
+            lst.append ((lc, m.group (1)))
+
+    base = os.path.split (fn)[1]
+    full_paths[base] = fn
+    incs[base] = lst
+    
+
+def has_include (f, name):
+    try:
+        return name in [b for (a,b) in incs[f]]
+    except KeyError:
+        return False
+
+for a in sys.argv:
+    parse_file (a)
+
+print '-*-compilation-*-'
+for (f, lst) in incs.items ():
+    for (n, inc) in lst:
+        for (n2, inc2) in lst:
+            if has_include (inc2, inc):
+                print "%s:%d: already have %s from %s" % (full_paths[f], n,
+                                                          inc, inc2)
+                break
+
+        
+    
diff --git a/scripts/auxiliar/fixcc.py b/scripts/auxiliar/fixcc.py
new file mode 100755 (executable)
index 0000000..34e9a89
--- /dev/null
@@ -0,0 +1,625 @@
+#!/usr/bin/env python
+
+# fixcc -- nitpick lily's c++ code
+
+# TODO
+#  * maintainable rules: regexp's using whitespace (?x) and match names
+#    <identifier>)
+#  * trailing `*' vs. function definition
+#  * do not break/change indentation of fixcc-clean files
+#  * check lexer, parser
+#  * rewrite in elisp, add to cc-mode
+#  * using regexes is broken by design
+#  * ?
+#  * profit
+
+import __main__
+import getopt
+import os
+import re
+import string
+import sys
+import time
+
+COMMENT = 'COMMENT'
+STRING = 'STRING'
+GLOBAL_CXX = 'GC++'
+CXX = 'C++'
+verbose_p = 0
+indent_p = 0
+
+rules = {
+    GLOBAL_CXX:
+    [
+    # delete gratuitous block
+    ('''\n(    |\t)\s*{\n\s*(.*?)(?![{}]|\b(do|for|else|if|switch|while)\b);\n\s*}''',
+    '\n\\2;'),
+    ],
+    CXX:
+    [
+    # space before parenthesis open
+    ('([^\( \]])[ \t]*\(', '\\1 ('),
+    # space after comma
+    ("\([^'],\)[ \t]*", '\1 '),
+    # delete gratuitous block
+    ('''\n(    |\t)\s*{\n\s*(.*?)(?![{}]|\b(do|for|else|if|switch|while)\b);\n\s*}''',
+    '\n\\2;'),
+    # delete inline tabs
+    ('(\w)\t+', '\\1 '),
+    # delete inline double spaces
+    ('   *', ' '),
+    # delete space after parenthesis open
+    ('\([ \t]*', '('),
+    # delete space before parenthesis close
+    ('[ \t]*\)', ')'),
+    # delete spaces after prefix
+    ('(--|\+\+)[ \t]*([\w\)])', '\\1\\2'),
+    # delete spaces before postfix
+    ('([\w\)\]])[ \t]*(--|\+\+)', '\\1\\2'),
+    # delete space after parenthesis close
+    #('\)[ \t]*([^\w])', ')\\1'),
+    # delete space around operator
+    # ('([\w\(\)\]])([ \t]*)(::|\.)([ \t]*)([\w\(\)])', '\\1\\3\\5'),
+    ('([\w\(\)\]])([ \t]*)(\.|->)([ \t]*)([\w\(\)])', '\\1\\3\\5'),
+    # delete space after operator
+    ('(::)([ \t]*)([\w\(\)])', '\\1\\3'),
+    # delete superflous space around operator
+    ('([\w\(\)\]])([ \t]+)(&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|\+|-|=|/|:|&|\||\*)([ \t]+)([\w\(\)])', '\\1 \\3 \\5'),
+    # space around operator1
+    ('([\w\)\]]) *(&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|=|/|:|&|\||\*) *([\w\(])', '\\1 \\2 \\3'),
+    # space around operator2
+    ('([\w\)\]]) *(&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|=|/|:|&|\||\*) ([^\w\s])', '\\1 \\2 \\3'),
+    # space around operator3
+    ('([^\w\s]) (&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|[^-]>|=|/|:|&|\||\*) *([\w\(])', '\\1 \\2 \\3'),
+    # space around operator4
+    ('([\w\(\)\]]) (\*|/|\+|-) *([-:])', '\\1 \\2 \\3'),
+    # space around +/-; exponent
+    ('([\w\)\]])(\+|-)([_A-Za-z\(])', '\\1 \\2 \\3'),
+    ('([_\dA-Za-df-z\)\]])(\+|-)([\w\(])', '\\1 \\2 \\3'),
+    # trailing operator
+    (' (::|&&|\|\||<=|>=|!=|\|=|==|\+=|-=|\*=|/=|\?|<|>|\+|-|=|/|:|&XXX|\||\*XXX)[ \t]*\n([ \t]*)',         '\n\\2\\1 '),
+    # pointer
+    ##('(bool|char|const|delete|int|stream|unsigned|void|size_t|struct \w+|[A-Z]\w*|,|;|&&|<|[^-]>|\|\||-|\+)[ \t]*(\*|&)[ \t]*', '\\1 \\2'),
+    ('(bool|char|const|delete|int|stream|unsigned|void|size_t|struct \w+|[A-Z]\w*|,|;|:|=|\?\)|&&|<|[^-]>|\|\||-|\+)[ \t]*(\*|&)[ \t]*', '\\1 \\2'),
+    #to#('(bool|char|const|delete|int|stream|unsigned|void|([A-Z]\w*)|[,])[ \n\t]*(\*|&)[ \t]*', '\\1 \\3'),
+    # pointer with template
+    ('(( *((bool|char|const|delete|int|stream|unsigned|void|size_t|class[ \t]+\w*|[A-Z]\w*|\w+::\w+|[,])[ \*&],*)+)>) *(\*|&) *', '\\1 \\5'),
+    #to#('(( *((bool|char|delete|int|stream|unsigned|void|(class[ \t]+\w*)|([A-Z]\w*)|[,])[ \*&],*)+)>)[ \t\n]*(\*|&) *', '\\1 \\7'),
+    # unary pointer, minus, not
+    ('(return|=) (\*|&|-|!) ([\w\(])', '\\1 \\2\\3'),
+    # space after `operator'
+    ('(\Woperator) *([^\w\s])', '\\1 \\2'),
+    # dangling brace close
+    ('\n[ \t]*(\n[ \t]*})', '\\1'),
+    # dangling newline
+    ('\n[ \t]*\n[ \t]*\n', '\n\n'),
+    # dangling parenthesis open
+    #('[ \t]*\n[ \t]*\([ \t]*\n', '('),
+    ('\([ \t]*\n', '('),
+    # dangling parenthesis close
+    ('\n[ \t]*\)', ')'),
+    # dangling comma
+    ('\n[ \t]*,', ','),
+    # dangling semicolon
+    ('\n[ \t]*;', ';'),
+    # brace open
+    ('(\w)[ \t]*([^\s]*){([ \t]*\n)', '\\1\\2\n{\n'),
+    # brace open backslash
+    ('(\w[^\n]*){[ \t]*\\\\\n', '\\1\\\n{\\\n'),
+    # brace close
+    ("}[ \t]*([^'\n]*\w[^\n\\\]*)\n", '}\n\\1\n'),
+    # brace close backslash
+    ("}[ \t]*([^'\n]*\w[^\n\\\]*)", '\n}\n\\1'),
+    # delete space after `operator'
+    #('(\Woperator) (\W)', '\\1\\2'),
+    # delete space after case, label
+    ('(\W(case|label) ([\w]+)) :', '\\1:'),
+    # delete space before comma
+    ('[ \t]*,', ','),
+    # delete space before semicolon
+    ('[ \t]*;', ';'),
+    # delete space before eol-backslash
+    ('[ \t]*\\\\\n', '\\\n'),
+    # delete trailing whitespace
+    ('[ \t]*\n', '\n'),
+
+    ## Deuglify code that also gets ugly by rules above.
+    # delete newline after typedef struct
+    ('(typedef struct\s+([\w]*\s){([^}]|{[^}]*})*})\s*\n\s*(\w[\w\d]*;)', '\\1 \\4'),
+    # delete spaces around template brackets
+    #('(dynamic_cast|template|([A-Z]\w*))[ \t]*<[ \t]*(( *(bool|char|int|unsigned|void|(class[ \t]+\w*)|([A-Z]\w*)),?)+)[ \t]?(| [\*&])[ \t]*>', '\\1<\\3\\8>'),
+    ('(dynamic_cast|template|typedef|\w+::\w+|[A-Z]\w*)[ \t]*<[ \t]*(( *(bool|char|const|int|unsigned|void|size_t|class[ \t]+\w*|[A-Z]\w*)( *[\*&]?,|[\*&])*)+)[ \t]?(| [\*&])[ \t]*>', '\\1<\\2\\6>'),
+    ('(\w+::\w+|[A-Z]\w*) < ((\w+::\w+|[A-Z]\w*)<[A-Z]\w*>) >', '\\1<\\2 >'),
+    ('((if|while)\s+\(([^\)]|\([^\)]*\))*\))\s*;', '\\1\n;'),
+    ('(for\s+\(([^;]*;[^;]*;([^\)]|\([^\)]*\))*)\))\s*;', '\\1\n;'),
+    # do {..} while
+    ('(}\s*while\s*)(\(([^\)]|\([^\)]*\))*\))\s*;', '\\1\\2;'),
+
+    ## Fix code that gets broken by rules above.
+    ##('->\s+\*', '->*'),
+    # delete space before #define x()
+    ('#[ \t]*define (\w*)[ \t]*\(', '#define \\1('),
+    # add space in #define x ()
+    ('#[ \t]*define (\w*)(\(([^\(\)]|\([^\(\)]*\))*\)\\n)',
+    '#define \\1 \\2'),
+    # delete space in #include <>
+    ('#[ \t]*include[ \t]*<[ \t]*([^ \t>]*)[ \t]*(/?)[ \t]*([^ \t>]*)[ \t]*>',
+    '#include <\\1\\2\\3>'),
+    # delete backslash before empty line (emacs' indent region is broken)
+    ('\\\\\n\n', '\n\n'),
+    ],
+
+    COMMENT:
+    [
+    # delete trailing whitespace
+    ('[ \t]*\n', '\n'),
+    # delete empty first lines
+    ('(/\*\n)\n*', '\\1'),
+    # delete empty last lines
+    ('\n*(\n\*/)', '\\1'),
+    ## delete newline after start?
+    #('/(\*)\n', '\\1'),
+    ## delete newline before end?
+    #('\n(\*/)', '\\1'),
+    ],
+    }
+
+# Recognize special sequences in the input.
+#
+#   (?P<name>regex) -- Assign result of REGEX to NAME.
+#   *? -- Match non-greedily.
+#   (?m) -- Multiline regex: Make ^ and $ match at each line.
+#   (?s) -- Make the dot match all characters including newline.
+#   (?x) -- Ignore whitespace in patterns.
+no_match = 'a\ba'
+snippet_res = {
+    CXX: {
+    'multiline_comment':
+    r'''(?sx)
+    (?P<match>
+    (?P<code>
+    [ \t]*/\*.*?\*/))''',
+    
+    'singleline_comment':
+    r'''(?mx)
+    ^.*
+    (?P<match>
+    (?P<code>
+    [ \t]*//([ \t][^\n]*|)\n))''',
+
+    'string':
+    r'''(?x)
+    (?P<match>
+    (?P<code>
+    "([^\"\n](\")*)*"))''',
+    
+    'char':
+    r'''(?x)
+    (?P<match>
+    (?P<code>
+    '([^']+|\')))''',
+     
+     'include':
+     r'''(?x)
+     (?P<match>
+     (?P<code>
+     "#[ \t]*include[ \t]*<[^>]*>''',
+     },
+     }
+
+class Chunk:
+    def replacement_text (self):
+        return ''
+
+    def filter_text (self):
+        return self.replacement_text ()
+
+class Substring (Chunk):
+    def __init__ (self, source, start, end):
+        self.source = source
+        self.start = start
+        self.end = end
+
+    def replacement_text (self):
+        s = self.source[self.start:self.end]
+        if verbose_p:
+            sys.stderr.write ('CXX Rules')
+        for i in rules[CXX]:
+            if verbose_p:
+                sys.stderr.write ('.')
+                #sys.stderr.write ('\n\n***********\n')
+                #sys.stderr.write (i[0])
+                #sys.stderr.write ('\n***********\n')
+                #sys.stderr.write ('\n=========>>\n')
+                #sys.stderr.write (s)
+                #sys.stderr.write ('\n<<=========\n')
+            s = re.sub (i[0], i[1], s)
+        if verbose_p:
+            sys.stderr.write ('done\n')
+        return s
+        
+
+class Snippet (Chunk):
+    def __init__ (self, type, match, format):
+        self.type = type
+        self.match = match
+        self.hash = 0
+        self.options = []
+        self.format = format
+
+    def replacement_text (self):
+        return self.match.group ('match')
+
+    def substring (self, s):
+        return self.match.group (s)
+
+    def __repr__ (self):
+        return `self.__class__` + ' type = ' + self.type
+
+class Multiline_comment (Snippet):
+    def __init__ (self, source, match, format):
+        self.type = type
+        self.match = match
+        self.hash = 0
+        self.options = []
+        self.format = format
+
+    def replacement_text (self):
+        s = self.match.group ('match')
+        if verbose_p:
+            sys.stderr.write ('COMMENT Rules')
+        for i in rules[COMMENT]:
+            if verbose_p:
+                sys.stderr.write ('.')
+            s = re.sub (i[0], i[1], s)
+        return s
+
+snippet_type_to_class = {
+    'multiline_comment': Multiline_comment,
+#        'string': Multiline_comment,
+#        'include': Include_snippet,
+}
+
+def find_toplevel_snippets (s, types):
+    if verbose_p:
+        sys.stderr.write ('Dissecting')
+
+    res = {}
+    for i in types:
+        res[i] = re.compile (snippet_res[format][i])
+
+    snippets = []
+    index = 0
+    ## found = dict (map (lambda x: (x, None),
+    ##                      types))
+    ## urg python2.1
+    found = {}
+    map (lambda x, f = found: f.setdefault (x, None),
+      types)
+
+    # We want to search for multiple regexes, without searching
+    # the string multiple times for one regex.
+    # Hence, we use earlier results to limit the string portion
+    # where we search.
+    # Since every part of the string is traversed at most once for
+    # every type of snippet, this is linear.
+
+    while 1:
+        if verbose_p:
+            sys.stderr.write ('.')
+        first = None
+        endex = 1 << 30
+        for type in types:
+            if not found[type] or found[type][0] < index:
+                found[type] = None
+                m = res[type].search (s[index:endex])
+                if not m:
+                    continue
+
+                cl = Snippet
+                if snippet_type_to_class.has_key (type):
+                    cl = snippet_type_to_class[type]
+                snip = cl (type, m, format)
+                start = index + m.start ('match')
+                found[type] = (start, snip)
+
+            if found[type] \
+             and (not first \
+                or found[type][0] < found[first][0]):
+                first = type
+
+                # FIXME.
+
+                # Limiting the search space is a cute
+                # idea, but this *requires* to search
+                # for possible containing blocks
+                # first, at least as long as we do not
+                # search for the start of blocks, but
+                # always/directly for the entire
+                # @block ... @end block.
+
+                endex = found[first][0]
+
+        if not first:
+            snippets.append (Substring (s, index, len (s)))
+            break
+
+        (start, snip) = found[first]
+        snippets.append (Substring (s, index, start))
+        snippets.append (snip)
+        found[first] = None
+        index = start + len (snip.match.group ('match'))
+
+    return snippets
+
+def nitpick_file (outdir, file):
+    s = open (file).read ()
+
+    for i in rules[GLOBAL_CXX]:
+        s = re.sub (i[0], i[1], s)
+
+    # FIXME: Containing blocks must be first, see
+    #        find_toplevel_snippets.
+    #        We leave simple strings be part of the code
+    snippet_types = (
+        'multiline_comment',
+        'singleline_comment',
+        'string',
+#                'char',
+        )
+
+    chunks = find_toplevel_snippets (s, snippet_types)
+    #code = filter (lambda x: is_derived_class (x.__class__, Substring),
+    #               chunks)
+
+    t = string.join (map (lambda x: x.filter_text (), chunks), '')
+    fixt = file
+    if s != t:
+        if not outdir:
+            os.system ('mv %s %s~' % (file, file))
+        else: 
+            fixt = os.path.join (outdir,
+                      os.path.basename (file))
+        h = open (fixt, "w")
+        h.write (t)
+        h.close ()
+    if s != t or indent_p:
+        indent_file (fixt)
+
+def indent_file (file):
+    emacs = '''emacs\
+    --no-window-system\
+    --batch\
+    --no-site-file\
+    --no-init-file\
+    %(file)s\
+    --eval '(let ((error nil)
+           (version-control nil))
+        (load-library "cc-mode")
+        (c++-mode)
+        (indent-region (point-min) (point-max))
+        (if (buffer-modified-p (current-buffer))
+         (save-buffer)))' ''' % vars ()
+    emacsclient = '''emacsclient\
+    --socket-name=%(socketdir)s/%(socketname)s\
+    --no-wait\
+    --eval '(let ((error nil)
+           (version-control nil))
+        (load-library "cc-mode")
+        (find-file "%(file)s")
+        (c++-mode)
+        (indent-region (point-min) (point-max))
+        (if (buffer-modified-p (current-buffer))
+         (save-buffer)))' ''' \
+         % { 'file': file,
+           'socketdir' : socketdir,
+           'socketname' : socketname, }
+    if verbose_p:
+        sys.stderr.write (emacs)
+        sys.stderr.write ('\n')
+    os.system (emacs)
+
+
+def usage ():
+    sys.stdout.write (r'''
+Usage:
+fixcc [OPTION]... FILE...
+
+Options:
+ --help
+ --indent   reindent, even if no changes
+ --verbose
+ --test
+
+Typical use with LilyPond:
+
+ fixcc $(find flower kpath-guile lily -name '*cc' -o -name '*hh' | grep -v /out)
+
+This script is licensed under the GNU GPL
+''')
+
+def do_options ():
+    global indent_p, outdir, verbose_p
+    (options, files) = getopt.getopt (sys.argv[1:], '',
+                     ['help', 'indent', 'outdir=',
+                     'test', 'verbose'])
+    for (o, a) in options:
+        if o == '--help':
+            usage ()
+            sys.exit (0)
+        elif o == '--indent':
+            indent_p = 1
+        elif o == '--outdir':
+            outdir = a
+        elif o == '--verbose':
+            verbose_p = 1
+        elif o == '--test':
+            test ()
+            sys.exit (0)
+        else:
+            assert unimplemented
+    if not files:
+        usage ()
+        sys.exit (2)
+    return files
+
+
+outdir = 0
+format = CXX
+socketdir = '/tmp/fixcc'
+socketname = 'fixcc%d' % os.getpid ()
+
+def setup_client ():
+    #--no-window-system\
+    #--batch\
+    os.unlink (os.path.join (socketdir, socketname))
+    os.mkdir (socketdir, 0700)
+    emacs='''emacs\
+        --no-site-file\
+        --no-init-file\
+        --eval '(let ((error nil)
+               (version-control nil))
+            (load-library "server")
+            (setq server-socket-dir "%(socketdir)s")
+            (setq server-name "%(socketname)s")
+            (server-start)
+            (while t) (sleep 1000))' ''' \
+            % { 'socketdir' : socketdir,
+              'socketname' : socketname, }
+              
+    if not os.fork ():
+        os.system (emacs)
+        sys.exit (0)
+    while not os.path.exists (os.path.join (socketdir, socketname)):
+        time.sleep (1)
+
+def main ():
+    #emacsclient should be faster, but this does not work yet
+    #setup_client ()
+    files = do_options ()
+    if outdir and not os.path.isdir (outdir):
+        os.makedirs (outdir)
+    for i in files:
+        sys.stderr.write ('%s...\n' % i)
+        nitpick_file (outdir, i)
+
+
+## TODO: make this compilable and check with g++
+TEST = '''
+#include <libio.h>
+#include <map>
+class
+ostream ;
+
+class Foo {
+public: static char* foo ();
+std::map<char*,int>* bar (char, char) { return 0; }
+};
+typedef struct
+{
+ Foo **bar;
+} String;
+
+ostream &
+operator << (ostream & os, String d);
+
+typedef struct _t_ligature
+{
+ char *succ, *lig;
+ struct _t_ligature * next;
+}  AFM_Ligature;
+typedef std::map < AFM_Ligature const *, int > Bar;
+
+ /**
+ (c) 1997--2009 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ */
+/*      ||
+*      vv
+* !OK  OK
+*/
+/*     ||
+   vv
+ !OK  OK
+*/
+char *
+Foo:: foo ()
+{
+int
+i
+;
+ char* a= &++ i ;
+ a [*++ a] = (char*) foe (*i, &bar) *
+ 2;
+ int operator double ();
+ std::map<char*,int> y =*bar(-*a ,*b);
+ Interval_t<T> & operator*= (T r);
+ Foo<T>*c;
+ int compare (Pqueue_ent < K, T > const& e1, Pqueue_ent < K,T> *e2);
+ delete *p;
+ if (abs (f)*2 > abs (d) *FUDGE)
+  ;
+ while (0);
+ for (; i<x foo(); foo>bar);
+ for (; *p && > y;
+   foo > bar)
+;
+ do {
+ ;;;
+ }
+ while (foe);
+
+ squiggle. extent;
+ 1 && * unsmob_moment (lf);
+ line_spanner_ = make_spanner ("DynamicLineSpanner", rq ? rq->*self_scm
+(): SCM_EOL);
+ case foo: k;
+
+ if (0) {a=b;} else {
+ c=d;
+ }
+
+ cookie_io_functions_t Memory_out_stream::functions_ = {
+  Memory_out_stream::reader,
+  ...
+ };
+
+ int compare (Array < Pitch> *, Array < Pitch> *);
+ original_ = (Grob *) & s;
+ Drul_array< Link_array<Grob> > o;
+}
+
+ header_.char_info_pos = (6 + header_length) * 4;
+ return ly_bool2scm (*ma < * mb);
+
+ 1 *::sign(2);
+
+ (shift) *-d;
+
+ a = 0 ? *x : *y;
+
+a = "foo() 2,2,4";
+{
+ if (!span_)
+  {
+   span_ = make_spanner ("StaffSymbol", SCM_EOL);
+  }
+}
+{
+ if (!span_)
+  {
+   span_ = make_spanner (StaffSymbol, SCM_EOL);
+  }
+}
+'''
+
+def test ():
+    test_file = 'fixcc.cc'
+    open (test_file, 'w').write (TEST)
+    nitpick_file (outdir, test_file)
+    sys.stdout.write (open (test_file).read ())
+
+if __name__ == '__main__':
+    main ()
+
diff --git a/scripts/auxiliar/makelsr.py b/scripts/auxiliar/makelsr.py
new file mode 100755 (executable)
index 0000000..cb0619f
--- /dev/null
@@ -0,0 +1,176 @@
+#!/usr/bin/env python
+
+import sys
+import os
+import glob
+import re
+
+USAGE = '''  Usage: makelsr.py LSR_SNIPPETS_DIR
+This script must be run from top of the source tree;
+it updates snippets input/lsr with snippets in input/new or LSR_SNIPPETS_DIR.
+'''
+
+LY_HEADER_LSR = '''%% Do not edit this file; it is auto-generated from LSR http://lsr.dsi.unimi.it
+%% This file is in the public domain.
+'''
+
+LY_HEADER_NEW = '''%% Do not edit this file; it is auto-generated from input/new
+%% This file is in the public domain.
+'''
+
+DEST = os.path.join ('input', 'lsr')
+NEW_LYS = os.path.join ('input', 'new')
+TEXIDOCS = os.path.join ('input', 'texidocs')
+
+TAGS = []
+# NR 1
+TAGS.extend (['pitches', 'rhythms', 'expressive-marks',
+'repeats', 'simultaneous-notes', 'staff-notation',
+'editorial-annotations', 'text'])
+# NR 2
+TAGS.extend (['vocal-music', 'chords', 'keyboards',
+'percussion', 'fretted-strings', 'unfretted-strings',
+'ancient-notation', 'winds', 'world-music'
+])
+
+# other
+TAGS.extend (['contexts-and-engravers', 'tweaks-and-overrides',
+'paper-and-layout', 'breaks', 'spacing', 'midi', 'titles', 'template'])
+
+def exit_with_usage (n=0):
+       sys.stderr.write (USAGE)
+       sys.exit (n)
+
+try:
+       in_dir = sys.argv[1]
+except:
+       exit_with_usage (2)
+
+if not (os.path.isdir (DEST) and os.path.isdir (NEW_LYS)):
+       exit_with_usage (3)
+
+unsafe = []
+unconverted = []
+notags_files = []
+
+# mark the section that will be printed verbatim by lilypond-book
+end_header_re = re.compile ('(\\header {.+?doctitle = ".+?})\n', re.M | re.S)
+
+def mark_verbatim_section (ly_code):
+       return end_header_re.sub ('\\1 % begin verbatim\n\n', ly_code, 1)
+
+# '% LSR' comments are to be stripped
+lsr_comment_re = re.compile (r'\s*%+\s*LSR.*')
+
+begin_header_re = re.compile (r'\\header\s*{', re.M)
+
+# add tags to ly files from LSR
+def add_tags (ly_code, tags):
+       return begin_header_re.sub ('\\g<0>\n  lsrtags = "' + tags + '"\n', ly_code, 1)
+
+def copy_ly (srcdir, name, tags):
+       global unsafe
+       global unconverted
+       dest = os.path.join (DEST, name)
+       tags = ', '.join (tags)
+       s = open (os.path.join (srcdir, name)).read ()
+
+       texidoc_translations_path = os.path.join (TEXIDOCS,
+                                                 os.path.splitext (name)[0] + '.texidoc')
+       if os.path.exists (texidoc_translations_path):
+               texidoc_translations = open (texidoc_translations_path).read ()
+               # Since we want to insert the translations verbatim using a 
+               # regexp, \\ is understood as ONE escaped backslash. So we have
+               # to escape those backslashes once more...
+               texidoc_translations = texidoc_translations.replace ('\\', '\\\\')
+               s = begin_header_re.sub ('\\g<0>\n' + texidoc_translations, s, 1)
+
+       if in_dir in srcdir:
+               s = LY_HEADER_LSR + add_tags (s, tags)
+       else:
+               s = LY_HEADER_NEW + s
+
+       s = mark_verbatim_section (s)
+       s = lsr_comment_re.sub ('', s)
+       open (dest, 'w').write (s)
+
+       e = os.system ("convert-ly -e '%s'" % dest)
+       if e:
+               unconverted.append (dest)
+       if os.path.exists (dest + '~'):
+               os.remove (dest + '~')
+       # -V seems to make unsafe snippets fail nicer/sooner
+       e = os.system ("lilypond -V -dno-print-pages -dsafe -o /tmp/lsrtest '%s'" % dest)
+       if e:
+               unsafe.append (dest)
+
+def read_source_with_dirs (src):
+       s = {}
+       l = {}
+       for tag in TAGS:
+               srcdir = os.path.join (src, tag)
+               l[tag] = set (map (os.path.basename, glob.glob (os.path.join (srcdir, '*.ly'))))
+               for f in l[tag]:
+                       if f in s:
+                               s[f][1].append (tag)
+                       else:
+                               s[f] = (srcdir, [tag])
+       return s, l
+
+
+tags_re = re.compile ('lsrtags\\s*=\\s*"(.+?)"')
+
+def read_source (src):
+       s = {}
+       l = dict ([(tag, set()) for tag in TAGS])
+       for f in glob.glob (os.path.join (src, '*.ly')):
+               basename = os.path.basename (f)
+               m = tags_re.search (open (f, 'r').read ())
+               if m:
+                       file_tags = [tag.strip() for tag in m.group (1). split(',')]
+                       s[basename] = (src, file_tags)
+                       [l[tag].add (basename) for tag in file_tags if tag in TAGS]
+               else:
+                       notags_files.append (f)
+       return s, l
+
+
+def dump_file_list (file, list):
+       f = open (file, 'w')
+       f.write ('\n'.join (list) + '\n')
+
+## clean out existing lys and generated files
+map (os.remove, glob.glob (os.path.join (DEST, '*.ly')) +
+     glob.glob (os.path.join (DEST, '*.snippet-list')))
+
+# read LSR source where tags are defined by subdirs
+snippets, tag_lists = read_source_with_dirs (in_dir)
+# read input/new where tags are directly
+s, l = read_source (NEW_LYS)
+snippets.update (s)
+for t in TAGS:
+       tag_lists[t].update (l[t])
+
+for (name, (srcdir, tags)) in snippets.items ():
+       copy_ly (srcdir, name, tags)
+
+for (tag, file_set) in tag_lists.items ():
+       dump_file_list (os.path.join (DEST, tag + '.snippet-list'), sorted(file_set))
+
+if unconverted:
+       sys.stderr.write ('These files could not be converted successfully by convert-ly:\n')
+       sys.stderr.write ('\n'.join (unconverted) + '\n\n')
+
+if notags_files:
+       sys.stderr.write ('No tags could be found in these files:\n')
+       sys.stderr.write ('\n'.join (notags_files) + '\n\n')
+
+dump_file_list ('lsr-unsafe.txt', unsafe)
+sys.stderr.write ('''
+
+Unsafe files printed in lsr-unsafe.txt: CHECK MANUALLY!
+  git add input/lsr/*.ly
+  xargs git-diff HEAD < lsr-unsafe.txt
+
+''')
+
diff --git a/scripts/auxiliar/musicxml_generate_intervals.py b/scripts/auxiliar/musicxml_generate_intervals.py
new file mode 100755 (executable)
index 0000000..3c00715
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+notes = "CDEFGAB"
+alterations = [-1, 0, 1]
+
+def print_note (octave, note, alteration):
+    print "      <note>\n        <pitch>\n          <step>%s</step>" % notes[note]
+    if alteration <> 0:
+        print "          <alter>%s</alter>" % alteration
+    print "          <octave>%s</octave>\n        </pitch>\n        <duration>1</duration>\n        <voice>1</voice>\n        <type>quarter</type>\n      </note>" % octave
+
+
+print """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwise//EN"
+                                "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise>
+  <movement-title>Various piches and interval sizes</movement-title>
+  <part-list>
+    <score-part id="P1">
+      <part-name>MusicXML Part</part-name>
+    </score-part>
+  </part-list>
+  <!--=========================================================-->
+  <part id="P1">
+    <measure number="1">
+      <attributes>
+        <divisions>1</divisions>
+        <key>
+          <fifths>0</fifths>
+          <mode>major</mode>
+        </key>
+        <time symbol="common">
+          <beats>2</beats>
+          <beat-type>4</beat-type>
+        </time>
+        <clef>
+          <sign>G</sign>
+          <line>2</line>
+        </clef>
+      </attributes>
+"""
+
+start_octave = 5
+
+for octave in (start_octave, start_octave+1):
+    for note in (0,1,2,3,4,5,6):
+        for alteration in alterations:
+            if octave == start_octave and note == 0 and alteration == -1:
+                continue
+            print_note (octave, note, alteration)
+#             if octave == start_octave and note == 0 and alteration == 0:
+#                 continue
+            print_note (start_octave-(octave-start_octave)-(1-(7-note)/7), (7-note)%7, -alteration)
+
+print """    </measure>
+  </part>
+</score-partwise>
+"""
diff --git a/scripts/auxiliar/musicxml_generate_keys.py b/scripts/auxiliar/musicxml_generate_keys.py
new file mode 100755 (executable)
index 0000000..7a16ac9
--- /dev/null
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+notes = "CDEFGAB"
+alterations = [-1, 0, 1]
+
+def print_measure (nr, fifth, mode, atts1 = "", atts = "", final = ""):
+    print """    <measure number="%s">
+      <attributes>
+%s        <key>
+          <fifths>%s</fifths>
+          <mode>%s</mode>
+        </key>
+%s      </attributes>
+      <note>
+        <pitch>
+          <step>C</step>
+          <octave>4</octave>
+        </pitch>
+        <duration>2</duration>
+        <voice>1</voice>
+        <type>half</type>
+      </note>
+%s    </measure>""" % (nr, atts1, fifth, mode, atts, final)
+
+first_div = """        <divisions>1</divisions>
+"""
+first_atts = """        <time symbol="common">
+          <beats>2</beats>
+          <beat-type>4</beat-type>
+        </time>
+        <clef>
+          <sign>G</sign>
+          <line>2</line>
+        </clef>
+"""
+
+final_barline = """      <barline location="right">
+        <bar-style>light-heavy</bar-style>
+      </barline>
+"""
+
+print """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwise//EN"
+                                "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise>
+  <movement-title>Different Key signatures</movement-title>
+  <identification>
+    <miscellaneous>
+      <miscellaneous-field name="description">Various key signature: from 11
+            flats to 11 sharps (each one first one measure in major, then one
+            measure in minor)</miscellaneous-field>
+    </miscellaneous>
+  </identification>
+  <part-list>
+    <score-part id="P1">
+      <part-name>MusicXML Part</part-name>
+    </score-part>
+  </part-list>
+  <!--=========================================================-->
+  <part id="P1">"""
+
+max_range = 11
+measure = 0
+for fifth in range(-max_range, max_range+1):
+    measure += 1
+    if fifth == -max_range:
+        print_measure (measure, fifth, "major", first_div, first_atts)
+    else:
+        print_measure (measure, fifth, "major")
+    measure += 1
+    if fifth == max_range:
+        print_measure (measure, fifth, "minor", "", "", final_barline)
+    else:
+        print_measure (measure, fifth, "minor")
+    
+
+print """  </part>
+</score-partwise>"""
diff --git a/scripts/auxiliar/musicxml_generate_timesignatures.py b/scripts/auxiliar/musicxml_generate_timesignatures.py
new file mode 100755 (executable)
index 0000000..c4cc78a
--- /dev/null
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+
+notes = "CDEFGAB"
+alterations = [-1, 0, 1]
+
+dot_xml = """        <dot/>
+"""
+tie_xml = """        <tie type="%s"/>
+"""
+tie_notation_xml = """        <notations><tied type="%s"/></notations>
+"""
+
+
+def generate_note (duration, end_tie = False):
+    if duration < 2:
+      (notetype, dur) = ("8th", 1)
+    elif duration < 4:
+      (notetype, dur) = ("quarter", 2)
+    elif duration < 8:
+      (notetype, dur) = ("half", 4)
+    else:
+      (notetype, dur) = ("whole", 8)
+    dur_processed = dur
+    dot = ""
+    if (duration - dur_processed >= dur/2):
+      dot = dot_xml
+      dur_processed += dur/2
+      if (duration - dur_processed >= max(dur/4, 1)):
+        dot += dot_xml
+        dur_processed += dur/4
+    tie = ""
+    tie_notation = ""
+    if end_tie:
+        tie += tie_xml % "stop"
+        tie_notation += tie_notation_xml % "stop"
+    second_note = None
+    if duration - dur_processed > 0:
+        second_note = generate_note (duration-dur_processed, True)
+        tie += tie_xml % "start"
+        tie_notation += tie_notation_xml % "start"
+    note = """      <note>
+        <pitch>
+          <step>C</step>
+          <octave>5</octave>
+        </pitch>
+        <duration>%s</duration>
+%s        <voice>1</voice>
+        <type>%s</type>
+%s%s      </note>""" % (dur_processed, tie, notetype, dot, tie_notation)
+    if second_note:
+        return "%s\n%s" % (note, second_note)
+    else:
+        return note
+
+def print_measure (nr, beats, type, params = "", attr = "", attr2 = "", barline = ""):
+    duration = 8*beats/type
+    note = generate_note (duration)
+
+    print """    <measure number="%s">
+      <attributes>
+%s        <time%s>
+          <beats>%s</beats>
+          <beat-type>%s</beat-type>
+        </time>
+%s      </attributes>
+%s
+%s    </measure>""" % (nr, attr, params, beats, type, attr2, note, barline)
+
+first_key = """        <divisions>2</divisions>
+        <key>
+          <fifths>0</fifths>
+          <mode>major</mode>
+        </key>
+"""
+first_clef = """        <clef>
+          <sign>G</sign>
+          <line>2</line>
+        </clef>
+"""
+
+final_barline = """      <barline location="right">
+        <bar-style>light-heavy</bar-style>
+      </barline>
+"""
+
+print """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwise//EN"
+                                "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise>
+  <identification>
+    <miscellaneous>
+      <miscellaneous-field name="description">Various time signatures: 2/2 
+            (alla breve), 4/4 (C), 2/2, 3/2, 2/4, 3/4, 4/4, 5/4, 3/8, 6/8, 
+            12/8</miscellaneous-field>
+    </miscellaneous>
+  </identification>
+  <part-list>
+    <score-part id="P1">
+      <part-name>MusicXML Part</part-name>
+    </score-part>
+  </part-list>
+  <!--=========================================================-->
+  <part id="P1">"""
+
+measure = 1
+
+print_measure (measure, 2, 2, " symbol=\"common\"", first_key, first_clef)
+measure += 1
+
+print_measure (measure, 4, 4, " symbol=\"common\"")
+measure += 1
+
+print_measure (measure, 2, 2)
+measure += 1
+
+print_measure (measure, 3, 2)
+measure += 1
+
+print_measure (measure, 2, 4)
+measure += 1
+
+print_measure (measure, 3, 4)
+measure += 1
+
+print_measure (measure, 4, 4)
+measure += 1
+
+print_measure (measure, 5, 4)
+measure += 1
+
+print_measure (measure, 3, 8)
+measure += 1
+
+print_measure (measure, 6, 8)
+measure += 1
+
+print_measure (measure, 12, 8, "", "", "", final_barline)
+measure += 1
+
+print """  </part>
+</score-partwise>"""
diff --git a/scripts/auxiliar/pfx2ttf.fontforge b/scripts/auxiliar/pfx2ttf.fontforge
new file mode 100644 (file)
index 0000000..7d87fae
--- /dev/null
@@ -0,0 +1,29 @@
+Open($1);
+MergeKern($2)
+
+
+# The AFM files of `New Century Schoolbook' family as distributed within the
+# urw-fonts-1.0.7pre41.tar.bz2 archive contain a bunch of ligatures which
+# shouldn't be active by default:
+#
+#   T + M -> trademark
+#   N + o -> afii61352
+#   i + j -> ij
+#   I + J -> IJ
+#
+# This font bundle is shipped by Fedora Core 6 and other GNU/Linux
+# distributions; we simply remove those ligatures.
+
+SelectIf("trademark", "trademark", \
+         "afii61352", "afii61352", \
+         "ij", "ij", \
+         "IJ", "IJ");
+if (Strtol($version) < 20070501)
+  RemoveATT("Ligature", "*", "*");
+else
+  RemovePosSub("*");
+endif
+
+Generate($3 + $fontname + ".otf");
+
+# EOF
diff --git a/scripts/auxiliar/readlink.py b/scripts/auxiliar/readlink.py
new file mode 100755 (executable)
index 0000000..70267ff
--- /dev/null
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+import os
+import sys
+
+for i in sys.argv[1:]:
+    print os.path.realpath (i)
diff --git a/scripts/auxiliar/tely-gettext.py b/scripts/auxiliar/tely-gettext.py
new file mode 100755 (executable)
index 0000000..341816a
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Temporary script that helps translated docs sources conversion
+# for texi2html processing
+
+# USAGE:  tely-gettext.py PYTHON-DIR LOCALEDIR LANG FILES
+
+print "tely-gettext.py"
+
+import sys
+import re
+import os
+import gettext
+
+if len (sys.argv) > 3:
+    buildscript_dir, localedir, lang = sys.argv[1:4]
+else:
+    print """USAGE:  tely-gettext.py PYTHON-DIR LOCALEDIR LANG FILES
+  For example scripts/auxiliar/tely-gettext.py python/out Documentation/po/out-www de Documentation/de/user/*.tely"""
+    sys.exit (1)
+
+sys.path.append (buildscript_dir)
+import langdefs
+
+double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
+t = gettext.translation('lilypond-doc', localedir, [lang])
+_doc = t.gettext
+
+include_re = re.compile (r'@include (.*?)$', re.M)
+whitespaces = re.compile (r'\s+')
+ref_re = re.compile (r'(?ms)@(ruser|rprogram|ref|rlearning)\{(.*?)\}')
+node_section_re = re.compile (r'@node (.*?)\n@((?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) (.*?)\n')
+menu_entry_re = re.compile (r'\* (.*?)::')
+
+def ref_gettext (m):
+    r = whitespaces.sub (' ', m.group (2))
+    return '@' + m.group (1) + '{' + _doc (r) + '}'
+
+def node_gettext (m):
+    return '@node ' + _doc (m.group (1)) + '\n@' + \
+        m.group (2) + ' ' + _doc (m.group (3)) + \
+       '\n@translationof ' + m.group (1) + '\n'
+
+def menu_entry_gettext (m):
+    return '* ' + _doc (m.group (1)) + '::'
+
+def process_file (filename):
+    print "Processing %s" % filename
+    f = open (filename, 'r')
+    page = f.read ()
+    f.close()
+    page = node_section_re.sub (node_gettext, page)
+    page = ref_re.sub (ref_gettext, page)
+    page = menu_entry_re.sub (menu_entry_gettext, page)
+    page = page.replace ("""-- SKELETON FILE --
+When you actually translate this file, please remove these lines as
+well as all `UNTRANSLATED NODE: IGNORE ME' lines.""", """@c -- SKELETON FILE --""")
+    page = page.replace ('UNTRANSLATED NODE: IGNORE ME', "@c UNTRANSLATED NODE: IGNORE ME")
+    includes = [whitespaces.sub ('', f) for f in include_re.findall (page)]
+    f = open (filename, 'w')
+    f.write (page)
+    f.close ()
+    dir = os.path.dirname (filename)
+    for file in includes:
+        p = os.path.join (dir, file)
+        if os.path.exists (p):
+            process_file (p)
+
+for filename in sys.argv[4:]:
+    process_file (filename)
diff --git a/scripts/auxiliar/texi-langutils.py b/scripts/auxiliar/texi-langutils.py
new file mode 100755 (executable)
index 0000000..7c34ce4
--- /dev/null
@@ -0,0 +1,176 @@
+#!/usr/bin/env python
+# texi-langutils.py
+
+# WARNING: this script can't find files included in a different directory
+
+import sys
+import re
+import getopt
+import os
+
+import langdefs
+
+def read_pipe (command):
+    print command
+    pipe = os.popen (command)
+    output = pipe.read ()
+    if pipe.close ():
+        print "pipe failed: %(command)s" % locals ()
+    return output
+
+
+optlist, texi_files = getopt.getopt(sys.argv[1:],'no:d:b:i:l:',['skeleton', 'gettext'])
+process_includes = not ('-n', '') in optlist # -n   don't process @include's in texinfo files
+
+make_gettext = ('--gettext', '') in optlist   # --gettext    generate a node list from a Texinfo source
+make_skeleton = ('--skeleton', '') in optlist # --skeleton   extract the node tree from a Texinfo source
+
+output_file = 'doc.pot'
+
+# @untranslated should be defined as a macro in Texinfo source
+node_blurb = '''@untranslated
+'''
+doclang = ''
+head_committish = read_pipe ('git-rev-parse HEAD')
+intro_blurb = '''@c -*- coding: utf-8; mode: texinfo%(doclang)s -*-
+@c This file is part of %(topfile)s
+@ignore
+    Translation of GIT committish: %(head_committish)s
+    When revising a translation, copy the HEAD committish of the
+    version that you are working on.  See TRANSLATION for details.
+@end ignore
+'''
+
+end_blurb = """
+@c -- SKELETON FILE --
+"""
+
+for x in optlist:
+    if x[0] == '-o': # -o NAME   set PO output file name to NAME
+        output_file = x[1]
+    elif x[0] == '-d': # -d DIR    set working directory to DIR
+        os.chdir (x[1])
+    elif x[0] == '-b': # -b BLURB  set blurb written at each node to BLURB
+        node_blurb = x[1]
+    elif x[0] == '-i': # -i BLURB  set blurb written at beginning of each file to BLURB
+        intro_blurb = x[1]
+    elif x[0] == '-l': # -l ISOLANG  set documentlanguage to ISOLANG
+        doclang = '; documentlanguage: ' + x[1]
+
+texinfo_with_menus_re = re.compile (r"^(\*) +([^:\n]+)::.*?$|^@(include|menu|end menu|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *(.*?)$|@(rglos){(.+?)}", re.M)
+
+texinfo_re = re.compile (r"^@(include|node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading) *(.+?)$|@(rglos){(.+?)}", re.M)
+
+ly_string_re = re.compile (r'^([a-zA-Z]+)[\t ]*=|%+[\t ]*(.*)$|\\(?:new|context)\s+(?:[a-zA-Z]*?(?:Staff(?:Group)?|Voice|FiguredBass|FretBoards|Names|Devnull))\s+=\s+"?([a-zA-Z]+)"?\s+')
+lsr_verbatim_ly_re = re.compile (r'% begin verbatim$')
+texinfo_verbatim_ly_re = re.compile (r'^@lilypond\[.*?verbatim')
+
+def process_texi (texifilename, i_blurb, n_blurb, write_skeleton, topfile, output_file=None, scan_ly=False):
+    try:
+        f = open (texifilename, 'r')
+        texifile = f.read ()
+        f.close ()
+        printedfilename = texifilename.replace ('../','')
+        includes = []
+
+        # process ly var names and comments
+        if output_file and (scan_ly or texifilename.endswith ('.ly')):
+            lines = texifile.splitlines ()
+            i = 0
+            in_verb_ly_block = False
+            if texifilename.endswith ('.ly'):
+                verbatim_ly_re = lsr_verbatim_ly_re
+            else:
+                verbatim_ly_re = texinfo_verbatim_ly_re
+            for i in range (len (lines)):
+                if verbatim_ly_re.search (lines[i]):
+                    in_verb_ly_block = True
+                elif lines[i].startswith ('@end lilypond'):
+                    in_verb_ly_block = False
+                elif in_verb_ly_block:
+                    for (var, comment, context_id) in ly_string_re.findall (lines[i]):
+                        if var:
+                            output_file.write ('# ' + printedfilename + ':' + \
+                                               str (i + 1) + ' (variable)\n_(r"' + var + '")\n')
+                        elif comment:
+                            output_file.write ('# ' + printedfilename + ':' + \
+                                               str (i + 1) + ' (comment)\n_(r"' + \
+                                               comment.replace ('"', '\\"') + '")\n')
+                        elif context_id:
+                            output_file.write ('# ' + printedfilename + ':' + \
+                                               str (i + 1) + ' (context id)\n_(r"' + \
+                                               context_id + '")\n')
+
+        # process Texinfo node names and section titles
+        if write_skeleton:
+            g = open (os.path.basename (texifilename), 'w')
+            subst = globals ()
+            subst.update (locals ())
+            g.write (i_blurb % subst)
+            tutu = texinfo_with_menus_re.findall (texifile)
+            node_trigger = False
+            for item in tutu:
+                if item[0] == '*':
+                    g.write ('* ' + item[1] + '::\n')
+                elif output_file and item[4] == 'rglos':
+                    output_file.write ('_(r"' + item[5] + '") # @rglos in ' + printedfilename + '\n')
+                elif item[2] == 'menu':
+                    g.write ('@menu\n')
+                elif item[2] == 'end menu':
+                    g.write ('@end menu\n\n')
+                else:
+                    g.write ('@' + item[2] + ' ' + item[3] + '\n')
+                    if node_trigger:
+                        g.write (n_blurb)
+                        node_trigger = False
+                    elif item[2] == 'include':
+                        includes.append (item[3])
+                    else:
+                        if output_file:
+                            output_file.write ('# @' + item[2] + ' in ' + \
+                                printedfilename + '\n_(r"' + item[3].strip () + '")\n')
+                        if item[2] == 'node':
+                            node_trigger = True
+            g.write (end_blurb)
+            g.close ()
+
+        elif output_file:
+            toto = texinfo_re.findall (texifile)
+            for item in toto:
+                if item[0] == 'include':
+                    includes.append(item[1])
+                elif item[2] == 'rglos':
+                    output_file.write ('# @rglos in ' + printedfilename + '\n_(r"' + item[3] + '")\n')
+                else:
+                    output_file.write ('# @' + item[0] + ' in ' + printedfilename + '\n_(r"' + item[1].strip () + '")\n')
+
+        if process_includes:
+            dir = os.path.dirname (texifilename)
+            for item in includes:
+                process_texi (os.path.join (dir, item.strip ()), i_blurb, n_blurb, write_skeleton, topfile, output_file, scan_ly)
+    except IOError, (errno, strerror):
+        sys.stderr.write ("I/O error(%s): %s: %s\n" % (errno, texifilename, strerror))
+
+
+if intro_blurb != '':
+    intro_blurb += '\n\n'
+if node_blurb != '':
+    node_blurb = '\n' + node_blurb + '\n\n'
+if make_gettext:
+    node_list_filename = 'node_list'
+    node_list = open (node_list_filename, 'w')
+    node_list.write ('# -*- coding: utf-8 -*-\n')
+    for texi_file in texi_files:
+        # Urgly: scan ly comments and variable names only in English doco
+        is_english_doc = 'Documentation/user' in texi_file
+        process_texi (texi_file, intro_blurb, node_blurb, make_skeleton,
+                      os.path.basename (texi_file), node_list,
+                      scan_ly=is_english_doc)
+    for word in ('Up:', 'Next:', 'Previous:', 'Appendix ', 'Footnotes', 'Table of Contents'):
+        node_list.write ('_(r"' + word + '")\n')
+    node_list.close ()
+    os.system ('xgettext -c -L Python --no-location -o ' + output_file + ' ' + node_list_filename)
+else:
+    for texi_file in texi_files:
+        process_texi (texi_file, intro_blurb, node_blurb, make_skeleton,
+                      os.path.basename (texi_file))
diff --git a/scripts/auxiliar/texi-skeleton-update.py b/scripts/auxiliar/texi-skeleton-update.py
new file mode 100755 (executable)
index 0000000..250b52e
--- /dev/null
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+# texi-skeleton-update.py
+
+import sys
+import glob
+import os
+import shutil
+
+sys.stderr.write ('texi-skeleton-update.py\n')
+
+orig_skeletons = set ([os.path.basename (f) for f in glob.glob (sys.argv[1] + '/*.ite??')])
+new_skeletons = set ([os.path.basename (f) for f in glob.glob (sys.argv[2] + '/*.ite??')])
+
+for f in new_skeletons:
+    if f in orig_skeletons:
+        g = open (os.path.join (sys.argv[1], f), 'r').read ()
+        if '-- SKELETON FILE --' in g:
+            sys.stderr.write ("Updating %s...\n" % f)
+            shutil.copy (os.path.join (sys.argv[2], f), sys.argv[1])
+    elif f != 'fdl.itexi':
+        sys.stderr.write ("Copying new file %s...\n" % f)
+        shutil.copy (os.path.join (sys.argv[2], f), sys.argv[1])
+
+for f in orig_skeletons.difference (new_skeletons):
+    sys.stderr.write ("Warning: outdated skeleton file %s\n" % f)
diff --git a/scripts/auxiliar/translations-status.py b/scripts/auxiliar/translations-status.py
new file mode 100755 (executable)
index 0000000..c931993
--- /dev/null
@@ -0,0 +1,578 @@
+#!/usr/bin/env python
+
+"""
+USAGE: translations-status.py BUILDSCRIPT-DIR LOCALEDIR
+
+  This script must be run from Documentation/
+
+  Reads template files translations.template.html.in
+and for each LANG in LANGUAGES LANG/translations.template.html.in
+  Writes translations.html.in and for each LANG in LANGUAGES
+translations.LANG.html.in
+  Writes out/translations-status.txt
+  Updates word counts in TRANSLATION
+"""
+
+import sys
+import re
+import string
+import os
+
+import langdefs
+import buildlib
+
+def progress (str):
+    sys.stderr.write (str + '\n')
+
+progress ("translations-status.py")
+
+_doc = lambda s: s
+
+# load gettext messages catalogs
+translation = langdefs.translation
+
+
+language_re = re.compile (r'^@documentlanguage (.+)', re.M)
+comments_re = re.compile (r'^@ignore\n(.|\n)*?\n@end ignore$|@c .*?$', re.M)
+space_re = re.compile (r'\s+', re.M)
+lilypond_re = re.compile (r'@lilypond({.*?}|(.|\n)*?\n@end lilypond$)', re.M)
+node_re = re.compile ('^@node .*?$', re.M)
+title_re = re.compile ('^@(top|chapter|(?:sub){0,2}section|' + \
+'(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?) (.*?)$', re.M)
+include_re = re.compile ('^@include (.*?)$', re.M)
+
+translators_re = re.compile (r'^@c\s+Translators\s*:\s*(.*?)$', re.M | re.I)
+checkers_re = re.compile (r'^@c\s+Translation\s*checkers\s*:\s*(.*?)$',
+                          re.M | re.I)
+status_re = re.compile (r'^@c\s+Translation\s*status\s*:\s*(.*?)$', re.M | re.I)
+post_gdp_re = re.compile ('post.GDP', re.I)
+untranslated_node_str = '@untranslated'
+skeleton_str = '-- SKELETON FILE --'
+
+section_titles_string = _doc ('Section titles')
+last_updated_string = _doc (' <p><i>Last updated %s</i></p>\n')
+detailed_status_heads = [_doc ('Translators'), _doc ('Translation checkers'),
+                         _doc ('Translated'), _doc ('Up to date'),
+                         _doc ('Other info')]
+format_table = {
+    'not translated': {'color':'d0f0f8', 'short':_doc ('no'), 'abbr':'NT',
+                       'long':_doc ('not translated')},
+    'partially translated': {'color':'dfef77',
+                             'short':_doc ('partially (%(p)d %%)'),
+                             'abbr':'%(p)d%%',
+                             'long':_doc ('partially translated (%(p)d %%)')},
+    'fully translated': {'color':'1fff1f', 'short':_doc ('yes'), 'abbr':'FT',
+                         'long': _doc ('translated')},
+    'up to date': {'short':_doc ('yes'), 'long':_doc ('up to date'),
+                   'abbr':'100%%', 'vague':_doc ('up to date')},
+    'outdated': {'short':_doc ('partially'), 'abbr':'%(p)d%%',
+                 'vague':_doc ('partially up to date')},
+    'N/A': {'short':_doc ('N/A'), 'abbr':'N/A', 'color':'d587ff', 'vague':''},
+    'pre-GDP':_doc ('pre-GDP'),
+    'post-GDP':_doc ('post-GDP')
+}
+
+texi_level = {
+# (Unumbered/Numbered/Lettered, level)
+    'top': ('u', 0),
+    'unnumbered': ('u', 1),
+    'unnumberedsec': ('u', 2),
+    'unnumberedsubsec': ('u', 3),
+    'chapter': ('n', 1),
+    'section': ('n', 2),
+    'subsection': ('n', 3),
+    'appendix': ('l', 1)
+}
+
+appendix_number_trans = string.maketrans ('@ABCDEFGHIJKLMNOPQRSTUVWXY',
+                                          'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
+
+class SectionNumber (object):
+    def __init__ (self):
+        self.__data = [[0,'u']]
+
+    def __increase_last_index (self):
+        type = self.__data[-1][1]
+        if type == 'l':
+            self.__data[-1][0] = \
+                self.__data[-1][0].translate (appendix_number_trans)
+        elif type == 'n':
+            self.__data[-1][0] += 1
+
+    def format (self):
+        if self.__data[-1][1] == 'u':
+            return ''
+        return '.'.join ([str (i[0]) for i in self.__data if i[1] != 'u']) + ' '
+
+    def increase (self, (type, level)):
+        if level == 0:
+            self.__data = [[0,'u']]
+        while level + 1 < len (self.__data):
+            del self.__data[-1]
+        if level + 1 > len (self.__data):
+            self.__data.append ([0, type])
+            if type == 'l':
+                self.__data[-1][0] = '@'
+        if type == self.__data[-1][1]:
+            self.__increase_last_index ()
+        else:
+            self.__data[-1] = ([0, type])
+            if type == 'l':
+                self.__data[-1][0] = 'A'
+            elif type == 'n':
+                self.__data[-1][0] = 1
+        return self.format ()
+
+
+def percentage_color (percent):
+    p = percent / 100.0
+    if p < 0.33:
+        c = [hex (int (3 * p * b + (1 - 3 * p) * a))[2:]
+             for (a, b) in [(0xff, 0xff), (0x5c, 0xa6), (0x5c, 0x4c)]]
+    elif p < 0.67:
+        c = [hex (int ((3 * p - 1) * b + (2 - 3 * p) * a))[2:]
+             for (a, b) in [(0xff, 0xff), (0xa6, 0xff), (0x4c, 0x3d)]]
+    else:
+        c = [hex (int ((3 * p - 2) * b + 3 * (1 - p) * a))[2:]
+             for (a, b) in [(0xff, 0x1f), (0xff, 0xff), (0x3d, 0x1f)]]
+    return ''.join (c)
+
+
+def update_word_count (text, filename, word_count):
+    return re.sub (r'(?m)^(\d+) *' + filename,
+                   str (word_count).ljust (6) + filename,
+                   text)
+
+po_msgid_re = re.compile (r'^msgid "(.*?)"(?:\n"(.*?)")*', re.M)
+
+def po_word_count (po_content):
+    s = ' '.join ([''.join (t) for t in po_msgid_re.findall (po_content)])
+    return len (space_re.split (s))
+
+sgml_tag_re = re.compile (r'<.*?>', re.S)
+
+def sgml_word_count (sgml_doc):
+    s = sgml_tag_re.sub ('', sgml_doc)
+    return len (space_re.split (s))
+
+def tely_word_count (tely_doc):
+    '''
+    Calculate word count of a Texinfo document node by node.
+
+    Take string tely_doc as an argument.
+    Return a list of integers.
+
+    Texinfo comments and @lilypond blocks are not included in word counts.
+    '''
+    tely_doc = comments_re.sub ('', tely_doc)
+    tely_doc = lilypond_re.sub ('', tely_doc)
+    nodes = node_re.split (tely_doc)
+    return [len (space_re.split (n)) for n in nodes]
+
+
+class TelyDocument (object):
+    def __init__ (self, filename):
+        self.filename = filename
+        self.contents = open (filename).read ()
+
+        ## record title and sectionning level of first Texinfo section
+        m = title_re.search (self.contents)
+        if m:
+            self.title = m.group (2)
+            self.level = texi_level [m.group (1)]
+        else:
+            self.title = 'Untitled'
+            self.level = ('u', 1)
+
+        m = language_re.search (self.contents)
+        if m:
+            self.language = m.group (1)
+
+        included_files = [os.path.join (os.path.dirname (filename), t)
+                          for t in include_re.findall (self.contents)]
+        self.included_files = [p for p in included_files if os.path.exists (p)]
+
+    def print_title (self, section_number):
+        return section_number.increase (self.level) + self.title
+
+
+class TranslatedTelyDocument (TelyDocument):
+    def __init__ (self, filename, masterdocument, parent_translation=None):
+        TelyDocument.__init__ (self, filename)
+
+        self.masterdocument = masterdocument
+        if not hasattr (self, 'language') \
+                and hasattr (parent_translation, 'language'):
+            self.language = parent_translation.language
+        if hasattr (self, 'language'):
+            self.translation = translation[self.language]
+        else:
+            self.translation = lambda x: x
+        self.title = self.translation (self.title)
+
+        ## record authoring information
+        m = translators_re.search (self.contents)
+        if m:
+            self.translators = [n.strip () for n in m.group (1).split (',')]
+        else:
+            self.translators = parent_translation.translators
+        m = checkers_re.search (self.contents)
+        if m:
+            self.checkers = [n.strip () for n in m.group (1).split (',')]
+        elif isinstance (parent_translation, TranslatedTelyDocument):
+            self.checkers = parent_translation.checkers
+        else:
+            self.checkers = []
+
+        ## check whether translation is pre- or post-GDP
+        m = status_re.search (self.contents)
+        if m:
+            self.post_gdp = bool (post_gdp_re.search (m.group (1)))
+        else:
+            self.post_gdp = False
+
+        ## record which parts (nodes) of the file are actually translated
+        self.partially_translated = not skeleton_str in self.contents
+        nodes = node_re.split (self.contents)
+        self.translated_nodes = [not untranslated_node_str in n for n in nodes]
+
+        ## calculate translation percentage
+        master_total_word_count = sum (masterdocument.word_count)
+        translation_word_count = \
+            sum ([masterdocument.word_count[k] * self.translated_nodes[k]
+                  for k in range (min (len (masterdocument.word_count),
+                                       len (self.translated_nodes)))])
+        self.translation_percentage = \
+            100 * translation_word_count / master_total_word_count
+
+        ## calculate how much the file is outdated
+        (diff_string, error) = \
+            buildlib.check_translated_doc (masterdocument.filename, self.filename, self.contents)
+        if error:
+            sys.stderr.write ('warning: %s: %s' % (self.filename, error))
+            self.uptodate_percentage = None
+        else:
+            diff = diff_string.splitlines ()
+            insertions = sum ([len (l) - 1 for l in diff
+                               if l.startswith ('+')
+                               and not l.startswith ('+++')])
+            deletions = sum ([len (l) - 1 for l in diff
+                              if l.startswith ('-')
+                              and not l.startswith ('---')])
+            outdateness_percentage = 50.0 * (deletions + insertions) / \
+                (masterdocument.size + 0.5 * (deletions - insertions))
+            self.uptodate_percentage = 100 - int (outdateness_percentage)
+            if self.uptodate_percentage > 100:
+                alternative = 50
+                progress ("%s: strange uptodateness percentage %d %%, \
+setting to %d %%" % (self.filename, self.uptodate_percentage, alternative))
+                self.uptodate_percentage = alternative
+            elif self.uptodate_percentage < 1:
+                alternative = 1
+                progress ("%s: strange uptodateness percentage %d %%, \
+setting to %d %%" % (self.filename, self.uptodate_percentage, alternative))
+                self.uptodate_percentage = alternative
+
+    def completeness (self, formats=['long'], translated=False):
+        if translated:
+            translation = self.translation
+        else:
+            translation = lambda x: x
+
+        if isinstance (formats, str):
+            formats = [formats]
+        p = self.translation_percentage
+        if p == 0:
+            status = 'not translated'
+        elif p == 100:
+            status = 'fully translated'
+        else:
+            status = 'partially translated'
+        return dict ([(f, translation (format_table[status][f]) % locals())
+                      for f in formats])
+
+    def uptodateness (self, formats=['long'], translated=False):
+        if translated:
+            translation = self.translation
+        else:
+            translation = lambda x: x
+
+        if isinstance (formats, str):
+            formats = [formats]
+        p = self.uptodate_percentage
+        if p == None:
+            status = 'N/A'
+        elif p == 100:
+            status = 'up to date'
+        else:
+            status = 'outdated'
+        l = {}
+        for f in formats:
+            if f == 'color' and p != None:
+                l['color'] = percentage_color (p)
+            else:
+                l[f] = translation (format_table[status][f]) % locals ()
+        return l
+
+    def gdp_status (self):
+        if self.post_gdp:
+            return self.translation (format_table['post-GDP'])
+        else:
+            return self.translation (format_table['pre-GDP'])
+
+    def short_html_status (self):
+        s = '  <td>'
+        if self.partially_translated:
+            s += '<br>\n   '.join (self.translators) + '<br>\n'
+            if self.checkers:
+                s += '   <small>' + \
+                    '<br>\n   '.join (self.checkers) + '</small><br>\n'
+
+        c = self.completeness (['color', 'long'])
+        s += '   <span style="background-color: #%(color)s">\
+%(long)s</span><br>\n' % c
+
+        if self.partially_translated:
+            u = self.uptodateness (['vague', 'color'])
+            s += '   <span style="background-color: #%(color)s">\
+%(vague)s</span><br>\n' % u
+
+        s += '  </td>\n'
+        return s
+
+    def text_status (self):
+        s = self.completeness ('abbr')['abbr'] + ' '
+
+        if self.partially_translated:
+            s += self.uptodateness ('abbr')['abbr'] + ' '
+        return s
+
+    def html_status (self, numbering=SectionNumber ()):
+        if self.title == 'Untitled':
+            return ''
+
+        if self.level[1] == 0: # if self is a master document
+            s = '''<table align="center" border="2">
+ <tr align="center">
+  <th>%s</th>''' % self.print_title (numbering)
+            s += ''.join (['  <th>%s</th>\n' % self.translation (h)
+                           for h in detailed_status_heads])
+            s += ' </tr>\n'
+            s += ' <tr align="left">\n  <td>%s<br>(%d)</td>\n' \
+                % (self.translation (section_titles_string),
+                   sum (self.masterdocument.word_count))
+
+        else:
+            s = ' <tr align="left">\n  <td>%s<br>(%d)</td>\n' \
+                % (self.print_title (numbering),
+                   sum (self.masterdocument.word_count))
+
+        if self.partially_translated:
+            s += '  <td>' + '<br>\n   '.join (self.translators) + '</td>\n'
+            s += '  <td>' + '<br>\n   '.join (self.checkers) + '</td>\n'
+        else:
+            s += '  <td></td>\n' * 2
+
+        c = self.completeness (['color', 'short'], translated=True)
+        s += '  <td><span style="background-color: #%(color)s">\
+%(short)s</span></td>\n' % {'color': c['color'],
+                           'short': c['short']}
+
+        if self.partially_translated:
+            u = self.uptodateness (['short', 'color'], translated=True)
+            s += '  <td><span style="background-color: #%(color)s">\
+%(short)s</span></td>\n' % {'color': u['color'],
+                           'short': u['short']}
+        else:
+            s += '  <td></td>\n'
+
+        s += '  <td>' + self.gdp_status () + '</td>\n </tr>\n'
+        s += ''.join ([i.translations[self.language].html_status (numbering)
+                       for i in self.masterdocument.includes
+                       if self.language in i.translations])
+
+        if self.level[1] == 0:  # if self is a master document
+            s += '</table>\n<p></p>\n'
+        return s
+
+class MasterTelyDocument (TelyDocument):
+    def __init__ (self,
+                  filename,
+                  parent_translations=dict ([(lang, None)
+                                             for lang in langdefs.LANGDICT])):
+        TelyDocument.__init__ (self, filename)
+        self.size = len (self.contents)
+        self.word_count = tely_word_count (self.contents)
+        translations = dict ([(lang, os.path.join (lang, filename))
+                              for lang in langdefs.LANGDICT])
+        self.translations = \
+            dict ([(lang,
+                    TranslatedTelyDocument (translations[lang],
+                                            self, parent_translations.get (lang)))
+                   for lang in langdefs.LANGDICT
+                   if os.path.exists (translations[lang])])
+        if self.translations:
+            self.includes = [MasterTelyDocument (f, self.translations)
+                             for f in self.included_files]
+        else:
+            self.includes = []
+
+    def update_word_counts (self, s):
+        s = update_word_count (s, self.filename, sum (self.word_count))
+        for i in self.includes:
+            s = i.update_word_counts (s)
+        return s
+
+    def html_status (self, numbering=SectionNumber ()):
+        if self.title == 'Untitled' or not self.translations:
+            return ''
+        if self.level[1] == 0: # if self is a master document
+            s = '''<table align="center" border="2">
+ <tr align="center">
+  <th>%s</th>''' % self.print_title (numbering)
+            s += ''.join (['  <th>%s</th>\n' % l for l in self.translations])
+            s += ' </tr>\n'
+            s += ' <tr align="left">\n  <td>Section titles<br>(%d)</td>\n' \
+                % sum (self.word_count)
+
+        else:  # if self is an included file
+            s = ' <tr align="left">\n  <td>%s<br>(%d)</td>\n' \
+                % (self.print_title (numbering), sum (self.word_count))
+
+        s += ''.join ([t.short_html_status ()
+                       for t in self.translations.values ()])
+        s += ' </tr>\n'
+        s += ''.join ([i.html_status (numbering) for i in self.includes])
+
+        if self.level[1] == 0:  # if self is a master document
+            s += '</table>\n<p></p>\n'
+        return s
+
+    def text_status (self, numbering=SectionNumber (), colspec=[48,12]):
+        if self.title == 'Untitled' or not self.translations:
+            return ''
+
+        s = ''
+        if self.level[1] == 0: # if self is a master document
+            s += (self.print_title (numbering) + ' ').ljust (colspec[0])
+            s += ''.join (['%s'.ljust (colspec[1]) % l
+                           for l in self.translations])
+            s += '\n'
+            s += ('Section titles (%d)' % \
+                      sum (self.word_count)).ljust (colspec[0])
+
+        else:
+            s = '%s (%d) ' \
+                % (self.print_title (numbering), sum (self.word_count))
+            s = s.ljust (colspec[0])
+
+        s += ''.join ([t.text_status ().ljust(colspec[1])
+                       for t in self.translations.values ()])
+        s += '\n\n'
+        s += ''.join ([i.text_status (numbering) for i in self.includes])
+
+        if self.level[1] == 0:
+            s += '\n'
+        return s
+
+
+update_category_word_counts_re = re.compile (r'(?ms)^-(\d+)-(.*?\n)\d+ *total')
+
+counts_re = re.compile (r'(?m)^(\d+) ')
+
+def update_category_word_counts_sub (m):
+    return '-' + m.group (1) + '-' + m.group (2) + \
+        str (sum ([int (c)
+                   for c in counts_re.findall (m.group (2))])).ljust (6) + \
+        'total'
+
+
+progress ("Reading documents...")
+
+tely_files = \
+    buildlib.read_pipe ("find -maxdepth 2 -name '*.tely'")[0].splitlines ()
+tely_files.sort ()
+master_docs = [MasterTelyDocument (os.path.normpath (filename))
+               for filename in tely_files]
+master_docs = [doc for doc in master_docs if doc.translations]
+
+main_status_page = open ('translations.template.html.in').read ()
+
+enabled_languages = [l for l in langdefs.LANGDICT
+                     if langdefs.LANGDICT[l].enabled
+                     and l != 'en']
+lang_status_pages = \
+    dict ([(l, open (os.path.join (l, 'translations.template.html.in')). read ())
+           for l in enabled_languages])
+
+progress ("Generating status pages...")
+
+date_time = buildlib.read_pipe ('LANG= date -u')[0]
+
+main_status_html = last_updated_string % date_time
+main_status_html += '\n'.join ([doc.html_status () for doc in master_docs])
+
+html_re = re.compile ('<html>', re.I)
+end_body_re = re.compile ('</body>', re.I)
+
+html_header = '''<html>
+<!-- This page is automatically generated by translation-status.py from
+translations.template.html.in; DO NOT EDIT !-->'''
+
+main_status_page = html_re.sub (html_header, main_status_page)
+
+main_status_page = end_body_re.sub (main_status_html + '\n</body>',
+                                    main_status_page)
+
+open ('translations.html.in', 'w').write (main_status_page)
+
+for l in enabled_languages:
+    date_time = buildlib.read_pipe ('LANG=%s date -u' % l)[0]
+    lang_status_pages[l] = translation[l] (last_updated_string) % date_time + lang_status_pages[l]
+    lang_status_page = html_re.sub (html_header, lang_status_pages[l])
+    html_status = '\n'.join ([doc.translations[l].html_status ()
+                              for doc in master_docs
+                              if l in doc.translations])
+    lang_status_page = end_body_re.sub (html_status + '\n</body>',
+                                        lang_status_page)
+    open (os.path.join (l, 'translations.html.in'), 'w').write (lang_status_page)
+
+main_status_txt = '''Documentation translations status
+Generated %s
+NT = not translated
+FT = fully translated
+
+''' % date_time
+
+main_status_txt += '\n'.join ([doc.text_status () for doc in master_docs])
+
+status_txt_file = 'out/translations-status.txt'
+progress ("Writing %s..." % status_txt_file)
+open (status_txt_file, 'w').write (main_status_txt)
+
+translation_instructions_file = 'TRANSLATION'
+progress ("Updating %s..." % translation_instructions_file)
+translation_instructions = open (translation_instructions_file).read ()
+
+for doc in master_docs:
+    translation_instructions = doc.update_word_counts (translation_instructions)
+
+for html_file in re.findall (r'(?m)^\d+ *(\S+?\.html\S*?)(?: |$)',
+                             translation_instructions):
+    word_count = sgml_word_count (open (html_file).read ())
+    translation_instructions = update_word_count (translation_instructions,
+                                                  html_file,
+                                                  word_count)
+
+for po_file in re.findall (r'(?m)^\d+ *(\S+?\.po\S*?)(?: |$)',
+                           translation_instructions):
+    word_count = po_word_count (open (po_file).read ())
+    translation_instructions = update_word_count (translation_instructions,
+                                                  po_file,
+                                                  word_count)
+
+translation_instructions = \
+    update_category_word_counts_re.sub (update_category_word_counts_sub,
+                                        translation_instructions)
+
+open (translation_instructions_file, 'w').write (translation_instructions)
diff --git a/scripts/auxiliar/update-snippets.py b/scripts/auxiliar/update-snippets.py
new file mode 100755 (executable)
index 0000000..6ccdbc1
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# update-snippets.py
+
+# USAGE:  update-snippets.py REFERENCE-DIR TARGET-DIR FILES
+#
+# update ly snippets in TARGET-DIR/FILES with snippets from REFERENCE-DIR/FILES
+#
+# More precisely, each existing FILE in TARGET-DIR is matched to the FILE in
+# REFERENCE-DIR (it the latter does not exist, a warning is given).
+#
+# Shell wildcards expansion is performed on FILES.
+# This script currently supports Texinfo format.
+# Ly snippets preceded with a line containing '@c KEEP LY' in TARGET-DIR/FILES
+# will not be updated.
+# An error occurs if REFERENCE-DIR/FILE and TARGET-DIR/FILE do not have the
+# same snippets count.
+
+import sys
+import os
+import glob
+import re
+
+print "update-snippets.py"
+
+comment_re = re.compile (r'(?<!@)(@c(?:omment)? .*?\n|^@ignore\n.*?\n@end ignore\n)', re.M | re.S)
+snippet_re = re.compile (r'^(@lilypond(?:file)?(?:\[.*?\])?\s*\{.+?\}|@lilypond(?:\[.*?\])?(?:.|\n)+?@end lilypond)', re.M)
+
+
+def snippet_split (l):
+    r = []
+    for s in [s for s in l if s]:
+        if s.startswith ('@c ') or s.startswith ('@ignore\n') or s.startswith ('@comment '):
+            r.append(s)
+        else:
+            r += [t for t in snippet_re.split (s) if t]
+    return r
+
+def count_snippet (l):
+    k = 0
+    for s in l:
+        if s.startswith ('@lilypond'):
+            k += 1
+    return k
+
+def find_next_snippet (l, k):
+    while not l[k].startswith ('@lilypond'):
+        k += 1
+    return k
+
+exit_code = 0
+
+def update_exit_code (code):
+    global exit_code
+    exit_code = max (code, exit_code)
+
+ref_dir, target_dir = sys.argv [1:3]
+file_patterns = sys.argv[3:]
+
+total_snippet_count = 0
+changed_snippets_count = 0
+
+for pattern in file_patterns:
+    files = glob.glob (os.path.join (target_dir, pattern))
+    for file in files:
+        ref_file = os.path.join (ref_dir, os.path.basename (file))
+        if not os.path.isfile (ref_file):
+            sys.stderr.write ("Warning: %s: no such file.\nReference file for %s not found.\n" % (ref_file, file))
+            continue
+        f = open (file, 'r')
+        target_source = comment_re.split (f.read ())
+        f.close ()
+        if reduce (lambda x, y: x or y, ['-- SKELETON FILE --' in s for s in target_source]):
+            sys.stderr.write ("Skipping skeleton file %s\n" % file)
+            continue
+        g = open (ref_file, 'r')
+        ref_source = comment_re.split (g.read ())
+        target_source = snippet_split (target_source)
+        ref_source = snippet_split (ref_source)
+        if '' in target_source or '' in ref_source:
+            raise "AAAAARGH: unuseful empty string"
+        snippet_count = count_snippet (target_source)
+        if not snippet_count == count_snippet (ref_source):
+            update_exit_code (1)
+            sys.stderr.write ("Error: %s and %s have different snippet counts.\n\
+Update translation by at least adding a @lilypond block where necessary, then rerun this script.\n" % (ref_file, file))
+            continue
+        total_snippet_count += snippet_count
+        c = 0
+        k = -1
+        for j in range (len (target_source)):
+            if target_source[j].startswith ('@lilypond'):
+                k = find_next_snippet (ref_source, k+1)
+                if j > 0 and (not target_source[j-1].startswith ('@c KEEP LY')) and target_source[j] != ref_source[k]:
+                    target_source[j] = ref_source[k]
+                    c += 1
+                    changed_snippets_count += 1
+        f = open (file, 'w')
+        f.write (''.join (target_source))
+        sys.stderr.write ('%s: %d/%d snippets updated\n' % (file, c, snippet_count))
+
+sys.stderr.write ('\nTotal: %d snippets, %d updated snippets.\n' % (total_snippet_count, changed_snippets_count))
+sys.exit (exit_code)
diff --git a/scripts/build/GNUmakefile b/scripts/build/GNUmakefile
new file mode 100644 (file)
index 0000000..5a62a47
--- /dev/null
@@ -0,0 +1,14 @@
+depth = ../..
+
+STEPMAKE_TEMPLATES=script install po
+
+include $(depth)/make/stepmake.make
+
+# Should we install these? This should be handled by sysadmin or
+# packager but if she forgets...
+#INSTALLATION_OUT_SUFFIXES=1
+#INSTALLATION_OUT_DIR1=$(local_lilypond_datadir)/scripts
+#INSTALLATION_OUT_FILES1=$(outdir)/lilypond-login $(outdir)/lilypond-profile
+
+all: $(INSTALLATION_FILES)
+
diff --git a/scripts/build/bib2html.py b/scripts/build/bib2html.py
new file mode 100644 (file)
index 0000000..c16f21c
--- /dev/null
@@ -0,0 +1,76 @@
+#!@PYTHON@
+import os
+import sys
+import getopt
+import tempfile
+
+# usage:
+def usage ():
+    print 'usage: %s [-s style] [-o <outfile>] BIBFILES...'
+
+(options, files) = getopt.getopt (sys.argv[1:], 's:o:', [])
+
+output = 'bib.html'
+style = 'long'
+
+for (o,a) in options:
+    if o == '-h' or o == '--help':
+        usage ()
+        sys.exit (0)
+    elif o == '-s' or o == '--style':
+        style = a
+    elif o == '-o' or o == '--output':
+        output = a
+    else:
+        raise Exception ('unknown option: %s' % o)
+
+
+if style not in ['alpha','index','long','longp','long-pario','short','short-pario','split']:
+    sys.stderr.write ("Unknown style \`%s'\n" % style)
+
+tempfile = tempfile.mktemp ('bib2html')
+
+if not files:
+   usage ()
+   sys.exit (2)
+
+
+def strip_extension (f, ext):
+    (p, e) = os.path.splitext (f)
+    if e == ext:
+        e = ''
+    return p + e
+
+nf = []
+for f in files:
+    nf.append (strip_extension (f, '.bib'))
+
+files = ','.join (nf)
+
+open (tempfile + '.aux', 'w').write (r'''
+\relax 
+\citation{*}
+\bibstyle{html-%(style)s}
+\bibdata{%(files)s}''' % vars ()) 
+
+cmd = "bibtex %s" % tempfile
+
+sys.stdout.write ("Invoking `%s'\n" % cmd)
+stat = os.system (cmd)
+if stat <> 0:
+    sys.exit(1)
+
+
+#TODO: do tex -> html on output 
+
+bbl = open (tempfile + '.bbl').read ()
+
+open (output, 'w').write  (bbl)
+
+
+def cleanup (tempfile):
+    for a in ['aux','bbl', 'blg']:
+        os.unlink (tempfile + '.' + a)
+
+cleanup (tempfile)
+
diff --git a/scripts/build/catmidi.py b/scripts/build/catmidi.py
new file mode 100644 (file)
index 0000000..c90d602
--- /dev/null
@@ -0,0 +1,12 @@
+#!@PYTHON@
+
+import sys
+import midi
+
+(h,tracks) = midi.parse (open (sys.argv[1]).read ())
+
+tracks = tracks[1:]
+
+for t in tracks:
+    for e in t:
+        print e
diff --git a/scripts/build/extract_texi_filenames.py b/scripts/build/extract_texi_filenames.py
new file mode 100644 (file)
index 0000000..5798d5d
--- /dev/null
@@ -0,0 +1,170 @@
+#!@PYTHON@
+# -*- coding: utf-8 -*-
+# extract_texi_filenames.py
+
+# USAGE:  extract_texi_filenames.py [-o OUTDIR] FILES
+#
+# -o OUTDIR specifies that output files should rather be written in OUTDIR
+#
+# Description:
+# This script parses the .texi file given and creates a file with the
+# nodename <=> filename/anchor map.
+# The idea behind: Unnumbered subsections go into the same file as the
+# previous numbered section, @translationof gives the original node name,
+# which is then used for the filename/anchor.
+#
+# If this script is run on a file texifile.texi, it produces a file
+# texifile[.LANG].xref-map with tab-separated entries of the form
+#        NODE\tFILENAME\tANCHOR
+# LANG is the document language in case it's not 'en'
+# Note: The filename does not have any extension appended!
+# This file can then be used by our texi2html init script to determine
+# the correct file name and anchor for external refs
+
+import sys
+import re
+import os
+import getopt
+
+optlist, args = getopt.getopt (sys.argv[1:],'o:')
+files = args
+
+outdir = '.'
+for x in optlist:
+    if x[0] == '-o':
+        outdir = x[1]
+
+if not os.path.isdir (outdir):
+    if os.path.exists (outdir):
+        os.unlink (outdir)
+    os.makedirs (outdir)
+
+include_re = re.compile (r'@include ((?!../lily-).*?)\.texi$', re.M)
+whitespaces = re.compile (r'\s+')
+section_translation_re = re.compile ('^@(node|(?:unnumbered|appendix)\
+(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|\
+(?:major|chap|(?:sub){0,2})heading|translationof) (.*?)\\s*$', re.MULTILINE)
+
+def expand_includes (m, filename):
+    filepath = os.path.join (os.path.dirname (filename), m.group(1)) + '.texi'
+    if os.path.exists (filepath):
+        return extract_sections (filepath)[1]
+    else:
+        print "Unable to locate include file " + filepath
+        return ''
+
+lang_re = re.compile (r'^@documentlanguage (.+)', re.M)
+
+def extract_sections (filename):
+    result = ''
+    f = open (filename, 'r')
+    page = f.read ()
+    f.close()
+    # Search document language
+    m = lang_re.search (page)
+    if m and m.group (1) != 'en':
+        lang_suffix = '.' + m.group (1)
+    else:
+        lang_suffix = ''
+    # Replace all includes by their list of sections and extract all sections
+    page = include_re.sub (lambda m: expand_includes (m, filename), page)
+    sections = section_translation_re.findall (page)
+    for sec in sections:
+        result += "@" + sec[0] + " " + sec[1] + "\n"
+    return (lang_suffix, result)
+
+# Convert a given node name to its proper file name (normalization as explained
+# in the texinfo manual:
+# http://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref-Node-Name-Expansion.html
+def texinfo_file_name(title):
+    # exception: The top node is always mapped to index.html
+    if title == "Top":
+        return "index"
+    # File name normalization by texinfo (described in the texinfo manual):
+    # 1/2: letters and numbers are left unchanged
+    # 3/4: multiple, leading and trailing whitespace is removed
+    title = title.strip ();
+    title = whitespaces.sub (' ', title)
+    # 5:   all remaining spaces are converted to '-'
+    # 6:   all other 7- or 8-bit chars are replaced by _xxxx (xxxx=ascii character code)
+    result = ''
+    for index in range(len(title)):
+        char = title[index]
+        if char == ' ': # space -> '-'
+            result += '-'
+        elif ( ('0' <= char and char <= '9' ) or
+               ('A' <= char and char <= 'Z' ) or
+               ('a' <= char and char <= 'z' ) ):  # number or letter
+            result += char
+        else:
+            ccode = ord(char)
+            if ccode <= 0xFFFF:
+                result += "_%04x" % ccode
+            else:
+                result += "__%06x" % ccode
+    # 7: if name begins with number, prepend 't_g' (so it starts with a letter)
+    if (result != '') and (ord(result[0]) in range (ord('0'), ord('9'))):
+        result = 't_g' + result
+    return result
+
+texinfo_re = re.compile (r'@.*{(.*)}')
+def remove_texinfo (title):
+    return texinfo_re.sub (r'\1', title)
+
+def create_texinfo_anchor (title):
+    return texinfo_file_name (remove_texinfo (title))
+
+unnumbered_re = re.compile (r'unnumbered.*')
+def process_sections (filename, lang_suffix, page):
+    sections = section_translation_re.findall (page)
+    basename = os.path.splitext (os.path.basename (filename))[0]
+    p = os.path.join (outdir, basename) + lang_suffix + '.xref-map'
+    f = open (p, 'w')
+
+    this_title = ''
+    this_filename = 'index'
+    this_anchor = ''
+    this_unnumbered = False
+    had_section = False
+    for sec in sections:
+        if sec[0] == "node":
+            # Write out the cached values to the file and start a new section:
+            if this_title != '' and this_title != 'Top':
+                    f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
+            had_section = False
+            this_title = remove_texinfo (sec[1])
+            this_anchor = create_texinfo_anchor (sec[1])
+        elif sec[0] == "translationof":
+            anchor = create_texinfo_anchor (sec[1])
+            # If @translationof is used, it gives the original node name, which
+            # we use for the anchor and the file name (if it is a numbered node)
+            this_anchor = anchor
+            if not this_unnumbered:
+                this_filename = anchor
+        else:
+            # Some pages might not use a node for every section, so treat this
+            # case here, too: If we already had a section and encounter enother
+            # one before the next @node, we write out the old one and start
+            # with the new values
+            if had_section and this_title != '':
+                f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
+                this_title = remove_texinfo (sec[1])
+                this_anchor = create_texinfo_anchor (sec[1])
+            had_section = True
+
+            # unnumbered nodes use the previously used file name, only numbered
+            # nodes get their own filename! However, top-level @unnumbered
+            # still get their own file.
+            this_unnumbered = unnumbered_re.match (sec[0])
+            if not this_unnumbered or sec[0] == "unnumbered":
+                this_filename = this_anchor
+
+    if this_title != '' and this_title != 'Top':
+        f.write (this_title + "\t" + this_filename + "\t" + this_anchor + "\n")
+    f.close ()
+
+
+for filename in files:
+    print "extract_texi_filenames.py: Processing %s" % filename
+    (lang_suffix, sections) = extract_sections (filename)
+    process_sections (filename, lang_suffix, sections)
diff --git a/scripts/build/gen-emmentaler-scripts.py b/scripts/build/gen-emmentaler-scripts.py
new file mode 100644 (file)
index 0000000..3da8840
--- /dev/null
@@ -0,0 +1,104 @@
+#!@PYTHON@
+import sys
+import getopt
+import re 
+import os
+
+(options, files) = \
+ getopt.getopt (sys.argv[1:],
+        '',
+        ['dir='])
+
+
+outdir = ''
+for opt in options:
+    o = opt[0]
+    a = opt[1]
+    if o == '--dir':
+        outdir = a
+    else:
+        print o
+        raise getopt.error
+
+# Ugh
+for design_size in [11,13,14,16,18,20,23,26]:
+    name = 'Emmentaler' 
+    filename = name.lower ()
+    script = '''#!@FONTFORGE@
+
+New();
+
+# Separate Feta versioning?
+#         *  using 20 as Weight works for gnome-font-select widget: gfs
+
+notice = "";
+notice += "This font is distributed under the GNU General Public License. ";
+notice += "As a special exception, if you create a document which uses ";
+notice += "this font, and embed this font or unaltered portions of this ";
+notice += "font into the document, this font does not by itself cause the ";
+notice += "resulting document to be covered by the GNU General Public License.";;
+
+SetFontNames("%(name)s-%(design_size)d", "%(name)s", "%(name)s %(design_size)d", "%(design_size)d", notice, "@TOPLEVEL_VERSION@");
+
+MergeFonts("feta%(design_size)d.pfb");
+MergeFonts("parmesan%(design_size)d.pfb");
+
+# load nummer/din after setting PUA.
+i = 0;
+while (i < CharCnt())
+ Select(i);
+# crashes fontforge, use PUA for now -- jcn
+# SetUnicodeValue(i + 0xF0000, 0);
+/*
+PRIVATE AREA
+   In the BMP, the range 0xe000 to 0xf8ff will never be  assigned  to  any
+   characters  by  the standard and is reserved for private usage. For the
+   Linux community, this private area has been subdivided further into the
+   range  0xe000  to 0xefff which can be used individually by any end-user
+   and the Linux zone in the range 0xf000 to 0xf8ff where  extensions  are
+   coordinated  among  all  Linux  users.  The  registry of the characters
+   assigned to the Linux zone is currently maintained by  H.  Peter  Anvin
+   <Peter.Anvin@linux.org>.
+*/
+ SetUnicodeValue(i + 0xE000, 0);
+ ++i;
+endloop
+
+
+MergeFonts("feta-alphabet%(design_size)d.pfb");
+MergeKern("feta-alphabet%(design_size)d.tfm");
+
+LoadTableFromFile("LILF", "%(filename)s-%(design_size)d.subfonts");
+LoadTableFromFile("LILC", "feta%(design_size)d.otf-table");
+LoadTableFromFile("LILY", "feta%(design_size)d.otf-gtable");
+
+Generate("%(filename)s-%(design_size)d.otf");
+Generate("%(filename)s-%(design_size)d.svg");
+''' % vars()
+
+    basename = '%s-%d' % (filename, design_size)
+    path = os.path.join (outdir, basename + '.pe')
+    open (path, 'w').write (script)
+
+    subfonts = ['feta%(design_size)d',
+          'parmesan%(design_size)d',
+          'feta-alphabet%(design_size)d']
+
+    ns = []
+    for s in subfonts:
+        ns.append ('%s' % (s % vars()))
+        
+    subfonts_str = ' '.join (ns)
+    
+    open (os.path.join (outdir, '%(filename)s-%(design_size)d.subfonts' % vars()), 'w').write (subfonts_str)
+
+    path = os.path.join (outdir, '%s-%d.dep' % (filename, design_size))
+
+    deps = r'''%(filename)s-%(design_size)d.otf: $(outdir)/feta%(design_size)d.pfa \
+ $(outdir)/parmesan%(design_size)d.pfa  \
+ $(outdir)/feta-alphabet%(design_size)d.pfa feta%(design_size)d.otf-table \
+ $(outdir)/feta-alphabet%(design_size)d.pfa feta%(design_size)d.otf-gtable
+''' % vars()
+    open (path, 'w').write (deps)
+
+    open (os.path.join (outdir, basename + '.fontname'), 'w').write ("%s-%d" % (name, design_size))
diff --git a/scripts/build/genicon.py b/scripts/build/genicon.py
new file mode 100644 (file)
index 0000000..5437352
--- /dev/null
@@ -0,0 +1,31 @@
+#!@PYTHON@
+import os
+import sys
+import tempfile
+
+base = os.path.splitext (os.path.split (sys.argv[1])[1])[0]
+input = os.path.abspath (sys.argv[1])
+output = os.path.abspath (sys.argv[2])
+program_name= os.path.split (sys.argv[0])[1]
+
+dir = tempfile.mktemp (program_name)
+os.mkdir (dir, 0777)
+os.chdir(dir)
+
+def system (c):
+    print c
+    if os.system (c):
+        raise 'barf'
+
+outputs = []
+for sz in [48,32,16] :
+    
+    for depth in [24,8]:
+        out = '%(base)s-%(sz)d-%(depth)d.png' % locals()
+        system ('convert -depth %(depth)d -sample %(sz)d %(input)s %(out)s' %
+            locals ())
+        outputs.append (out)
+        
+system('icotool --output %s --create %s' % (output, ' '.join (outputs)))
+system('rm -rf %(dir)s' % locals())                 
+
diff --git a/scripts/build/grand-replace.py b/scripts/build/grand-replace.py
new file mode 100644 (file)
index 0000000..dc0697d
--- /dev/null
@@ -0,0 +1,69 @@
+#! @PYTHON@
+
+'''
+    Copyright (c) 2009--210    Jan Nieuwenhuizen <janneke@gnu.org>
+
+    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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+'''
+
+import datetime
+import os
+import re
+import sys
+#
+sys.path.insert (0, '@top-src-dir@/scripts/build')
+import pytt
+
+dry_run = False
+
+def read_pipe (cmd, ignore_errors=False):
+    pipe = os.popen (cmd)
+    val = pipe.read ()
+    if pipe.close () and not ignore_errors:
+        raise SystemFailed ('Pipe failed: %(cmd)s' % locals ())
+    return val
+
+def filter_out (p, lst):
+    return filter (lambda x: not p (x), lst)
+
+copied_files = [
+    'help2man.pl',
+    'mf2pt1.mp',
+    'mf2pt1.pl',
+    'texinfo.tex',
+    'txi-de.tex',
+    'txi-en.tex',
+    'txi-fr.tex',
+    'txi-sf.tex',
+    ]
+
+def main ():
+    files = filter_out (lambda x: (os.path.basename (x) in copied_files
+                                   or 'CHANGES' in x or 'ChangeLog' in x),
+                        read_pipe ('cd @top-src-dir@ && git ls-files').split ())
+    os.chdir ('@top-src-dir@')
+    year = datetime.datetime.now ().year
+    last_year = year - 1
+    last_year_1d = last_year % 10
+    for f in files:
+        pytt.pytt ('(Copyright|\(c\)|\(C\)|@copyright\{\})\s*%(last_year)s([^-]|$)' % locals (),
+                   r'\1 %(last_year)s--%(year)s' % locals (),
+                   f)
+        pytt.pytt ('(Copyright|\(c\)|\(C\)|@copyright\{\})\s*([^-]*)--(20[0-9][0-%(last_year_1d)s])' % locals (),
+                   r'\1 \2--%(year)s' % locals (),
+                   f)
+
+if __name__ == '__main__':
+    main ()
diff --git a/scripts/build/help2man.pl b/scripts/build/help2man.pl
new file mode 100644 (file)
index 0000000..9cb09c4
--- /dev/null
@@ -0,0 +1,559 @@
+#!@PERL@ -w
+
+# Generate a short man page from --help and --version output.
+# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software
+# Foundation, Inc.
+
+# 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, 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.
+
+# Written by Brendan O'Dea <bod@debian.org>
+# Available from ftp://ftp.gnu.org/gnu/help2man/
+
+use 5.005;
+use strict;
+use Getopt::Long;
+use Text::Tabs qw(expand);
+use POSIX qw(strftime setlocale LC_TIME);
+
+my $this_program = 'help2man';
+my $this_version = '1.28';
+my $version_info = <<EOT;
+GNU $this_program $this_version
+
+Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Written by Brendan O'Dea <bod\@debian.org>
+EOT
+
+my $help_info = <<EOT;
+`$this_program' generates a man page out of `--help' and `--version' output.
+
+Usage: $this_program [OPTIONS]... EXECUTABLE
+
+ -n, --name=STRING       description for the NAME paragraph
+ -s, --section=SECTION   section number for manual page (1, 6, 8)
+ -m, --manual=TEXT       name of manual (User Commands, ...)
+ -S, --source=TEXT       source of program (FSF, Debian, ...)
+ -i, --include=FILE      include material from `FILE'
+ -I, --opt-include=FILE  include material from `FILE' if it exists
+ -o, --output=FILE       send output to `FILE'
+ -p, --info-page=TEXT    name of Texinfo manual
+ -N, --no-info           suppress pointer to Texinfo manual
+     --help              print this help, then exit
+     --version           print version number, then exit
+
+EXECUTABLE should accept `--help' and `--version' options although
+alternatives may be specified using:
+
+ -h, --help-option=STRING     help option string
+ -v, --version-option=STRING  version option string
+
+Report bugs to <bug-help2man\@gnu.org>.
+EOT
+
+my $section = 1;
+my $manual = '';
+my $source = '';
+my $help_option = '--help';
+my $version_option = '--version';
+my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info);
+
+my %opt_def = (
+    'n|name=s'          => \$opt_name,
+    's|section=s'       => \$section,
+    'm|manual=s'        => \$manual,
+    'S|source=s'        => \$source,
+    'i|include=s'       => sub { push @opt_include, [ pop, 1 ] },
+    'I|opt-include=s'   => sub { push @opt_include, [ pop, 0 ] },
+    'o|output=s'        => \$opt_output,
+    'p|info-page=s'     => \$opt_info,
+    'N|no-info'                 => \$opt_no_info,
+    'h|help-option=s'   => \$help_option,
+    'v|version-option=s' => \$version_option,
+);
+
+# Parse options.
+Getopt::Long::config('bundling');
+GetOptions (%opt_def,
+    help    => sub { print $help_info; exit },
+    version => sub { print $version_info; exit },
+) or die $help_info;
+
+die $help_info unless @ARGV == 1;
+
+my %include = ();
+my %append = ();
+my @include = (); # retain order given in include file
+
+# Process include file (if given).  Format is:
+#
+#   [section name]
+#   verbatim text
+#
+# or
+#
+#   /pattern/
+#   verbatim text
+#
+
+while (@opt_include)
+{
+    my ($inc, $required) = @{shift @opt_include};
+
+    next unless -f $inc or $required;
+    die "$this_program: can't open `$inc' ($!)\n"
+       unless open INC, $inc;
+
+    my $key;
+    my $hash = \%include;
+
+    while (<INC>)
+    {
+       # [section]
+       if (/^\[([^]]+)\]/)
+       {
+           $key = uc $1;
+           $key =~ s/^\s+//;
+           $key =~ s/\s+$//;
+           $hash = \%include;
+           push @include, $key unless $include{$key};
+           next;
+       }
+
+       # /pattern/
+       if (m!^/(.*)/([ims]*)!)
+       {
+           my $pat = $2 ? "(?$2)$1" : $1;
+
+           # Check pattern.
+           eval { $key = qr($pat) };
+           if ($@)
+           {
+               $@ =~ s/ at .*? line \d.*//;
+               die "$inc:$.:$@";
+           }
+
+           $hash = \%append;
+           next;
+       }
+
+       # Check for options before the first section--anything else is
+       # silently ignored, allowing the first for comments and
+       # revision info.
+       unless ($key)
+       {
+           # handle options
+           if (/^-/)
+           {
+               local @ARGV = split;
+               GetOptions %opt_def;
+           }
+
+           next;
+       }
+
+       $hash->{$key} ||= '';
+       $hash->{$key} .= $_;
+    }
+
+    close INC;
+
+    die "$this_program: no valid information found in `$inc'\n"
+       unless $key;
+}
+
+# Compress trailing blank lines.
+for my $hash (\(%include, %append))
+{
+    for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ }
+}
+
+# Turn off localisation of executable's output.
+@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
+
+# Turn off localisation of date (for strftime).
+setlocale LC_TIME, 'C';
+
+# Grab help and version info from executable.
+my ($help_text, $version_text) = map {
+    join '', map { s/ +$//; expand $_ } `$ARGV[0] $_ 2>/dev/null`
+       or die "$this_program: can't get `$_' info from $ARGV[0]\n"
+} $help_option, $version_option;
+
+my $date = strftime "%B %Y", localtime;
+(my $program = $ARGV[0]) =~ s!.*/!!;
+my $package = $program;
+my $version;
+
+if ($opt_output)
+{
+    unlink $opt_output
+       or die "$this_program: can't unlink $opt_output ($!)\n"
+       if -e $opt_output;
+
+    open STDOUT, ">$opt_output"
+       or die "$this_program: can't create $opt_output ($!)\n";
+}
+
+# The first line of the --version information is assumed to be in one
+# of the following formats:
+#
+#   <version>
+#   <program> <version>
+#   {GNU,Free} <program> <version>
+#   <program> ({GNU,Free} <package>) <version>
+#   <program> - {GNU,Free} <package> <version>
+#
+# and seperated from any copyright/author details by a blank line.
+
+($_, $version_text) = split /\n+/, $version_text, 2;
+
+if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or
+    /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/)
+{
+    $program = $1;
+    $package = $2;
+    $version = $3;
+}
+elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/)
+{
+    $program = $2;
+    $package = $1 ? "$1$2" : $2;
+    $version = $3;
+}
+else
+{
+    $version = $_;
+}
+
+$program =~ s!.*/!!;
+
+# No info for `info' itself.
+$opt_no_info = 1 if $program eq 'info';
+
+# --name overrides --include contents.
+$include{NAME} = "$program \\- $opt_name\n" if $opt_name;
+
+# Default (useless) NAME paragraph.
+$include{NAME} ||= "$program \\- manual page for $program $version\n";
+
+# Man pages traditionally have the page title in caps.
+my $PROGRAM = uc $program;
+
+# Set default page head/footers
+$source ||= "$program $version";
+unless ($manual)
+{
+    for ($section)
+    {
+       if (/^(1[Mm]|8)/) { $manual = 'System Administration Utilities' }
+       elsif (/^6/)      { $manual = 'Games' }
+       else              { $manual = 'User Commands' }
+    }
+}
+
+# Extract usage clause(s) [if any] for SYNOPSIS.
+if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m)
+{
+    my @syn = $2 . $3;
+
+    if ($_ = $4)
+    {
+       s/^\n//;
+       for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ }
+    }
+
+    my $synopsis = '';
+    for (@syn)
+    {
+       $synopsis .= ".br\n" if $synopsis;
+       s!^\S*/!!;
+       s/^(\S+) *//;
+       $synopsis .= ".B $1\n";
+       s/\s+$//;
+       s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
+       s/^/\\fI/ unless s/^\\fR//;
+       $_ .= '\fR';
+       s/(\\fI)( *)/$2$1/g;
+       s/\\fI\\fR//g;
+       s/^\\fR//;
+       s/\\fI$//;
+       s/^\./\\&./;
+
+       $synopsis .= "$_\n";
+    }
+
+    $include{SYNOPSIS} ||= $synopsis;
+}
+
+# Process text, initial section is DESCRIPTION.
+my $sect = 'DESCRIPTION';
+$_ = "$help_text\n\n$version_text";
+
+# Normalise paragraph breaks.
+s/^\n+//;
+s/\n*$/\n/;
+s/\n\n+/\n\n/g;
+
+# Temporarily exchange leading dots, apostrophes and backslashes for
+# tokens.
+s/^\./\x80/mg;
+s/^'/\x81/mg;
+s/\\/\x82/g;
+
+# Start a new paragraph (if required) for these.
+s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g;
+
+sub convert_option;
+
+while (length)
+{
+    # Convert some standard paragraph names.
+    if (s/^(Options|Examples): *\n//)
+    {
+       $sect = uc $1;
+       next;
+    }
+
+    # Copyright section
+    if (/^Copyright +[(\xa9]/)
+    {
+       $sect = 'COPYRIGHT';
+       $include{$sect} ||= '';
+       $include{$sect} .= ".PP\n" if $include{$sect};
+
+       my $copy;
+       ($copy, $_) = split /\n\n/, $_, 2;
+
+       for ($copy)
+       {
+           # Add back newline
+           s/\n*$/\n/;
+
+           # Convert iso9959-1 copyright symbol or (c) to nroff
+           # character.
+           s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg;
+
+           # Insert line breaks before additional copyright messages
+           # and the disclaimer.
+           s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g;
+
+           # Join hyphenated lines.
+           s/([A-Za-z])-\n */$1/g;
+       }
+
+       $include{$sect} .= $copy;
+       $_ ||= '';
+       next;
+    }
+
+    # Catch bug report text.
+    if (/^(Report +bugs|Email +bug +reports +to) /)
+    {
+       $sect = 'REPORTING BUGS';
+    }
+
+    # Author section.
+    elsif (/^Written +by/)
+    {
+       $sect = 'AUTHOR';
+    }
+
+    # Examples, indicated by an indented leading $, % or > are
+    # rendered in a constant width font.
+    if (/^( +)([\$\%>] )\S/)
+    {
+       my $indent = $1;
+       my $prefix = $2;
+       my $break = '.IP';
+       $include{$sect} ||= '';
+       while (s/^$indent\Q$prefix\E(\S.*)\n*//)
+       {
+           $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n";
+           $break = '.br';
+       }
+
+       next;
+    }
+
+    my $matched = '';
+    $include{$sect} ||= '';
+
+    # Sub-sections have a trailing colon and the second line indented.
+    if (s/^(\S.*:) *\n / /)
+    {
+       $matched .= $& if %append;
+       $include{$sect} .= qq(.SS "$1"\n);
+    }
+
+    my $indent = 0;
+    my $content = '';
+
+    # Option with description.
+    if (s/^( {1,10}([+-]\S.*?))(?:(  +(?!-))|\n( {20,}))(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $indent = length ($4 || "$1$3");
+       $content = ".TP\n\x83$2\n\x83$5\n";
+       unless ($4)
+       {
+           # Indent may be different on second line.
+           $indent = length $& if /^ {20,}/;
+       }
+    }
+
+    # Option without description.
+    elsif (s/^ {1,10}([+-]\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $content = ".HP\n\x83$1\n";
+       $indent = 80; # not continued
+    }
+
+    # Indented paragraph with tag.
+    elsif (s/^( +(\S.*?)  +)(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $indent = length $1;
+       $content = ".TP\n\x83$2\n\x83$3\n";
+    }
+
+    # Indented paragraph.
+    elsif (s/^( +)(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $indent = length $1;
+       $content = ".IP\n\x83$2\n";
+    }
+
+    # Left justified paragraph.
+    else
+    {
+       s/(.*)\n//;
+       $matched .= $& if %append;
+       $content = ".PP\n" if $include{$sect};
+       $content .= "$1\n";
+    }
+
+    # Append continuations.
+    while (s/^ {$indent}(\S.*)\n//)
+    {
+       $matched .= $& if %append;
+       $content .= "\x83$1\n"
+    }
+
+    # Move to next paragraph.
+    s/^\n+//;
+
+    for ($content)
+    {
+       # Leading dot and apostrophe protection.
+       s/\x83\./\x80/g;
+       s/\x83'/\x81/g;
+       s/\x83//g;
+
+       # Convert options.
+       s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge;
+    }
+
+    # Check if matched paragraph contains /pat/.
+    if (%append)
+    {
+       for my $pat (keys %append)
+       {
+           if ($matched =~ $pat)
+           {
+               $content .= ".PP\n" unless $append{$pat} =~ /^\./;
+               $content .= $append{$pat};
+           }
+       }
+    }
+
+    $include{$sect} .= $content;
+}
+
+# Refer to the real documentation.
+unless ($opt_no_info)
+{
+    my $info_page = $opt_info || $program;
+
+    $sect = 'SEE ALSO';
+    $include{$sect} ||= '';
+    $include{$sect} .= ".PP\n" if $include{$sect};
+    $include{$sect} .= <<EOT;
+The full documentation for
+.B $program
+is maintained as a Texinfo manual.  If the
+.B info
+and
+.B $program
+programs are properly installed at your site, the command
+.IP
+.B info $info_page
+.PP
+should give you access to the complete manual.
+EOT
+}
+
+# Output header.
+print <<EOT;
+.\\" DO NOT MODIFY THIS FILE!  It was generated by $this_program $this_version.
+.TH $PROGRAM "$section" "$date" "$source" "$manual"
+EOT
+
+# Section ordering.
+my @pre = qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES);
+my @post = ('AUTHOR', 'REPORTING BUGS', 'COPYRIGHT', 'SEE ALSO');
+my $filter = join '|', @pre, @post;
+
+# Output content.
+for (@pre, (grep ! /^($filter)$/o, @include), @post)
+{
+    if ($include{$_})
+    {
+       my $quote = /\W/ ? '"' : '';
+       print ".SH $quote$_$quote\n";
+       
+       for ($include{$_})
+       {
+           # Replace leading dot, apostrophe and backslash tokens.
+           s/\x80/\\&./g;
+           s/\x81/\\&'/g;
+           s/\x82/\\e/g;
+           print;
+       }
+    }
+}
+
+exit;
+
+# Convert option dashes to \- to stop nroff from hyphenating 'em, and
+# embolden.  Option arguments get italicised.
+sub convert_option
+{
+    local $_ = '\fB' . shift;
+
+    s/-/\\-/g;
+    unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
+    {
+       s/=(.)/\\fR=\\fI$1/;
+       s/ (.)/ \\fI$1/;
+       $_ .= '\fR';
+    }
+
+    $_;
+}
diff --git a/scripts/build/html-gettext.py b/scripts/build/html-gettext.py
new file mode 100644 (file)
index 0000000..ccfe693
--- /dev/null
@@ -0,0 +1,126 @@
+#!@PYTHON@
+# html-gettext.py
+
+# USAGE:  html-gettext.py [-o OUTDIR] LANG FILES
+#
+# -o OUTDIR specifies that output files should be written in OUTDIR
+#    rather than be overwritten
+#
+
+import sys
+import re
+import os
+import getopt
+
+import langdefs
+
+optlist, args = getopt.getopt(sys.argv[1:],'o:')
+lang = args[0]
+files = args [1:]
+
+outdir = '.'
+for x in optlist:
+    if x[0] == '-o':
+        outdir = x[1]
+
+double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
+my_gettext = langdefs.translation[lang]
+
+html_codes = ((' -- ', ' &ndash; '),
+              (' --- ', ' &mdash; '),
+              ("'", '&rsquo;'))
+texi_html_conversion = {
+    'command': {
+        'html2texi':
+            (re.compile (r'(?:<samp><span class="command">|<code>)(.*?)(?:</span></samp>|</code>)'),
+             r'@command{\1}'),
+        'texi2html':
+            (re.compile (r'@command{(.*?)}'),
+             r'<code>\1</code>'),
+        },
+    'code': {
+        'html2texi':
+            (re.compile (r'<code>(.*?)</code>'),
+             r'@code{\1}'),
+        'texi2html':
+            (re.compile (r'@code{(.*?)}'),
+             r'<code>\1</code>'),
+        },
+    }
+
+whitespaces = re.compile (r'\s+')
+
+
+def _ (s):
+    if not s:
+        return ''
+    str = whitespaces.sub (' ', s)
+    for c in html_codes:
+        str = str.replace (c[1], c[0])
+    for command in texi_html_conversion:
+        d = texi_html_conversion[command]
+        str = d['html2texi'][0].sub (d['html2texi'][1], str)
+        str = my_gettext (str)
+        str = d['texi2html'][0].sub (d['texi2html'][1], str)
+    for c in html_codes:
+        str = str.replace (c[0], c[1])
+    return str
+
+link_re =  re.compile (r'<link rel="(up|prev|next)" (.*?) title="([^"]*?)">')
+
+def link_gettext (m):
+    return '<link rel="' + m.group (1) + '" ' + m.group (2) \
+        + ' title="' + _ (m.group (3)) + '">'
+
+makeinfo_title_re = re.compile (r'<title>([^<]*?) - ([^<]*?)</title>')
+
+def makeinfo_title_gettext (m):
+    return '<title>' + _ (m.group (1)) + ' - ' + m.group (2) + '</title>'
+
+texi2html_title_re = re.compile (r'<title>(.+): ([A-Z\d.]+ |)(.+?)</title>')
+
+def texi2html_title_gettext (m):
+    return '<title>' + _ (m.group (1)) + double_punct_char_separator + ': ' \
+        + m.group (2) + _ (m.group (3)) + '</title>'
+
+a_href_re = re.compile ('(?s)<a (?P<attributes>[^>]*?href="[\\w.#-_]+"[^>]*?>)(?P<code><code>)?\
+(?P<appendix>Appendix )?(?P<leading>[A-Z0-9.]+ | (?:&lt;){1,2} |&nbsp;[^>:]+?:&nbsp;|&nbsp;|)\
+(?P<name>(?:<samp><span class="command">|</?code>|</span>|[^>])+?)(?P<end_code>(?(code)</code>|))\
+(?P<trailing> (?:&gt;){1,2} |&nbsp;|)</a>:?')
+
+def a_href_gettext (m):
+    s = ''
+    if m.group(0)[-1] == ':':
+        s = double_punct_char_separator + ':'
+    t = ''
+    if m.group ('appendix'):
+        t = _ (m.group ('appendix'))
+    return '<a ' + m.group ('attributes') + (m.group ('code') or '') + \
+        t + m.group ('leading') + _ (m.group ('name')) + \
+        m.group ('end_code') + m.group ('trailing') + '</a>' + s
+
+h_re = re.compile (r'<h(\d)( class="\w+"|)>\s*(Appendix |)([A-Z\d.]+ |)(.+?)\s*</h\1>')
+
+def h_gettext (m):
+    if m.group (3):
+        s = _ (m.group (3))
+    else:
+        s= ''
+    return '<h' + m.group (1) + m.group (2) + '>' + s +\
+           m.group (4) + _ (m.group (5)) + '</h' + m.group (1) + '>'
+
+for filename in files:
+    f = open (filename, 'r')
+    page = f.read ()
+    f.close ()
+    page = link_re.sub (link_gettext, page)
+    page = makeinfo_title_re.sub (makeinfo_title_gettext, page)
+    page = texi2html_title_re.sub (texi2html_title_gettext, page)
+    page = a_href_re.sub (a_href_gettext, page)
+    page = h_re.sub (h_gettext, page)
+    for w in ('Next:', 'Previous:', 'Up:'):
+        page = page.replace (w, _ (w))
+    page = langdefs.LANGDICT[lang].html_filter (page)
+    f = open (os.path.join (outdir, filename), 'w')
+    f.write (page)
+    f.close ()
diff --git a/scripts/build/install-info-html.sh b/scripts/build/install-info-html.sh
new file mode 100644 (file)
index 0000000..a116cd9
--- /dev/null
@@ -0,0 +1,157 @@
+#!@BASH@
+
+name=install-info-html
+version=1.0
+
+all=
+index_dir=.
+
+#
+# debugging
+#
+debug_echo=:
+
+
+#
+# print usage
+#
+help ()
+{
+       cat << EOF
+$name $version
+Install HTML info document.
+
+Usage: $name [OPTIONS]... [DOCUMENT-DIR]...
+
+Options:
+  -a, --all            assume all subdirectories of index to be DOCUMENT-DIRs
+  -d, --dir=DIR        set index directory to DIR (default=.)
+  -D, --debug          print debugging info
+  -h, --help           show this help text
+  -v, --version        show version
+EOF
+}
+
+cleanup ()
+{
+       $debug_echo "cleaning ($?)..."
+}
+
+trap cleanup 0 9 15
+
+#
+# Find command line options and switches
+#
+
+# "x:" x takes argument
+#
+options="adhvW:"
+#
+# ugh, "\-" is a hack to support long options
+# must be in double quotes for bash-2.0
+
+while getopts "\-:$options" O
+do
+       $debug_echo "O: \`$O'"
+       $debug_echo "arg: \`$OPTARG'"
+       case $O in
+               a)
+                       all=yes
+                       ;;
+               D)
+                       [ "$debug_echo" = "echo" ] && set -x
+                       debug_echo=echo
+                       ;;
+               h)
+                       help;
+                       exit 0
+                       ;;
+               v)
+                       echo $name $version
+                       exit 0
+                       ;;
+               d)
+                       index_dir=$OPTARG
+                       ;;
+       # a long option!
+       -)
+               case "$OPTARG" in
+                       a*|-a*)
+                               all=yes
+                               ;;
+                       de*|-de*)
+                               [ "$debug_echo" = "echo" ] && set -x
+                               debug_echo=echo
+                               ;;
+                       h*|-h*)
+                               help;
+                               exit 0
+                               ;;
+                       di*|-di*)
+                               index_dir="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"
+                               ;;
+                       version|-version)
+                               echo $name $version
+                               exit 0
+                               ;;
+                       *|-*)
+                               echo "$0: invalid option -- \"$OPTARG\""
+                               help;
+                               exit -1
+                               ;;
+               esac
+       esac
+done
+shift `expr $OPTIND - 1`
+
+#
+# Input file name
+#
+if [ -z "$all" -a -z "$1" ]; then
+       help
+       echo "$name: No HTML documents given"
+       exit 2
+fi
+
+if [ -n "$all" -a -n "$1" ]; then
+       echo "$name: --all specified, ignoring DIRECTORY-DIRs"
+fi
+
+if [ -n "$all" ]; then
+       document_dirs=`/bin/ls -d1 $index_dir`
+else
+       document_dirs=$*
+fi
+
+index_file=$index_dir/index.html
+rm -f $index_file
+echo -n "$name: Writing index: $index_file..."
+
+# head
+cat >> $index_file <<EOF
+<html> 
+<title>Info documentation index</title>
+<body>
+<h1>Info documentation index</h1>
+<p>
+This is the directory file \`index.html' a.k.a. \`DIR', which contains the
+topmost node of the HTML Info hierarchy.
+</p>
+<ul>
+EOF
+
+#list
+for i in $document_dirs; do
+    cat <<EOF
+<li> <a href="$i/index.html">$i</a> (<a href="$i.html">$i as one big page</a>)</li>
+EOF
+done >> $index_file
+
+# foot
+cat >> $index_file <<EOF
+</ul>
+</body>
+</html>
+EOF
+echo
diff --git a/scripts/build/lilypond-words.py b/scripts/build/lilypond-words.py
new file mode 100644 (file)
index 0000000..e9851f6
--- /dev/null
@@ -0,0 +1,149 @@
+#!@PYTHON@
+
+# Created 01 September 2003 by Heikki Junes.
+# Rewritten by John Mandereau
+
+# Generates lilypond-words.el for (X)Emacs and lilypond-words[.vim] for Vim.
+
+import re
+import sys
+import os
+import getopt
+
+keywords = []
+reserved_words = []
+note_names = []
+
+# keywords not otherwise found
+keywords += ['include', 'maininput', 'version']
+
+# the main keywords
+s = open ('lily/lily-lexer.cc', 'r').read ()
+keywords += [w for w in re.findall (r"\s*{\"(.+)\",\s*.*},\s*\n", s)]
+
+s = open ('scm/markup.scm', 'r').read ()
+keywords += [w for w in re.findall (r"(?m)^\s*\(cons\s*([a-z-]+)-markup", s)]
+
+# identifiers and keywords
+for name in ['ly/chord-modifiers-init.ly',
+             'ly/dynamic-scripts-init.ly',
+             'ly/engraver-init.ly',
+             'ly/grace-init.ly',
+             'ly/gregorian.ly',
+             'ly/music-functions-init.ly',
+             'ly/performer-init.ly',
+             'ly/property-init.ly',
+             'ly/scale-definitions-init.ly',
+             'ly/script-init.ly',
+             'ly/spanners-init.ly',
+             'ly/declarations-init.ly',
+             'ly/params-init.ly']:
+    s = open (name, 'r').read ()
+    keywords += [w for w in re.findall (r"(?m)^\s*\"?([a-zA-Z]+)\"?\s*=", s)]
+
+# note names
+for name in ['ly/catalan.ly',
+             'ly/deutsch.ly',
+             'ly/drumpitch-init.ly',
+             'ly/english.ly',
+             'ly/espanol.ly',
+             'ly/italiano.ly',
+             'ly/nederlands.ly',
+             'ly/norsk.ly',
+             'ly/portugues.ly',
+             'ly/suomi.ly',
+             'ly/svenska.ly',
+             'ly/vlaams.ly']:
+    s = open (name, 'r').read ()
+    note_names += [n for n in re.findall (r"(?m)^\s*\(([a-z]+)[^l]+ly:make-pitch", s)]
+
+# reserved words
+for name in ['ly/engraver-init.ly',
+             'ly/performer-init.ly']:
+    s = open (name, 'r').read ()
+    for pattern in [r"(?m)^\s*.consists\s+\"([a-zA-Z_]+)\"",
+                    r"[\\]name\s+[\"]?([a-zA-Z_]+)[\"]?",
+                    r"\s+([a-zA-Z_]+)\s*\\(?:set|override)"]:
+        reserved_words += [w for w in re.findall (pattern, s)]
+
+keywords = list (set (keywords))
+keywords.sort (reverse=True)
+
+reserved_words = list (set (reserved_words))
+reserved_words.sort (reverse=True)
+
+note_names = list (set (note_names))
+note_names.sort (reverse=True)
+
+
+# output
+outdir = ''
+out_words = False
+out_el = False
+out_vim = False
+
+options = getopt.getopt (sys.argv[1:],
+  '', ['words', 'el', 'vim', 'dir='])[0]
+
+for (o, a) in options:
+    if o == '--words':
+        out_words = True
+    elif o == '--el':
+        out_el = True
+    elif o == '--vim':
+        out_vim = True
+    elif o == '--dir':
+        outdir = a
+
+if out_words or out_el:
+    outstring = ''.join (['\\\\' + w + '\n' for w in keywords])
+    outstring += ''.join ([w + '\n' for w in reserved_words])
+    outstring += ''.join ([w + '\n' for w in note_names])
+
+if out_words:
+    f = open (os.path.join (outdir, 'lilypond-words'), 'w')
+    f.write (outstring)
+
+if out_el:
+    f = open (os.path.join (outdir, 'lilypond-words.el'), 'w')
+    f.write (outstring)
+
+    # the menu in lilypond-mode.el
+    # for easier typing of this list, replace '/' with '\' below
+    # when writing to file
+    elisp_menu = ['/( - _ /) -',
+                  '/[ - _ /] -',
+                  '< - _ > -',
+                  '<< - _ >> -',
+                  '///( - _ ///) -',
+                  '///[ - _ ///] -',
+                  '///< - _ ///! -',
+                  '///> - _ ///! -',
+                  '//center - / << _ >> -',
+                  '//column - / << _ >> -',
+                  '//context/ Staff/ = - % { _ } -',
+                  '//context/ Voice/ = - % { _ } -',
+                  '//markup - { _ } -',
+                  '//notes - { _ } -',
+                  '//relative - % { _ } -',
+                  '//score - { //n /? //simultaneous { //n _ //n } /! //n //paper {  } //n /? //midi {  } //n /! } //n -',
+                  '//simultaneous - { _ } -',
+                  '//sustainDown - _ //sustainUp -',
+                  '//times - % { _ } -',
+                  '//transpose - % { _ } -',
+                  '']
+    f.write ('\n'.join ([line.replace ('/', '\\') for line in elisp_menu]))
+
+if out_vim:
+    f = open (os.path.join (outdir, 'lilypond-words.vim'), 'w')
+    f.write ('syn match lilyKeyword \"[-_^]\\?\\\\\\(')
+    f.write (''.join ([w + '\\|' for w in keywords]))
+    f.write ('n\\)\\(\\A\\|\\n\\)\"me=e-1\n')
+
+    f.write ('syn match lilyReservedWord \"\\(\\A\\|\\n\\)\\(')
+    f.write (''.join ([w + '\\|' for w in reserved_words]))
+    f.write ('Score\\)\\(\\A\\|\\n\\)\"ms=s+1,me=e-1\n')
+
+    f.write ('syn match lilyNote \"\\<\\(\\(\\(')
+    f.write (''.join ([w + '\\|' for w in note_names]))
+    f.write ('a\\)\\([,\']\\)\\{,4}\\([?!]\\)\\?\\)\\|s\\|r\\)\\(\\(128\\|64\\|32\\|16\\|8\\|4\\|2\\|1\\|\\\\breve\\|\\\\longa\\|\\\\maxima\\)[.]\\{,8}\\)\\?\\(\\A\\|\\n\\)\"me=e-1\n')
diff --git a/scripts/build/lys-to-tely.py b/scripts/build/lys-to-tely.py
new file mode 100644 (file)
index 0000000..c9d698f
--- /dev/null
@@ -0,0 +1,125 @@
+#!@PYTHON@
+
+
+'''
+TODO:
+
+ * Add @nodes, split at sections?
+
+'''
+
+
+import sys
+import os
+import getopt
+import re
+
+program_name = 'lys-to-tely'
+
+include_snippets = '@lysnippets'
+fragment_options = 'printfilename,texidoc'
+help_text = r"""Usage: %(program_name)s [OPTIONS]... LY-FILE...
+Construct tely doc from LY-FILEs.
+
+Options:
+ -h, --help                     print this help
+ -f, --fragment-options=OPTIONS use OPTIONS as lilypond-book fragment
+   options
+ -o, --output=NAME              write tely doc to NAME
+ -t, --title=TITLE              set tely doc title TITLE
+     --template=TEMPLATE        use TEMPLATE as Texinfo template file,
+   instead of standard template; TEMPLATE should contain a command
+   '%(include_snippets)s' to tell where to insert LY-FILEs.  When this
+   option is used, NAME and TITLE are ignored.
+"""
+
+def help (text):
+    sys.stdout.write ( text)
+    sys.exit (0)
+
+(options, files) = getopt.getopt (sys.argv[1:], 'f:hn:t:',
+                     ['fragment-options=', 'help', 'name=', 'title=', 'template='])
+
+name = "ly-doc"
+title = "Ly Doc"
+template = '''\input texinfo
+@setfilename %%(name)s.info
+@settitle %%(title)s
+
+@documentencoding utf-8
+@iftex
+@afourpaper
+@end iftex
+
+@finalout @c we do not want black boxes.
+
+@c fool ls-latex
+@ignore
+@author Han-Wen Nienhuys and Jan Nieuwenhuizen
+@title %%(title)s
+@end ignore
+
+@node Top, , , (dir)
+@top %%(title)s
+
+%s
+
+@bye
+''' % include_snippets
+
+for opt in options:
+    o = opt[0]
+    a = opt[1]
+    if o == '-h' or o == '--help':
+        # We can't use vars () inside a function, as that only contains all 
+        # local variables and none of the global variables! Thus we have to 
+        # generate the help text here and pass it to the function...
+        help (help_text % vars ())
+    elif o == '-n' or o == '--name':
+        name = a
+    elif o == '-t' or o == '--title':
+        title = a
+    elif o == '-f' or o == '--fragment-options':
+        fragment_options = a
+    elif o == '--template':
+        template = open (a, 'r').read ()
+    else:
+        raise Exception ('unknown option: ' + o)
+
+texi_file_re = re.compile ('.*\.i?te(ly|xi)$')
+
+def name2line (n):
+    if texi_file_re.match (n):
+        # We have a texi include file, simply include it:
+        s = r"@include %s" % os.path.basename (n)
+    else:
+        # Assume it's a lilypond file -> create image etc.
+        s = r"""
+@ifhtml
+@html
+<a name="%s"></a>
+@end html
+@end ifhtml
+
+@lilypondfile[%s]{%s}
+""" % (os.path.basename (n), fragment_options, n)
+    return s
+
+if files:
+    dir = os.path.dirname (name) or "."
+# don't strip .tely extension, input/lsr uses .itely
+    name = os.path.basename (name)
+    template = template % vars ()
+
+    s = "\n".join (map (name2line, files))
+    s = template.replace (include_snippets, s, 1)
+    f = "%s/%s" % (dir, name)
+    sys.stderr.write ("%s: writing %s..." % (program_name, f))
+    h = open (f, "w")
+    h.write (s)
+    h.close ()
+    sys.stderr.write ('\n')
+else:
+    # not Unix philosophy, but hey, at least we notice when
+    # we don't distribute any .ly files.
+    sys.stderr.write ("No files specified. Doing nothing")
diff --git a/scripts/build/mass-link.py b/scripts/build/mass-link.py
new file mode 100644 (file)
index 0000000..17412e5
--- /dev/null
@@ -0,0 +1,67 @@
+#!@PYTHON@
+# mass-link.py
+
+# USAGE:  mass-link.py  [--prepend-suffix SUFFIX]   symbolic | hard   SOURCEDIR DESTDIR FILES
+#
+# create hard or symbolic links to SOURCEDIR/FILES in DESTDIR
+#
+# If --prepend-suffix is specified, link to foo.bar will be called fooSUFFIX.bar.
+# Shell wildcards expansion is performed on FILES.
+
+import sys
+import os
+import glob
+import getopt
+
+print "mass-link.py"
+
+optlist, args = getopt.getopt (sys.argv[1:], '', ['prepend-suffix='])
+link_type, source_dir, dest_dir = args[0:3]
+files = args[3:]
+
+source_dir = os.path.normpath (source_dir)
+dest_dir = os.path.normpath (dest_dir)
+
+prepended_suffix = ''
+for x in optlist:
+    if x[0] == '--prepend-suffix':
+        prepended_suffix = x[1]
+
+if prepended_suffix:
+    def insert_suffix (p):
+        l = p.split ('.')
+        if len (l) >= 2:
+            l[-2] += prepended_suffix
+            return '.'.join (l)
+        return p + prepended_suffix
+else:
+    insert_suffix = lambda p: p
+
+if link_type == 'symbolic':
+    link = os.symlink
+elif link_type == 'hard':
+    link = os.link
+else:
+    sys.stderr.write(sys.argv[0] + ': ' + link_type + ": wrong argument, expected 'symbolic' or 'hard'\n")
+    sys.exit (1)
+
+sourcefiles = []
+for pattern in files:
+    sourcefiles += (glob.glob (os.path.join (source_dir, pattern)))
+
+def relative_path (f):
+    if source_dir == '.':
+        return f
+    return f[len (source_dir) + 1:]
+
+destfiles = [os.path.join (dest_dir, insert_suffix (relative_path (f))) for f in sourcefiles]
+
+destdirs = set ([os.path.dirname (dest) for dest in destfiles])
+[os.makedirs (d) for d in destdirs if not os.path.exists (d)]
+
+def force_link (src,dest):
+    if os.path.exists (dest):
+        os.system ('rm -f ' + dest)
+    link (src, dest)
+
+map (force_link, sourcefiles, destfiles)
diff --git a/scripts/build/mf-to-table.py b/scripts/build/mf-to-table.py
new file mode 100644 (file)
index 0000000..2fe43d2
--- /dev/null
@@ -0,0 +1,244 @@
+#!@PYTHON@
+
+# mf-to-table.py -- convert spacing info in MF logs . 
+#
+# source file of the GNU LilyPond music typesetter
+#
+# (c) 1997--2009 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+import os
+import sys
+import getopt
+import re
+import time
+
+def read_log_file (fn):
+    str = open (fn).read ()
+    str = re.sub ('\n', '', str)
+    str = re.sub ('[\t ]+', ' ', str)
+
+    deps = []
+    autolines = []
+    def include_func (match, d = deps):
+        d.append (match.group (1))
+        return ''
+
+    def auto_func (match, a = autolines):
+        a.append (match.group (1))
+        return ''
+
+    str = re.sub ('\\(([/a-z.A-Z_0-9-]+\\.mf)', include_func, str)
+    str = re.sub ('@{(.*?)@}', auto_func, str)
+
+    return (autolines, deps)
+
+
+class Char_metric:
+    def __init__ (self):
+        pass
+
+font_family = 'feta'
+
+def parse_logfile (fn):
+    autolines, deps = read_log_file (fn)
+    charmetrics = []
+    
+    global_info = {
+        'filename' : os.path.splitext (os.path.basename (fn))[0]
+        }
+    group = ''
+
+    for l in autolines:
+        tags = l.split ('@:')
+        if tags[0] == 'group':
+            group = tags[1]
+        elif tags[0] == 'puorg':
+            group = ''
+        elif tags[0] == 'char':
+            name = tags[9]
+
+            if group:
+                name = group + '.' + name
+            m = {
+                'description': tags[1],
+                'name': name,
+                'code': int (tags[2]),
+                'breapth': float (tags[3]),
+                'width': float (tags[4]),
+                'depth': float (tags[5]),
+                'height': float (tags[6]),
+                'wx': float (tags[7]),
+                'wy': float (tags[8]),
+            }
+            charmetrics.append (m)
+        elif tags[0] == 'font':
+            global font_family
+            font_family = (tags[3])
+            # To omit 'GNU' (foundry) from font name proper:
+            # name = tags[2:]
+            #urg
+            if 0: # testing
+                tags.append ('Regular')
+
+            encoding = re.sub (' ','-', tags[5])
+            tags = tags[:-1]
+            name = tags[1:]
+            global_info['design_size'] = float (tags[4])
+            global_info['FontName'] = '-'.join (name)
+            global_info['FullName'] = ' '.join (name)
+            global_info['FamilyName'] = '-'.join (name[1:-1])
+            if 1:
+                global_info['Weight'] = tags[4]
+            else: # testing
+                global_info['Weight'] = tags[-1]
+
+            global_info['FontBBox'] = '0 0 1000 1000'
+            global_info['Ascender'] = '0'
+            global_info['Descender'] = '0'
+            global_info['EncodingScheme'] = encoding
+
+        elif tags[0] == 'parameter':
+            global_info[tags[1]] = tags[2];
+            
+    return (global_info, charmetrics, deps)
+
+
+
+def character_lisp_table (global_info, charmetrics):
+
+    def conv_char_metric (charmetric):
+        f = 1.0
+        s = """(%s .
+((bbox . (%f %f %f %f))
+(subfont . "%s")
+(subfont-index . %d)
+(attachment . (%f . %f))))
+""" %(charmetric['name'],
+   -charmetric['breapth'] * f,
+   -charmetric['depth'] * f,
+   charmetric['width'] * f,
+   charmetric['height'] * f,
+   global_info['filename'],
+   charmetric['code'],
+   charmetric['wx'],
+   charmetric['wy'])
+
+        return s
+
+    s = ''
+    for c in charmetrics:
+        s += conv_char_metric (c)
+
+    return s
+
+
+def global_lisp_table (global_info):
+    str = ''
+
+    keys = ['staffsize', 'stafflinethickness', 'staff_space',
+        'linethickness', 'black_notehead_width', 'ledgerlinethickness',
+        'design_size', 
+        'blot_diameter'
+        ]
+    for k in keys:
+        if global_info.has_key (k):
+            str = str + "(%s . %s)\n" % (k,global_info[k])
+
+    return str
+
+    
+def ps_encoding (name, global_info, charmetrics):
+    encs = ['.notdef'] * 256
+    for m in charmetrics:
+        encs[m['code']] = m['name']
+
+
+    s =  ('/%s [\n' % name)
+    for m in range (0, 256):
+        s += ('  /%s %% %d\n' % (encs[m], m))
+    s +=  ('] def\n')
+    return s
+
+def get_deps (deps, targets):
+    s = ''
+    for t in targets:
+        t = re.sub ( '^\\./', '', t)
+        s += ('%s '% t)
+    s += (": ")
+    for d in deps:
+        s += ('%s ' % d)
+    s += ('\n')
+    return s
+
+def help ():
+    sys.stdout.write(r"""Usage: mf-to-table [OPTIONS] LOGFILEs
+
+Generate feta metrics table from preparated feta log.
+
+Options:
+ -d, --dep=FILE         print dependency info to FILE
+ -h, --help             print this help
+ -l, --ly=FILE          name output table
+ -o, --outdir=DIR       prefix for dependency info
+ -p, --package=DIR      specify package
+
+ """)
+    sys.exit (0)
+
+
+(options, files) = \
+ getopt.getopt (sys.argv[1:],
+        'a:d:ho:p:t:',
+        ['enc=',  'outdir=', 'dep=', 'lisp=',
+         'global-lisp=',
+         'debug', 'help', 'package='])
+
+global_lisp_nm = ''
+char_lisp_nm = ''
+enc_nm = ''
+depfile_nm = ''
+lyfile_nm = ''
+outdir_prefix = '.'
+
+for opt in options:
+    o = opt[0]
+    a = opt[1]
+    if o == '--dep' or o == '-d':
+        depfile_nm = a
+    elif o == '--outdir' or o == '-o':
+        outdir_prefix = a
+    elif o == '--lisp': 
+        char_lisp_nm = a
+    elif o == '--global-lisp': 
+        global_lisp_nm = a
+    elif o == '--enc':
+        enc_nm = a
+    elif o== '--help' or o == '-h':
+        help()
+    elif o == '--debug':
+        debug_b = 1
+    else:
+        print o
+        raise getopt.error
+
+base = os.path.splitext (lyfile_nm)[0]
+
+for filenm in files:
+    (g, m, deps) = parse_logfile (filenm)
+
+    enc_name = 'FetaEncoding'
+    if re.search ('parmesan', filenm):
+        enc_name = 'ParmesanEncoding'
+    elif re.search ('feta-brace', filenm):
+        enc_name = 'FetaBraceEncoding'
+    elif re.search ('feta-alphabet', filenm):
+        enc_name = 'FetaAlphabetEncoding';
+
+    open (enc_nm, 'w').write (ps_encoding (enc_name, g, m))
+    open (char_lisp_nm, 'w').write (character_lisp_table (g, m))
+    open (global_lisp_nm, 'w').write (global_lisp_table (g))
+    if depfile_nm:
+        open (depfile_nm, 'wb').write (get_deps (deps,
+                                                 [base + '.log', base + '.dvi', base + '.pfa',
+                                                  depfile_nm,
+                                                  base + '.pfb']))
diff --git a/scripts/build/mf2pt1.pl b/scripts/build/mf2pt1.pl
new file mode 100644 (file)
index 0000000..95df0f8
--- /dev/null
@@ -0,0 +1,1090 @@
+#!@PERL@
+
+##################################################
+# Convert stylized Metafont to PostScript Type 1 #
+# By Scott Pakin <scott+mf@pakin.org>            #
+##################################################
+
+########################################################################
+# mf2pt1                                                               #
+# Copyright (C) 2008 Scott Pakin                                       #
+#                                                                      #
+# This program may be distributed and/or modified under the conditions #
+# of the LaTeX Project Public License, either version 1.3c of this     #
+# license or (at your option) any later version.                       #
+#                                                                      #
+# The latest version of this license is in:                            #
+#                                                                      #
+#    http://www.latex-project.org/lppl.txt                             #
+#                                                                      #
+# and version 1.3c or later is part of all distributions of LaTeX      #
+# version 2006/05/20 or later.                                         #
+########################################################################
+
+our $VERSION = "2.4.4";   # mf2pt1 version number
+require 5.6.1;            # I haven't tested mf2pt1 with older Perl versions
+
+use File::Basename;
+use File::Spec;
+use Getopt::Long;
+use Pod::Usage;
+use Math::Trig;
+use warnings;
+use strict;
+
+# Define some common encoding vectors.
+my @standardencoding =
+    ((map {"_a$_"} (0..31)),
+     qw (space exclam quotedbl numbersign dollar percent ampersand
+         quoteright parenleft parenright asterisk plus comma hyphen
+         period slash zero one two three four five six seven eight
+         nine colon semicolon less equal greater question at A B C D E
+         F G H I J K L M N O P Q R S T U V W X Y Z bracketleft
+         backslash bracketright asciicircum underscore quoteleft a b c
+         d e f g h i j k l m n o p q r s t u v w x y z braceleft bar
+         braceright asciitilde),
+     (map {"_a$_"} (127..160)),
+     qw (exclamdown cent sterling fraction yen florin section currency
+         quotesingle quotedblleft guillemotleft guilsinglleft
+         guilsinglright fi fl _a176 endash dagger daggerdbl
+         periodcentered _a181 paragraph bullet quotesinglbase
+         quotedblbase quotedblright guillemotright ellipsis
+         perthousand _a190 questiondown _a192 grave acute circumflex
+         tilde macron breve dotaccent dieresis _a201 ring cedilla
+         _a204 hungarumlaut ogonek caron emdash),
+     (map {"_a$_"} (209..224)),
+     qw (AE _a226 ordfeminine _a228 _a229 _a230 _a231 Lslash Oslash OE
+         ordmasculine _a236 _a237 _a238 _a239 _a240 ae _a242 _a243
+         _a244 dotlessi _a246 _a247 lslash oslash oe germandbls _a252
+         _a253 _a254 _a255));
+my @isolatin1encoding =
+    ((map {"_a$_"} (0..31)),
+     qw (space exclam quotedbl numbersign dollar percent ampersand
+         quoteright parenleft parenright asterisk plus comma minus
+         period slash zero one two three four five six seven eight
+         nine colon semicolon less equal greater question at A B C D E
+         F G H I J K L M N O P Q R S T U V W X Y Z bracketleft
+         backslash bracketright asciicircum underscore quoteleft a b c
+         d e f g h i j k l m n o p q r s t u v w x y z braceleft bar
+         braceright asciitilde),
+     (map {"_a$_"} (128..143)),
+     qw (dotlessi grave acute circumflex tilde macron breve dotaccent
+         dieresis _a153 ring cedilla _a156 hungarumlaut ogonek
+         caron space exclamdown cent sterling currency yen brokenbar
+         section dieresis copyright ordfeminine guillemotleft
+         logicalnot hyphen registered macron degree plusminus
+         twosuperior threesuperior acute mu paragraph periodcentered
+         cedilla onesuperior ordmasculine guillemotright onequarter
+         onehalf threequarters questiondown Agrave Aacute Acircumflex
+         Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex
+         Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde
+         Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash
+         Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls
+         agrave aacute acircumflex atilde adieresis aring ae ccedilla
+         egrave eacute ecircumflex edieresis igrave iacute icircumflex
+         idieresis eth ntilde ograve oacute ocircumflex otilde
+         odieresis divide oslash ugrave uacute ucircumflex udieresis
+         yacute thorn ydieresis));
+my @ot1encoding =
+    qw (Gamma Delta Theta Lambda Xi Pi Sigma Upsilon Phi
+        Psi Omega ff fi fl ffi ffl dotlessi dotlessj grave acute caron
+        breve macron ring cedilla germandbls ae oe oslash AE OE Oslash
+        suppress exclam quotedblright numbersign dollar percent
+        ampersand quoteright parenleft parenright asterisk plus comma
+        hyphen period slash zero one two three four five six seven
+        eight nine colon semicolon exclamdown equal questiondown
+        question at A B C D E F G H I J K L M N O P Q R S T U V W X Y
+        Z bracketleft quotedblleft bracketright circumflex dotaccent
+        quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z
+        endash emdash hungarumlaut tilde dieresis);
+my @t1encoding =
+    qw (grave acute circumflex tilde dieresis hungarumlaut ring caron
+        breve macron dotaccent cedilla ogonek quotesinglbase
+        guilsinglleft guilsinglright quotedblleft quotedblright
+        quotedblbase guillemotleft guillemotright endash emdash cwm
+        perthousand dotlessi dotlessj ff fi fl ffi ffl space exclam
+        quotedbl numbersign dollar percent ampersand quoteright
+        parenleft parenright asterisk plus comma hyphen period slash
+        zero one two three four five six seven eight nine colon
+        semicolon less equal greater question at A B C D E F G H I J K L
+        M N O P Q R S T U V W X Y Z bracketleft backslash bracketright
+        asciicircum underscore quoteleft a b c d e f g h i j k l m n o p
+        q r s t u v w x y z braceleft bar braceright asciitilde
+        sfthyphen Abreve Aogonek Cacute Ccaron Dcaron Ecaron Eogonek
+        Gbreve Lacute Lcaron Lslash Nacute Ncaron Eng Ohungarumlaut
+        Racute Rcaron Sacute Scaron Scedilla Tcaron Tcedilla
+        Uhungarumlaut Uring Ydieresis Zacute Zcaron Zdotaccent IJ
+        Idotaccent dcroat section abreve aogonek cacute ccaron dcaron
+        ecaron eogonek gbreve lacute lcaron lslash nacute ncaron eng
+        ohungarumlaut racute rcaron sacute scaron scedilla tcaron
+        tcedilla uhungarumlaut uring ydieresis zacute zcaron zdotaccent
+        ij exclamdown questiondown sterling Agrave Aacute Acircumflex
+        Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex
+        Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve
+        Oacute Ocircumflex Otilde Odieresis OE Oslash Ugrave Uacute
+        Ucircumflex Udieresis Yacute Thorn SS agrave aacute acircumflex
+        atilde adieresis aring ae ccedilla egrave eacute ecircumflex
+        edieresis igrave iacute icircumflex idieresis eth ntilde ograve
+        oacute ocircumflex otilde odieresis oe oslash ugrave uacute
+        ucircumflex udieresis yacute thorn germandbls);
+
+# Define font parameters that the user can override.
+my $fontversion;
+my $creationdate;
+my $comment;
+my $familyname;
+my $weight;
+my $fullname;
+my $fixedpitch;
+my $italicangle;
+my $underlinepos;
+my $underlinethick;
+my $fontname;
+my $uniqueID;
+my $designsize;
+my ($mffile, $pt1file, $pfbfile, $ffscript);
+my $encoding;
+my $rounding;
+my $bpppix;
+
+# Define all of our other global variables.
+my $progname = basename $0, ".pl";
+my $mag;
+my @fontbbox;
+my @charbbox;
+my @charwd;
+my @glyphname;
+my @charfiles;
+my $filebase;
+my $filedir;
+my $filenoext;
+my $versionmsg = "mf2pt1 version $VERSION
+
+Copyright (C) 2008 Scott Pakin
+
+This program may be distributed and/or modified under the conditions
+of the LaTeX Project Public License, either version 1.3c of this
+license or (at your option) any later version.
+
+The latest version of this license is in:
+
+   http://www.latex-project.org/lppl.txt
+
+and version 1.3c or later is part of all distributions of LaTeX
+version 2006/05/20 or later.
+";
+
+
+######################################################################
+
+# The routines to compute the fractional approximation of a real number
+# are heavily based on code posted by Ben Tilly
+# <http://www.perlmonks.org/?node_id=26179> on Nov 16th, 2000, to the
+# PerlMonks list.  See <http://www.perlmonks.org/index.pl?node_id=41961>.
+
+
+# Takes numerator/denominator pairs.
+# Returns a PS fraction string representation (with a trailing space).
+sub frac_string (@)
+{
+    my $res = "";
+
+    while (@_) {
+        my $n = shift;
+        my $d = shift;
+        $res .= $n . " ";
+        $res .= $d . " div " if $d > 1;
+    }
+
+    return $res;
+}
+
+
+# Takes a number.
+# Returns a numerator and denominator with the smallest denominator
+# so that the difference of the resulting fraction to the number is
+# smaller or equal to $rounding.
+sub frac_approx ($)
+{
+    my $num = shift;
+    my $f = ret_frac_iter ($num);
+
+    while (1) {
+        my ($n, $m) = $f->();
+        my $approx = $n / $m;
+        my $delta = abs ($num - $approx);
+        return ($n, $m) if ($delta <= $rounding);
+    }
+}
+
+
+# Takes a number, returns the best integer approximation and (in list
+# context) the error.
+sub best_int ($)
+{
+    my $x = shift;
+    my $approx = sprintf '%.0f', $x;
+    if (wantarray) {
+        return ($approx, $x - $approx);
+    }
+    else {
+        return $approx;
+    }
+}
+
+
+# Takes a numerator and denominator, in scalar context returns
+# the best fraction describing them, in list the numerator and
+# denominator.
+sub frac_standard ($$)
+{
+    my $n = best_int(shift);
+    my $m = best_int(shift);
+    my $k = gcd($n, $m);
+    $n /= $k;
+    $m /= $k;
+    if ($m < 0) {
+        $n *= -1;
+        $m *= -1;
+    }
+    if (wantarray) {
+        return ($n, $m);
+    }
+    else {
+        return "$n/$m";
+    }
+}
+
+
+# Euclidean algorithm for calculating a GCD.
+# Takes two integers, returns the greatest common divisor.
+sub gcd ($$)
+{
+    my ($n, $m) = @_;
+    while ($m) {
+        my $k = $n % $m;
+        ($n, $m) = ($m, $k);
+    }
+    return $n;
+}
+
+
+# Takes a list of terms in a continued fraction, and converts it
+# into a fraction.
+sub ints_to_frac (@)
+{
+    my ($n, $m) = (0, 1);     # Start with 0
+    while (@_) {
+        my $k = pop;
+        if ($n) {
+            # Want frac for $k + 1/($n/$m)
+            ($n, $m) = frac_standard($k*$n + $m, $n);
+        }
+        else {
+            # Want $k
+            ($n, $m) = frac_standard($k, 1);
+        }
+    }
+    return frac_standard($n, $m);
+}
+
+
+# Takes a number, returns an anon sub which iterates through a set of
+# fractional approximations that converges very quickly to the number.
+sub ret_frac_iter ($)
+{
+    my $x = shift;
+    my $term_iter = ret_next_term_iter($x);
+    my @ints;
+    return sub {
+        push @ints, $term_iter->();
+        return ints_to_frac(@ints);
+    }
+}
+
+
+# Terms of a continued fraction converging on that number.
+sub ret_next_term_iter ($)
+{
+    my $x = shift;
+    return sub {
+        (my $n, $x) = best_int($x);
+        if (0 != $x) {
+            $x = 1/$x;
+        }
+        return $n;
+    }
+}
+
+######################################################################
+
+# Round a number to the nearest integer.
+sub round ($)
+{
+    return int($_[0] + 0.5*($_[0] <=> 0));
+}
+
+
+# Round a number to a given precision.
+sub prec ($)
+{
+  return round ($_[0] / $rounding) * $rounding;
+}
+
+
+# Set a variable's value to the first defined value in the given list.
+# If the variable was not previously defined and no value in the list
+# is defined, do nothing.
+sub assign_default (\$@)
+{
+    my $varptr = shift;        # Pointer to variable to define
+    return if defined $$varptr && $$varptr ne "UNSPECIFIED";
+    foreach my $val (@_) {
+        next if !defined $val;
+        $$varptr = $val;
+        return;
+    }
+}
+
+
+# Print and execute a shell command.  An environment variable with the
+# same name as the command overrides the command name.  Return 1 on
+# success, 0 on failure.  Optionally abort if the command fails, based
+# on the first argument to execute_command.
+sub execute_command ($@)
+{
+    my $abort_on_failure = shift;
+    my @command = @_;
+    $command[0] = $ENV{uc $command[0]} || $command[0];
+    my $prettyargs = join (" ", map {/[\\ ]/ ? "'$_'" : $_} @command);
+    print "Invoking \"$prettyargs\"...\n";
+    my $result = system @command;
+    die "${progname}: \"$prettyargs\" failed ($!)\n" if $result && $abort_on_failure;
+    return !$result;
+}
+
+
+# Output the font header.
+sub output_header ()
+{
+    # Show the initial boilerplate.
+    print OUTFILE <<"ENDHEADER";
+%!FontType1-1.0: $fontname $fontversion
+%%CreationDate: $creationdate
+% Font converted to Type 1 by mf2pt1, written by Scott Pakin.
+11 dict begin
+/FontInfo 11 dict dup begin
+/version ($fontversion) readonly def
+/Notice ($comment) readonly def
+/FullName ($fullname) readonly def
+/FamilyName ($familyname) readonly def
+/Weight ($weight) readonly def
+/ItalicAngle $italicangle def
+/isFixedPitch $fixedpitch def
+/UnderlinePosition $underlinepos def
+/UnderlineThickness $underlinethick def
+end readonly def
+/FontName /$fontname def
+ENDHEADER
+
+    # If we're not using an encoding that PostScript knows about, then
+    # create an encoding vector.
+    if ($encoding==\@standardencoding) {
+        print OUTFILE "/Encoding StandardEncoding def\n";
+    }
+    else {
+        print OUTFILE "/Encoding 256 array\n";
+        print OUTFILE "0 1 255 {1 index exch /.notdef put} for\n";
+        foreach my $charnum (0 .. $#{$encoding}) {
+            if ($encoding->[$charnum] && $encoding->[$charnum]!~/^_a\d+$/) {
+                print OUTFILE "dup $charnum /$encoding->[$charnum] put\n";
+            }
+        }
+        print OUTFILE "readonly def\n";
+    }
+
+    # Show the final boilerplate.
+    print OUTFILE <<"ENDHEADER";
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/UniqueID $uniqueID def
+/FontBBox{@fontbbox}readonly def
+currentdict end
+currentfile eexec
+dup /Private 5 dict dup begin
+/RD{string currentfile exch readstring pop}executeonly def
+/ND{noaccess def}executeonly def
+/NP{noaccess put}executeonly def
+ENDHEADER
+}
+
+
+# Use MetaPost to generate one PostScript file per character.  We
+# calculate the font bounding box from these characters and store them
+# in @fontbbox.  If the input parameter is 1, set other font
+# parameters, too.
+sub get_bboxes ($)
+{
+    execute_command 1, ("mpost", "-mem=mf2pt1", "-progname=mpost",
+                        "\\mode:=localfont; mag:=$mag; bpppix $bpppix; input $mffile");
+    opendir (CURDIR, ".") || die "${progname}: $! ($filedir)\n";
+    @charfiles = sort
+                   { ($a=~ /\.(\d+)$/)[0] <=> ($b=~ /\.(\d+)$/)[0] }
+                   grep /^$filebase.*\.\d+$/, readdir(CURDIR);
+    close CURDIR;
+    @fontbbox = (1000000, 1000000, -1000000, -1000000);
+    foreach my $psfile (@charfiles) {
+        # Read the character number from the output file's extension.
+        $psfile =~ /\.(\d+)$/;
+        my $charnum = $1;
+
+        # Process in turn each line of the current PostScript file.
+        my $havebbox = 0;
+        open (PSFILE, "<$psfile") || die "${progname}: $! ($psfile)\n";
+        while (<PSFILE>) {
+            my @tokens = split " ";
+            if ($tokens[0] eq "%%BoundingBox:") {
+                # Store the MetaPost-produced bounding box, just in case
+                # the given font doesn't use beginchar.
+                @tokens = ("%", "MF2PT1:", "glyph_dimensions", @tokens[1..4]);
+                $havebbox--;
+            }
+            next if $#tokens<1 || $tokens[1] ne "MF2PT1:";
+
+            # Process a "special" inserted into the generated PostScript.
+          MF2PT1_CMD:
+            {
+                # glyph_dimensions llx lly urx ury -- specified glyph dimensions
+                $tokens[2] eq "glyph_dimensions" && do {
+                    my @bbox = @tokens[3..6];
+                    $fontbbox[0]=$bbox[0] if $bbox[0]<$fontbbox[0];
+                    $fontbbox[1]=$bbox[1] if $bbox[1]<$fontbbox[1];
+                    $fontbbox[2]=$bbox[2] if $bbox[2]>$fontbbox[2];
+                    $fontbbox[3]=$bbox[3] if $bbox[3]>$fontbbox[3];
+                    $charbbox[$charnum] = \@bbox;
+                    $havebbox++;
+                    last MF2PT1_CMD;
+                };
+
+                # If all we want is the bounding box, exit the loop now.
+                last MF2PT1_CMD if !$_[0];
+
+                # glyph_name name -- glyph name
+                $tokens[2] eq "glyph_name" && do {
+                    $glyphname[$charnum] = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # charwd wd -- character width as in TFM
+                $tokens[2] eq "charwd" && do {
+                    $charwd[$charnum] = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_identifier name -- full font name
+                $tokens[2] eq "font_identifier" && do {
+                    $fullname = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_size number -- font design size (pt, not bp)
+                $tokens[2] eq "font_size" && $tokens[3] && do {
+                    $designsize = $tokens[3] * 72 / 72.27;
+                    last MF2PT1_CMD;
+                };
+
+                # font_slant number -- italic amount
+                $tokens[2] eq "font_slant" && do {
+                    $italicangle = 0 + rad2deg (atan(-$tokens[3]));
+                    last MF2PT1_CMD;
+                };
+
+                # font_coding_scheme string -- font encoding
+                $tokens[2] eq "font_coding_scheme" && do {
+                    $encoding = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_version string -- font version number (xxx.yyy)
+                $tokens[2] eq "font_version" && do {
+                    $fontversion = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_comment string -- font comment notice
+                $tokens[2] eq "font_comment" && do {
+                    $comment = join (" ", @tokens[3..$#tokens]);
+                    last MF2PT1_CMD;
+                };
+
+                # font_family string -- font family name
+                $tokens[2] eq "font_family" && do {
+                    $familyname = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_weight string -- font weight (e.g., "Book" or "Heavy")
+                $tokens[2] eq "font_weight" && do {
+                    $weight = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_fixed_pitch number -- fixed width font (0=false, 1=true)
+                $tokens[2] eq "font_fixed_pitch" && do {
+                    $fixedpitch = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_underline_position number -- vertical underline position
+                $tokens[2] eq "font_underline_position" && do {
+                    # We store $underlinepos in points and later
+                    # scale it by 1000/$designsize.
+                    $underlinepos = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_underline_thickness number -- thickness of underline
+                $tokens[2] eq "font_underline_thickness" && do {
+                    # We store $underlinethick in points and later
+                    # scale it by 1000/$designsize.
+                    $underlinethick = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_name string -- font name
+                $tokens[2] eq "font_name" && do {
+                    $fontname = $tokens[3];
+                    last MF2PT1_CMD;
+                };
+
+                # font_unique_id number (as string) -- globally unique font ID
+                $tokens[2] eq "font_unique_id" && do {
+                    $uniqueID = 0+$tokens[3];
+                    last MF2PT1_CMD;
+                };
+            }
+        }
+        close PSFILE;
+        if (!$havebbox) {
+            warn "${progname}: No beginchar in character $charnum; glyph dimensions are probably incorrect\n";
+        }
+    }
+}
+
+
+# Convert ordinary, MetaPost-produced PostScript files into Type 1
+# font programs.
+sub output_font_programs ()
+{
+    # Iterate over all the characters.  We convert each one, line by
+    # line and token by token.
+    print "Converting PostScript graphics to Type 1 font programs...\n";
+    foreach my $psfile (@charfiles) {
+        # Initialize the font program.
+        $psfile =~ /\.(\d+)$/;
+        my $charnum = $1;
+        my $gname = $glyphname[$charnum] || $encoding->[$charnum];
+        my @fontprog;
+        push @fontprog, ("/$gname {",
+                         frac_string (frac_approx ($charbbox[$charnum]->[0]),
+                                      frac_approx ($charwd[$charnum] * $mag))
+                         . "hsbw");
+        my ($cpx, $cpy) =
+            ($charbbox[$charnum]->[0], 0);  # Current point (PostScript)
+
+        # Iterate over every line in the current file.
+        open (PSFILE, "<$psfile") || die "${progname}: $! ($psfile)\n";
+        while (my $oneline=<PSFILE>) {
+            next if $oneline=~/^\%/;
+            next if $oneline=~/set/;   # Fortunately, "set" never occurs on "good" lines.
+            my @arglist;   # Arguments to current PostScript function
+
+            # Iterate over every token in the current line.
+          TOKENLOOP:
+            foreach my $token (split " ", $oneline) {
+                # Number: Round and push on the argument list.
+                $token =~ /^[-.\d]+$/ && do {
+                    push @arglist, prec ($&);
+                    next TOKENLOOP;
+                };
+
+                # curveto: Convert to vhcurveto, hvcurveto, or rrcurveto.
+                $token eq "curveto" && do {
+                    my ($dx1, $dy1) = ($arglist[0] - $cpx,
+                                       $arglist[1] - $cpy);
+                    my ($dx1n, $dx1d) = frac_approx ($dx1);
+                    my ($dy1n, $dy1d) = frac_approx ($dy1);
+                    $cpx += $dx1n / $dx1d;
+                    $cpy += $dy1n / $dy1d;
+
+                    my ($dx2, $dy2) = ($arglist[2] - $cpx,
+                                       $arglist[3] - $cpy);
+                    my ($dx2n, $dx2d) = frac_approx ($dx2);
+                    my ($dy2n, $dy2d) = frac_approx ($dy2);
+                    $cpx += $dx2n / $dx2d;
+                    $cpy += $dy2n / $dy2d;
+
+                    my ($dx3, $dy3) = ($arglist[4] - $cpx,
+                                       $arglist[5] - $cpy);
+                    my ($dx3n, $dx3d) = frac_approx ($dx3);
+                    my ($dy3n, $dy3d) = frac_approx ($dy3);
+                    $cpx += $dx3n / $dx3d;
+                    $cpy += $dy3n / $dy3d;
+
+                    if (!$dx1n && !$dy3n) {
+                        push @fontprog, frac_string ($dy1n, $dy1d,
+                                                     $dx2n, $dx2d,
+                                                     $dy2n, $dy2d,
+                                                     $dx3n, $dx3d)
+                                        . "vhcurveto";
+                    }
+                    elsif (!$dy1n && !$dx3n) {
+                        push @fontprog, frac_string ($dx1n, $dx1d,
+                                                     $dx2n, $dx2d,
+                                                     $dy2n, $dy2d,
+                                                     $dy3n, $dy3d)
+                                        . "hvcurveto";
+                    }
+                    else {
+                        push @fontprog, frac_string ($dx1n, $dx1d,
+                                                     $dy1n, $dy1d,
+                                                     $dx2n, $dx2d,
+                                                     $dy2n, $dy2d,
+                                                     $dx3n, $dx3d,
+                                                     $dy3n, $dy3d)
+                                        . "rrcurveto";
+                    }
+                    next TOKENLOOP;
+                };
+
+                # lineto: Convert to vlineto, hlineto, or rlineto.
+                $token eq "lineto" && do {
+                    my ($dx, $dy) = ($arglist[0] - $cpx,
+                                     $arglist[1] - $cpy);
+                    my ($dxn, $dxd) = frac_approx ($dx);
+                    my ($dyn, $dyd) = frac_approx ($dy);
+                    $cpx += $dxn / $dxd;
+                    $cpy += $dyn / $dyd;
+
+                    if (!$dxn) {
+                        push @fontprog, frac_string ($dyn, $dyd)
+                                        . "vlineto" if $dyn;
+                    }
+                    elsif (!$dyn) {
+                        push @fontprog, frac_string ($dxn, $dxd)
+                                        . "hlineto";
+                    }
+                    else {
+                        push @fontprog, frac_string ($dxn, $dxd, $dyn, $dyd)
+                                        . "rlineto";
+                    }
+                    next TOKENLOOP;
+                };
+
+                # moveto: Convert to vmoveto, hmoveto, or rmoveto.
+                $token eq "moveto" && do {
+                    my ($dx, $dy) = ($arglist[0] - $cpx,
+                                     $arglist[1] - $cpy);
+                    my ($dxn, $dxd) = frac_approx ($dx);
+                    my ($dyn, $dyd) = frac_approx ($dy);
+                    $cpx += $dxn / $dxd;
+                    $cpy += $dyn / $dyd;
+
+                    if (!$dxn) {
+                        push @fontprog, frac_string ($dyn, $dyd)
+                                        . "vmoveto";
+                    }
+                    elsif (!$dyn) {
+                        push @fontprog, frac_string ($dxn, $dxd)
+                                        . "hmoveto";
+                    }
+                    else {
+                        push @fontprog, frac_string ($dxn, $dxd, $dyn, $dyd)
+                                        . "rmoveto";
+                    }
+                    next TOKENLOOP;
+                };
+
+                # closepath: Output as is.
+                $token eq "closepath" && do {
+                    push @fontprog, $token;
+                    next TOKENLOOP;
+                };
+            }
+        }
+        close PSFILE;
+        push @fontprog, ("endchar",
+                         "} ND");
+        print OUTFILE join ("\n\t", @fontprog), "\n";
+    }
+}
+
+
+# Output the final set of code for the Type 1 font.
+sub output_trailer ()
+{
+    print OUTFILE <<"ENDTRAILER";
+/.notdef {
+        0 @{[$fontbbox[2]-$fontbbox[0]]} hsbw
+        endchar
+        } ND
+end
+end
+readonly put
+noaccess put
+dup/FontName get exch definefont pop
+mark currentfile closefile
+cleartomark
+ENDTRAILER
+}
+
+######################################################################
+
+# Parse the command line.  Asterisks in the following represents
+# commands also defined by Plain Metafont.
+my %opthash = ();
+GetOptions (\%opthash,
+            "fontversion=s",       # font_version
+            "comment=s",           # font_comment
+            "family=s",            # font_family
+            "weight=s",            # font_weight
+            "fullname=s",          # font_identifier (*)
+            "fixedpitch!",         # font_fixed_pitch
+            "italicangle=f",       # font_slant (*)
+            "underpos=f",          # font_underline_position
+            "underthick=f",        # font_underline_thickness
+            "name=s",              # font_name
+            "uniqueid=i",          # font_unique_id
+            "designsize=f",        # font_size (*)
+            "encoding=s",          # font_coding_scheme (*)
+            "rounding=f",
+            "bpppix=f",
+            "ffscript=s",
+            "h|help",
+            "V|version") || pod2usage(2);
+if (defined $opthash{"h"}) {
+    pod2usage(-verbose => 1,
+              -output  => \*STDOUT,    # Bug workaround for Pod::Usage
+              -exitval => "NOEXIT");
+    print "Please e-mail bug reports to scott+mf\@pakin.org.\n";
+    exit 1;
+}
+do {print $versionmsg; exit 1} if defined $opthash{"V"};
+pod2usage(2) if $#ARGV != 0;
+
+# Extract the filename from the command line.
+$mffile = $ARGV[0];
+my @fileparts = fileparse $mffile, ".mf";
+$filebase = $fileparts[0];
+$filedir = $fileparts[1];
+$filenoext = File::Spec->catfile ($filedir, $filebase);
+$pt1file = $filebase . ".pt1";
+$pfbfile = $filebase . ".pfb";
+
+assign_default $bpppix, $opthash{bpppix}, 0.02;
+
+# Make our first pass through the input, to set values for various options.
+$mag = 100;           # Get a more precise bounding box.
+get_bboxes(1);        # This might set $designsize.
+
+# Sanity-check the specified precision.
+assign_default $rounding, $opthash{rounding}, 1;
+if ($rounding<=0.0 || $rounding>1.0) {
+    die sprintf "%s: Invalid rounding amount \"%g\"; value must be a positive number no greater than 1.0\n", $progname, $rounding;
+}
+
+# Ensure that every user-definable parameter is assigned a value.
+assign_default $fontversion, $opthash{fontversion}, "001.000";
+assign_default $creationdate, scalar localtime;
+assign_default $comment, $opthash{comment}, "Font converted to Type 1 by mf2pt1, written by Scott Pakin.";
+assign_default $weight, $opthash{weight}, "Medium";
+assign_default $fixedpitch, $opthash{fixedpitch}, 0;
+assign_default $uniqueID, $opthash{uniqueid}, int(rand(1000000)) + 4000000;
+assign_default $designsize, $opthash{designsize};
+die "${progname}: a design size must be specified in $mffile or on the command line\n" if !defined $designsize;
+die "${progname}: the design size must be a positive number\n" if $designsize<=0.0;
+assign_default $underlinepos, $opthash{underpos}, -1;
+$underlinepos = round(1000*$underlinepos/$designsize);
+assign_default $underlinethick, $opthash{underthick}, 0.5;
+$underlinethick = round(1000*$underlinethick/$designsize);
+assign_default $fullname, $opthash{fullname}, $filebase;
+assign_default $familyname, $opthash{family}, $fullname;
+assign_default $italicangle, $opthash{italicangle}, 0;
+assign_default $fontname, $opthash{name}, "$familyname-$weight";
+$fontname =~ s/\s//g;
+assign_default $encoding, $opthash{encoding}, "standard";
+my $encoding_name = $encoding;
+ENCODING:
+{
+    if (-e $encoding) {
+        # Filenames take precedence over built-in encodings.
+        my @enc_array;
+        open (ENCFILE, "<$encoding") || die "${progname}: $! ($encoding)\n";
+        while (my $oneline = <ENCFILE>) {
+            $oneline =~ s/\%.*$//;
+            foreach my $word (split " ", $oneline) {
+                push @enc_array, substr($word, 1) if substr($word, 0, 1) eq "/";
+            }
+        }
+        close ENCFILE;
+        $encoding_name = substr (shift @enc_array, 1);
+        $encoding = \@enc_array;
+        last ENCODING;
+    }
+    $encoding=\@standardencoding,  last ENCODING  if $encoding eq "standard";
+    $encoding=\@isolatin1encoding, last ENCODING  if $encoding eq "isolatin1";
+    $encoding=\@ot1encoding,       last ENCODING  if $encoding eq "ot1";
+    $encoding=\@t1encoding,        last ENCODING  if $encoding eq "t1";
+    $encoding=\@glyphname,         last ENCODING  if $encoding eq "asis";
+    warn "${progname}: Unknown encoding \"$encoding\"; using standard Adobe encoding\n";
+    $encoding=\@standardencoding;     # Default to standard encoding
+}
+assign_default $fixedpitch, $opthash{fixedpitch}, 0;
+$fixedpitch = $fixedpitch ? "true" : "false";
+assign_default $ffscript, $opthash{ffscript};
+
+# Output the final values of all of our parameters.
+print "\n";
+print <<"PARAMVALUES";
+mf2pt1 is using the following font parameters:
+    font_version:              $fontversion
+    font_comment:              $comment
+    font_family:               $familyname
+    font_weight:               $weight
+    font_identifier:           $fullname
+    font_fixed_pitch:          $fixedpitch
+    font_slant:                $italicangle
+    font_underline_position:   $underlinepos
+    font_underline_thickness:  $underlinethick
+    font_name:                 $fontname
+    font_unique_id:            $uniqueID
+    font_size:                 $designsize (bp)
+    font_coding_scheme:        $encoding_name
+PARAMVALUES
+    ;
+print "\n";
+
+# Scale by a factor of 1000/design size.
+$mag = 1000.0 / $designsize;
+get_bboxes(0);
+print "\n";
+
+# Output the font in disassembled format.
+open (OUTFILE, ">$pt1file") || die "${progname}: $! ($pt1file)\n";
+output_header();
+printf OUTFILE "2 index /CharStrings %d dict dup begin\n",
+               1+scalar(grep {defined($_)} @charbbox);
+output_font_programs();
+output_trailer();
+close OUTFILE;
+unlink @charfiles;
+print "\n";
+
+# Convert from the disassembled font format to Type 1 binary format.
+if (!execute_command 0, ("t1asm", $pt1file, $pfbfile)) {
+    die "${progname}: You'll need either to install t1utils and rerun $progname or find another way to convert $pt1file to $pfbfile\n";
+    exit 1;
+}
+print "\n";
+unlink $pt1file;
+
+# Use FontForge to autohint the result.
+my $user_script = 0;   # 1=script file was provided by the user; 0=created here
+if (defined $ffscript) {
+    # The user provided his own script.
+    $user_script = 1;
+}
+else {
+    # Create a FontForge script file.
+    $ffscript = $filebase . ".pe";
+    open (FFSCRIPT, ">$ffscript") || die "${progname}: $! ($ffscript)\n";
+    print FFSCRIPT <<'AUTOHINT';
+Open($1);
+SelectAll();
+RemoveOverlap();
+AddExtrema();
+Simplify(0, 2);
+CorrectDirection();
+Simplify(0, 2);
+RoundToInt();
+AutoHint();
+Generate($1);
+Quit(0);
+AUTOHINT
+    ;
+    close FFSCRIPT;
+}
+if (!execute_command 0, ("fontforge", "-script", $ffscript, $pfbfile)) {
+    warn "${progname}: You'll need to install FontForge if you want $pfbfile autohinted (not required, but strongly recommended)\n";
+}
+unlink $ffscript if !$user_script;
+print "\n";
+
+# Finish up.
+print "*** Successfully generated $pfbfile! ***\n";
+exit 0;
+
+######################################################################
+
+__END__
+
+=head1 NAME
+
+mf2pt1 - produce a PostScript Type 1 font program from a Metafont source
+
+
+=head1 SYNOPSIS
+
+mf2pt1
+[B<--help>]
+[B<--version>]
+[B<--comment>=I<string>]
+[B<--designsize>=I<number>]
+[B<--encoding>=I<encoding>]
+[B<--family>=I<name>]
+[B<-->[B<no>]B<fixedpitch>]
+[B<--fontversion>=I<MMM.mmm>]
+[B<--fullname>=I<name>]
+[B<--italicangle>=I<number>]
+[B<--name>=I<name>]
+[B<--underpos>=I<number>]
+[B<--underthick>=I<number>]
+[B<--uniqueid>=I<number>]
+[B<--weight>=I<weight>]
+[B<--rounding>=I<number>]
+[B<--bpppix>=I<number>]
+[B<--ffscript>=I<file.pe>]
+I<infile>.mf
+
+
+=head1 WARNING
+
+The B<mf2pt1> Info file is the main source of documentation for
+B<mf2pt1>.  This man page is merely a brief summary.
+
+
+=head1 DESCRIPTION
+
+B<mf2pt1> facilitates producing PostScript Type 1 fonts from a
+Metafont source file.  It is I<not>, as the name may imply, an
+automatic converter of arbitrary Metafont fonts to Type 1 format.
+B<mf2pt1> imposes a number of restrictions on the Metafont input.  If
+these restrictions are met, B<mf2pt1> will produce valid Type 1
+output.  (Actually, it produces "disassembled" Type 1; the B<t1asm>
+program from the B<t1utils> suite will convert this to a true Type 1
+font.)
+
+=head2 Usage
+
+    mf2pt1 myfont.mf
+
+=head1 OPTIONS
+
+Font parameters are best specified within a Metafont program.  If
+necessary, though, command-line options can override any of these
+parameters.  The B<mf2pt1> Info page, the primary source of B<mf2pt1>
+documentation, describes the following in greater detail.
+
+=over 4
+
+=item B<--help>
+
+Provide help on B<mf2pt1>'s command-line options.
+
+=item B<--version>
+
+Output the B<mf2pt1> version number, copyright, and license.
+
+=item B<--comment>=I<string>
+
+Include a font comment, usually a copyright notice.
+
+=item B<--designsize>=I<number>
+
+Specify the font design size in points.
+
+=item B<--encoding>=I<encoding>
+
+Designate the font encoding, either the name of a---typically
+F<.enc>---file which contains a PostScript font-encoding vector or one
+of C<standard> (the default), C<ot1>, C<t1>, or C<isolatin1>.
+
+=item B<--family>=I<name>
+
+Specify the font family.
+
+=item B<--fixedpitch>, B<--nofixedpitch>
+
+Assert that the font uses either monospaced (B<--fixedpitch>) or
+proportional (B<--nofixedpitch>) character widths.
+
+=item B<--fontversion>=I<MMM.mmm>
+
+Specify the font's major and minor version number.
+
+=item B<--fullname>=I<name>
+
+Designate the full font name (family plus modifiers).
+
+=item B<--italicangle>=I<number>
+
+Designate the italic angle in degrees counterclockwise from vertical.
+
+=item B<--name>=I<name>
+
+Provide the font name.
+
+=item B<--underpos>=I<number>
+
+Specify the vertical position of the underline in thousandths of the
+font height.
+
+=item B<--underthick>=I<number>
+
+Specify the thickness of the underline in thousandths of the font
+height.
+
+=item B<--uniqueid>=I<number>
+
+Specify a globally unique font identifier.
+
+=item B<--weight>=I<weight>
+
+Provide a description of the font weight (e.g., ``Heavy'').
+
+=item B<--rounding>=I<number>
+
+Specify the fraction of a font unit (0.0 < I<number> <= 1.0) to which
+to round coordinate values [default: 1.0].
+
+=item B<--bpppix>=I<number>
+
+Redefine the number of big points per pixel from 0.02 to I<number>.
+
+=item B<--ffscript>=I<file.pe>
+
+Name a script to pass to FontForge.
+
+=back
+
+
+=head1 FILES
+
+F<mf2pt1.mem> (which is generated from F<mf2pt1.mp> and F<mfplain.mp>)
+
+
+=head1 NOTES
+
+As stated in L</"WARNING">, the complete source of documentation for
+B<mf2pt1> is the Info page, not this man page.
+
+
+=head1 SEE ALSO
+
+mf(1), mpost(1), t1asm(1), fontforge(1)
+
+
+=head1 AUTHOR
+
+Scott Pakin, I<scott+mf@pakin.org>
diff --git a/scripts/build/mutopia-index.py b/scripts/build/mutopia-index.py
new file mode 100644 (file)
index 0000000..31fa6ac
--- /dev/null
@@ -0,0 +1,197 @@
+#!@PYTHON@
+# mutopia-index.py
+
+import fnmatch
+import getopt
+import os
+import re
+import stat
+import sys
+
+def find (pat, dir):
+    f = os.popen ('find %s -name "%s"'% (dir, pat))
+    lst = []
+    for a in f.readlines():
+        a = a[:-1]
+        lst.append (a)
+    return lst
+
+
+junk_prefix = 'out-www/'
+
+headertext= r"""
+
+<h1>LilyPond samples</h1>
+
+
+<p>You are looking at a page with some LilyPond samples.  These files
+are also included in the distribution. The output is completely
+generated from the source file, without any further touch up.
+
+<p>
+
+The pictures are 90 dpi anti-aliased snapshots of the printed output.
+For a good impression of the quality print out the PDF file.
+"""
+
+headertext_nopics= r"""
+<p>No examples were found in this directory. 
+"""
+
+#
+# FIXME breaks on multiple strings.
+#
+def read_lilypond_header (fn):
+    s = open (fn).read ()
+    s = re.sub ('%.*$', '', s)
+    s = re.sub ('\n', ' ', s)                
+
+    dict = {}
+    m = re.search (r"""\\header\s*{([^}]*)}""", s)
+
+    if m:
+            s = m.group (1)
+    else:
+            return dict
+
+    while s:
+        m = re.search (r'''\s*(\S+)\s*=\s*"([^"]+)"''', s)
+        if m == None:
+            s = ''
+        else:
+            s = s[m.end (0):]
+            left  = m.group         (1)
+            right = m.group (2)
+
+            left = re.sub ('"', '', left)
+            right = re.sub ('"', '', right)
+            dict[left] = right
+
+    return dict
+
+def help ():
+    sys.stdout.write (r'''Usage: mutopia-index [OPTIONS] INFILE OUTFILE
+Generate index for mutopia.
+
+Options:
+ -h, --help                 print this help
+ -o, --output=FILE          write output to file
+ -s, --subdirs=DIR             add subdir
+   --suffix=SUF             specify suffix
+   
+''')
+    sys.exit (0)
+
+# ugh.
+def gen_list (inputs, file_name):
+    sys.stderr.write ("generating HTML list %s" % file_name)
+    sys.stderr.write ('\n')
+    if file_name:
+        list = open (file_name, 'w')
+    else:
+        list = sys.stdout
+    list.write ('''<html><head><title>Rendered Examples</title>
+<style type="text/css">
+hr { border:0; height:1; color: #000000; background-color: #000000; }\n
+</style>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+</head>''')
+
+    list.write ('<body bgcolor=white>\n')
+    
+    if inputs:
+        list.write (headertext)
+    else:
+        list.write (headertext_nopics)
+
+    for ex in inputs:
+        print ex
+        
+        (base, ext) = os.path.splitext (ex)
+        (base, ext2) = os.path.splitext (base)                
+        ext = ext2 + ext
+        
+        header = read_lilypond_header (ex)
+        head = header.get ('title', os.path.basename (base))
+        composer = header.get ('composer', '')
+        desc = header.get ('description', '')
+        list.write ('<hr>\n')
+        list.write ('<h1>%s</h1>\n' % head);
+        if composer:
+            list.write ('<h2>%s</h2>\n' % composer)
+        if desc:
+            list.write ('%s<p>' % desc)
+        list.write ('<ul>\n')
+
+        def list_item (file_name, desc, type, lst = list):
+            if os.path.isfile (file_name):
+                lst.write ('<li><a href="%s">%s</a>'
+                     % (re.sub (junk_prefix, '', file_name), desc))
+
+                # FIXME: include warning if it uses \include
+                # files.
+                
+                size = os.stat (file_name)[stat.ST_SIZE]
+                kB = (size + 512) / 1024
+                if kB:
+                    lst.write (' (%s %d kB)' % (type, kB))
+                else:
+                    lst.write (' (%s %d characters)'
+                         % (type, size))
+                pictures = ['jpeg', 'png', 'xpm']
+                lst.write ('\n')
+            else:
+                print "cannot find" , `file_name`
+
+        list_item (base + ext, 'The input', 'ASCII')
+
+        pages_found = 0
+        for page in range (1, 100):
+            f = base + '-page%d.png' % page
+            
+            if not os.path.isfile (f):
+                break
+            pages_found += 1
+            list_item (f, 'See a picture of page %d' % page, 'png')
+
+        if pages_found == 0 and os.path.exists (base + '.png'):
+            list_item (base + ".png",
+                 'See a picture', 'png')
+
+            
+        list_item (base + '.pdf', 'Print', 'PDF')
+        list_item (base + '.midi', 'Listen', 'MIDI')
+        list.write ('</ul>\n');
+
+    list.write ('</body></html>\n');
+    list.close ()
+
+(options, files) = getopt.getopt (sys.argv[1:],
+ 'ho:', ['help', 'output='])
+outfile = 'examples.html'
+
+subdirs = []
+for (o, a) in options:
+    if o == '--help' or o == '-h':
+        help ()
+    elif o == '--output' or o == '-o':
+        outfile = a
+
+dirs  = []
+for f in files:
+    dirs += find ('out-www', f)
+
+if not dirs:
+    dirs = ['.']
+
+allfiles = []
+
+for d in dirs:
+    allfiles += find ('*.ly', d)
+
+allfiles = [f for f in allfiles
+            if not f.endswith ('snippet-map.ly')
+            and not re.search ('lily-[0-9a-f]+', f)
+            and 'musicxml' not in f]
+
+gen_list (allfiles, outfile)
diff --git a/scripts/build/output-distance.py b/scripts/build/output-distance.py
new file mode 100644 (file)
index 0000000..afc4cf9
--- /dev/null
@@ -0,0 +1,1262 @@
+#!@PYTHON@
+import sys
+import optparse
+import os
+import math
+
+## so we can call directly as scripts/build/output-distance.py
+me_path = os.path.abspath (os.path.split (sys.argv[0])[0])
+sys.path.insert (0, me_path + '/../python/')
+sys.path.insert (0, me_path + '/../python/out/')
+
+
+X_AXIS = 0
+Y_AXIS = 1
+INFTY = 1e6
+
+OUTPUT_EXPRESSION_PENALTY = 1
+ORPHAN_GROB_PENALTY = 1
+options = None
+
+################################################################
+# system interface.
+temp_dir = None
+class TempDirectory:
+    def __init__ (self):
+        import tempfile
+        self.dir = tempfile.mkdtemp ()
+        print 'dir is', self.dir
+    def __del__ (self):
+        print 'rm -rf %s' % self.dir 
+        os.system ('rm -rf %s' % self.dir)
+    def __call__ (self):
+        return self.dir
+
+
+def get_temp_dir  ():
+    global temp_dir
+    if not temp_dir:
+        temp_dir = TempDirectory ()
+    return temp_dir ()
+
+def read_pipe (c):
+    print 'pipe' , c
+    return os.popen (c).read ()
+
+def system (c):
+    print 'system' , c
+    s = os.system (c)
+    if s :
+        raise Exception ("failed")
+    return
+
+def shorten_string (s):
+    threshold = 15 
+    if len (s) > 2*threshold:
+        s = s[:threshold] + '..' + s[-threshold:]
+    return s
+
+def max_distance (x1, x2):
+    dist = 0.0
+
+    for (p,q) in zip (x1, x2):
+        dist = max (abs (p-q), dist)
+        
+    return dist
+
+
+def compare_png_images (old, new, dest_dir):
+    def png_dims (f):
+        m = re.search ('([0-9]+) x ([0-9]+)', read_pipe ('file %s' % f))
+        
+        return tuple (map (int, m.groups ()))
+
+    dest = os.path.join (dest_dir, new.replace ('.png', '.compare.jpeg'))
+    try:
+        dims1 = png_dims (old)
+        dims2 = png_dims (new)
+    except AttributeError:
+        ## hmmm. what to do?
+        system ('touch %(dest)s' % locals ())
+        return
+    
+    dims = (min (dims1[0], dims2[0]),
+            min (dims1[1], dims2[1]))
+
+    dir = get_temp_dir ()
+    system ('convert -depth 8 -crop %dx%d+0+0 %s %s/crop1.png' % (dims + (old, dir)))
+    system ('convert -depth 8 -crop %dx%d+0+0 %s %s/crop2.png' % (dims + (new, dir)))
+
+    system ('compare -depth 8 %(dir)s/crop1.png %(dir)s/crop2.png %(dir)s/diff.png' % locals ())
+
+    system ("convert  -depth 8 %(dir)s/diff.png -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity'    %(dir)s/matte.png" % locals ())
+
+    system ("composite -compose atop -quality 65 %(dir)s/matte.png %(new)s %(dest)s" % locals ())
+
+
+################################################################
+# interval/bbox arithmetic.
+
+empty_interval = (INFTY, -INFTY)
+empty_bbox = (empty_interval, empty_interval)
+
+def interval_is_empty (i):
+    return i[0] > i[1]
+
+def interval_length (i):
+    return max (i[1]-i[0], 0) 
+    
+def interval_union (i1, i2):
+    return (min (i1[0], i2[0]),
+            max (i1[1], i2[1]))
+
+def interval_intersect (i1, i2):
+    return (max (i1[0], i2[0]),
+            min (i1[1], i2[1]))
+
+def bbox_is_empty (b):
+    return (interval_is_empty (b[0])
+            or interval_is_empty (b[1]))
+
+def bbox_union (b1, b2):
+    return (interval_union (b1[X_AXIS], b2[X_AXIS]),
+            interval_union (b2[Y_AXIS], b2[Y_AXIS]))
+            
+def bbox_intersection (b1, b2):
+    return (interval_intersect (b1[X_AXIS], b2[X_AXIS]),
+            interval_intersect (b2[Y_AXIS], b2[Y_AXIS]))
+
+def bbox_area (b):
+    return interval_length (b[X_AXIS]) * interval_length (b[Y_AXIS])
+
+def bbox_diameter (b):
+    return max (interval_length (b[X_AXIS]),
+                interval_length (b[Y_AXIS]))
+                
+
+def difference_area (a, b):
+    return bbox_area (a) - bbox_area (bbox_intersection (a,b))
+
+class GrobSignature:
+    def __init__ (self, exp_list):
+        (self.name, self.origin, bbox_x,
+         bbox_y, self.output_expression) = tuple (exp_list)
+        
+        self.bbox = (bbox_x, bbox_y)
+        self.centroid = (bbox_x[0] + bbox_x[1], bbox_y[0] + bbox_y[1])
+
+    def __repr__ (self):
+        return '%s: (%.2f,%.2f), (%.2f,%.2f)\n' % (self.name,
+                                                   self.bbox[0][0],
+                                                   self.bbox[0][1],
+                                                   self.bbox[1][0],
+                                                   self.bbox[1][1])
+                                                 
+    def axis_centroid (self, axis):
+        return apply (sum, self.bbox[axis])  / 2 
+    
+    def centroid_distance (self, other, scale):
+        return max_distance (self.centroid, other.centroid) / scale 
+        
+    def bbox_distance (self, other):
+        divisor = bbox_area (self.bbox) + bbox_area (other.bbox)
+
+        if divisor:
+            return (difference_area (self.bbox, other.bbox) +
+                    difference_area (other.bbox, self.bbox)) / divisor
+        else:
+            return 0.0
+        
+    def expression_distance (self, other):
+        if self.output_expression == other.output_expression:
+            return 0
+        else:
+            return 1
+
+################################################################
+# single System.
+
+class SystemSignature:
+    def __init__ (self, grob_sigs):
+        d = {}
+        for g in grob_sigs:
+            val = d.setdefault (g.name, [])
+            val += [g]
+
+        self.grob_dict = d
+        self.set_all_bbox (grob_sigs)
+
+    def set_all_bbox (self, grobs):
+        self.bbox = empty_bbox
+        for g in grobs:
+            self.bbox = bbox_union (g.bbox, self.bbox)
+
+    def closest (self, grob_name, centroid):
+        min_d = INFTY
+        min_g = None
+        try:
+            grobs = self.grob_dict[grob_name]
+
+            for g in grobs:
+                d = max_distance (g.centroid, centroid)
+                if d < min_d:
+                    min_d = d
+                    min_g = g
+
+
+            return min_g
+
+        except KeyError:
+            return None
+    def grobs (self):
+        return reduce (lambda x,y: x+y, self.grob_dict.values(), [])
+
+################################################################
+## comparison of systems.
+
+class SystemLink:
+    def __init__ (self, system1, system2):
+        self.system1 = system1
+        self.system2 = system2
+        
+        self.link_list_dict = {}
+        self.back_link_dict = {}
+
+
+        ## pairs
+        self.orphans = []
+
+        ## pair -> distance
+        self.geo_distances = {}
+
+        ## pairs
+        self.expression_changed = []
+
+        self._geometric_distance = None
+        self._expression_change_count = None
+        self._orphan_count = None
+        
+        for g in system1.grobs ():
+
+            ## skip empty bboxes.
+            if bbox_is_empty (g.bbox):
+                continue
+            
+            closest = system2.closest (g.name, g.centroid)
+            
+            self.link_list_dict.setdefault (closest, [])
+            self.link_list_dict[closest].append (g)
+            self.back_link_dict[g] = closest
+
+
+    def calc_geometric_distance (self):
+        total = 0.0
+        for (g1,g2) in self.back_link_dict.items ():
+            if g2:
+                d = g1.bbox_distance (g2)
+                if d:
+                    self.geo_distances[(g1,g2)] = d
+
+                total += d
+
+        self._geometric_distance = total
+    
+    def calc_orphan_count (self):
+        count = 0
+        for (g1, g2) in self.back_link_dict.items ():
+            if g2 == None:
+                self.orphans.append ((g1, None))
+                
+                count += 1
+
+        self._orphan_count = count
+    
+    def calc_output_exp_distance (self):
+        d = 0
+        for (g1,g2) in self.back_link_dict.items ():
+            if g2:
+                d += g1.expression_distance (g2)
+
+        self._expression_change_count = d
+
+    def output_expression_details_string (self):
+        return ', '.join ([g1.name for g1 in self.expression_changed])
+    
+    def geo_details_string (self):
+        results = [(d, g1,g2) for ((g1, g2), d) in self.geo_distances.items()]
+        results.sort ()
+        results.reverse ()
+        
+        return ', '.join (['%s: %f' % (g1.name, d) for (d, g1, g2) in results])
+
+    def orphan_details_string (self):
+        return ', '.join (['%s-None' % g1.name for (g1,g2) in self.orphans if g2==None])
+
+    def geometric_distance (self):
+        if self._geometric_distance == None:
+            self.calc_geometric_distance ()
+        return self._geometric_distance
+    
+    def orphan_count (self):
+        if self._orphan_count == None:
+            self.calc_orphan_count ()
+            
+        return self._orphan_count
+    
+    def output_expression_change_count (self):
+        if self._expression_change_count == None:
+            self.calc_output_exp_distance ()
+        return self._expression_change_count
+        
+    def distance (self):
+        return (self.output_expression_change_count (),
+                self.orphan_count (),
+                self.geometric_distance ())
+    
+def read_signature_file (name):
+    print 'reading', name
+    
+    entries = open (name).read ().split ('\n')
+    def string_to_tup (s):
+        return tuple (map (float, s.split (' '))) 
+
+    def string_to_entry (s):
+        fields = s.split('@')
+        fields[2] = string_to_tup (fields[2])
+        fields[3] = string_to_tup (fields[3])
+
+        return tuple (fields)
+    
+    entries = [string_to_entry (e) for e in entries
+               if e and not e.startswith ('#')]
+
+    grob_sigs = [GrobSignature (e) for e in entries]
+    sig = SystemSignature (grob_sigs)
+    return sig
+
+
+################################################################
+# different systems of a .ly file.
+
+hash_to_original_name = {}
+
+class FileLink:
+    def __init__ (self, f1, f2):
+        self._distance = None
+        self.file_names = (f1, f2)
+        
+    def text_record_string (self):
+        return '%-30f %-20s\n' % (self.distance (),
+                                  self.name ()
+                                  + os.path.splitext (self.file_names[1])[1]
+                                  )
+    
+    def calc_distance (self):
+        return 0.0
+
+    def distance (self):
+        if self._distance == None:
+           self._distance = self.calc_distance ()
+
+        return self._distance
+    
+    def source_file (self):
+        for ext in ('.ly', '.ly.txt'):
+            base = os.path.splitext (self.file_names[1])[0]
+            f = base + ext
+            if os.path.exists (f):
+                return f
+            
+        return ''
+        
+    def name (self):
+        base = os.path.basename (self.file_names[1])
+        base = os.path.splitext (base)[0]
+        base = hash_to_original_name.get (base, base)
+        base = os.path.splitext (base)[0]
+        return base
+    
+    def extension (self):
+        return os.path.splitext (self.file_names[1])[1]
+
+    def link_files_for_html (self, dest_dir):
+        for f in self.file_names:
+            link_file (f, os.path.join (dest_dir, f))
+
+    def get_distance_details (self):
+        return ''
+
+    def get_cell (self, oldnew):
+        return ''
+    
+    def get_file (self, oldnew):
+        return self.file_names[oldnew]
+    
+    def html_record_string (self, dest_dir):
+        dist = self.distance()
+        
+        details = self.get_distance_details ()
+        if details:
+            details_base = os.path.splitext (self.file_names[1])[0]
+            details_base += '.details.html'
+            fn = dest_dir + '/'  + details_base
+            open_write_file (fn).write (details)
+
+            details = '<br>(<a href="%(details_base)s">details</a>)' % locals ()
+
+        cell1 = self.get_cell (0)
+        cell2 = self.get_cell (1)
+
+        name = self.name () + self.extension ()
+        file1 = self.get_file (0)
+        file2 = self.get_file (1)
+        
+        return '''<tr>
+<td>
+%(dist)f
+%(details)s
+</td>
+<td>%(cell1)s<br><font size=-2><a href="%(file1)s"><tt>%(name)s</tt></font></td>
+<td>%(cell2)s<br><font size=-2><a href="%(file2)s"><tt>%(name)s</tt></font></td>
+</tr>''' % locals ()
+
+
+class FileCompareLink (FileLink):
+    def __init__ (self, f1, f2):
+        FileLink.__init__ (self, f1, f2)
+        self.contents = (self.get_content (self.file_names[0]),
+                         self.get_content (self.file_names[1]))
+        
+
+    def calc_distance (self):
+        ## todo: could use import MIDI to pinpoint
+        ## what & where changed.
+
+        if self.contents[0] == self.contents[1]:
+            return 0.0
+        else:
+            return 100.0;
+        
+    def get_content (self, f):
+        print 'reading', f
+        s = open (f).read ()
+        return s
+
+
+class GitFileCompareLink (FileCompareLink):
+    def get_cell (self, oldnew):
+        str = self.contents[oldnew]
+
+        # truncate long lines
+        str = '\n'.join ([l[:80] for l in str.split ('\n')])
+
+        
+        str = '<font size="-2"><pre>%s</pre></font>' % str
+        return str
+    
+    def calc_distance (self):
+        if self.contents[0] == self.contents[1]:
+            d = 0.0
+        else:
+            d = 1.0001 *options.threshold
+
+        return d
+
+        
+class TextFileCompareLink (FileCompareLink):
+    def calc_distance (self):
+        import difflib
+        diff = difflib.unified_diff (self.contents[0].strip().split ('\n'),
+                                     self.contents[1].strip().split ('\n'),
+                                     fromfiledate = self.file_names[0],
+                                     tofiledate = self.file_names[1]
+                                     )
+        
+        self.diff_lines =  [l for l in diff]
+        self.diff_lines = self.diff_lines[2:]
+        
+        return math.sqrt (float (len ([l for l in self.diff_lines if l[0] in '-+'])))
+        
+    def get_cell (self, oldnew):
+        str = ''
+        if oldnew == 1:
+            str = '\n'.join ([d.replace ('\n','') for d in self.diff_lines])
+        str = '<font size="-2"><pre>%s</pre></font>' % str
+        return str
+
+class LogFileCompareLink (TextFileCompareLink):
+  def get_content (self, f):
+      c = TextFileCompareLink.get_content (self, f)
+      c = re.sub ("\nProcessing `[^\n]+'\n", '', c)
+      return c
+        
+class ProfileFileLink (FileCompareLink):
+    def __init__ (self, f1, f2):
+        FileCompareLink.__init__ (self, f1, f2)
+        self.results = [{}, {}]
+    
+    def get_cell (self, oldnew):
+        str = ''
+        for k in ('time', 'cells'):
+            if oldnew==0:
+                str += '%-8s: %d\n' %  (k, int (self.results[oldnew][k]))
+            else:
+                str += '%-8s: %8d (%5.3f)\n' % (k, int (self.results[oldnew][k]),
+                                                self.get_ratio (k))
+
+        return '<pre>%s</pre>' % str
+            
+    def get_ratio (self, key):
+        (v1,v2) = (self.results[0].get (key, -1),
+                   self.results[1].get (key, -1))
+
+        if v1 <= 0 or v2 <= 0:
+            return 0.0
+
+        return (v1 - v2) / float (v1+v2)
+    
+    def calc_distance (self):
+        for oldnew in (0,1):
+            def note_info (m):
+                self.results[oldnew][m.group(1)] = float (m.group (2))
+            
+            re.sub ('([a-z]+): ([-0-9.]+)\n',
+                    note_info, self.contents[oldnew])
+
+        dist = 0.0
+        factor = {
+            'time': 0.1,
+            'cells': 5.0,
+            }
+        
+        for k in ('time', 'cells'):
+            real_val = math.tan (self.get_ratio (k) * 0.5 * math.pi)
+            dist += math.exp (math.fabs (real_val) * factor[k])  - 1
+
+        dist = min (dist, 100)
+        return dist
+
+    
+class MidiFileLink (TextFileCompareLink):
+    def get_content (self, oldnew):
+        import midi
+        
+        data = FileCompareLink.get_content (self, oldnew)
+        midi = midi.parse (data)
+        tracks = midi[1]
+
+        str = ''
+        j = 0
+        for t in tracks:
+            str += 'track %d' % j
+            j += 1
+
+            for e in t:
+                ev_str = repr (e)
+                if re.search ('LilyPond [0-9.]+', ev_str):
+                    continue
+                
+                str += '  ev %s\n' % `e`
+        return str
+    
+
+
+class SignatureFileLink (FileLink):
+    def __init__ (self, f1, f2 ):
+        FileLink.__init__ (self, f1, f2)
+        self.system_links = {}
+
+    def add_system_link (self, link, number):
+        self.system_links[number] = link
+
+    def calc_distance (self):
+        d = 0.0
+
+        orphan_distance = 0.0
+        for l in self.system_links.values ():
+            d = max (d, l.geometric_distance ())
+            orphan_distance += l.orphan_count ()
+            
+        return d + orphan_distance
+
+    def add_file_compare (self, f1, f2):
+        system_index = [] 
+
+        def note_system_index (m):
+            system_index.append (int (m.group (1)))
+            return ''
+        
+        base1 = re.sub ("-([0-9]+).signature", note_system_index, f1)
+        base2 = re.sub ("-([0-9]+).signature", note_system_index, f2)
+
+        self.base_names = (os.path.normpath (base1),
+                           os.path.normpath (base2))
+
+        s1 = read_signature_file (f1)
+        s2 = read_signature_file (f2)
+
+        link = SystemLink (s1, s2)
+
+        self.add_system_link (link, system_index[0])
+
+    
+    def create_images (self, dest_dir):
+
+        files_created = [[], []]
+        for oldnew in (0, 1):
+            pat = self.base_names[oldnew] + '.eps'
+
+            for f in glob.glob (pat):
+                infile = f
+                outfile = (dest_dir + '/' + f).replace ('.eps', '.png')
+                data_option = ''
+                if options.local_data_dir:
+                    data_option = ('-slilypond-datadir=%s/../share/lilypond/current '
+                                   % os.path.dirname(infile))
+                
+                mkdir (os.path.split (outfile)[0])
+                cmd = ('gs -sDEVICE=png16m -dGraphicsAlphaBits=4 -dTextAlphaBits=4 '
+                       ' %(data_option)s '
+                       ' -r101 '
+                       ' -sOutputFile=%(outfile)s -dNOSAFER -dEPSCrop -q -dNOPAUSE '
+                       ' %(infile)s  -c quit ') % locals ()
+
+                files_created[oldnew].append (outfile)
+                system (cmd)
+
+        return files_created
+    
+    def link_files_for_html (self, dest_dir):
+        FileLink.link_files_for_html (self, dest_dir)
+        to_compare = [[], []]
+
+        exts = []
+        if options.create_images:
+            to_compare = self.create_images (dest_dir)
+        else:
+            exts += ['.png', '-page*png']
+        
+        for ext in exts:            
+            for oldnew in (0,1):
+                for f in glob.glob (self.base_names[oldnew] + ext):
+                    dst = dest_dir + '/' + f
+                    link_file (f, dst)
+
+                    if f.endswith ('.png'):
+                        to_compare[oldnew].append (f)
+                        
+        if options.compare_images:                
+            for (old, new) in zip (to_compare[0], to_compare[1]):
+                compare_png_images (old, new, dest_dir)
+
+
+    def get_cell (self, oldnew):
+        def img_cell (ly, img, name):
+            if not name:
+                name = 'source'
+            else:
+                name = '<tt>%s</tt>' % name
+                
+            return '''
+<a href="%(img)s">
+<img src="%(img)s" style="border-style: none; max-width: 500px;">
+</a><br>
+''' % locals ()
+        def multi_img_cell (ly, imgs, name):
+            if not name:
+                name = 'source'
+            else:
+                name = '<tt>%s</tt>' % name
+
+            imgs_str = '\n'.join (['''<a href="%s">
+<img src="%s" style="border-style: none; max-width: 500px;">
+</a><br>''' % (img, img) 
+                                  for img in imgs])
+
+
+            return '''
+%(imgs_str)s
+''' % locals ()
+
+
+
+        def cell (base, name):
+            pat = base + '-page*.png'
+            pages = glob.glob (pat)
+
+            if pages:
+                return multi_img_cell (base + '.ly', sorted (pages), name)
+            else:
+                return img_cell (base + '.ly', base + '.png', name)
+
+
+
+        str = cell (os.path.splitext (self.file_names[oldnew])[0], self.name ())  
+        if options.compare_images and oldnew == 1:
+            str = str.replace ('.png', '.compare.jpeg')
+            
+        return str
+
+
+    def get_distance_details (self):
+        systems = self.system_links.items ()
+        systems.sort ()
+
+        html = ""
+        for (c, link) in systems:
+            e = '<td>%d</td>' % c
+            for d in link.distance ():
+                e += '<td>%f</td>' % d
+            
+            e = '<tr>%s</tr>' % e
+
+            html += e
+
+            e = '<td>%d</td>' % c
+            for s in (link.output_expression_details_string (),
+                      link.orphan_details_string (),
+                      link.geo_details_string ()):
+                e += "<td>%s</td>" % s
+
+            
+            e = '<tr>%s</tr>' % e
+            html += e
+            
+        original = self.name ()
+        html = '''<html>
+<head>
+<title>comparison details for %(original)s</title>
+</head>
+<body>
+<table border=1>
+<tr>
+<th>system</th>
+<th>output</th>
+<th>orphan</th>
+<th>geo</th>
+</tr>
+
+%(html)s
+</table>
+
+</body>
+</html>
+''' % locals ()
+        return html
+
+
+################################################################
+# Files/directories
+
+import glob
+import re
+
+def compare_signature_files (f1, f2):
+    s1 = read_signature_file (f1)
+    s2 = read_signature_file (f2)
+    
+    return SystemLink (s1, s2).distance ()
+
+def paired_files (dir1, dir2, pattern):
+    """
+    Search DIR1 and DIR2 for PATTERN.
+
+    Return (PAIRED, MISSING-FROM-2, MISSING-FROM-1)
+
+    """
+
+    files = []
+    for d in (dir1,dir2):
+        found = [os.path.split (f)[1] for f in glob.glob (d + '/' + pattern)]
+        found = dict ((f, 1) for f in found)
+        files.append (found)
+        
+    pairs = []
+    missing = []
+    for f in files[0]:
+        try:
+            files[1].pop (f)
+            pairs.append (f)
+        except KeyError:
+            missing.append (f)
+
+    return (pairs, files[1].keys (), missing)
+    
+class ComparisonData:
+    def __init__ (self):
+        self.result_dict = {}
+        self.missing = []
+        self.added = []
+        self.file_links = {}
+
+    def read_sources (self):
+
+        ## ugh: drop the .ly.txt
+        for (key, val) in self.file_links.items ():
+            
+            def note_original (match, ln=val):
+                key = ln.name ()
+                hash_to_original_name[key] = match.group (1)
+                return ''
+
+            sf = val.source_file ()
+            if sf:
+                re.sub (r'\\sourcefilename "([^"]+)"',
+                        note_original, open (sf).read ())
+            else:
+                print 'no source for', val
+        
+    def compare_trees (self, dir1, dir2):
+        self.compare_directories (dir1, dir2)
+        
+        (root, dirs, files) = os.walk (dir1).next ()
+        for d in dirs:
+            d1 = os.path.join (dir1, d)
+            d2 = os.path.join (dir2, d)
+
+            if os.path.islink (d1) or os.path.islink (d2):
+                continue
+            
+            if os.path.isdir (d2):
+                self.compare_trees (d1, d2)
+    
+    def compare_directories (self, dir1, dir2):
+        for ext in ['signature',
+                    'midi',
+                    'log',
+                    'profile',
+                    'gittxt']:
+            (paired, m1, m2) = paired_files (dir1, dir2, '*.' + ext)
+
+            self.missing += [(dir1, m) for m in m1] 
+            self.added += [(dir2, m) for m in m2] 
+
+            for p in paired:
+                if (options.max_count
+                    and len (self.file_links) > options.max_count):
+                    continue
+                
+                f2 = dir2 +  '/' + p
+                f1 = dir1 +  '/' + p
+                self.compare_files (f1, f2)
+
+    def compare_files (self, f1, f2):
+        if f1.endswith ('signature'):
+            self.compare_signature_files (f1, f2)
+        else:
+            ext = os.path.splitext (f1)[1]
+            klasses = {
+                '.midi': MidiFileLink,
+                '.log' : LogFileCompareLink,
+                '.profile': ProfileFileLink,
+                '.gittxt': GitFileCompareLink, 
+                }
+            
+            if klasses.has_key (ext):
+                self.compare_general_files (klasses[ext], f1, f2)
+
+    def compare_general_files (self, klass, f1, f2):
+        name = os.path.split (f1)[1]
+
+        file_link = klass (f1, f2)
+        self.file_links[name] = file_link
+        
+    def compare_signature_files (self, f1, f2):
+        name = os.path.split (f1)[1]
+        name = re.sub ('-[0-9]+.signature', '', name)
+        
+        file_link = None
+        try:
+            file_link = self.file_links[name]
+        except KeyError:
+            generic_f1 = re.sub ('-[0-9]+.signature', '.ly', f1)
+            generic_f2 = re.sub ('-[0-9]+.signature', '.ly', f2)
+            file_link = SignatureFileLink (generic_f1, generic_f2)
+            self.file_links[name] = file_link
+
+        file_link.add_file_compare (f1, f2)
+
+    def write_changed (self, dest_dir, threshold):
+        (changed, below, unchanged) = self.thresholded_results (threshold)
+
+        str = '\n'.join ([os.path.splitext (link.file_names[1])[0]
+                        for link in changed])
+        fn = dest_dir + '/changed.txt'
+        
+        open_write_file (fn).write (str)
+                
+    def thresholded_results (self, threshold):
+        ## todo: support more scores.
+        results = [(link.distance(), link)
+                   for link in self.file_links.values ()]
+        results.sort ()
+        results.reverse ()
+
+        unchanged = [r for (d,r) in results if d == 0.0]
+        below = [r for (d,r) in results if threshold >= d > 0.0]
+        changed = [r for (d,r) in results if d > threshold]
+
+        return (changed, below, unchanged)
+                
+    def write_text_result_page (self, filename, threshold):
+        out = None
+        if filename == '':
+            out = sys.stdout
+        else:
+            print 'writing "%s"' % filename
+            out = open_write_file (filename)
+
+        (changed, below, unchanged) = self.thresholded_results (threshold)
+
+        
+        for link in changed:
+            out.write (link.text_record_string ())
+
+        out.write ('\n\n')
+        out.write ('%d below threshold\n' % len (below))
+        out.write ('%d unchanged\n' % len (unchanged))
+        
+    def create_text_result_page (self, dir1, dir2, dest_dir, threshold):
+        self.write_text_result_page (dest_dir + '/index.txt', threshold)
+        
+    def create_html_result_page (self, dir1, dir2, dest_dir, threshold):
+        dir1 = dir1.replace ('//', '/')
+        dir2 = dir2.replace ('//', '/')
+
+        (changed, below, unchanged) = self.thresholded_results (threshold)
+
+
+        html = ''
+        old_prefix = os.path.split (dir1)[1]
+        for link in changed:
+            html += link.html_record_string (dest_dir)
+
+
+        short_dir1 = shorten_string (dir1)
+        short_dir2 = shorten_string (dir2)
+        html = '''<html>
+<table rules="rows" border bordercolor="blue">
+<tr>
+<th>distance</th>
+<th>%(short_dir1)s</th>
+<th>%(short_dir2)s</th>
+</tr>
+%(html)s
+</table>
+</html>''' % locals()
+
+        html += ('<p>')
+        below_count = len (below)
+
+        if below_count:
+            html += ('<p>%d below threshold</p>' % below_count)
+            
+        html += ('<p>%d unchanged</p>' % len (unchanged))
+
+        dest_file = dest_dir + '/index.html'
+        open_write_file (dest_file).write (html)
+
+
+        for link in changed:
+            link.link_files_for_html (dest_dir)
+        
+
+    def print_results (self, threshold):
+        self.write_text_result_page ('', threshold)
+
+def compare_trees (dir1, dir2, dest_dir, threshold):
+    data = ComparisonData ()
+    data.compare_trees (dir1, dir2)
+    data.read_sources ()
+
+    
+    data.print_results (threshold)
+
+    if os.path.isdir (dest_dir):
+        system ('rm -rf %s '% dest_dir)
+
+    data.write_changed (dest_dir, threshold)
+    data.create_html_result_page (dir1, dir2, dest_dir, threshold)
+    data.create_text_result_page (dir1, dir2, dest_dir, threshold)
+    
+################################################################
+# TESTING
+
+def mkdir (x):
+    if not os.path.isdir (x):
+        print 'mkdir', x
+        os.makedirs (x)
+
+def link_file (x, y):
+    mkdir (os.path.split (y)[0])
+    try:
+        print x, '->', y
+        os.link (x, y)
+    except OSError, z:
+        print 'OSError', x, y, z
+        raise OSError
+    
+def open_write_file (x):
+    d = os.path.split (x)[0]
+    mkdir (d)
+    return open (x, 'w')
+
+
+def system (x):
+    
+    print 'invoking', x
+    stat = os.system (x)
+    assert stat == 0
+
+
+def test_paired_files ():
+    print paired_files (os.environ["HOME"] + "/src/lilypond/scripts/",
+                        os.environ["HOME"] + "/src/lilypond-stable/scripts/build/", '*.py')
+                  
+    
+def test_compare_trees ():
+    system ('rm -rf dir1 dir2')
+    system ('mkdir dir1 dir2')
+    system ('cp 20{-*.signature,.ly,.png,.eps,.log,.profile} dir1')
+    system ('cp 20{-*.signature,.ly,.png,.eps,.log,.profile} dir2')
+    system ('cp 20expr{-*.signature,.ly,.png,.eps,.log,.profile} dir1')
+    system ('cp 19{-*.signature,.ly,.png,.eps,.log,.profile} dir2/')
+    system ('cp 19{-*.signature,.ly,.png,.eps,.log,.profile} dir1/')
+    system ('cp 19-1.signature 19.sub-1.signature')
+    system ('cp 19.ly 19.sub.ly')
+    system ('cp 19.profile 19.sub.profile')
+    system ('cp 19.log 19.sub.log')
+    system ('cp 19.png 19.sub.png')
+    system ('cp 19.eps 19.sub.eps')
+
+    system ('cp 20multipage* dir1')
+    system ('cp 20multipage* dir2')
+    system ('cp 19multipage-1.signature dir2/20multipage-1.signature')
+
+    
+    system ('mkdir -p dir1/subdir/ dir2/subdir/')
+    system ('cp 19.sub{-*.signature,.ly,.png,.eps,.log,.profile} dir1/subdir/')
+    system ('cp 19.sub{-*.signature,.ly,.png,.eps,.log,.profile} dir2/subdir/')
+    system ('cp 20grob{-*.signature,.ly,.png,.eps,.log,.profile} dir2/')
+    system ('cp 20grob{-*.signature,.ly,.png,.eps,.log,.profile} dir1/')
+    system ('echo HEAD is 1 > dir1/tree.gittxt')
+    system ('echo HEAD is 2 > dir2/tree.gittxt')
+
+    ## introduce differences
+    system ('cp 19-1.signature dir2/20-1.signature')
+    system ('cp 19.profile dir2/20.profile')
+    system ('cp 19.png dir2/20.png')
+    system ('cp 19multipage-page1.png dir2/20multipage-page1.png')
+    system ('cp 20-1.signature dir2/subdir/19.sub-1.signature')
+    system ('cp 20.png dir2/subdir/19.sub.png')
+    system ("sed 's/: /: 1/g'  20.profile > dir2/subdir/19.sub.profile")
+
+    ## radical diffs.
+    system ('cp 19-1.signature dir2/20grob-1.signature')
+    system ('cp 19-1.signature dir2/20grob-2.signature')
+    system ('cp 19multipage.midi dir1/midi-differ.midi')
+    system ('cp 20multipage.midi dir2/midi-differ.midi')
+    system ('cp 19multipage.log dir1/log-differ.log')
+    system ('cp 19multipage.log dir2/log-differ.log &&  echo different >> dir2/log-differ.log &&  echo different >> dir2/log-differ.log')
+
+    compare_trees ('dir1', 'dir2', 'compare-dir1dir2', options.threshold)
+
+
+def test_basic_compare ():
+    ly_template = r"""
+
+\version "2.10.0"
+#(define default-toplevel-book-handler
+  print-book-with-defaults-as-systems )
+
+#(ly:set-option (quote no-point-and-click))
+
+\sourcefilename "my-source.ly"
+%(papermod)s
+\header { tagline = ##f }
+\score {
+<<
+\new Staff \relative c {
+  c4^"%(userstring)s" %(extragrob)s
+  }
+\new Staff \relative c {
+  c4^"%(userstring)s" %(extragrob)s
+  }
+>>
+\layout{}
+}
+
+"""
+
+    dicts = [{ 'papermod' : '',
+               'name' : '20',
+               'extragrob': '',
+               'userstring': 'test' },
+             { 'papermod' : '#(set-global-staff-size 19.5)',
+               'name' : '19',
+               'extragrob': '',
+               'userstring': 'test' },
+             { 'papermod' : '',
+               'name' : '20expr',
+               'extragrob': '',
+               'userstring': 'blabla' },
+             { 'papermod' : '',
+               'name' : '20grob',
+               'extragrob': 'r2. \\break c1',
+               'userstring': 'test' },
+             ]
+
+    for d in dicts:
+        open (d['name'] + '.ly','w').write (ly_template % d)
+        
+    names = [d['name'] for d in dicts]
+
+    system ('lilypond -ddump-profile -dseparate-log-files -ddump-signatures --png -dbackend=eps ' + ' '.join (names))
+    
+
+    multipage_str = r'''
+    #(set-default-paper-size "a6")
+    \score {
+      \relative {c1 \pageBreak c1 }
+      \layout {}
+      \midi {}
+    }
+    '''
+
+    open ('20multipage.ly', 'w').write (multipage_str.replace ('c1', 'd1'))
+    open ('19multipage.ly', 'w').write ('#(set-global-staff-size 19.5)\n' + multipage_str)
+    system ('lilypond -dseparate-log-files -ddump-signatures --png 19multipage 20multipage ')
+    test_compare_signatures (names)
+    
+def test_compare_signatures (names, timing=False):
+    import time
+
+    times = 1
+    if timing:
+        times = 100
+
+    t0 = time.clock ()
+
+    count = 0
+    for t in range (0, times):
+        sigs = dict ((n, read_signature_file ('%s-1.signature' % n)) for n in names)
+        count += 1
+
+    if timing:
+        print 'elapsed', (time.clock() - t0)/count
+
+
+    t0 = time.clock ()
+    count = 0
+    combinations = {}
+    for (n1, s1) in sigs.items():
+        for (n2, s2) in sigs.items():
+            combinations['%s-%s' % (n1, n2)] = SystemLink (s1,s2).distance ()
+            count += 1
+
+    if timing:
+        print 'elapsed', (time.clock() - t0)/count
+
+    results = combinations.items ()
+    results.sort ()
+    for k,v in results:
+        print '%-20s' % k, v
+
+    assert combinations['20-20'] == (0.0,0.0,0.0)
+    assert combinations['20-20expr'][0] > 0.0
+    assert combinations['20-19'][2] < 10.0
+    assert combinations['20-19'][2] > 0.0
+
+
+def run_tests ():
+    dir = 'test-output-distance'
+
+    do_clean = not os.path.exists (dir)
+
+    print 'test results in ', dir
+    if do_clean:
+        system ('rm -rf ' + dir)
+        system ('mkdir ' + dir)
+        
+    os.chdir (dir)
+    if do_clean:
+        test_basic_compare ()
+        
+    test_compare_trees ()
+    
+################################################################
+#
+
+def main ():
+    p = optparse.OptionParser ("output-distance - compare LilyPond formatting runs")
+    p.usage = 'output-distance.py [options] tree1 tree2'
+    
+    p.add_option ('', '--test-self',
+                  dest="run_test",
+                  action="store_true",
+                  help='run test method')
+    
+    p.add_option ('--max-count',
+                  dest="max_count",
+                  metavar="COUNT",
+                  type="int",
+                  default=0, 
+                  action="store",
+                  help='only analyze COUNT signature pairs')
+
+    p.add_option ('', '--threshold',
+                  dest="threshold",
+                  default=0.3,
+                  action="store",
+                  type="float",
+                  help='threshold for geometric distance')
+
+    p.add_option ('--no-compare-images',
+                  dest="compare_images",
+                  default=True,
+                  action="store_false",
+                  help="Don't run graphical comparisons")
+
+    p.add_option ('--create-images',
+                  dest="create_images",
+                  default=False,
+                  action="store_true",
+                  help="Create PNGs from EPSes")
+
+
+    p.add_option ('--local-datadir',
+                  dest="local_data_dir",
+                  default=False,
+                  action="store_true",
+                  help='whether to use the share/lilypond/ directory in the test directory')
+
+    p.add_option ('-o', '--output-dir',
+                  dest="output_dir",
+                  default=None,
+                  action="store",
+                  type="string",
+                  help='where to put the test results [tree2/compare-tree1tree2]')
+
+    global options
+    (options, args) = p.parse_args ()
+
+    if options.run_test:
+        run_tests ()
+        sys.exit (0)
+
+    if len (args) != 2:
+        p.print_usage()
+        sys.exit (2)
+
+    name = options.output_dir
+    if not name:
+        name = args[0].replace ('/', '')
+        name = os.path.join (args[1], 'compare-' + shorten_string (name))
+    
+    compare_trees (args[0], args[1], name, options.threshold)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/scripts/build/pytt.py b/scripts/build/pytt.py
new file mode 100755 (executable)
index 0000000..8aee66b
--- /dev/null
@@ -0,0 +1,54 @@
+#! /usr/bin/python
+
+'''
+    Copyright (c) 2008--2009
+    Jan Nieuwenhuizen <janneke@gnu.org>
+
+    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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+'''
+
+import os
+import re
+import stat
+import sys
+
+dry_run = False
+
+def pytt (from_re, to, file_name):
+    s = file (file_name).read ()
+    name = os.path.basename (file_name)
+    base, ext = os.path.splitext (name)
+    t = re.sub (from_re, to % locals (), s)
+    if s != t:
+        if dry_run:
+            sys.stdout.write (t)
+        else:
+            stat_info = os.stat (file_name)
+            mode = stat.S_IMODE (stat_info[stat.ST_MODE])
+            os.system ('mv --backup=t %(file_name)s %(file_name)s~' % locals ())
+            file (file_name, 'w').write (t)
+            os.chmod (file_name, mode)
+
+def main ():
+    from_re = re.compile (sys.argv[1], re.MULTILINE)
+    to = sys.argv[2]
+    if not sys.argv[3:] or sys.argv[3] == '-':
+        sys.stdout.write (re.sub (from_re, to, sys.stdin.read ()))
+    else:
+        for f in sys.argv[3:]:
+            pytt (from_re, to, f)
+    
+if __name__ == '__main__':
+    main ()
diff --git a/scripts/build/texi-gettext.py b/scripts/build/texi-gettext.py
new file mode 100644 (file)
index 0000000..546819b
--- /dev/null
@@ -0,0 +1,77 @@
+#!@PYTHON@
+# -*- coding: utf-8 -*-
+# texi-gettext.py
+
+# USAGE:  texi-gettext.py [-o OUTDIR] LANG FILES
+#
+# -o OUTDIR specifies that output files should rather be written in OUTDIR
+#
+
+print "texi_gettext.py"
+
+import sys
+import re
+import os
+import getopt
+
+import langdefs
+
+optlist, args = getopt.getopt (sys.argv[1:],'o:')
+lang = args[0]
+files = args[1:]
+
+outdir = '.'
+for x in optlist:
+    if x[0] == '-o':
+        outdir = x[1]
+
+double_punct_char_separator = langdefs.LANGDICT[lang].double_punct_char_sep
+_doc = langdefs.translation[lang]
+
+include_re = re.compile (r'@include ((?!../lily-).*?)\.texi$', re.M)
+whitespaces = re.compile (r'\s+')
+ref_re = re.compile (r'(?ms)@(rglos|ruser|rprogram|ref)(\{)(.*?)(\})')
+node_section_re = re.compile (r'@(node|(?:unnumbered|appendix)(?:(?:sub){0,2}sec)?|top|chapter|(?:sub){0,2}section|(?:major|chap|(?:sub){0,2})heading)( )(.*?)(\n)')
+menu_entry_re = re.compile (r'\* (.*?)::')
+
+def title_gettext (m):
+    if m.group (2) == '{':
+        r = whitespaces.sub (' ', m.group (3))
+    else:
+        r = m.group (3)
+    return '@' + m.group (1) + m.group (2) + _doc (r) + m.group (4)
+
+def menu_entry_gettext (m):
+    return '* ' + _doc (m.group (1)) + '::'
+
+def include_replace (m, filename):
+    if os.path.exists (os.path.join (os.path.dirname (filename), m.group(1)) + '.texi'):
+        return '@include ' + m.group(1) + '.pdftexi'
+    return m.group(0)
+
+def process_file (filename):
+    print "Processing %s" % filename
+    f = open (filename, 'r')
+    page = f.read ()
+    f.close()
+    page = node_section_re.sub (title_gettext, page)
+    page = ref_re.sub (title_gettext, page)
+    page = menu_entry_re.sub (menu_entry_gettext, page)
+    page = page.replace ("""-- SKELETON FILE --
+When you actually translate this file, please remove these lines as
+well as all `UNTRANSLATED NODE: IGNORE ME' lines.""", '')
+    page = page.replace ('UNTRANSLATED NODE: IGNORE ME', _doc ("This section has not been translated yet; please refer to the manual in English."))
+    includes = include_re.findall (page)
+    page = include_re.sub (lambda m: include_replace (m, filename), page)
+    p = os.path.join (outdir, filename) [:-4] + 'pdftexi'
+    f = open (p, 'w')
+    f.write (page)
+    f.close ()
+    dir = os.path.dirname (filename)
+    for file in includes:
+        p = os.path.join (dir, file) + '.texi'
+        if os.path.exists (p):
+            process_file (p)
+
+for filename in files:
+    process_file (filename)
diff --git a/scripts/build/texi2omf.py b/scripts/build/texi2omf.py
new file mode 100644 (file)
index 0000000..cc2603f
--- /dev/null
@@ -0,0 +1,154 @@
+#!@PYTHON@
+
+import getopt
+import os
+import re
+import sys
+import time
+
+def usage ():
+    sys.stderr.write ('''
+texi2omf [options] FILE.texi > FILE.omf
+
+Options:
+
+--format=FORM         set format FORM  (HTML, PS, PDF, [XML]).
+--location=FILE       file name as installed on disk.
+--version=VERSION
+
+Use the following commands (enclose in @ignore)
+
+@omfsubject . .
+@omfdescription . .
+@omftype . . 
+
+etc.
+
+
+''')
+    
+(options, files) = getopt.getopt (sys.argv[1:], '',
+                 ['format=', 'location=', 'version='])
+
+license = 'FDL'
+location = ''
+version = ''
+email = os.getenv ('MAILADDRESS')
+name = os.getenv ('USERNAME')
+format = 'xml'
+
+for (o, a) in options:
+    if o == '--format':
+        format = a
+    elif o == '--location':
+        location = 'file:%s' % a
+    elif o == '--version':
+        version = a
+    else:
+        assert 0
+
+        
+if not files:
+    usage ()
+    sys.exit (2)
+
+
+formats = {
+    'html' : 'text/html',
+    'pdf' : 'application/pdf',
+    'ps.gz' : 'application/postscript',
+    'ps' : 'application/postscript',
+    'xml' : 'text/xml',
+    }
+
+if not formats.has_key (format):
+    sys.stderr.write ("Format `%s' unknown\n" % format)
+    sys.exit (1)
+
+
+infile = files[0]
+
+today = time.localtime ()
+
+texi = open (infile).read ()
+
+if not location:
+    location = 'file:/%s' % re.sub (r'\..*', '.' + format, infile)
+
+omf_vars = {
+    'date': '%d-%d-%d' %  today[:3],
+    'mimeformat': formats[format],
+    'maintainer':  "%s (%s)" % (name, email),
+    'version' : version,
+    'location' : location,
+    'language' : 'C',
+    }
+
+omf_caterories = ['subject', 'creator', 'maintainer', 'contributor',
+         'title', 'subtitle', 'version', 'category', 'type',
+         'description', 'license', 'language',]
+    
+for a in omf_caterories:
+    m = re.search ('@omf%s (.*)\n'% a, texi)
+    if m:
+        omf_vars[a] = m.group (1)
+    elif not omf_vars.has_key (a):
+        omf_vars[a] = ''
+        
+if not omf_vars['title']:
+    title = ''
+    m = re.search ('@title (.*)\n', texi)
+    if m:
+        title = m.group (1)
+
+    subtitle = ''
+    m = re.search ('@subtitle (.*)\n', texi)
+    if m:
+        subtitle = m.group (1)
+
+    if subtitle:
+        title  = '%s -- %s' % (title, subtitle)
+
+    omf_vars['title'] = title
+    
+if not omf_vars['creator']:
+    m = re.search ('@author (.*)\n', texi)
+    if m:
+        omf_vars['creator'] = m.group (1)
+
+
+
+print r'''<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE omf PUBLIC "-//OMF//DTD Scrollkeeper OMF Variant V1.0//EN" "http://scrollkeeper.sourceforge.net/dtds/scrollkeeper-omf-1.0/scrollkeeper-omf.dtd">
+<omf>
+ <resource>
+  <creator>
+   %(creator)s
+  </creator>
+  <maintainer>
+   %(maintainer)s
+  </maintainer>
+  <title>
+   %(title)s
+  </title>
+  <date>
+   %(date)s
+  </date>
+  <version identifier="%(version)s" date="%(date)s" />
+  <subject category="%(category)s"/>
+  <description>
+  %(description)s
+  </description>
+  <type>
+  %(type)s
+  </type>
+  <format mime="%(mimeformat)s" />
+  <identifier url="%(location)s"/>
+  <language code="%(language)s"/>
+  <rights type="%(license)s" />
+ </resource>
+</omf>
+
+''' % omf_vars
+
+
diff --git a/scripts/build/www_post.py b/scripts/build/www_post.py
new file mode 100644 (file)
index 0000000..29f80cf
--- /dev/null
@@ -0,0 +1,100 @@
+#!@PYTHON@
+
+## This is www_post.py. This script is the main stage
+## of toplevel GNUmakefile local-WWW-post target.
+
+# USAGE: www_post PACKAGE_NAME TOPLEVEL_VERSION OUTDIR TARGETS
+# please call me from top of the source directory
+
+import sys
+import os
+import re
+
+import langdefs
+
+import mirrortree
+import postprocess_html
+
+package_name, package_version, outdir, targets = sys.argv[1:]
+targets = targets.split (' ')
+outdir = os.path.normpath (outdir)
+doc_dirs = ['input', 'Documentation', outdir]
+target_pattern = os.path.join (outdir, '%s-root')
+
+# these redirection pages allow to go back to the documentation index
+# from HTML manuals/snippets page
+static_files = {
+    os.path.join (outdir, 'index.html'):
+        '''<META HTTP-EQUIV="refresh" content="0;URL=Documentation/index.html">
+<html><body>Redirecting to the documentation index...</body></html>\n''',
+    os.path.join (outdir, 'VERSION'):
+        package_version + '\n',
+    os.path.join ('input', 'lsr', outdir, 'index.html'):
+        '''<META HTTP-EQUIV="refresh" content="0;URL=../../index.html">
+<html><body>Redirecting to the documentation index...</body></html>\n'''
+    }
+
+for l in langdefs.LANGUAGES:
+    static_files[os.path.join ('Documentation', 'user', outdir, l.file_name ('index', '.html'))] = \
+                                  '<META HTTP-EQUIV="refresh" content="0;URL=../' + l.file_name ('index', '.html') + \
+                                  '">\n<html><body>Redirecting to the documentation index...</body></html>\n'
+
+for f, contents in static_files.items ():
+    open (f, 'w').write (contents)
+
+sys.stderr.write ("Mirrorring...\n")
+dirs, symlinks, files = mirrortree.walk_tree (
+    tree_roots = doc_dirs,
+    process_dirs = outdir,
+    exclude_dirs = '(^|/)(' + r'|po|out|out-test|.*?[.]t2d|\w*?-root)(/|$)|Documentation/(' + '|'.join ([l.code for l in langdefs.LANGUAGES]) + ')',
+    find_files = r'.*?\.(?:midi|html|pdf|png|txt|i?ly|signature|css)$|VERSION',
+    exclude_files = r'lily-[0-9a-f]+.*\.(pdf|txt)')
+
+# actual mirrorring stuff
+html_files = []
+hardlinked_files = []
+for f in files:
+    if f.endswith ('.html'):
+        html_files.append (f)
+    else:
+        hardlinked_files.append (f)
+dirs = [re.sub ('/' + outdir, '', d) for d in dirs]
+while outdir in dirs:
+    dirs.remove (outdir)
+dirs = list (set (dirs))
+dirs.sort ()
+
+strip_file_name = {}
+strip_re = re.compile (outdir + '/')
+for t in targets:
+    out_root = target_pattern % t
+    strip_file_name[t] = lambda s: os.path.join (target_pattern % t, (strip_re.sub ('', s)))
+    os.mkdir (out_root)
+    map (os.mkdir, [os.path.join (out_root, d) for d in dirs])
+    for f in hardlinked_files:
+        os.link (f, strip_file_name[t] (f))
+    for l in symlinks:
+        p = mirrortree.new_link_path (os.path.normpath (os.readlink (l)), os.path.dirname (l), strip_re)
+        dest = strip_file_name[t] (l)
+        if not os.path.exists (dest):
+            os.symlink (p, dest)
+
+    ## ad-hoc renaming to make xrefs between PDFs work
+    os.rename (os.path.join (out_root, 'input/lsr/lilypond-snippets.pdf'),
+               os.path.join (out_root, 'Documentation/user/lilypond-snippets.pdf'))
+
+# need this for content negotiation with documentation index
+if 'online' in targets:
+    f = open (os.path.join (target_pattern % 'online', 'Documentation/.htaccess'), 'w')
+    f.write ('#.htaccess\nDirectoryIndex index\n')
+    f.close ()
+
+postprocess_html.build_pages_dict (html_files)
+for t in targets:
+    sys.stderr.write ("Processing HTML pages for %s target...\n" % t)
+    postprocess_html.process_html_files (
+        package_name = package_name,
+        package_version = package_version,
+        target = t,
+        name_filter = strip_file_name[t])
+
index 93e345f2ae6edf305b7a40481c6de828c978b1ff..cffd859ff72ef74900f01579fb3efdbc6bc6c66a 100644 (file)
@@ -4,7 +4,7 @@
 #
 # source file of the GNU LilyPond music typesetter
 #
-# (c) 1998--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+# (c) 1998--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 #                 Jan Nieuwenhuizen <janneke@gnu.org>
 #
 # converting rules are found in python/convertrules.py
@@ -44,6 +44,9 @@ copyright = ('Jan Nieuwenhuizen <janneke@gnu.org>',
 program_name = os.path.basename (sys.argv[0])
 program_version = '@TOPLEVEL_VERSION@'
 
+authors = ('Jan Nieuwenhuizen <janneke@gnu.org>',
+           'Han-Wen Nienhuys <hanwen@xs4all.nl>')
+
 error_file_write = ly.stderr_write
 
 def warning (s):
@@ -58,17 +61,16 @@ def identify (port=sys.stderr):
 def warranty ():
     identify ()
     ly.encoded_write (sys.stdout, '''
-Copyright (c) %s by
+%s
 
-  Han-Wen Nienhuys
-  Jan Nieuwenhuizen
+%s
 
 %s
 %s
-'''  ( '2001--2006',
-       _ ("Distributed under terms of the GNU General Public License."),
-       _ ('It comes with NO WARRANTY.')))
-
+''' % ( _ ('Copyright (c) %s by') % '2001--2009',
+        ' '.join (authors),
+        _ ('Distributed under terms of the GNU General Public License.'),
+        _ ('It comes with NO WARRANTY.')))
 
 def get_option_parser ():
     p = ly.get_option_parser (usage=_ ("%s [OPTION]... FILE") % 'convert-ly',
@@ -117,7 +119,9 @@ def get_option_parser ():
               action='store',
               dest="to_version",
               default='')
-
+    p.add_option ('-w', '--warranty', help=_ ("show warranty and copyright"),
+           action='store_true',
+           ),
     p.add_option_group ('',
                         description=(
             _ ("Report bugs via %s")
@@ -256,6 +260,9 @@ def do_options ():
     opt_parser = get_option_parser()
     (options, args) = opt_parser.parse_args ()
 
+    if options.warranty:
+        warranty ()
+        sys.exit (0)
 
     if options.from_version:
         options.from_version = str_to_tuple (options.from_version)
index c9f23aa6770740ff9496a0edcff5b8cfa83bf18f..54daa94decea6db273a297308eaa815797fb1321 100644 (file)
@@ -34,6 +34,9 @@ import os
 
 program_name = sys.argv[0]
 
+authors = ('Jan Nieuwenhuizen <janneke@gnu.org>',
+           'Han-Wen Nienhuys <hanwen@xs4all.nl>')
+
 version = '@TOPLEVEL_VERSION@'
 if version == '@' + 'TOPLEVEL_VERSION' + '@':
     version = '(unknown version)'           # uGUHGUHGHGUGH
@@ -1162,18 +1165,16 @@ def identify():
 def warranty ():
     identify ()
     sys.stdout.write ('''
-Copyright (c) %s by
+%s
 
- Han-Wen Nienhuys
- Jan Nieuwenhuizen
+  %s
 
 %s
 %s
-''' % ( '2001--2006',
-   _('Distributed under terms of the GNU General Public License.'),
-   _('It comes with NO WARRANTY.')))
-
-
+''' % ( _ ('Copyright (c) %s by') % '2001--2009',
+        '\n  '.join (authors),
+        _ ('Distributed under terms of the GNU General Public License.'),
+        _ ('It comes with NO WARRANTY.')))
 
 def get_option_parser ():
     p = ly.get_option_parser (usage=_ ("%s [OPTION]... ETF-FILE") % 'etf2ly',
index 22eb8e61f47b7ef8b05f6a7704bc1d748bbe5ccd..b8481b3457d5e54ea72d193270f6ce2e919f8f12 100644 (file)
@@ -1,6 +1,6 @@
 #!@TARGET_PYTHON@
 
-# Copyright (C) 2006, 2007 Brailcom, o.p.s.
+# Copyright (c) 2006--2009 Brailcom, o.p.s.
 #
 # Author: Milan Zamazal <pdm@brailcom.org>
 #
index 655ea9888e6945ea7a2d3fe25048460cd293249a..c629201c5d6cb3d71dcd3317e08bb63b947089ff 100644 (file)
@@ -15,7 +15,7 @@ classic lilypond-book:
 TODO:
 
   *  this script is too complex. Modularize.
-  
+
   *  ly-options: intertext?
   *  --line-width?
   *  eps in latex / eps by lilypond -b ps?
@@ -53,7 +53,7 @@ program_name = os.path.basename (sys.argv[0])
 
 # Check if program_version contains @ characters. This will be the case if
 # the .py file is called directly while building the lilypond documentation.
-# If so, try to check for the env var LILYPOND_VERSION, which is set by our 
+# If so, try to check for the env var LILYPOND_VERSION, which is set by our
 # makefiles and use its value.
 at_re = re.compile (r'@')
 if at_re.match (program_version):
@@ -108,12 +108,12 @@ def warranty ():
     ly.encoded_write (sys.stdout, '''
 %s
 
-%s
+  %s
 
 %s
 %s
-''' % ( _ ('Copyright (c) %s by') % '2001--2008',
-        ' '.join (authors),
+''' % ( _ ('Copyright (c) %s by') % '2001--2009',
+        '\n  '.join (authors),
         _ ("Distributed under terms of the GNU General Public License."),
         _ ("It comes with NO WARRANTY.")))
 
@@ -155,18 +155,18 @@ def get_option_parser ():
                   action='store', dest='latex_program',
                   default='latex')
 
-    p.add_option ('--left-padding', 
+    p.add_option ('--left-padding',
                   metavar=_ ("PAD"),
                   dest="padding_mm",
                   help=_ ("pad left side of music to align music inspite of uneven bar numbers (in mm)"),
                   type="float",
                   default=3.0)
-    
+
     p.add_option ("-o", '--output', help=_ ("write output to DIR"),
                   metavar=_ ("DIR"),
                   action='store', dest='output_dir',
                   default='')
-    
+
     p.add_option ('--skip-lily-check',
                   help=_ ("do not fail if no lilypond output is found"),
                   metavar=_ ("DIR"),
@@ -178,16 +178,16 @@ def get_option_parser ():
                   metavar=_ ("DIR"),
                   action='store_true', dest='skip_png_check',
                   default=False)
-    
+
     p.add_option ('--lily-output-dir',
                   help=_ ("write lily-XXX files to DIR, link into --output dir"),
                   metavar=_ ("DIR"),
                   action='store', dest='lily_output_dir',
                   default=None)
-    
+
     p.add_option ('-P', '--process', metavar=_ ("COMMAND"),
                   help = _ ("process ly_files using COMMAND FILE..."),
-                  action='store', 
+                  action='store',
                   dest='process_cmd', default='')
 
     p.add_option ('--pdf',
@@ -290,6 +290,9 @@ no_options = {
 #
 #   (?P<name>regex) -- Assign result of REGEX to NAME.
 #   *? -- Match non-greedily.
+#   (?!...) -- Match if `...' doesn't match next (without consuming
+#              the string).
+#
 #   (?m) -- Multiline regex: Make ^ and $ match at each line.
 #   (?s) -- Make the dot match all characters including newline.
 #   (?x) -- Ignore whitespace in patterns.
@@ -303,17 +306,36 @@ snippet_res = {
         'lilypond':
          r'''(?smx)
           (?P<match>
-          <(?P<inline>(inline)?)mediaobject>\s*<textobject.*?>\s*<programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>(?P<code>.*?)</programlisting\s*>\s*</textobject\s*>\s*</(inline)?mediaobject>)''',
+          <(?P<inline>(inline)?)mediaobject>\s*
+          <textobject.*?>\s*
+          <programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>
+          (?P<code>.*?)
+          </programlisting\s*>\s*
+          </textobject\s*>\s*
+          </(inline)?mediaobject>)''',
 
         'lilypond_block':
          r'''(?smx)
           (?P<match>
-          <(?P<inline>(inline)?)mediaobject>\s*<textobject.*?>\s*<programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>(?P<code>.*?)</programlisting\s*>\s*</textobject\s*>\s*</(inline)?mediaobject>)''',
+          <(?P<inline>(inline)?)mediaobject>\s*
+          <textobject.*?>\s*
+          <programlisting\s+language="lilypond".*?(role="(?P<options>.*?)")?>
+          (?P<code>.*?)
+          </programlisting\s*>\s*
+          </textobject\s*>\s*
+          </(inline)?mediaobject>)''',
 
         'lilypond_file':
          r'''(?smx)
           (?P<match>
-          <(?P<inline>(inline)?)mediaobject>\s*<imageobject.*?>\s*<imagedata\s+fileref="(?P<filename>.*?\.ly)"\s*(role="(?P<options>.*?)")?\s*(/>|>\s*</imagedata>)\s*</imageobject>\s*</(inline)?mediaobject>)''',
+          <(?P<inline>(inline)?)mediaobject>\s*
+          <imageobject.*?>\s*
+          <imagedata\s+
+           fileref="(?P<filename>.*?\.ly)"\s*
+           (role="(?P<options>.*?)")?\s*
+           (/>|>\s*</imagedata>)\s*
+          </imageobject>\s*
+          </(inline)?mediaobject>)''',
 
         'multiline_comment':
          r'''(?smx)
@@ -329,11 +351,11 @@ snippet_res = {
          no_match,
 
         'verbatim':
-       no_match,
+         no_match,
 
         'lilypondversion':
          no_match,
-    }, 
+    },
     ##
     HTML: {
         'include':
@@ -545,13 +567,11 @@ snippet_res = {
 }
 
 
-
-
 format_res = {
-    DOCBOOK: {        
-       'intertext': r',?\s*intertext=\".*?\"',
+    DOCBOOK: {
+        'intertext': r',?\s*intertext=\".*?\"',
         'option_sep': '\s*',
-    }, 
+    },
     HTML: {
         'intertext': r',?\s*intertext=\".*?\"',
         'option_sep': '\s*',
@@ -568,6 +588,7 @@ format_res = {
     },
 }
 
+
 # Options without a pattern in ly_options.
 simple_options = [
     EXAMPLEINDENT,
@@ -628,21 +649,37 @@ ly_options = {
 
 output = {
     ##
-    DOCBOOK: {                 
-        FILTER: r'''<mediaobject><textobject><programlisting language="lilypond" role="%(options)s">%(code)s</programlisting></textobject></mediaobject>''', 
-    
-        OUTPUT: r'''
-        <imageobject role="latex">
-               <imagedata fileref="%(base)s.pdf" format="PDF"/>
-               </imageobject>
-               <imageobject role="html">
-               <imagedata fileref="%(base)s.png" format="PNG"/></imageobject>''',
-    
-        VERBATIM: r'''<programlisting>%(verb)s</programlisting>''',
-        
+    DOCBOOK: {
+        FILTER: r'''<mediaobject>
+  <textobject>
+    <programlisting language="lilypond"
+                    role="%(options)s">
+%(code)s
+    </programlisting>
+  </textobject>
+</mediaobject>''',
+
+        OUTPUT: r'''<imageobject role="latex">
+  <imagedata fileref="%(base)s.pdf" format="PDF"/>
+</imageobject>
+<imageobject role="html">
+  <imagedata fileref="%(base)s.png" format="PNG"/>
+</imageobject>''',
+
+        VERBATIM: r'''<programlisting>
+%(verb)s</programlisting>''',
+
         VERSION: program_version,
-    
-        PRINTFILENAME: '<textobject><simpara><ulink url="%(base)s.ly"><filename>%(filename)s</filename></ulink></simpara></textobject>'
+
+        PRINTFILENAME: r'''<textobject>
+  <simpara>
+    <ulink url="%(base)s.ly">
+      <filename>
+        %(filename)s
+      </filename>
+    </ulink>
+  </simpara>
+</textobject>'''
     },
     ##
     HTML: {
@@ -659,8 +696,10 @@ output = {
  <a href="%(base)s.ly">''',
 
         OUTPUT: r'''
-  <img align="middle" 
-    border="0" src="%(image)s" alt="%(alt)s">''',
+  <img align="middle"
+       border="0"
+       src="%(image)s"
+       alt="%(alt)s">''',
 
         PRINTFILENAME: '<p><tt><a href="%(base)s.ly">%(filename)s</a></tt></p>',
 
@@ -678,29 +717,29 @@ output = {
     ##
     LATEX: {
         OUTPUT: r'''{%%
-\parindent 0pt%%
-\ifx\preLilyPondExample \undefined%%
- \relax%%
-\else%%
- \preLilyPondExample%%
-\fi%%
+\parindent 0pt
+\ifx\preLilyPondExample \undefined
+\else
+  \expandafter\preLilyPondExample
+\fi
 \def\lilypondbook{}%%
-\input %(base)s-systems.tex%%
-\ifx\postLilyPondExample \undefined%%
- \relax%%
-\else%%
- \postLilyPondExample%%
-\fi%%
+\input %(base)s-systems.tex
+\ifx\postLilyPondExample \undefined
+\else
+  \expandafter\postLilyPondExample
+\fi
 }''',
 
         PRINTFILENAME: '''\\texttt{%(filename)s}
-    ''',
+''',
 
-        QUOTE: r'''\begin{quotation}%(str)s
+        QUOTE: r'''\begin{quotation}
+%(str)s
 \end{quotation}''',
 
         VERBATIM: r'''\noindent
-\begin{verbatim}%(verb)s\end{verbatim}''',
+\begin{verbatim}%(verb)s\end{verbatim}
+''',
 
         VERSION: program_version,
 
@@ -729,7 +768,9 @@ output = {
 <p>
  <a href="%(base)s.ly">
   <img align="middle"
-    border="0" src="%(image)s" alt="%(alt)s">
+       border="0"
+       src="%(image)s"
+       alt="%(alt)s">
  </a>
 </p>
 @end html
@@ -784,7 +825,7 @@ PREAMBLE_LY = '''%%%% Generated by %(program_name)s
 
 
 %% ****************************************************************
-%% Start cut-&-pastable-section 
+%% Start cut-&-pastable-section
 %% ****************************************************************
 
 %(preamble_string)s
@@ -866,7 +907,7 @@ def find_file (name, raise_error=True):
         full = os.path.join (i, name)
         if os.path.exists (full):
             return full
-        
+
     if raise_error:
         error (_ ("file not found: %s") % name + '\n')
         exit (1)
@@ -894,7 +935,7 @@ def verb_ly_gettext (s):
         return s
 
     s = ly_comment_re.sub (lambda m: ly_comment_gettext (t, m), s)
-    
+
     for v in ly_var_def_re.findall (s):
         s = re.sub (r"(?m)(^|[' \\#])%s([^a-zA-Z])" % v,
                     "\\1" + t (v) + "\\2",
@@ -940,7 +981,7 @@ class Chunk:
 
     def is_plain (self):
         return False
-    
+
 class Substring (Chunk):
     """A string that does not require extra memory."""
     def __init__ (self, source, start, end, line_number):
@@ -949,7 +990,7 @@ class Substring (Chunk):
         self.end = end
         self.line_number = line_number
         self.override_text = None
-        
+
     def is_plain (self):
         return True
 
@@ -1197,7 +1238,7 @@ class LilypondSnippet (Snippet):
 
             ## let's not create too long names.
             self.checksum = hash.hexdigest ()[:10]
-            
+
         return self.checksum
 
     def basename (self):
@@ -1237,7 +1278,7 @@ class LilypondSnippet (Snippet):
                 os.makedirs (dst_path)
             os.link (src, dst)
 
-        
+
     def all_output_files (self, output_dir, output_dir_files):
         """Return all files generated in lily_output_dir, a set.
 
@@ -1250,7 +1291,7 @@ class LilypondSnippet (Snippet):
         def consider_file (name):
             if name in output_dir_files:
                 result.add (name)
-             
+
         def require_file (name):
             if name in output_dir_files:
                 result.add (name)
@@ -1305,14 +1346,14 @@ class LilypondSnippet (Snippet):
             # markups do not output a signature.
             if 'ddump-signature' in global_options.process_cmd:
                 consider_file (systemfile + '.signature')
-             
-       
+
+
         return (result, missing)
-    
+
     def is_outdated (self, output_dir, current_files):
         found, missing = self.all_output_files (output_dir, current_files)
         return missing
-    
+
     def filter_text (self):
         """Run snippet bodies through a command (say: convert-ly).
 
@@ -1337,14 +1378,14 @@ class LilypondSnippet (Snippet):
         single = '%(base)s.png' % vars ()
         multiple = '%(base)s-page1.png' % vars ()
         images = (single,)
-        if (os.path.exists (multiple) 
+        if (os.path.exists (multiple)
             and (not os.path.exists (single)
                  or (os.stat (multiple)[stat.ST_MTIME]
                      > os.stat (single)[stat.ST_MTIME]))):
             count = ps_page_count ('%(base)s.eps' % vars ())
             images = ['%s-page%d.png' % (base, page) for page in range (1, count+1)]
             images = tuple (images)
-            
+
         return images
 
     def output_docbook (self):
@@ -1353,8 +1394,8 @@ class LilypondSnippet (Snippet):
         for image in self.get_images ():
             (base, ext) = os.path.splitext (image)
             str += output[DOCBOOK][OUTPUT] % vars ()
-           str += self.output_print_filename (DOCBOOK)
-            if (self.substring('inline') == 'inline'): 
+            str += self.output_print_filename (DOCBOOK)
+            if (self.substring('inline') == 'inline'):
                 str = '<inlinemediaobject>' + str + '</inlinemediaobject>'
             else:
                 str = '<mediaobject>' + str + '</mediaobject>'
@@ -1362,7 +1403,7 @@ class LilypondSnippet (Snippet):
                 verb = verbatim_html (self.verb_ly ())
                 str = output[DOCBOOK][VERBATIM] % vars () + str
         return str
-       
+
     def output_html (self):
         str = ''
         base = self.basename ()
@@ -1413,7 +1454,7 @@ class LilypondSnippet (Snippet):
         if 0:
             breaks = self.ly ().count ("\n")
             str += "".ljust (breaks, "\n").replace ("\n","%\n")
-        
+
         if QUOTE in self.option_dict:
             str = output[LATEX][QUOTE] % vars ()
         return str
@@ -1546,7 +1587,7 @@ def find_toplevel_snippets (input_string, format, types):
         for type in types:
             if not found[type] or found[type][0] < index:
                 found[type] = None
-                
+
                 m = res[type].search (input_string[index:endex])
                 if not m:
                     continue
@@ -1565,8 +1606,8 @@ def find_toplevel_snippets (input_string, format, types):
 
                 found[type] = (start, snip)
 
-            if (found[type] 
-                and (not first 
+            if (found[type]
+                and (not first
                      or found[type][0] < found[first][0])):
                 first = type
 
@@ -1599,7 +1640,7 @@ def find_toplevel_snippets (input_string, format, types):
 
 def filter_pipe (input, cmd):
     """Pass input through cmd, and return the result."""
-    
+
     if global_options.verbose:
         progress (_ ("Opening filter `%s'") % cmd)
 
@@ -1634,13 +1675,13 @@ def system_in_directory (cmd, directory):
 
     Because of win32 compatibility, we can't simply use subprocess.
     """
-    
+
     current = os.getcwd()
     os.chdir (directory)
-    ly.system(cmd, be_verbose=global_options.verbose, 
+    ly.system(cmd, be_verbose=global_options.verbose,
               progress_p=1)
     os.chdir (current)
-    
+
 
 def process_snippets (cmd, snippets,
                       format, lily_output_dir):
@@ -1648,14 +1689,14 @@ def process_snippets (cmd, snippets,
 
     if not snippets:
         return
-    
+
     if format in (HTML, TEXINFO) and '--formats' not in cmd:
         cmd += ' --formats=png '
     elif format in (DOCBOOK) and '--formats' not in cmd:
         cmd += ' --formats=png,pdf '
 
     checksum = snippet_list_checksum (snippets)
-    contents = '\n'.join (['snippet-map-%d.ly' % checksum] 
+    contents = '\n'.join (['snippet-map-%d.ly' % checksum]
                           + [snip.basename() + '.ly' for snip in snippets])
     name = os.path.join (lily_output_dir,
                          'snippet-names-%d.ly' % checksum)
@@ -1663,8 +1704,8 @@ def process_snippets (cmd, snippets,
 
     system_in_directory (' '.join ([cmd, ly.mkarg (name)]),
                          lily_output_dir)
-            
-        
+
+
 ###
 # Retrieve dimensions from LaTeX
 LATEX_INSPECTION_DOCUMENT = r'''
@@ -1682,13 +1723,13 @@ def get_latex_textwidth (source):
     m = re.search (r'''(?P<preamble>\\begin\s*{document})''', source)
     if m == None:
         warning (_ ("cannot find \\begin{document} in LaTeX document"))
-        
+
         ## what's a sensible default?
         return 550.0
-    
+
     preamble = source[:m.start (0)]
     latex_document = LATEX_INSPECTION_DOCUMENT % vars ()
-    
+
     (handle, tmpfile) = tempfile.mkstemp('.tex')
     logfile = os.path.splitext (tmpfile)[0] + '.log'
     logfile = os.path.split (logfile)[1]
@@ -1696,11 +1737,11 @@ def get_latex_textwidth (source):
     tmp_handle = os.fdopen (handle,'w')
     tmp_handle.write (latex_document)
     tmp_handle.close ()
-    
+
     ly.system ('%s %s' % (global_options.latex_program, tmpfile),
                be_verbose=global_options.verbose)
     parameter_string = file (logfile).read()
-    
+
     os.unlink (tmpfile)
     os.unlink (logfile)
 
@@ -1731,7 +1772,7 @@ def modify_preamble (chunk):
                r"\\usepackage{graphics}" + '\n'
                + r"\\begin{document}",
                str)
-        chunk.override_text = str 
+        chunk.override_text = str
 
 
 format2ext = {
@@ -1779,8 +1820,8 @@ def do_process_cmd (chunks, input_name, options):
 
     output_files = split_output_files (options.lily_output_dir)
     outdated = [c for c in snippets if c.is_outdated (options.lily_output_dir, output_files)]
-    
-    write_file_map (outdated, input_name)    
+
+    write_file_map (outdated, input_name)
     progress (_ ("Writing snippets..."))
     for snippet in outdated:
         snippet.write_ly()
@@ -1899,15 +1940,15 @@ def do_file (input_filename, included=False):
         global_options.output_dir = os.getcwd()
     else:
         global_options.output_dir = os.path.abspath(global_options.output_dir)
-        
+
         if not os.path.isdir (global_options.output_dir):
             os.mkdir (global_options.output_dir, 0777)
         os.chdir (global_options.output_dir)
 
     output_filename = os.path.join(global_options.output_dir,
                                    input_base + format2ext[global_options.format])
-    if (os.path.exists (input_filename) 
-        and os.path.exists (output_filename) 
+    if (os.path.exists (input_filename)
+        and os.path.exists (output_filename)
         and samefile (output_filename, input_fullname)):
      error (
      _ ("Output would overwrite input file; use --output."))
@@ -1955,7 +1996,7 @@ def do_file (input_filename, included=False):
             write_if_updated (output_filename,
                      [s.replacement_text ()
                      for s in chunks])
-        
+
         def process_include (snippet):
             os.chdir (original_dir)
             name = snippet.substring ('filename')
@@ -1968,7 +2009,7 @@ def do_file (input_filename, included=False):
                                       chunks))
 
         return chunks + reduce (lambda x, y: x + y, include_chunks, [])
-        
+
     except CompileError:
         os.chdir (original_dir)
         progress (_ ("Removing `%s'") % output_filename)
@@ -1984,14 +2025,14 @@ def do_options ():
         global_options.format = TEXINFO
 
     global_options.include_path =  map (os.path.abspath, global_options.include_path)
-    
+
     if global_options.warranty:
         warranty ()
         exit (0)
     if not args or len (args) > 1:
         opt_parser.print_help ()
         exit (2)
-        
+
     return args
 
 def main ():
@@ -2000,7 +2041,7 @@ def main ():
 
     basename = os.path.splitext (files[0])[0]
     basename = os.path.split (basename)[1]
-    
+
     if not global_options.format:
         global_options.format = guess_format (files[0])
 
@@ -2009,7 +2050,7 @@ def main ():
         formats += ',png'
 
     if global_options.process_cmd == '':
-        global_options.process_cmd = (lilypond_binary 
+        global_options.process_cmd = (lilypond_binary
                                       + ' --formats=%s -dbackend=eps ' % formats)
 
     if global_options.process_cmd:
@@ -2026,13 +2067,13 @@ def main ():
         global_options.process_cmd += ' --formats=eps '
         if global_options.create_pdf:
             global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts "
-    
+
     if global_options.verbose:
         global_options.process_cmd += " --verbose "
 
     if global_options.padding_mm:
         global_options.process_cmd += " -deps-box-padding=%f " % global_options.padding_mm
-        
+
     global_options.process_cmd += " -dread-file-list -dno-strip-output-dir"
 
     if global_options.lily_output_dir:
@@ -2041,7 +2082,7 @@ def main ():
             os.makedirs (global_options.lily_output_dir)
     else:
         global_options.lily_output_dir = os.path.abspath(global_options.output_dir)
-        
+
 
     identify ()
     try:
@@ -2057,7 +2098,7 @@ def main ():
     final_output_file = os.path.join (global_options.output_dir,
                      base_file_name
                      + '.%s' % global_options.format)
-    
+
     os.chdir (original_dir)
     file (dep_file, 'w').write ('%s: %s'
                                 % (final_output_file, ' '.join (inputs)))
index 7ff21871fe4ac444e7a07c6f984fca5992344f66..2f4f3e84e54c9cfc5af90edc3675172093f634f4 100644 (file)
@@ -4,7 +4,7 @@
 ;;;;
 ;;;; source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c) 2005--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2005--2009 Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;; gui debug helper
 ;; (define (exit x) (system "sleep 10"))
index adc6f57526cf8e608ca464b5df4f00628d2098ce..f02aca7903abac1d6e4b96fa8be23a6a4ecc7205 100644 (file)
@@ -1,6 +1,6 @@
 #!@TARGET_PYTHON@
 
-# Copyright (C) 2006, 2007 Brailcom, o.p.s.
+# Copyright (c) 2006--2009 Brailcom, o.p.s.
 #
 # Author: Milan Zamazal <pdm@brailcom.org>
 #
index ace53d3446e90979fad38b2cd31d40f7a6b5649c..c57c788d51d042fdf0f2ca42ece26edf6fc8c328 100644 (file)
@@ -4,7 +4,7 @@
 # 
 # source file of the GNU LilyPond music typesetter
 #
-# (c) 1998--2008  Han-Wen Nienhuys <hanwen@xs4all.nl>
+# (c) 1998--2009  Han-Wen Nienhuys <hanwen@xs4all.nl>
 #                 Jan Nieuwenhuizen <janneke@gnu.org>
 
 
@@ -57,6 +57,9 @@ allowed_tuplet_clocks = []
 program_name = sys.argv[0]
 program_version = '@TOPLEVEL_VERSION@'
 
+authors = ('Jan Nieuwenhuizen <janneke@gnu.org>',
+           'Han-Wen Nienhuys <hanwen@xs4all.nl>')
+
 errorport = sys.stderr
 
 def identify ():
@@ -65,17 +68,16 @@ def identify ():
 def warranty ():
     identify ()
     ly.encoded_write (sys.stdout, '''
-Copyright (c) %s by
+%s
 
- Han-Wen Nienhuys
- Jan Nieuwenhuizen
+  %s
 
 %s
 %s
-'''  ( '2001--2006',
-   _('Distributed under terms of the GNU General Public License.'),
-   _('It comes with NO WARRANTY.')))
-
+''' % ( _ ('Copyright (c) %s by') % '2001--2009',
+        '\n  '.join (authors),
+        _ ('Distributed under terms of the GNU General Public License.'),
+        _ ('It comes with NO WARRANTY.')))
 
 def progress (s):
     ly.encoded_write (errorport, s + '\n')
index 0a100d3932f55cb86bb1fd5a151d76170424e792..06e7cb7542a5b9482e495a4d20016b4a0855f77e 100644 (file)
@@ -2573,7 +2573,7 @@ If the given filename is -, musicxml2ly reads from the command line.
 
     p.version = ('''%prog (LilyPond) @TOPLEVEL_VERSION@\n\n'''
 +
-_ ("""Copyright (c) 2005--2008 by
+_ ("""Copyright (c) 2005--2009 by
     Han-Wen Nienhuys <hanwen@xs4all.nl>,
     Jan Nieuwenhuizen <janneke@gnu.org> and
     Reinhold Kainhofer <reinhold@kainhofer.com>
index 51073c20b1e183aad51a215d54a13c73fa053159..e0498b01488c23ad051e55442967df27183471b0 100644 (file)
@@ -1,5 +1,5 @@
 # We must invoke the generated $(outdir)/help2man script instead of
-# the help2man.pl source, which means that the buildscripts directory
+# the help2man.pl source, which means that the scripts/build directory
 # must be built first.
 #
 # From the perlrun man-page:
 # cases.  Four more explaining what a line comment is, and that it may
 # be parsed, same here.
 
-HELP2MAN_COMMAND = $(PERL) $(top-build-dir)/buildscripts/$(outbase)/help2man $< > $@
+HELP2MAN_COMMAND = $(buildscript-dir)/help2man $< > $@
 
 ifeq ($(strip $(CROSS)),no)
-$(outdir)/%.1: $(outdir)/%
+$(outdir)/%.1: $(outdir)/% $(buildscript-dir)/help2man
        $(HELP2MAN_COMMAND)
 else
 # When cross building, some manpages will not build because the
@@ -33,3 +33,6 @@ ifneq ($(outdir),./out)
 $(outdir)/%.1: out/%.1
        cp $< $@
 endif
+
+$(buildscript-dir)/help2man:
+       $(MAKE) -C $(depth)/scripts/build
index 592a47b35159fd5d64e54c328fbce5371729abf6..ab28ced9a5f3d8f0319580acb309d0012662d914 100644 (file)
@@ -19,7 +19,7 @@ $(outdir)/%.pfb: %.mf $(outdir)/mf2pt1.mem
        TMP=`mktemp -d $(outdir)/pfbtemp.XXXXXXXXX` \
        && ( cd $$TMP \
                && ln -s ../mf2pt1.mem . \
-               && MFINPUTS=$(top-src-dir)/mf:..:: $(PERL) $(top-src-dir)/buildscripts/mf2pt1.pl $(MF2PT1_OPTIONS) $< $(METAFONT_QUIET)) \
+               && MFINPUTS=$(top-src-dir)/mf:..:: $(buildscript-dir)/mf2pt1 $(MF2PT1_OPTIONS) $< $(METAFONT_QUIET)) \
        && mv $$TMP/*pfb $(outdir); \
        rm -rf $$TMP
 
diff --git a/stepmake/stepmake/metapost-rules.make b/stepmake/stepmake/metapost-rules.make
deleted file mode 100644 (file)
index 3bf28ca..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# Don't remove $(outdir)/.log's.  Logs are a target!
-
-$(outdir)/%.0: %.mf $(outdir)/mfplain.mem
-       -$(METAPOST) "&$(outdir)/mfplain \mode=lowres; \mag=1.0; nonstopmode; input $<"
-
-$(outdir)/mfplain.mem: $(MFPLAIN_MP)
-       $(INIMETAPOST)  $(INIMETAPOST_FLAGS) $(MFPLAIN_MP) dump
-       mv mfplain.* $(outdir)
-
-$(outdir)/%.pfa: $(outdir)/%.0
-       $(PYTHON) $(depth)/buildscripts/ps-to-pfa.py --output $(basename $<).pfa $<
-       rm -f $(basename $(@F)).[0-9]*
-       rm -f $(basename $(@F)).tfm $(basename $(@F)).log
-
diff --git a/stepmake/stepmake/metapost-targets.make b/stepmake/stepmake/metapost-targets.make
deleted file mode 100644 (file)
index d976642..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-
-pfa: $(PFA_FILES)
diff --git a/stepmake/stepmake/metapost-vars.make b/stepmake/stepmake/metapost-vars.make
deleted file mode 100644 (file)
index 1dae6a2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-
-MP_PFA_FILES = $(addprefix $(outdir)/, $(FONT_FILES:.mf=.pfa))
-PFA_FILES += $(MP_PFA_FILES)
-
index ae2c4acc8f2eb2503c3634f1dfc2c2639ee306ef..05627f18dab6eb598cd0fab9c76fc546fc93ac54 100644 (file)
@@ -6,12 +6,12 @@
 # $(outdir)/$(INFO_IMAGES_DIR)/*.png symlinks are only needed to view
 # out-www/*.info with Emacs -- HTML docs no longer need these
 # symlinks, see replace_symlinks_urls in
-# buildscripts/add_html_footer.py.
+# python/auxiliar/postprocess_html.py.
 
 # make dereferences symlinks, and $(INFO_IMAGES_DIR) is a symlink
 # to $(outdir), so we can't use directly $(INFO_IMAGES_DIR) as a
 # prerequisite, otherwise %.info are always outdated (because older
-# than $(outdir), hence this .dep file
+# than $(outdir)), hence this .dep file
 
 $(outdir)/$(INFO_IMAGES_DIR).info-images-dir-dep: $(INFO_DOCS:%=$(outdir)/%.texi)
 ifneq ($(INFO_IMAGES_DIR),)
@@ -19,7 +19,7 @@ ifneq ($(INFO_IMAGES_DIR),)
        ln -s $(outdir) $(INFO_IMAGES_DIR)
        mkdir -p $(outdir)/$(INFO_IMAGES_DIR)
        rm -f $(outdir)/$(INFO_IMAGES_DIR)/[a-f0-9][a-f0-9]
-       cd $(outdir)/$(INFO_IMAGES_DIR) && $(PYTHON) $(top-src-dir)/buildscripts/mass-link.py symbolic .. . [a-f0-9][a-f0-9]
+       cd $(outdir)/$(INFO_IMAGES_DIR) && $(buildscript-dir)/mass-link symbolic .. . [a-f0-9][a-f0-9]
 endif
        touch $@
 
@@ -72,7 +72,7 @@ $(outdir)/%.texi: %.texi
        cp $< $@
 
 $(XREF_MAPS_DIR)/%.xref-map: $(outdir)/%.texi
-       $(PYTHON) $(buildscript-dir)/extract_texi_filenames.py -o $(XREF_MAPS_DIR) $<
+       $(buildscript-dir)/extract_texi_filenames -o $(XREF_MAPS_DIR) $<
 
 
 $(outdir)/version.%: $(top-src-dir)/VERSION
index 0fbf0f59199f72c29e0fb06d4fb04d484f1d5660..ca567b686806f6dd3560f1ed888b05e657396b4f 100644 (file)
@@ -6,7 +6,7 @@ TEXINFO_SOURCES = $(TEXI_FILES)
 
 OUTTXT_FILES += $(addprefix $(outdir)/,$(TEXI_FILES:.texi=.txt))
 
-GENERATE_OMF = $(PYTHON) $(buildscript-dir)/texi2omf.py --format $(1) --location $(webdir)/$(tree-dir)/out-www/$(notdir $(basename $@))  --version $(TOPLEVEL_VERSION) $< > $@
+GENERATE_OMF = $(buildscript-dir)/texi2omf --format $(1) --location $(webdir)/$(tree-dir)/out-www/$(notdir $(basename $@))  --version $(TOPLEVEL_VERSION) $< > $@
 
 TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper)
 
index bc9dcc9201355f15d5eb99b3a87b78ebfba0d633..9f275d7041dafd07eff9077712c43975dc4f382b 100644 (file)
@@ -1,7 +1,8 @@
 depth = ..
 
-TEX_FILES = $(filter-out texinfo.tex, $(call src-wildcard,*.tex))
-EXTRA_DIST_FILES = $(TEX_FILES) texinfo.tex
+TEXINFO_FILES = texinfo.tex $(call src-wildcard,txi-*.tex)
+TEX_FILES = $(filter-out $TEXINFO_FILES,$(call src-wildcard,*.tex))
+EXTRA_DIST_FILES = $(TEX_FILES) $(TEXINFO_FILES)
 STEPMAKE_TEMPLATES = install install-out
 
 INSTALLATION_DIR = $(local_lilypond_datadir)/tex/
diff --git a/tex/SConscript b/tex/SConscript
deleted file mode 100644 (file)
index e9feaa3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-sources = src_glob ('*.tex')
-install (sources, env['sharedir_package_version'] + '/tex')
index fd82e40164ae545679ce9529ece1f13285148b3c..ad032e42fe75d5542147a7dd6e756e9557ace988 100644 (file)
@@ -9,7 +9,7 @@ EXTRA_DIST_FILES=$(call src-wildcard,*.vim) vimrc
 LILYPOND_WORDS = $(outdir)/lilypond-words $(outdir)/lilypond-words.vim
 LILYPOND_WORDS_DEPENDS =\
   $(top-src-dir)/lily/lily-lexer.cc \
-  $(buildscript-dir)/lilypond-words.py \
+  $(buildscript-dir)/lilypond-words \
   $(top-src-dir)/scm/markup.scm \
   $(top-src-dir)/ly/engraver-init.ly
 
@@ -31,8 +31,11 @@ local-uninstall:
        done
        -rmdir -p $(DESTDIR)$(vimdir)
 
+$(buildscript-dir)/lilypond-words:
+       make -C $(depth)/scripts/build
+
 $(LILYPOND_WORDS):
-       cd $(top-src-dir) && $(PYTHON) buildscripts/lilypond-words.py --words --vim --dir=$(top-build-dir)/vim/$(outconfbase)
+       cd $(top-src-dir) && $(buildscript-dir)/lilypond-words --words --vim --dir=$(top-build-dir)/vim/$(outconfbase)
 
 all: $(LILYPOND_WORDS)
 
diff --git a/vim/SConscript b/vim/SConscript
deleted file mode 100644 (file)
index 6896a7b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*-python-*-
-
-Import ('env', 'install', 'src_glob')
-sources = src_glob ('*.vim') + ['lilypond-words.vim']
-
-e = env.Copy ()
-a = '$PYTHON $srcdir/buildscripts/lilypond-words.py --words --vim --dir=${TARGET.dir}'
-e.Command ('lilypond-words.vim',
-          ['#/lily/lily-lexer.cc',
-           '#/buildscripts/lilypond-words.py',
-           '#/scm/markup.scm',
-           '#/ly/engraver-init.ly',],
-          a)
-
-install (sources, env['sharedir_package_version'] + '/vim')