mirror of https://github.com/patacrep/patacrep.git
Louis
11 years ago
2 changed files with 111 additions and 0 deletions
@ -0,0 +1,110 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
r"""PlasTeX module to deal with chords commands of the songs LaTeX package |
|||
|
|||
Chords are set using commands like \[C]. This package parses those commands. |
|||
""" |
|||
|
|||
from plasTeX import Command, Environment, Macro |
|||
from plasTeX.Base.LaTeX.Math import BeginDisplayMath |
|||
|
|||
# Count the number of levels of 'verse' environment: IN_VERSE==1 means that we |
|||
# are in a 'verse' environment; IN_VERSE==2 means that we are in two included |
|||
# 'verse' environment, and so on. |
|||
IN_VERSE = 0 |
|||
|
|||
def wrap_displaymath(cls): |
|||
"""Decorator to store the depth of 'verse' environment |
|||
|
|||
In the invoke() method classes, global variable IN_VERSE indicates the |
|||
number of 'verse' (or 'chorus' or 'verse*') environment we are in. |
|||
""" |
|||
|
|||
# pylint: disable=no-init,too-few-public-methods |
|||
class DisplayMath(cls): |
|||
"""Wrapper to LaTeX environment updating IN_VERSE""" |
|||
blockType = True |
|||
# pylint: disable=super-on-old-class,global-statement,no-member |
|||
def invoke(self, tex): |
|||
"""Wrapper to invoke() to update global variable IN_VERSE.""" |
|||
global IN_VERSE |
|||
if self.macroMode == Macro.MODE_BEGIN: |
|||
IN_VERSE += 1 |
|||
else: |
|||
IN_VERSE -= 1 |
|||
super(DisplayMath, self).invoke(tex) |
|||
return DisplayMath |
|||
|
|||
# pylint: disable=too-many-public-methods |
|||
@wrap_displaymath |
|||
class Verse(Environment): |
|||
"""LaTeX 'verse' environment""" |
|||
macroName = 'verse' |
|||
|
|||
# pylint: disable=too-many-public-methods |
|||
@wrap_displaymath |
|||
class VerseStar(Environment): |
|||
"""LaTeX 'verse*' environment""" |
|||
macroName = 'verse*' |
|||
|
|||
# pylint: disable=too-many-public-methods |
|||
@wrap_displaymath |
|||
class Chorus(Environment): |
|||
"""LaTeX 'chorus' environment""" |
|||
macroName = 'chorus' |
|||
|
|||
|
|||
|
|||
class BeginChord(Command): |
|||
"""Beginning of a chord notation""" |
|||
macroName = 'chord' |
|||
macroMode = Command.MODE_BEGIN |
|||
|
|||
@property |
|||
def source(self): |
|||
"""Return chord LaTeX code.""" |
|||
return r'\[{}]'.format(''.join([str(item) for item in self.childNodes])) |
|||
|
|||
class EndChord(Command): |
|||
"""End of a chord notation""" |
|||
macroMode = Command.MODE_END |
|||
|
|||
class BeginChordOrDisplayMath(BeginDisplayMath): |
|||
r"""Wrapper to BeginDisplayMath |
|||
|
|||
In a 'verse' (or 'verse*' or 'chorus') environment, the '\[' macro |
|||
displays a chord. Otherwise, it corresponds to the usual LaTeX math mode. |
|||
This class calls the right method, depending on the inclusion of this |
|||
macro in a verse environment. |
|||
""" |
|||
macroName = '[' |
|||
|
|||
def digest(self, tokens): |
|||
"""Consume the tokens corresponding to the arguments of this macro""" |
|||
if IN_VERSE: |
|||
for item in tokens: |
|||
if item.nodeType == item.TEXT_NODE and item.nodeValue == ']': |
|||
break |
|||
self.appendChild(item) |
|||
else: |
|||
return super(BeginChordOrDisplayMath, self).digest(tokens) |
|||
|
|||
def invoke(self, tex): |
|||
"""Process this macro""" |
|||
if IN_VERSE: |
|||
begin = BeginChord() |
|||
self.ownerDocument.context.push(begin) # pylint: disable=no-member |
|||
self.parse(tex) |
|||
|
|||
for token in tex: |
|||
if token.nodeType == token.TEXT_NODE and token.nodeValue == ']': |
|||
break |
|||
else: |
|||
begin.appendChild(token) |
|||
|
|||
end = EndChord() |
|||
self.ownerDocument.context.push(end) # pylint: disable=no-member |
|||
|
|||
return [begin] |
|||
else: |
|||
return super(BeginChordOrDisplayMath, self).invoke(tex) |
Loading…
Reference in new issue