From cb716935310eadba766e2994c2ce64ef47812efd Mon Sep 17 00:00:00 2001 From: fred Date: Wed, 27 Mar 2002 00:37:21 +0000 Subject: [PATCH] lilypond-1.3.107 --- Documentation/user/convert-mudela.itexi | 36 - Documentation/user/latex-mudela-example.latex | 163 --- Documentation/user/mudela-book.tely | 636 ---------- lily/include/mudela-version.hh | 30 - lily/mudela-version.cc | 42 - make/mudela-rules.make | 25 - make/mudela-targets.make | 2 - make/mudela-vars.make | 4 - scripts/convert-mudela.py | 697 ----------- scripts/mudela-book.py | 1102 ----------------- 10 files changed, 2737 deletions(-) delete mode 100644 Documentation/user/convert-mudela.itexi delete mode 100644 Documentation/user/latex-mudela-example.latex delete mode 100644 Documentation/user/mudela-book.tely delete mode 100644 lily/include/mudela-version.hh delete mode 100644 lily/mudela-version.cc delete mode 100644 make/mudela-rules.make delete mode 100644 make/mudela-targets.make delete mode 100644 make/mudela-vars.make delete mode 100644 scripts/convert-mudela.py delete mode 100644 scripts/mudela-book.py diff --git a/Documentation/user/convert-mudela.itexi b/Documentation/user/convert-mudela.itexi deleted file mode 100644 index 02b13d8f45..0000000000 --- a/Documentation/user/convert-mudela.itexi +++ /dev/null @@ -1,36 +0,0 @@ -@node convert-mudela, , ,Top -@chapter convert-mudela -@code{convert-mudela} sequentially applies different -mudela-conversions to upgrade a Mudela input file. It uses -@code{\version} statements in the file to detect the old version -number. - -@example - convert-mudela [options] [files] -@end example - -@section Options -@table @samp -@item --output - The output file to write. -@item --edit - Do an inline edit of the input file. override @code{--output} -@item --show-rules - shows all known conversions, and exit -@item --from=@var{FROM_PATCHLEVEL} - Set the level to convert from. If this is not set, convert-mudela will - guess this, on the basis of @code{\version} strings in the file -@item --to=@var{TO_PATCHLEVEL} - Set the goal version of the conversion. It defaults to the latest - available version. -@end table - -Not all language changes are handled. Multiple output options won't -work. - -convert-mudela is written in python, so you have install -@uref{http://www.python.org,python}. It was written by -@email{hanwen@@cs.uu.nl, Han-Wen Nienhuys}. - - - diff --git a/Documentation/user/latex-mudela-example.latex b/Documentation/user/latex-mudela-example.latex deleted file mode 100644 index 817a0f00e1..0000000000 --- a/Documentation/user/latex-mudela-example.latex +++ /dev/null @@ -1,163 +0,0 @@ -% kommentar -\documentclass[a4paper, 12pt]{article} -%\def\preMudelaExample{} -%\def\postMudelaExample{} -%\usepackage{graphics} -%\usepackage{landscape} -\begin{document} -%uncomment this to try twocolumn mode -%\twocolumn - - -\section{Mudelabook + LaTeX} - -This is an examplefile for mixing Lilypond and Latex. It is also -used to test mudela-book. View the source to see how it is done. - -A simple scale: - -\begin{mudela} -\score{ - \notes\relative c'{c d e f g a b c} -} -\end{mudela} - -Mudela-book search for the \verb|\score| command when it decides -if the code is only a fragment. Thus, in the following code, you have -to use \verb|fragment| option, because the comment confuses mudela-book. - -\begin[fragment]{mudela} -c d e % \score -\end{mudela} - -There is also a shorthand version \verb|\mudela{c' e' g'}|: - -\mudela{c' e' g'} - -that is the same as writing -\begin{verbatim} -\begin[eps]{mudela} -c' e' g' -\end{mudela} -\end{verbatim} - -This C major -\begin[eps, 11pt]{mudela} -c' e' g' -\end{mudela} -and C minor \mudela[11pt]{c' es' g'} chords are floating inside the text. - -\subsection{verb and verbatim} - -As you see, the begin/end verbatim command inside -does not confuse mudela-book: - -\verb|\begin{mudela}c d e\end{mudela}| - -Neither does a verbatim inside verb: - -\verb|\begin{verbatim}\begin{mudela}c d e\end{mudela}\end{verbatim}| - -or verb inside verbatim: - -\begin{verbatim} -\verb|\begin{mudela}c d e\end{mudela}| -\end{verbatim} - -But this is just to stress \verb|mudela-book|. What you need is: - -\verb|\mudela{c' d' e'}| - -and - -\begin{verbatim} -\begin{mudela} -c d e -\end{mudela} -\end{verbatim} - -\subsection{The 'verbatim' and 'intertext' option} -This shows the verbatim option: -\begin[verbatim, intertext="gives this music:"]{mudela} -c' d' e' -\end{mudela} - -\subsection{LaTeX comments} -This is a line with mudela code after the comment char % \mudela{} -% \mudela{} - -If you do not see any music from the heading 'LaTeX comments' and until -this line, then mudela-book is handling latex comments pretty well :-) - -\subsection{To float or not to float} -This music -\begin[eps]{mudela} -c' e' -\end{mudela} -should be floating inside the text by using the \verb|eps| options. - -This music - -\begin[eps]{mudela} -c' e' -\end{mudela} - -has also the \verb|eps| options, but is not floating because there -are an emptry line before and after the mudela block. That is -correct behaviour because it follows La\TeX{} convention that an -empty line signals a new paragraph. Note that the \verb|eps| option -is not necessary when you want the music in a paragraph on its own. - -\subsection{More examples} - -Itemize environment: -\begin{itemize} -\item \mudela[11pt]{ c'} do -\item \mudela[11pt]{d'} re -\item \mudela[11pt]{e'} mi -\item \mudela[11pt]{f'} fa -\item \mudela[11pt]{g'} sol -\end{itemize} - -Tables\footnote{ and footnote: \mudela[eps,11pt]{c' e' g'} }: -\marginpar{ Yes, even as marginpar -\mudela[eps,11pt]{c' d' e'} } - -\begin{tabular}{|l|l|r|} -\hline -\em Notes & \em Name \\ -\hline -\mudela[11pt, filename="cdur"]{} & major \\ -\mudela[11pt]{} & minor \\ -\mudela[11pt]{} & diminished \\ -\mudela[11pt]{} & augmented \\ -\hline -\end{tabular} - -\pagebreak - -Testing of spacing. The next music is surrounded by an empty line. -text text text text text text text text text text text text -text text text text text text text text text text text text - -\begin{mudela} -\score{ \notes\relative c'{ c d e f g a b c} } -\end{mudela} - -text text text text text text text text text text text text -text text text text text text text text text text text text -text text text text text text text text text text text text - -Next has no empty lines. -text text text text text text text text text text text text -text text text text text text text text text text text text -text text text text text text text text text text text text -\begin{mudela} -\score{ \notes\relative c'{ c d e f g a b c} } -\end{mudela} -text text text text text text text text text text text text -text text text text text text text text text text text text - - - -\end{document} diff --git a/Documentation/user/mudela-book.tely b/Documentation/user/mudela-book.tely deleted file mode 100644 index ae77afe0d2..0000000000 --- a/Documentation/user/mudela-book.tely +++ /dev/null @@ -1,636 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@setfilename mudela-book.info -@settitle mudela-book Manual -@afourpaper -@titlepage -@title mudela-book Manual -@subtitle Integrating mudela with La@TeX{} and TeXinfo -@author Tom Cato Amundsen and Han-Wen Nienhuys - - Copyright @copyright{} 1999 by the authors - -@vskip 0pt plus 1filll - -Permission is granted to make and distribute verbatim -copies of this manual provided the copyright notice and -this permission notice are preserved on all copies. - -Permission is granted to copy and distribute modified -versions of this manual under the conditions for -verbatim copying, provided also that the sections -entitled ``Copying'' and ``GNU General Public License'' -are included exactly as in the original, and provided -that the entire resulting derived work is distributed -under the terms of a permission notice identical to this -one. - -Permission is granted to copy and distribute -translations of this manual into another language, -under the above conditions for modified versions, -except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - -@end titlepage - -@ifinfo -This file documents GNU LilyPond. - -Copyright 1999 Tom Cato Amundsen and Han-Wen Nienhuys - - -Permission is granted to make and distribute verbatim -copies of this manual provided the copyright notice and -this permission notice are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX -and print the results, provided the printed document -carries a copying permission notice identical to this -one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -@end ignore - -Permission is granted to copy and distribute modified -versions of this manual under the conditions for -verbatim copying, provided also that the sections -entitled ``Copying'' and ``GNU General Public License'' -are included exactly as in the original, and provided -that the entire resulting derived work is distributed -under the terms of a permission notice identical to this -one. - -Permission is granted to copy and distribute -translations of this manual into another language, -under the above conditions for modified versions, -except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - -@end ifinfo -@tex -\def\preMudelaExample{\vspace{0.5cm}} -@end tex - -@contents -@node Top, , , (dir) -@top - - - -@section Introduction - -[ The tutorial part is at the moment commented out and moved to -the end of this document ] - - -[TODO: THIS MANUAL IS NOT FINISHED YET. FIXME.] - -@command{mudela-book} is a script that helps integrating mudela with -La@TeX{} or TeXinfo. @command{mudela-book} runs Lilypond on fragments -of mudela in your source file, and includes the results into a -document that can be processed with La@TeX{}, @command{makeinfo} -or @command{texi2dvi}. -The result is a text document with formatted music integrated. - -@command{mudela-book} will do its best to try to align the music to -the left and right margins. Currently the most used papersizes and -one- and twocolumn mode is supported. But if you use some more -advances features, like the geometry-package or change the margins in -La@TeX{} or use @code{@@pagesize} in texinfo, will break. - -This document assumes you have basic knowledge of GNU LilyPond and -La@TeX{} or texinfo. - -@section TeXinfo reference - -Your markup the mudela code like this: -@example -@@mudela[options, go, here] - YOUR MUDELA CODE -@@end mudela -@end example - -or - -@example -@@mudela[option, go, here]@{ YOUR MUDELA CODE @} -@end example - -@command{mudela-book} knows the default margins, and a few papersizes. -These commands should be in the beginning of the document: -@itemize @bullet -@item @code{@@afourpaper} -@item @code{@@afourwide} -@item @code{@@smallbook} -@end itemize -@code{@@pagesizes} are not supported. - -@subsection Examples - -Two simple examples. First a complete block: - -@example -@@mudela[26pt] -c' d' e' f' g'2 g' -@@end mudela -@end example - -produces this music: -@mudela -c' d' e' f' g'2 g' -@end mudela - -Then the short version: -@example -@@mudela[11pt]@{@} -@end example - -and its music: - -@mudela[11pt]{} - - -@subsection @@example and @@code - -I'm not sure if this will go into the final documentation, this is -here mostly to remember me on why things are the way they are. - -@command{mudela-book} will do nothing with special with @code{@@code} and -@code{@@example} environments. The 'code' and 'example' commands -should work just as normal. People looking at document that should be -processed by @command{mudela-book}, should notice nothing special, except from -some block like this: -@example -@@mudela -BLABLA -@@end mudela -@end example - -or this: - -@code{@@mudela@{ BLABLA @}} - -Anything other is a bug in @command{mudela-book}. - -So to get this in the printed manual: - -@example -@@mudela[26pt] -\relative c'@{c d e f g2 g@} -@@end mudela -@end example - -you have to write this: - -@example -@@example -@@@@mudela[26pt] -\relative c'@@@{c d e f g2 g@@@} -@@@@end mudela -@@end example -@end example - -Simply explained, every '@{', '@}' and '@@' has to be written as '@@@{', -'@@@}' and '@@@@'. This is how it works in plain texinfo too. - -@section La@TeX{} reference - -Your markup the mudela code like this: -@example -\begin[option, go, here]@{mudela@} - YOUR MUDELA CODE -\end@{mudela@} -@end example - -or - -@example -\mudela@{ YOUR MUDELA CODE @} -@end example - -The 'geometry' package is is not supported. The most popular -papersizes should work. - -Mudela-book know about the @code{\onecolumn} and -@code{\twocolumn} commands. - -The music will be surrounded by @code{\preMudelaExample} and -@code{\postMudelaExample}. The variables are -defined to nothing by default, and the user can redefine them -to whatever he wants. -@strong{[UGH: THIS DOES NOT HAPPEN WHEN -YOU USE THE SHORT FORM, \MUDELA@{ ... @}, CHECK OUT WHY]} - -@subsection @code{landscape} package -There is some simple support for landscape paper format, and this -can be combined with the @code{\twocolumn} command. Only a4 and -letter paper is supported, more to come... - -A more complete -support, maybe also supporting the geometry package is planned, but -there are more work that has to be done on @command{mudela-book} -first. - -This should work: -@example -\documentclass@{article@} -\usepackage@{landscape@} -\begin@{document@} -\twocolumn -BLA BLA BLA -\end@{document@} -@end example - -@subsection Examples - -@example -\begin[26pt]@{mudela@} -c' d' e' f' g'2 g'2 -\end@{mudela@} -@end example - -produces this music: - -@mudela[26pt] -c' d' e' f' g'2 g'2 -@end mudela - -Then the short version: -@example -\mudela[11pt]@{@} -@end example - -and its music: - -@mudela[11pt]{} - - -@subsection \begin@{verbatim@} and \verb|\verb| - -There work just as expected. Look at @file{mb-latex.tex} for details. - -@section Options - -@table @samp -@item eps - the music is created as eps graphics that can be inserted in - the middle of a text line, not only as a separate paragraph. - (La@TeX{} only) -@item verbatim - CONTENTS is copied into the source enclosed in a verbatim block, - followed by any text given with the @code{intertext} option, then - the actual music is displayed. This option does not work with - the short version of the mudela blocks: - - @code{ @@mudela@{ CONTENTS @} } and @code{ \mudela@{ CONTENTS @} } - -@item intertext="text inside apostrophs" - Used in conjunction with @code{verbatim} option. -@item filename=FILENAME - Save the mudela code to FILENAME instead of using a hash value - of CONTENTS. -@item 11pt, 13pt, 16pt, 20pt, 26pt - set the fontsize to use for the music -@item singleline - linewidth = -1. -@item multiline - linewidth = textwidth -@item fragment -@item nonfragment - Override @command{mudela-book} autodetection of what type of code is in the - mudela block, voice contents or complete code. -@end table - -@section Invocation - -When you run @command{mudela-book} it will generate lots of small -files that Lilypond will process. So to avoid all the garbage in -your source directory, you should either change to a temporary -directory, or use the @code{--outdir} commandline options: - -@code{cd out && mudela-book ../yourfile.tex} - -@code{mudela-book --outdir=out yourfile.tex} - - -For latex input, the file to give to latex has ext @file{.latex}. -TeXinfo input will be written to a file with ext @file{.texi}. So be -careful, don't give the source file that ext, or the file will be -overwritten. - -If you use @code{--outdir}, you should also @code{cd} to that directory -before running LaTeX or makeinfo. - -@strong{[UGH: IS THIS THE BEST WAY TO DO IT. MAYBE ADD A COMMENT LINE TO THE -GENERATED FILE, SO MUDELA-BOOK CAN TEST IF THE FILE IT IS TO OVERWRITE -IS GENERATED.]} - -@strong{About the input} - -If the file contains the ``block'' - -@example - - \begin@{mudela@} - CONTENTS - \end@{mudela@} - -@end example - -then LilyPond is run on CONTENTS. @command{mudela-book} puts the result back, -surrounded by @code{\preMudelaExample} and @code{\postMudelaExample} -commands. @code{\preMudelaExample} and @code{posMudelaExample} is -defined to nothing by default, and the user can redefine them -to whatever he wants. - - -@subsection Command line options - -@table @samp - -@item @option{-f}, @option{--format=} - Specify the document type to process, @code{latex} or @code{texi}. - @command{mudela-book} usually figure out this automatically. -@item --default-music-fontsize=??pt - Set the fontsize to use for mudela if no fontsize is given - as option. -@item --force-music-fontsize=??pt - Force all mudela to use this fontsize, overriding options - given to \begin@{mudela@} -@item -I DIR, --include=DIR - include path -@item -M, --dependencies - Write dependencies to out-www/filename.dep -@item --dep-prefix=PREF - prepend PREF before each -M dependency -@item -n, --no-lily - don't run lilypond -@item --no-pictures - don't generate pictures -@item --read-lys - don't write ly files. This way you can do - @example - mudela-book file.tely - convert-mudela - mudela-book --read-lys - @end example -@item --outname=FILE - The name of La@TeX{} file to output. If this option is not given, - the output name derived from the input name. -@item --outdir= - where to place generated files -@item --version - print version information -@item --help - Print a short help message -@end table - - - -@command{mudela-book} is written in python 1.5, so you have to install -@uref{http://www.python.org,python}. - - - -@section Bugs - -The La@TeX{} \includeonly@{...@} command is ignored. - -Ignores almost all La@TeX{} commands that changes margins and linewidths. - -@section Authors - -@email{hanwen@@cs.uu.nl, Han-Wen Nienhuys}, @uref{http://www.cs.uu.nl/people/hanwen} - -@email{tca@@gnu.org, Tom Cato Amundsen} - -@bye -@ignore - -So what does this look like? Well, here is an example: -@mudela[veryverbatim, intertext="produces this music:"] -\score{ - \notes\relative c'{ - \time 5/8; - [e16( g b c a g][e a b d] | )e2 d,8 | - [e16( g b c a g][e a b d] | )b2 [a16( f] | - [e a b d] )e4 c8 | [es16( bes a as g es][d c b! )g] | - [f( a b d b a][f a b d] | )e2 - } -} -@end mudela -If you are lucky, the above example show a nice feature of LilyPond -and La@TeX{}. Since LilyPond can output the music as @TeX{} graphics, -La@TeX{} can insert pagebreaks between the lines of music. - -Notice that there is no @code{\paper} statement in the example -above. Mudela-book will insert some code for you that defines the -linewidth and the font to use. If you don't want to change the default, -there is no need to put an empty @code{\paper@{@}} inside the @code{\score}. -In the example above, something like -this might be inserted before your code: -@example -\include "paper16.ly" -\paper@{ \paper_sixteen - linewidth = 390.\pt; - castingalgorithm = \Gourlay; -@} -@end example -The actual values for linewidth will differ depending on papersize and -number of columns. Also, if you use a different fontsize for the -music, another file than @code{paper16.ly} will be included. - -If you want to make the music not so wide, you can insert a -@code{\paper} statement that set the linewidth: - -@mudela[veryverbatim, intertext="produces this music:"] -\score{ - \notes\relative c'{ - \time 5/8; - [e16( g b c a g][e a b d] | )e2 d,8 | - [e16( g b c a g][e a b d] | )b2 [a16( f] | - [e a b d] )e4 c8 | [es16( bes a as g es][d c b! )g] | - [f( a b d b a][f a b d] | )e2 - } - \paper{linewidth = 10.\cm;} -} -@end mudela - -Very often, if you mix music and text, the music is often only a -few notes or at most a few bars. This music should be as short as -possible and not stretched to be aligned to the right margin. - -If you only write voice-contents in the mudela block, @command{mudela-book} -will set the @code{linewidth} variable to -1, so Lilypond -will make the music as short as possible but without breaking the -line. Here is a well know harmonic progression: -@mudela[veryverbatim, intertext="produce a well known harmonic progression:"] - \context Voice { } -@end mudela - -If you want to place music examples in the text, -@mudela[eps] -\context Voice { } -@end mudela -, you can use the @code{eps} option. This will create the music as -eps graphics and include it into the document with the -@code{\includegraphics} command. - -The code used look like this: -@example -@@mudela[eps] - \context Voice { } -@@end mudela -@end example - -You can also use the @code{eps} option if the block is a complete -mudela source. This 5 cm long empty line, -@mudela[eps] -\score{ - \notes{s} - \paper{ linewidth = 5.\cm;} -} -@end mudela -was created with this code: -@example -@@mudela[eps] -\score@{ - \notes@{s@} - \paper@{ linewidth = 5.\cm;@} -@} -@@end mudela -@end example - -To avoid that La@TeX{} places the music on a line of its one, there should -be no empty lines between the normal text and the mudela -environment. - -You can also use @code{mudelafile} (on a separate line, FIXME), to -include another file. - -@section Fontsize options You can use all lilypond fontsizes in -@command{mudela-book}. The default 16pt fontsize is probably to big to be -included in the middle of the text, 11pt or 13pt is probably better. - -The code can look like this: -@example -@@mudela[13pt, eps] - -@@end mudela -@end example - -The following options set the fontsize: -@itemize -@item @code{11pt} -@mudela[11pt, eps] - \relative c'{ - r16 [c d e][f d e c] [g'8 c][b-\prall c] | - [d16 g, a b][c a b g][d'8 g f-\prall g] - } -@end mudela -@item @code{13pt} -@mudela[13pt, eps] - \relative c'{ - r16 [c d e][f d e c] [g'8 c][b-\prall c] | - [d16 g, a b][c a b g][d'8 g f-\prall g] - } -@end mudela -@item @code{16pt} -@mudela[16pt, eps] - \relative c'{ - r16 [c d e][f d e c] [g'8 c][b-\prall c] | - [d16 g, a b][c a b g][d'8 g f-\prall g] - } -@end mudela -@item @code{20pt} -@mudela[20pt, eps] - \relative c'{ - r16 [c d e][f d e c] [g'8 c][b-\prall c] | - [d16 g, a b][c a b g][d'8 g f-\prall g] - } -@end mudela -@item @code{26pt} -@mudela[26pt, eps] - \relative c'{ - r16 [c d e][f d e c] [g'8 c][b-\prall c] | - [d16 g, a b][c a b g][d'8 g f-\prall g] - } -@end mudela -@end itemize - - -@section More options -@itemize -@item The @code{singleline} option set @code{linewidth} to -1.0. -@item The @code{multiline} option set @code{linewidth} to a value letting -the music be aligned to the right margin. The music can span several -lines. -@end itemize - -@section Just in case... -The options @code{fragment} and @code{nonfragment} will override -@command{mudela-book} when it scans the mudela code to see if it is voice -contents or complete code. This might be useful if @command{mudela-book} choose -wrong. - -Since there is no finder's fee which doubles every year, there is no -need to wait for the price money to grow. So send a bug report today -if you need this one of these options. - -@section Examples - -This was all options to @code{\begin}. The rest of the mudela -document will show some ways you can use mudela in -La@TeX{} documents. It will also act as a simple test-suite for -mudela-book. You can place @code{eps} mudela in and marginspars just -as any other included eps graphics. - -@mudela -\score{ - \notes\relative c'{ - \time 12/8; - r4-\fermata [b16-.( )b-.] [f'8-- dis16-.( )dis-. gis8--] - [f16-.( )f-. dis8-- gis16-.( )gis-.] cis4.-\fermata | - - r4.-\fermata [cis,16 cis g'8 f16 f b8][g16 g f8 b16 b] dis4.-\fermata - } - \paper{linewidth = 7.\cm;} -} -@end mudela - - -To the right you can see some bars from the trumpet fanfara from the -beginning of the fantastic street opera ``Houdini the Great'', by the -Danish composer Andy Pape. The music is put inside a -@code{floatingfigure} environment, and the music will be aligned by -the right marging if you set floatingfigure width and mudela linewidth -to the same value. The code looks like this: - -@mudela[verbatim] -\score{ - \notes\relative c'{ - \time 12/8; - r4.-\fermata [b16-.( )b-.] [f'8-- dis16-.( )dis-. gis8--] - [f16-.( )f-. dis8-- gis16-.( )gis-.] cis8.-\fermata | - - r4.-\fermata [cis,16 cis g'8 f16 f b8] - [g16 g f8 b16 b] dis4.-\fermata - } - \paper{linewidth = 7.\cm;} -} -@end mudela - -If you have a lot of small music examples like this in the middle of -your text, you might get a nicer look by using ``double'' line -spacing. Put the @code{\linespread@{1.6@}} command into the preamble of -your document. Then the line spacing will not be increased between the -lines where you have music printed with the smallest font size. - -Mudela-book does know about @code{\onecolumn} and @code{\twocolumn}. -So the music will be adjusted to the new linewith: - -Verbatim environments will also ignore the page margins. That is -a feature of La@TeX{}. (But you usually put things inside a verbatim -environment when you don't want La@TeX{} to do any linebreaking) - -@end ignore diff --git a/lily/include/mudela-version.hh b/lily/include/mudela-version.hh deleted file mode 100644 index f8d8e510ed..0000000000 --- a/lily/include/mudela-version.hh +++ /dev/null @@ -1,30 +0,0 @@ -/* - mudela-version.hh -- declare Mudela_version - - source file of the GNU LilyPond music typesetter - - (c) 1998--2000 Jan Nieuwenhuizen - -*/ - -#ifndef MUDELA_VERSION_HH -#define MUDELA_VERSION_HH - -#include "string.hh" - -struct Mudela_version -{ - Mudela_version (int major, int minor, int patch); - Mudela_version (String str); - - String str () const; - operator int () const; - - int major_i_; - int minor_i_; - int patch_i_; -}; - -extern Mudela_version oldest_version; - -#endif // MUDELA_VERSION_HH diff --git a/lily/mudela-version.cc b/lily/mudela-version.cc deleted file mode 100644 index 7b2e9d58ee..0000000000 --- a/lily/mudela-version.cc +++ /dev/null @@ -1,42 +0,0 @@ -/* - mudela-version.cc -- implement Mudela_version - - source file of the GNU LilyPond music typesetter - - (c) 1998--2000 Jan Nieuwenhuizen - -*/ - -#include "mudela-version.hh" -#include "string-convert.hh" -#include "array.hh" - -Mudela_version::Mudela_version (int major, int minor, int patch) -{ - major_i_ = major; - minor_i_ = minor; - patch_i_ = patch; -} - -Mudela_version::Mudela_version (String str) -{ - Array version; - version = String_convert::split_arr (str, '.'); - assert (version.size () == 3); - major_i_ = version[0].value_i (); - minor_i_ = version[1].value_i (); - patch_i_ = version[2].value_i (); -} - -String -Mudela_version::str () const -{ - return to_str (major_i_) + "." + to_str (minor_i_) + "." + to_str (patch_i_); -} - -Mudela_version::operator int () const -{ - // ugh - return 100000 * major_i_ + 1000 * minor_i_ + patch_i_; -} - diff --git a/make/mudela-rules.make b/make/mudela-rules.make deleted file mode 100644 index 28fd1893a7..0000000000 --- a/make/mudela-rules.make +++ /dev/null @@ -1,25 +0,0 @@ -# Mudela_rules.make - -.SUFFIXES: .doc .dvi .mudtex .tely .texi - -SUBST_TEXI_DEPS=sed 's! \.\./! !g' < $(basename $@).dep > $(outdir)/temp.dep ; mv $(outdir)/temp.dep $(basename $@).dep - -$(outdir)/%.latex: %.doc - LILYPONDPREFIX=$(LILYPONDPREFIX)/.. $(PYTHON) $(script-dir)/mudela-book.py --outdir=$(outdir) -I .. -I $(input-dir)/test/ --dependencies --dep-prefix=$(outdir)/ $< - $(SUBST_TEXI_DEPS) - -# don't do ``cd $(outdir)'', and assume that $(outdir)/.. is the src dir. -# it is not, for --scrdir builds -$(outdir)/%.texi: %.tely - LILYPONDPREFIX=$(LILYPONDPREFIX)/.. $(PYTHON) $(script-dir)/mudela-book.py --outdir=$(outdir) -I .. -I $(input-dir)/test/ --dependencies --dep-prefix=$(outdir)/ --format=texi $< - $(SUBST_TEXI_DEPS) - -# nexi: no-lily texi -# for plain info doco: don't run lily -$(outdir)/%.nexi: %.tely - LILYPONDPREFIX=$(LILYPONDPREFIX)/.. $(PYTHON) $(script-dir)/mudela-book.py --outdir=$(outdir) --no-lily -I .. -I $(input-dir)/test/ --dependencies --dep-prefix=$(outdir)/ --format=texi $< - mv $(@D)/$(*F).texi $@ - $(SUBST_TEXI_DEPS) - -$(outdir)/%.info: $(outdir)/%.nexi - -$(MAKEINFO) --force --output=$@ $< diff --git a/make/mudela-targets.make b/make/mudela-targets.make deleted file mode 100644 index e032d7ee59..0000000000 --- a/make/mudela-targets.make +++ /dev/null @@ -1,2 +0,0 @@ -# empty - diff --git a/make/mudela-vars.make b/make/mudela-vars.make deleted file mode 100644 index 024d2ab564..0000000000 --- a/make/mudela-vars.make +++ /dev/null @@ -1,4 +0,0 @@ -# empty -TELY_FILES := $(wildcard *.tely) -EXTRA_DIST_FILES += $(TELY_FILES) - diff --git a/scripts/convert-mudela.py b/scripts/convert-mudela.py deleted file mode 100644 index 8d86614ddb..0000000000 --- a/scripts/convert-mudela.py +++ /dev/null @@ -1,697 +0,0 @@ -#!@PYTHON@ - -# convert-mudela.py -- convertor for mudela versions -# -# source file of the GNU LilyPond music typesetter -# -# (c) 1998 - -# TODO -# use -f and -t for -s output - -# NEWS -# 0.2 -# - rewrite in python - -program_name = 'convert-mudela' -version = '@TOPLEVEL_VERSION@' - -import os -import sys -import __main__ -import getopt -import string -import re -import time - -mudela_version_re_str = '\\\\version *\"(.*)\"' -mudela_version_re = re.compile(mudela_version_re_str) - -def program_id (): - return '%s (GNU LilyPond) %s' %(program_name, version); - -def identify (): - sys.stderr.write (program_id () + '\n') - -def usage (): - sys.stdout.write ( - r"""Usage: %s [OPTION]... [FILE]... -Try to convert to newer mudela-versions. The version number of the -input is guessed by default from \version directive - -Options: - -h, --help print this help - -e, --edit in place edit - -f, --from=VERSION start from version - -s, --show-rules print all rules. - -t, --to=VERSION target version - --version print program version - -Report bugs to bugs-gnu-music@gnu.org - -""" % program_name) - - - sys.exit (0) - -def print_version (): - - sys.stdout.write (r"""%s - -This is free software. It is covered by the GNU General Public -License, and you are welcome to change it and/or distribute copies of -it under certain conditions. invoke as `%s --warranty' for more -information. - -""" % (program_id() , program_name)) - -def gulp_file(f): - try: - i = open(f) - i.seek (0, 2) - n = i.tell () - i.seek (0,0) - except: - print 'can\'t open file: ' + f + '\n' - return '' - s = i.read (n) - if len (s) <= 0: - print 'gulped empty file: ' + f + '\n' - i.close () - return s - -def str_to_tuple (s): - return tuple (map (string.atoi, string.split (s,'.'))) - -def tup_to_str (t): - return string.join (map (lambda x: '%s' % x, list (t)), '.') - -def version_cmp (t1, t2): - for x in [0,1,2]: - if t1[x] - t2[x]: - return t1[x] - t2[x] - return 0 - -def guess_mudela_version(filename): - s = gulp_file (filename) - m = mudela_version_re.search (s) - if m: - return m.group(1) - else: - return '' - -class FatalConversionError: - pass - -conversions = [] - -def show_rules (file): - for x in conversions: - file.write ('%s: %s\n' % (tup_to_str (x[0]), x[2])) - -############################ - -if 1: # need new a namespace - def conv (str): - if re.search ('\\\\octave', str): - sys.stderr.write ('\nNot smart enough to convert \\octave') - raise FatalConversionError() - - return str - - conversions.append ( - ((0,1,19), conv, 'deprecated \\octave; can\'t convert automatically')) - - -if 1: # need new a namespace - def conv (str): - str = re.sub ('\\\\textstyle([^;]+);', - '\\\\property Lyrics . textstyle = \\1', str) - str = re.sub ('\\\\key([^;]+);', '\\\\accidentals \\1;', str) - - return str - - conversions.append ( - ((0,1,20), conv, 'deprecated \\textstyle, new \key syntax')) - - -if 1: - def conv (str): - str = re.sub ('\\\\musical_pitch', '\\\\musicalpitch',str) - str = re.sub ('\\\\meter', '\\\\time',str) - - return str - - conversions.append ( - ((0,1,21), conv, '\\musical_pitch -> \\musicalpitch, '+ - '\\meter -> \\time')) - -if 1: - def conv (str): - return str - - conversions.append ( - ((1,0,0), conv, '0.1.21 -> 1.0.0 ')) - - -if 1: - def conv (str): - str = re.sub ('\\\\accidentals', '\\\\keysignature',str) - str = re.sub ('specialaccidentals *= *1', 'keyoctaviation = 0',str) - str = re.sub ('specialaccidentals *= *0', 'keyoctaviation = 1',str) - - return str - - conversions.append ( - ((1,0,1), conv, '\\accidentals -> \\keysignature, ' + - 'specialaccidentals -> keyoctaviation')) - -if 1: - def conv(str): - if re.search ('\\\\header', str): - sys.stderr.write ('\nNot smart enough to convert to new \\header format') - return str - - conversions.append ((1,0,2), conv, '\\header { key = concat + with + operator }') - -if 1: - def conv(str): - str = re.sub ('\\\\melodic', '\\\\notes',str) - - return str - - conversions.append ((1,0,3), conv, '\\melodic -> \\notes') - -if 1: - def conv(str): - str = re.sub ('default_paper *=', '',str) - str = re.sub ('default_midi *=', '',x) - - return str - - conversions.append ((1,0,4), conv, 'default_{paper,midi}') - -if 1: - def conv(str): - str = re.sub ('ChoireStaff', 'ChoirStaff',str) - str = re.sub ('\\output', 'output = ',str) - - return str - - conversions.append ((1,0,5), conv, 'ChoireStaff -> ChoirStaff') - -if 1: - def conv(str): - if re.search ('[a-zA-Z]+ = *\\translator',str): - sys.stderr.write ('\nNot smart enough to change \\translator syntax') - raise FatalConversionError() - return str - - conversions.append ((1,0,6), conv, 'foo = \\translator {\\type .. } ->\\translator {\\type ..; foo; }') - - -if 1: - def conv(str): - str = re.sub ('\\\\lyric', '\\\\lyrics',str) - - return str - - conversions.append ((1,0,7), conv, '\\lyric -> \\lyrics') - -if 1: - def conv(str): - str = re.sub ('\\\\\\[/3+', '\\\\times 2/3 { ',str) - str = re.sub ('\\[/3+', '\\\\times 2/3 { [',str) - str = re.sub ('\\\\\\[([0-9/]+)', '\\\\times \\1 {',str) - str = re.sub ('\\[([0-9/]+)', '\\\\times \\1 { [',str) - str = re.sub ('\\\\\\]([0-9/]+)', '}', str) - str = re.sub ('\\\\\\]', '}',str) - str = re.sub ('\\]([0-9/]+)', '] }', str) - return str - - conversions.append ((1,0,10), conv, '[2/3 ]1/1 -> \\times 2/3 ') - -if 1: - def conv(str): - return str - conversions.append ((1,0,12), conv, 'Chord syntax stuff') - - -if 1: - def conv(str): - - - str = re.sub ('<([^>~]+)~([^>]*)>','<\\1 \\2> ~', str) - - return str - - conversions.append ((1,0,13), conv, ' c -> ~ c') - -if 1: - def conv(str): - str = re.sub ('<\\[','[<', str) - str = re.sub ('\\]>','>]', str) - - return str - - conversions.append ((1,0,14), conv, '<[a b> c -> [ ]') - - -if 1: - def conv(str): - str = re.sub ('\\\\type','\\\\context', str) - str = re.sub ('textstyle','textStyle', str) - - return str - - conversions.append ((1,0,16), conv, '\\type -> \\context, textstyle -> textStyle') - - -if 1: - def conv(str): - if re.search ('\\\\repeat',str): - sys.stderr.write ('\nNot smart enough to convert \\repeat') - raise FatalConversionError() - return str - - conversions.append ((1,0,18), conv, - '\\repeat NUM Music Alternative -> \\repeat FOLDSTR Music Alternative') - -if 1: - def conv(str): - str = re.sub ('SkipBars','skipBars', str) - str = re.sub ('fontsize','fontSize', str) - str = re.sub ('midi_instrument','midiInstrument', str) - - return str - - conversions.append ((1,0,19), conv, - 'fontsize -> fontSize, midi_instrument -> midiInstrument, SkipBars -> skipBars') - - -if 1: - def conv(str): - str = re.sub ('tieydirection','tieVerticalDirection', str) - str = re.sub ('slurydirection','slurVerticalDirection', str) - str = re.sub ('ydirection','verticalDirection', str) - - return str - - conversions.append ((1,0,20), conv, - '{,tie,slur}ydirection -> {v,tieV,slurV}erticalDirection') - - -if 1: - def conv(str): - str = re.sub ('hshift','horizontalNoteShift', str) - - return str - - conversions.append ((1,0,21), conv, - 'hshift -> horizontalNoteShift') - - -if 1: - def conv(str): - str = re.sub ('\\\\grouping[^;]*;','', str) - - return str - - conversions.append ((1,1,52), conv, - 'deprecate \\grouping') - - -if 1: - def conv(str): - str = re.sub ('\\\\wheel','\\\\coda', str) - - return str - - conversions.append ((1,1,55), conv, - '\\wheel -> \\coda') - -if 1: - def conv(str): - str = re.sub ('keyoctaviation','keyOctaviation', str) - str = re.sub ('slurdash','slurDash', str) - - return str - - conversions.append ((1,1,65), conv, - 'slurdash -> slurDash, keyoctaviation -> keyOctaviation') - -if 1: - def conv(str): - str = re.sub ('\\\\repeat *\"?semi\"?','\\\\repeat "volta"', str) - - return str - - conversions.append ((1,1,66), conv, - 'semi -> volta') - - -if 1: - def conv(str): - str = re.sub ('\"?beamAuto\"? *= *\"?0?\"?','noAutoBeaming = "1"', str) - - return str - - conversions.append ((1,1,67), conv, - 'beamAuto -> noAutoBeaming') - -if 1: - def conv(str): - str = re.sub ('automaticMelismas', 'automaticMelismata', str) - - return str - - conversions.append ((1,2,0), conv, - 'automaticMelismas -> automaticMelismata') - -if 1: - def conv(str): - str = re.sub ('dynamicDir\\b', 'dynamicDirection', str) - - return str - - conversions.append ((1,2,1), conv, - 'dynamicDir -> dynamicDirection') - -if 1: - def conv(str): - str = re.sub ('\\\\cadenza *0 *;', '\\\\cadenzaOff', str) - str = re.sub ('\\\\cadenza *1 *;', '\\\\cadenzaOn', str) - - return str - - conversions.append ((1,3,4), conv, - '\\cadenza -> \cadenza{On|Off}') - -if 1: - def conv (str): - str = re.sub ('beamAuto([^=]+)= *"([0-9]+)/([0-9]+)" *;', - 'beamAuto\\1 = #(make-moment \\2 \\3)', - str) - return str - - conversions.append ((1,3,5), conv, 'beamAuto moment properties') - -if 1: - def conv (str): - str = re.sub ('stemStyle', - 'flagStyle', - str) - return str - - conversions.append ((1,3,17), conv, 'stemStyle -> flagStyle') - -if 1: - def conv (str): - str = re.sub ('staffLineLeading', - 'staffSpace', - str) - return str - - conversions.append ((1,3,18), conv, 'staffLineLeading -> staffSpace') - -if 1: - def conv (str): - str = re.sub ('textEmptyDimension *= *##t', - 'textNonEmpty = ##f', - str) - str = re.sub ('textEmptyDimension *= *##f', - 'textNonEmpty = ##t', - str) - return str - - conversions.append ((1,3,35), conv, 'textEmptyDimension -> textNonEmpty') - -if 1: - def conv (str): - str = re.sub ("([a-z]+)[ \t]*=[ \t]*\\\\musicalpitch *{([- 0-9]+)} *\n", - "(\\1 . (\\2))\n", str) - str = re.sub ("\\\\musicalpitch *{([0-9 -]+)}", - "\\\\musicalpitch #'(\\1)", str) - if re.search ('\\\\notenames',str): - sys.stderr.write ('\nNot smart enough to convert to new \\notenames format') - return str - - conversions.append ((1,3,38), conv, '\musicalpitch { a b c } -> #\'(a b c)') - -if 1: - def conv (str): - def replace (match): - return '\\key %s;' % string.lower (match.group (1)) - - str = re.sub ("\\\\key ([^;]+);", replace, str) - return str - - conversions.append ((1,3,39), conv, '\\key A ; ->\\key a;') - -if 1: - def conv (str): - if re.search ('\\[:',str): - sys.stderr.write ('\nNot smart enough to convert to new tremolo format') - return str - - conversions.append ((1,3,41), conv, - '[:16 c4 d4 ] -> \\repeat "tremolo" 2 { c16 d16 }') - -if 1: - def conv (str): - str = re.sub ('Staff_margin_engraver' , 'Instrument_name_engraver', str) - return str - - conversions.append ((1,3,42), conv, - 'Staff_margin_engraver deprecated, use Instrument_name_engraver') - -if 1: - def conv (str): - str = re.sub ('note[hH]eadStyle\\s*=\\s*"?(\\w+)"?' , "noteHeadStyle = #'\\1", str) - return str - - conversions.append ((1,3,49), conv, - 'noteHeadStyle value: string -> symbol') - -if 1: - def conv (str): - str = re.sub (r"""\\key *([a-z]+) *;""", r"""\\key \1 \major;""",str); - return str - conversions.append ((1,3,59), conv, - '\key X ; -> \key X major; ') - -if 1: - def conv (str): - str = re.sub (r'latexheaders *= *"\\\\input ', - 'latexheaders = "', - str) - return str - conversions.append ((1,3,68), conv, 'latexheaders = "\\input global" -> latexheaders = "global"') - - - -################ TODO: lots of other syntax change should be done here as well - - - -if 1: - def conv (str): - str = re.sub ('basicCollisionProperties', 'NoteCollision', str) - str = re.sub ('basicVoltaSpannerProperties' , "VoltaBracket", str) - str = re.sub ('basicKeyProperties' , "KeySignature", str) - - str = re.sub ('basicClefItemProperties' ,"Clef", str) - - - str = re.sub ('basicLocalKeyProperties' ,"Accidentals", str) - str = re.sub ('basicMarkProperties' ,"Accidentals", str) - str = re.sub ('basic([A-Za-z_]+)Properties', '\\1', str) - return str - - conversions.append ((1,3,92), conv, 'basicXXXProperties -> XXX') - -if 1: - def conv (str): - str = re.sub ('\\\\stemup', '\\\\stemUp', str) - str = re.sub ('\\\\stemdown', '\\\\stemDown', str) - str = re.sub ('\\\\stemboth', '\\\\stemBoth', str) - str = re.sub ('\\\\slurup', '\\\\slurUp', str) - str = re.sub ('\\\\slurboth', '\\\\slurBoth', str) - str = re.sub ('\\\\slurdown', '\\\\slurDown', str) - str = re.sub ('\\\\slurdotted', '\\\\slurDotted', str) - str = re.sub ('\\\\slurnormal', '\\\\slurNoDots', str) - - str = re.sub ('\\\\shiftoff', '\\\\shiftOff', str) - str = re.sub ('\\\\shifton', '\\\\shiftOn', str) - str = re.sub ('\\\\shiftonn', '\\\\shiftOnn', str) - str = re.sub ('\\\\shiftonnn', '\\\\shiftOnnn', str) - - str = re.sub ('\\\\onevoice', '\\\\oneVoice', str) - str = re.sub ('\\\\voiceone', '\\\\voiceOne', str) - str = re.sub ('\\\\voicetwo', '\\\\voiceTwo', str) - str = re.sub ('\\\\voicethree', '\\\\voiceThree', str) - str = re.sub ('\\\\voicefour', '\\\\voiceFour', str) - - return str - - conversions.append ((1,3,93), conv, - 'property definiton case (eg. onevoice -> oneVoice)') - - -if 1: - def conv (str): - str = re.sub ('ChordNames*', 'ChordNames', str) - if re.search ('\\\\textscript "[^"]* *"[^"]*"', str): - sys.stderr.write ('\nNot smart enough to convert to new \\textscript markup text') - - str = re.sub ('\\textscript +("[^"]*")', '\\textscript #\\1', str) - - return str - - conversions.append ((1,3,97), conv, 'ChordName -> ChordNames') - -if 1: - def conv (str): - str = re.sub ('beamAutoEnd_([0-9]*) *= *(#\\([^)]*\\))', 'autoBeamSettings \\push #\'(end 1 \\1 * *) = \\2', str) - str = re.sub ('beamAutoBegin_([0-9]*) *= *(#\\([^)]*\))', 'autoBeamSettings \\push #\'(begin 1 \\1 * *) = \\2', str) - str = re.sub ('beamAutoEnd *= *(#\\([^)]*\\))', 'autoBeamSettings \\push #\'(end * * * *) = \\1', str) - str = re.sub ('beamAutoBegin *= *(#\\([^)]*\\))', 'autoBeamSettings \\push #\'(begin * * * *) = \\1', str) - - - return str - - conversions.append ((1,3,102), conv, 'beamAutoEnd -> autoBeamSettings \\push (end * * * *)') - -############################ - - -def get_conversions (from_version, to_version): - def version_b (v, f = from_version, t = to_version): - return version_cmp (v[0], f) > 0 and version_cmp (v[0], t) <= 0 - return filter (version_b, conversions) - - -def latest_version (): - return conversions[-1][0] - -def do_conversion (infile, from_version, outfile, to_version): - conv_list = get_conversions (from_version, to_version) - - sys.stderr.write ('Applying conversions: ') - str = infile.read () - last_conversion = () - try: - for x in conv_list: - sys.stderr.write (tup_to_str (x[0]) + ', ') - str = x[1] (str) - last_conversion = x[0] - - except FatalConversionError: - sys.stderr.write ('Error while converting; I won\'t convert any further') - - if last_conversion: - sys.stderr.write ('\n') - new_ver = '\\\\version \"%s\"' % tup_to_str (last_conversion) - if re.search (mudela_version_re_str, str): - str = re.sub (mudela_version_re_str,new_ver , str) - else: - str = new_ver + '\n' + str - - outfile.write(str) - - return last_conversion - -class UnknownVersion: - pass - -def do_one_file (infile_name): - sys.stderr.write ('Processing `%s\' ... '% infile_name) - outfile_name = '' - if __main__.edit: - outfile_name = infile_name + '.NEW' - elif __main__.outfile_name: - outfile_name = __main__.outfile_name - - if __main__.from_version: - from_version = __main__.from_version - else: - guess = guess_mudela_version (infile_name) - if not guess: - raise UnknownVersion() - from_version = str_to_tuple (guess) - - if __main__.to_version: - to_version = __main__.to_version - else: - to_version = latest_version () - - - if infile_name: - infile = open (infile_name,'r') - else: - infile = sys.stdin - - if outfile_name: - outfile = open (outfile_name, 'w') - else: - outfile = sys.stdout - - touched = do_conversion (infile, from_version, outfile, to_version) - - if infile_name: - infile.close () - - if outfile_name: - outfile.close () - - if __main__.edit and touched: - try: - os.remove(infile_name + '~') - except: - pass - os.rename (infile_name, infile_name + '~') - os.rename (infile_name + '.NEW', infile_name) - - sys.stderr.write ('\n') - sys.stderr.flush () - -edit = 0 -to_version = () -from_version = () -outfile_name = '' - -(options, files) = getopt.getopt ( - sys.argv[1:], 'o:f:t:seh', ['version', 'output', 'show-rules', 'help', 'edit', 'from=', 'to']) - -for opt in options: - o = opt[0] - a = opt[1] - if o== '--help' or o == '-h': - usage () - sys.exit (0) - if o == '--version' or o == '-v': - print_version () - sys.exit (0) - elif o== '--from' or o=='-f': - from_version = str_to_tuple (a) - elif o== '--to' or o=='-t': - to_version = str_to_tuple (a) - elif o== '--edit' or o == '-e': - edit = 1 - elif o== '--show-rules' or o == '-s': - show_rules (sys.stdout) - sys.exit(0) - elif o == '--output' or o == '-o': - outfile_name = a - else: - print o - raise getopt.error - -identify () -for f in files: - if f == '-': - f = '' - try: - do_one_file (f) - except UnknownVersion: - pass diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py deleted file mode 100644 index d37806d3a9..0000000000 --- a/scripts/mudela-book.py +++ /dev/null @@ -1,1102 +0,0 @@ -#!@PYTHON@ -# vim: set noexpandtab: -# TODO: -# * Figure out clean set of options. Hmm, isn't it pretty ok now? -# * add support for .lilyrc - - -# todo: dimension handling (all the x2y) is clumsy. - -# This is was the idea for handling of comments: -# Multiline comments, @ignore .. @end ignore is scanned for -# in read_doc_file, and the chunks are marked as 'ignore', so -# mudela-book will not touch them any more. The content of the -# chunks are written to the output file. Also 'include' and 'input' -# regex has to check if they are commented out. -# -# Then it is scanned for 'mudela', 'mudela-file' and 'mudela-block'. -# These three regex's has to check if they are on a commented line, -# % for latex, @c for texinfo. -# -# Then lines that are commented out with % (latex) and @c (Texinfo) -# are put into chunks marked 'ignore'. This cannot be done before -# searching for the mudela-blocks because % is also the comment character -# for lilypond. -# -# The the rest of the rexeces are searched for. They don't have to test -# if they are on a commented out line. - -import os -import stat -import string -import re -import getopt -import sys -import __main__ -import operator - - -program_version = '@TOPLEVEL_VERSION@' -if program_version == '@' + 'TOPLEVEL_VERSION' + '@': - program_version = '1.3.106' - -include_path = [os.getcwd()] - - -# g_ is for global (?) - -g_here_dir = os.getcwd () -g_dep_prefix = '' -g_outdir = '' -g_force_mudela_fontsize = 0 -g_read_lys = 0 -g_do_pictures = 1 -g_num_cols = 1 -format = '' -g_run_lilypond = 1 -no_match = 'a\ba' - -default_music_fontsize = 16 -default_text_fontsize = 12 - - -class LatexPaper: - def __init__(self): - self.m_paperdef = { - # the dimentions are from geometry.sty - 'a0paper': (mm2pt(841), mm2pt(1189)), - 'a1paper': (mm2pt(595), mm2pt(841)), - 'a2paper': (mm2pt(420), mm2pt(595)), - 'a3paper': (mm2pt(297), mm2pt(420)), - 'a4paper': (mm2pt(210), mm2pt(297)), - 'a5paper': (mm2pt(149), mm2pt(210)), - 'b0paper': (mm2pt(1000), mm2pt(1414)), - 'b1paper': (mm2pt(707), mm2pt(1000)), - 'b2paper': (mm2pt(500), mm2pt(707)), - 'b3paper': (mm2pt(353), mm2pt(500)), - 'b4paper': (mm2pt(250), mm2pt(353)), - 'b5paper': (mm2pt(176), mm2pt(250)), - 'letterpaper': (in2pt(8.5), in2pt(11)), - 'legalpaper': (in2pt(8.5), in2pt(14)), - 'executivepaper': (in2pt(7.25), in2pt(10.5))} - self.m_use_geometry = None - self.m_papersize = 'letterpaper' - self.m_fontsize = 10 - self.m_num_cols = 1 - self.m_landscape = 0 - self.m_geo_landscape = 0 - self.m_geo_width = None - self.m_geo_textwidth = None - self.m_geo_lmargin = None - self.m_geo_rmargin = None - self.m_geo_includemp = None - self.m_geo_marginparwidth = {10: 57, 11: 50, 12: 35} - self.m_geo_marginparsep = {10: 11, 11: 10, 12: 10} - self.m_geo_x_marginparwidth = None - self.m_geo_x_marginparsep = None - self.__body = None - def set_geo_option(self, name, value): - if name == 'body' or name == 'text': - if type(value) == type(""): - self._set_dimen('m_geo_textwidth', value) - else: - self._set_dimen('m_geo_textwidth', value[0]) - self.__body = 1 - elif name == 'portrait': - self.m_geo_landscape = 0 - elif name == 'reversemp' or name == 'reversemarginpar': - if self.m_geo_includemp == None: - self.m_geo_includemp = 1 - elif name == 'marginparwidth' or name == 'marginpar': - self._set_dimen('m_geo_x_marginparwidth', value) - self.m_geo_includemp = 1 - elif name == 'marginparsep': - self._set_dimen('m_geo_x_marginparsep', value) - self.m_geo_includemp = 1 - elif name == 'scale': - if type(value) == type(""): - self.m_geo_width = self.get_paperwidth() * float(value) - else: - self.m_geo_width = self.get_paperwidth() * float(value[0]) - elif name == 'hscale': - self.m_geo_width = self.get_paperwidth() * float(value) - elif name == 'left' or name == 'lmargin': - self._set_dimen('m_geo_lmargin', value) - elif name == 'right' or name == 'rmargin': - self._set_dimen('m_geo_rmargin', value) - elif name == 'hdivide' or name == 'divide': - if value[0] not in ('*', ''): - self._set_dimen('m_geo_lmargin', value[0]) - if value[1] not in ('*', ''): - self._set_dimen('m_geo_width', value[1]) - if value[2] not in ('*', ''): - self._set_dimen('m_geo_rmargin', value[2]) - elif name == 'hmargin': - if type(value) == type(""): - self._set_dimen('m_geo_lmargin', value) - self._set_dimen('m_geo_rmargin', value) - else: - self._set_dimen('m_geo_lmargin', value[0]) - self._set_dimen('m_geo_rmargin', value[1]) - elif name == 'margin':#ugh there is a bug about this option in - # the geometry documentation - if type(value) == type(""): - self._set_dimen('m_geo_lmargin', value) - self._set_dimen('m_geo_rmargin', value) - else: - self._set_dimen('m_geo_lmargin', value[0]) - self._set_dimen('m_geo_rmargin', value[0]) - elif name == 'total': - if type(value) == type(""): - self._set_dimen('m_geo_width', value) - else: - self._set_dimen('m_geo_width', value[0]) - elif name == 'width' or name == 'totalwidth': - self._set_dimen('m_geo_width', value) - elif name == 'paper' or name == 'papername': - self.m_papersize = value - elif name[-5:] == 'paper': - self.m_papersize = name - else: - self._set_dimen('m_geo_'+name, value) - def _set_dimen(self, name, value): - if type(value) == type("") and value[-2:] == 'pt': - self.__dict__[name] = float(value[:-2]) - elif type(value) == type("") and value[-2:] == 'mm': - self.__dict__[name] = mm2pt(float(value[:-2])) - elif type(value) == type("") and value[-2:] == 'cm': - self.__dict__[name] = 10 * mm2pt(float(value[:-2])) - elif type(value) == type("") and value[-2:] == 'in': - self.__dict__[name] = in2pt(float(value[:-2])) - else: - self.__dict__[name] = value - def display(self): - print "LatexPaper:\n-----------" - for v in self.__dict__.keys(): - if v[:2] == 'm_': - print v, self.__dict__[v] - print "-----------" - def get_linewidth(self): - w = self._calc_linewidth() - if self.m_num_cols == 2: - return (w - 10) / 2 - else: - return w - def get_paperwidth(self): - #if self.m_use_geometry: - return self.m_paperdef[self.m_papersize][self.m_landscape or self.m_geo_landscape] - #return self.m_paperdef[self.m_papersize][self.m_landscape] - - def _calc_linewidth(self): - # since geometry sometimes ignores 'includemp', this is - # more complicated than it should be - mp = 0 - if self.m_geo_includemp: - if self.m_geo_x_marginparsep is not None: - mp = mp + self.m_geo_x_marginparsep - else: - mp = mp + self.m_geo_marginparsep[self.m_fontsize] - if self.m_geo_x_marginparwidth is not None: - mp = mp + self.m_geo_x_marginparwidth - else: - mp = mp + self.m_geo_marginparwidth[self.m_fontsize] - if self.__body:#ugh test if this is necessary - mp = 0 - def tNone(a, b, c): - return a == None, b == None, c == None - if not self.m_use_geometry: - return latex_linewidths[self.m_papersize][self.m_fontsize] - else: - if tNone(self.m_geo_lmargin, self.m_geo_width, - self.m_geo_rmargin) == (1, 1, 1): - if self.m_geo_textwidth: - return self.m_geo_textwidth - w = self.get_paperwidth() * 0.8 - return w - mp - elif tNone(self.m_geo_lmargin, self.m_geo_width, - self.m_geo_rmargin) == (0, 1, 1): - if self.m_geo_textwidth: - return self.m_geo_textwidth - return self.f1(self.m_geo_lmargin, mp) - elif tNone(self.m_geo_lmargin, self.m_geo_width, - self.m_geo_rmargin) == (1, 1, 0): - if self.m_geo_textwidth: - return self.m_geo_textwidth - return self.f1(self.m_geo_rmargin, mp) - elif tNone(self.m_geo_lmargin, self.m_geo_width, - self.m_geo_rmargin) \ - in ((0, 0, 1), (1, 0, 0), (1, 0, 1)): - if self.m_geo_textwidth: - return self.m_geo_textwidth - return self.m_geo_width - mp - elif tNone(self.m_geo_lmargin, self.m_geo_width, - self.m_geo_rmargin) in ((0, 1, 0), (0, 0, 0)): - w = self.get_paperwidth() - self.m_geo_lmargin - self.m_geo_rmargin - mp - if w < 0: - w = 0 - return w - raise "Never do this!" - def f1(self, m, mp): - tmp = self.get_paperwidth() - m * 2 - mp - if tmp < 0: - tmp = 0 - return tmp - def f2(self): - tmp = self.get_paperwidth() - self.m_geo_lmargin \ - - self.m_geo_rmargin - if tmp < 0: - return 0 - return tmp - -class TexiPaper: - def __init__(self): - self.m_papersize = 'a4' - self.m_fontsize = 12 - def get_linewidth(self): - return texi_linewidths[self.m_papersize][self.m_fontsize] - -def mm2pt(x): - return x * 2.8452756 -def in2pt(x): - return x * 72.26999 -def em2pt(x, fontsize): - return {10: 10.00002, 11: 10.8448, 12: 11.74988}[fontsize] * x -def ex2pt(x, fontsize): - return {10: 4.30554, 11: 4.7146, 12: 5.16667}[fontsize] * x - -# latex linewidths: -# indices are no. of columns, papersize, fontsize -# Why can't this be calculated? -latex_linewidths = { - 'a4paper':{10: 345, 11: 360, 12: 390}, - 'a4paper-landscape': {10: 598, 11: 596, 12:592}, - 'a5paper':{10: 276, 11: 276, 12: 276}, - 'b5paper':{10: 345, 11: 356, 12: 356}, - 'letterpaper':{10: 345, 11: 360, 12: 390}, - 'letterpaper-landscape':{10: 598, 11: 596, 12:596}, - 'legalpaper': {10: 345, 11: 360, 12: 390}, - 'executivepaper':{10: 345, 11: 360, 12: 379}} - -texi_linewidths = { - 'a4': {12: 455}, - 'a4wide': {12: 470}, - 'smallbook': {12: 361}, - 'texidefault': {12: 433}} - -option_definitions = [ - ('EXT', 'f', 'format', 'set format. EXT is one of texi and latex.'), - ('DIM', '', 'default-music-fontsize', 'default fontsize for music. DIM is assumed to be in points'), - ('DIM', '', 'default-mudela-fontsize', 'deprecated, use --default-music-fontsize'), - ('DIM', '', 'force-music-fontsize', 'force fontsize for all inline mudela. DIM is assumed be to in points'), - ('DIM', '', 'force-mudela-fontsize', 'deprecated, use --force-music-fontsize'), - ('DIR', 'I', 'include', 'include path'), - ('', 'M', 'dependencies', 'write dependencies'), - ('PREF', '', 'dep-prefix', 'prepend PREF before each -M dependency'), - ('', 'n', 'no-lily', 'don\'t run lilypond'), - ('', '', 'no-pictures', "don\'t generate pictures"), - ('', '', 'read-lys', "don't write ly files."), - ('FILE', 'o', 'outname', 'filename main output file'), - ('FILE', '', 'outdir', "where to place generated files"), - ('', 'v', 'version', 'print version information' ), - ('', 'h', 'help', 'print help'), - ] - -# format specific strings, ie. regex-es for input, and % strings for output -output_dict= { - 'latex': { - 'output-mudela-fragment' : r"""\begin[eps,singleline,%s]{mudela} - \context Staff < - \context Voice{ - %s - } - > -\end{mudela}""", - 'output-mudela':r"""\begin[%s]{mudela} -%s -\end{mudela}""", - 'output-verbatim': "\\begin{verbatim}%s\\end{verbatim}", - 'output-default-post': "\\def\postMudelaExample{}\n", - 'output-default-pre': "\\def\preMudelaExample{}\n", - 'usepackage-graphics': '\\usepackage{graphics}\n', - 'output-eps': '\\noindent\\parbox{\\mudelaepswidth{%(fn)s.eps}}{\includegraphics{%(fn)s.eps}}', - 'output-tex': '\\preMudelaExample \\input %(fn)s.tex \\postMudelaExample\n', - 'pagebreak': r'\pagebreak', - }, - 'texi' : {'output-mudela': """@mudela[%s] -%s -@end mudela -""", - 'output-mudela-fragment': """@mudela[%s] -\context Staff\context Voice{ %s } -@end mudela """, - 'pagebreak': None, - 'output-verbatim': r"""@example -%s -@end example -""", - -# do some tweaking: @ is needed in some ps stuff. -# override EndLilyPondOutput, since @tex is done -# in a sandbox, you can't do \input lilyponddefs at the -# top of the document. - -# should also support fragment in - - 'output-all': r"""@tex -\catcode`\@=12 -\input lilyponddefs -\def\EndLilyPondOutput{} -\input %(fn)s.tex -\catcode`\@=0 -@end tex -@html -

- -@end html -""", - } - } - -def output_verbatim (body): - if __main__.format == 'texi': - body = re.sub ('([@{}])', '@\\1', body) - return get_output ('output-verbatim') % body - - -re_dict = { - 'latex': {'input': r'(?m)^[^%\n]*?(?P\\mbinput{?([^}\t \n}]*))', - 'include': r'(?m)^[^%\n]*?(?P\\mbinclude{(?P[^}]+)})', - 'option-sep' : ', *', - 'header': r"\\documentclass\s*(\[.*?\])?", - 'geometry': r"^(?m)[^%\n]*?\\usepackage\s*(\[(?P.*)\])?\s*{geometry}", - 'preamble-end': r'(?P\\begin{document})', - 'verbatim': r"(?s)(?P\\begin{verbatim}.*?\\end{verbatim})", - 'verb': r"(?P\\verb(?P.).*?(?P=del))", - 'mudela-file': r'(?m)^[^%\n]*?(?P\\mudelafile(\[(?P.*?)\])?\{(?P.+)})', - 'mudela' : r'(?m)^[^%\n]*?(?P\\mudela(\[(?P.*?)\])?{(?P.*?)})', - 'mudela-block': r"(?sm)^[^%\n]*?(?P\\begin(\[(?P.*?)\])?{mudela}(?P.*?)\\end{mudela})", - 'def-post-re': r"\\def\\postMudelaExample", - 'def-pre-re': r"\\def\\preMudelaExample", - 'usepackage-graphics': r"\usepackage{graphics}", - 'intertext': r',?\s*intertext=\".*?\"', - 'multiline-comment': no_match, - 'singleline-comment': r"(?m)^.*?(?P(?P^%.*$\n+))", - 'numcols': r"(?P\\(?Pone|two)column)", - }, - - 'texi': { - 'include': '(?m)^[^%\n]*?(?P@mbinclude[ \n\t]+(?P[^\t \n]*))', - 'input': no_match, - 'header': no_match, - 'preamble-end': no_match, - 'landscape': no_match, - 'verbatim': r"""(?s)(?P@example\s.*?@end example\s)""", - 'verb': r"""(?P@code{.*?})""", - 'mudela-file': '(?m)^(?!@c)(?P@mudelafile(\[(?P.*?)\])?{(?P[^}]+)})', - 'mudela' : '(?m)^(?!@c)(?P@mudela(\[(?P.*?)\])?{(?P.*?)})', - 'mudela-block': r"""(?m)^(?!@c)(?P(?s)(?P@mudela(\[(?P.*?)\])?\s(?P.*?)@end mudela\s))""", - 'option-sep' : ', *', - 'intertext': r',?\s*intertext=\".*?\"', - 'multiline-comment': r"(?sm)^\s*(?!@c\s+)(?P@ignore\s.*?@end ignore)\s", - 'singleline-comment': r"(?m)^.*?(?P(?P@c.*$\n+))", - 'numcols': no_match, - } - } - - -for r in re_dict.keys (): - olddict = re_dict[r] - newdict = {} - for k in olddict.keys (): - newdict[k] = re.compile (olddict[k]) - re_dict[r] = newdict - - -def uniq (list): - list.sort () - s = list - list = [] - for x in s: - if x not in list: - list.append (x) - return list - - -def get_output (name): - return output_dict[format][name] - -def get_re (name): - return re_dict[format][name] - -def bounding_box_dimensions(fname): - try: - fd = open(fname) - except IOError: - error ("Error opening `%s'" % fname) - str = fd.read () - s = re.search('%%BoundingBox: ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)', str) - if s: - return (int(s.group(3))-int(s.group(1)), - int(s.group(4))-int(s.group(2))) - else: - return (0,0) - - -def error (str): - sys.stderr.write (str + "\n Exiting ... \n\n") - raise 'Exiting.' - - -def compose_full_body (body, opts): - """Construct the mudela code to send to Lilypond. - Add stuff to BODY using OPTS as options.""" - music_size = default_music_fontsize - latex_size = default_text_fontsize - for o in opts: - if g_force_mudela_fontsize: - music_size = g_force_mudela_fontsize - else: - m = re.match ('([0-9]+)pt', o) - if m: - music_size = string.atoi(m.group (1)) - - m = re.match ('latexfontsize=([0-9]+)pt', o) - if m: - latex_size = string.atoi (m.group (1)) - - if re.search ('\\\\score', body): - is_fragment = 0 - else: - is_fragment = 1 - if 'fragment' in opts: - is_fragment = 1 - if 'nonfragment' in opts: - is_fragment = 0 - - if is_fragment and not 'multiline' in opts: - opts.append('singleline') - if 'singleline' in opts: - l = -1.0; - else: - l = paperguru.get_linewidth() - - if 'relative' in opts:#ugh only when is_fragment - body = '\\relative c { %s }' % body - - if is_fragment: - body = r"""\score { - \notes { %s } - \paper { } -}""" % body - - opts = uniq (opts) - optstring = string.join (opts, ' ') - optstring = re.sub ('\n', ' ', optstring) - body = r""" -%% Generated by mudela-book.py; options are %s %%ughUGH not original options -\include "paper%d.ly" -\paper { linewidth = %f \pt; } -""" % (optstring, music_size, l) + body - return body - -def parse_options_string(s): - d = {} - r1 = re.compile("((\w+)={(.*?)})((,\s*)|$)") - r2 = re.compile("((\w+)=(.*?))((,\s*)|$)") - r3 = re.compile("(\w+?)((,\s*)|$)") - while s: - m = r1.match(s) - if m: - s = s[m.end():] - d[m.group(2)] = re.split(",\s*", m.group(3)) - continue - m = r2.match(s) - if m: - s = s[m.end():] - d[m.group(2)] = m.group(3) - continue - m = r3.match(s) - if m: - s = s[m.end():] - d[m.group(1)] = 1 - continue - print "trøbbel:%s:" % s - return d - -def scan_latex_preamble(chunks): - # first we want to scan the \documentclass line - # it should be the first non-comment line - idx = 0 - while 1: - if chunks[idx][0] == 'ignore': - idx = idx + 1 - continue - m = get_re ('header').match(chunks[idx][1]) - options = re.split (',[\n \t]*', m.group(1)[1:-1]) - for o in options: - if o == 'landscape': - paperguru.m_landscape = 1 - m = re.match("(.*?)paper", o) - if m: - paperguru.m_papersize = m.group() - else: - m = re.match("(\d\d)pt", o) - if m: - paperguru.m_fontsize = int(m.group(1)) - - break - while chunks[idx][0] != 'preamble-end': - if chunks[idx] == 'ignore': - idx = idx + 1 - continue - m = get_re ('geometry').search(chunks[idx][1]) - if m: - paperguru.m_use_geometry = 1 - o = parse_options_string(m.group('options')) - for k in o.keys(): - paperguru.set_geo_option(k, o[k]) - idx = idx + 1 - -def scan_texi_preamble (chunks): - # this is not bulletproof..., it checks the first 10 chunks - idx = 0 - while 1: - if chunks[idx][0] == 'input': - if string.find(chunks[idx][1], "@afourpaper") != -1: - paperguru.m_papersize = 'a4' - elif string.find(chunks[idx][1], "@afourwide") != -1: - paperguru.m_papersize = 'a4wide' - elif string.find(chunks[idx][1], "@smallbook") != -1: - paperguru.m_papersize = 'smallbook' - idx = idx + 1 - if idx == 10 or idx == len(chunks): - break - -def scan_preamble (chunks): - if __main__.format == 'texi': - scan_texi_preamble(chunks) - else: - assert __main__.format == 'latex' - scan_latex_preamble(chunks) - - -def completize_preamble (chunks): - if __main__.format == 'texi': - return chunks - pre_b = post_b = graphics_b = None - for chunk in chunks: - if chunk[0] == 'preamble-end': - break - if chunk[0] == 'input': - m = get_re('def-pre-re').search(chunk[1]) - if m: - pre_b = 1 - if chunk[0] == 'input': - m = get_re('def-post-re').search(chunk[1]) - if m: - post_b = 1 - if chunk[0] == 'input': - m = get_re('usepackage-graphics').search(chunk[1]) - if m: - graphics_b = 1 - x = 0 - while chunks[x][0] != 'preamble-end': - x = x + 1 - if not pre_b: - chunks.insert(x, ('input', get_output ('output-default-pre'))) - if not post_b: - chunks.insert(x, ('input', get_output ('output-default-post'))) - if not graphics_b: - chunks.insert(x, ('input', get_output ('usepackage-graphics'))) - return chunks - - -read_files = [] -def find_file (name): - f = None - for a in include_path: - try: - nm = os.path.join (a, name) - f = open (nm) - __main__.read_files.append (nm) - break - except IOError: - pass - if f: - return f.read () - else: - error ("File not found `%s'\n" % name) - return '' - -def do_ignore(match_object): - return [('ignore', match_object.group('code'))] -def do_preamble_end(match_object): - return [('preamble-end', match_object.group('code'))] - -def make_verbatim(match_object): - return [('verbatim', match_object.group('code'))] - -def make_verb(match_object): - return [('verb', match_object.group('code'))] - -def do_include_file(m): - "m: MatchObject" - return [('input', get_output ('pagebreak'))] \ - + read_doc_file(m.group('filename')) \ - + [('input', get_output ('pagebreak'))] - -def do_input_file(m): - return read_doc_file(m.group('filename')) - -def make_mudela(m): - if m.group('options'): - options = m.group('options') - else: - options = '' - return [('input', get_output('output-mudela-fragment') % - (options, m.group('code')))] - -def make_mudela_file(m): - if m.group('options'): - options = m.group('options') - else: - options = '' - return [('input', get_output('output-mudela') % - (options, find_file(m.group('filename'))))] - -def make_mudela_block(m): - if m.group('options'): - options = get_re('option-sep').split (m.group('options')) - else: - options = [] - options = filter(lambda s: s != '', options) - return [('mudela', m.group('code'), options)] - -def do_columns(m): - if __main__.format != 'latex': - return [] - if m.group('num') == 'one': - return [('numcols', m.group('code'), 1)] - if m.group('num') == 'two': - return [('numcols', m.group('code'), 2)] - -def chop_chunks(chunks, re_name, func, use_match=0): - newchunks = [] - for c in chunks: - if c[0] == 'input': - str = c[1] - while str: - m = get_re (re_name).search (str) - if m == None: - newchunks.append (('input', str)) - str = '' - else: - if use_match: - newchunks.append (('input', str[:m.start ('match')])) - else: - newchunks.append (('input', str[:m.start (0)])) - #newchunks.extend(func(m)) - # python 1.5 compatible: - newchunks = newchunks + func(m) - str = str [m.end(0):] - else: - newchunks.append(c) - return newchunks - -def read_doc_file (filename): - """Read the input file, find verbatim chunks and do \input and \include - """ - str = '' - str = find_file(filename) - - if __main__.format == '': - latex = re.search ('\\\\document', str[:200]) - texinfo = re.search ('@node|@setfilename', str[:200]) - if (texinfo and latex) or not (texinfo or latex): - error("error: can't determine format, please specify") - if texinfo: - __main__.format = 'texi' - else: - __main__.format = 'latex' - if __main__.format == 'texi': - __main__.paperguru = TexiPaper() - else: - __main__.paperguru = LatexPaper() - chunks = [('input', str)] - # we have to check for verbatim before doing include, - # because we don't want to include files that are mentioned - # inside a verbatim environment - chunks = chop_chunks(chunks, 'verbatim', make_verbatim) - chunks = chop_chunks(chunks, 'verb', make_verb) - chunks = chop_chunks(chunks, 'multiline-comment', do_ignore) - #ugh fix input - chunks = chop_chunks(chunks, 'include', do_include_file, 1) - chunks = chop_chunks(chunks, 'input', do_input_file, 1) - return chunks - - -taken_file_names = {} -def schedule_mudela_block (chunk): - """Take the body and options from CHUNK, figure out how the - real .ly should look, and what should be left MAIN_STR (meant - for the main file). The .ly is written, and scheduled in - TODO. - - Return: a chunk (TYPE_STR, MAIN_STR, OPTIONS, TODO, BASE) - - TODO has format [basename, extension, extension, ... ] - - """ - (type, body, opts) = chunk - assert type == 'mudela' - file_body = compose_full_body (body, opts) - basename = `abs(hash (file_body))` - for o in opts: - m = re.search ('filename="(.*?)"', o) - if m: - basename = m.group (1) - if not taken_file_names.has_key(basename): - taken_file_names[basename] = 0 - else: - taken_file_names[basename] = taken_file_names[basename] + 1 - basename = basename + "-%i" % taken_file_names[basename] - if not g_read_lys: - update_file(file_body, os.path.join(g_outdir, basename) + '.ly') - needed_filetypes = ['tex'] - - if format == 'texi': - needed_filetypes.append('eps') - needed_filetypes.append('png') - if 'eps' in opts and not ('eps' in needed_filetypes): - needed_filetypes.append('eps') - outname = os.path.join(g_outdir, basename) - def f(base, ext1, ext2): - a = os.path.isfile(base + ext2) - if (os.path.isfile(base + ext1) and - os.path.isfile(base + ext2) and - os.stat(base+ext1)[stat.ST_MTIME] > - os.stat(base+ext2)[stat.ST_MTIME]) or \ - not os.path.isfile(base + ext2): - return 1 - todo = [] - if 'tex' in needed_filetypes and f(outname, '.ly', '.tex'): - todo.append('tex') - if 'eps' in needed_filetypes and f(outname, '.tex', '.eps'): - todo.append('eps') - if 'png' in needed_filetypes and f(outname, '.eps', '.png'): - todo.append('png') - newbody = '' - if 'verbatim' in opts: - newbody = output_verbatim (body) - - for o in opts: - m = re.search ('intertext="(.*?)"', o) - if m: - newbody = newbody + m.group (1) + "\n\n" - if format == 'latex': - if 'eps' in opts: - s = 'output-eps' - else: - s = 'output-tex' - else: # format == 'texi' - s = 'output-all' - newbody = newbody + get_output(s) % {'fn': basename } - return ('mudela', newbody, opts, todo, basename) - -def process_mudela_blocks(outname, chunks):#ugh rename - newchunks = [] - # Count sections/chapters. - for c in chunks: - if c[0] == 'mudela': - c = schedule_mudela_block (c) - elif c[0] == 'numcols': - paperguru.m_num_cols = c[2] - newchunks.append (c) - return newchunks - - -def find_eps_dims (match): - "Fill in dimensions of EPS files." - - fn =match.group (1) - dims = bounding_box_dimensions (fn) - if g_outdir: - fn = os.path.join(g_outdir, fn) - - return '%ipt' % dims[0] - - -def system (cmd): - sys.stderr.write ("invoking `%s'\n" % cmd) - st = os.system (cmd) - if st: - error ('Error command exited with value %d\n' % st) - return st - -def compile_all_files (chunks): - eps = [] - tex = [] - png = [] - - for c in chunks: - if c[0] <> 'mudela': - continue - base = c[4] - exts = c[3] - for e in exts: - if e == 'eps': - eps.append (base) - elif e == 'tex': - #ugh - if base + '.ly' not in tex: - tex.append (base + '.ly') - elif e == 'png' and g_do_pictures: - png.append (base) - d = os.getcwd() - if g_outdir: - os.chdir(g_outdir) - if tex: - # fixme: be sys-independent. - def incl_opt (x): - if g_outdir and x[0] <> '/' : - x = os.path.join (g_here_dir, x) - return ' -I %s' % x - - incs = map (incl_opt, include_path) - lilyopts = string.join (incs, ' ' ) - texfiles = string.join (tex, ' ') - system ('lilypond %s %s' % (lilyopts, texfiles)) - for e in eps: - system(r"tex '\nonstopmode \input %s'" % e) - system(r"dvips -E -o %s %s" % (e + '.eps', e)) - for g in png: - cmd = r"""gs -sDEVICE=pgm -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -q -sOutputFile=- -r90 -dNOPAUSE %s -c quit | pnmcrop | pnmtopng > %s""" - cmd = cmd % (g + '.eps', g + '.png') - system (cmd) - if g_outdir: - os.chdir(d) - - -def update_file (body, name): - """ - write the body if it has changed - """ - same = 0 - try: - f = open (name) - fs = f.read (-1) - same = (fs == body) - except: - pass - - if not same: - f = open (name , 'w') - f.write (body) - f.close () - - return not same - - -def getopt_args (opts): - "Construct arguments (LONG, SHORT) for getopt from list of options." - short = '' - long = [] - for o in opts: - if o[1]: - short = short + o[1] - if o[0]: - short = short + ':' - if o[2]: - l = o[2] - if o[0]: - l = l + '=' - long.append (l) - return (short, long) - -def option_help_str (o): - "Transform one option description (4-tuple ) into neatly formatted string" - sh = ' ' - if o[1]: - sh = '-%s' % o[1] - - sep = ' ' - if o[1] and o[2]: - sep = ',' - - long = '' - if o[2]: - long= '--%s' % o[2] - - arg = '' - if o[0]: - if o[2]: - arg = '=' - arg = arg + o[0] - return ' ' + sh + sep + long + arg - - -def options_help_str (opts): - "Convert a list of options into a neatly formatted string" - w = 0 - strs =[] - helps = [] - - for o in opts: - s = option_help_str (o) - strs.append ((s, o[3])) - if len (s) > w: - w = len (s) - - str = '' - for s in strs: - str = str + '%s%s%s\n' % (s[0], ' ' * (w - len(s[0]) + 3), s[1]) - return str - -def help(): - sys.stdout.write("""Usage: mudela-book [options] FILE\n -Generate hybrid LaTeX input from Latex + mudela -Options: -""") - sys.stdout.write (options_help_str (option_definitions)) - sys.stdout.write (r"""Warning all output is written in the CURRENT directory - - - -Report bugs to bug-gnu-music@gnu.org. - -Written by Tom Cato Amundsen and -Han-Wen Nienhuys -""") - - sys.exit (0) - - -def write_deps (fn, target): - sys.stdout.write('writing `%s\'\n' % os.path.join(g_outdir, fn)) - f = open (os.path.join(g_outdir, fn), 'w') - f.write ('%s%s: ' % (g_dep_prefix, target)) - for d in __main__.read_files: - f.write ('%s ' % d) - f.write ('\n') - f.close () - __main__.read_files = [] - -def identify(): - sys.stdout.write ('mudela-book (GNU LilyPond) %s\n' % program_version) - -def print_version (): - identify() - sys.stdout.write (r"""Copyright 1998--1999 -Distributed under terms of the GNU General Public License. It comes with -NO WARRANTY. -""") - -def do_file(input_filename): - file_settings = {} - if outname: - my_outname = outname - else: - my_outname = os.path.basename(os.path.splitext(input_filename)[0]) - my_depname = my_outname + '.dep' - - chunks = read_doc_file(input_filename) - chunks = chop_chunks(chunks, 'mudela', make_mudela, 1) - chunks = chop_chunks(chunks, 'mudela-file', make_mudela_file, 1) - chunks = chop_chunks(chunks, 'mudela-block', make_mudela_block, 1) - chunks = chop_chunks(chunks, 'singleline-comment', do_ignore, 1) - chunks = chop_chunks(chunks, 'preamble-end', do_preamble_end) - chunks = chop_chunks(chunks, 'numcols', do_columns) - #print "-" * 50 - #for c in chunks: print "c:", c; - #sys.exit() - scan_preamble(chunks) - chunks = process_mudela_blocks(my_outname, chunks) - # Do It. - if __main__.g_run_lilypond: - compile_all_files (chunks) - newchunks = [] - # finishing touch. - for c in chunks: - if c[0] == 'mudela' and 'eps' in c[2]: - body = re.sub (r"""\\mudelaepswidth{(.*?)}""", find_eps_dims, c[1]) - newchunks.append (('mudela', body)) - else: - newchunks.append (c) - chunks = newchunks - x = 0 - chunks = completize_preamble (chunks) - foutn = os.path.join(g_outdir, my_outname + '.' + format) - sys.stderr.write ("Writing `%s'\n" % foutn) - fout = open (foutn, 'w') - for c in chunks: - fout.write (c[1]) - fout.close () - - if do_deps: - write_deps (my_depname, foutn) - - -outname = '' -try: - (sh, long) = getopt_args (__main__.option_definitions) - (options, files) = getopt.getopt(sys.argv[1:], sh, long) -except getopt.error, msg: - sys.stderr.write("error: %s" % msg) - sys.exit(1) - -do_deps = 0 -for opt in options: - o = opt[0] - a = opt[1] - - if o == '--include' or o == '-I': - include_path.append (a) - elif o == '--version' or o == '-v': - print_version () - sys.exit (0) - elif o == '--format' or o == '-f': - __main__.format = a - elif o == '--outname' or o == '-o': - if len(files) > 1: - #HACK - sys.stderr.write("Mudela-book is confused by --outname on multiple files") - sys.exit(1) - outname = a - elif o == '--help' or o == '-h': - help () - elif o == '--no-lily' or o == '-n': - __main__.g_run_lilypond = 0 - elif o == '--dependencies' or o == '-M': - do_deps = 1 - elif o == '--default-music-fontsize': - default_music_fontsize = string.atoi (a) - elif o == '--default-mudela-fontsize': - print "--default-mudela-fontsize is deprecated, use --default-music-fontsize" - default_music_fontsize = string.atoi (a) - elif o == '--force-music-fontsize': - g_force_mudela_fontsize = string.atoi(a) - elif o == '--force-mudela-fontsize': - print "--force-mudela-fontsize is deprecated, use --default-mudela-fontsize" - g_force_mudela_fontsize = string.atoi(a) - elif o == '--dep-prefix': - g_dep_prefix = a - elif o == '--no-pictures': - g_do_pictures = 0 - elif o == '--read-lys': - g_read_lys = 1 - elif o == '--outdir': - g_outdir = a - -identify() -if g_outdir: - if os.path.isfile(g_outdir): - error ("outdir is a file: %s" % g_outdir) - if not os.path.exists(g_outdir): - os.mkdir(g_outdir) -for input_filename in files: - do_file(input_filename) - -# -# Petr, ik zou willen dat ik iets zinvoller deed, -# maar wat ik kan ik doen, het verandert toch niets? -# --hwn 20/aug/99 -- 2.39.5