# This file is part of python-ly, https://pypi.python.org/pypi/python-ly
#
# Copyright (c) 2008 - 2015 by Wilbert Berendsen
#
# 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
# of the License, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# See http://www.gnu.org/licenses/ for more information.
"""
Parses and tokenizes Texinfo input, recognizing LilyPond in Texinfo.
"""
from __future__ import unicode_literals
from . import _token
from . import Parser, FallthroughParser
[docs]class Attribute(_token.Token):
pass
[docs]class Keyword(_token.Token):
rx = r"@[a-zA-Z]+"
[docs]class Block(_token.Token):
pass
[docs]class BlockStart(Block):
rx = r"@[a-zA-Z]+\{"
[docs] def update_state(self, state):
state.enter(ParseBlock())
[docs]class BlockEnd(Block, _token.Leaver):
rx = r"\}"
[docs]class EscapeChar(_token.Character):
rx = r"@[@{}]"
[docs]class Accent(EscapeChar):
rx = "@['\"',=^`~](\\{[a-zA-Z]\\}|[a-zA-Z]\\b)"
[docs]class Verbatim(_token.Token):
pass
[docs]class VerbatimStart(Keyword):
rx = r"@verbatim\b"
[docs] def update_state(self, state):
state.enter(ParseVerbatim())
[docs]class VerbatimEnd(Keyword, _token.Leaver):
rx = r"@end\s+verbatim\b"
[docs]class LilyPondBlockStart(Block):
rx = r"@lilypond(?=(\[[a-zA-Z,=0-9\\\s]+\])?\{)"
[docs] def update_state(self, state):
state.enter(ParseLilyPondBlockAttr())
[docs]class LilyPondBlockStartBrace(Block):
rx = r"\{"
[docs] def update_state(self, state):
state.replace(ParseLilyPondBlock())
[docs]class LilyPondBlockEnd(Block, _token.Leaver):
rx = r"\}"
[docs]class LilyPondEnvStart(Keyword):
rx = r"@lilypond\b"
[docs] def update_state(self, state):
state.enter(ParseLilyPondEnvAttr())
[docs]class LilyPondEnvEnd(Keyword, _token.Leaver):
rx = r"@end\s+lilypond\b"
[docs]class LilyPondFileStart(Block):
rx = r"@lilypondfile\b"
[docs] def update_state(self, state):
state.enter(ParseLilyPondFile())
[docs]class LilyPondFileStartBrace(Block):
rx = r"\{"
[docs] def update_state(self, state):
state.replace(ParseBlock())
[docs]class LilyPondAttrStart(Attribute):
rx = r"\["
[docs] def update_state(self, state):
state.enter(ParseLilyPondAttr())
[docs]class LilyPondAttrEnd(Attribute, _token.Leaver):
rx = r"\]"
# Parsers:
[docs]class ParseTexinfo(Parser):
mode = "texinfo"
items = (
LineComment,
BlockCommentStart,
Accent,
EscapeChar,
LilyPondBlockStart,
LilyPondEnvStart,
LilyPondFileStart,
BlockStart,
VerbatimStart,
Keyword,
)
[docs]class ParseBlock(Parser):
items = (
BlockEnd,
Accent,
EscapeChar,
BlockStart,
Keyword,
)
[docs]class ParseVerbatim(Parser):
default = Verbatim
items = (
VerbatimEnd,
)
[docs]class ParseLilyPondBlockAttr(Parser):
items = (
LilyPondAttrStart,
LilyPondBlockStartBrace,
)
[docs]class ParseLilyPondEnvAttr(FallthroughParser):
items = (
LilyPondAttrStart,
)
[docs] def fallthrough(self, state):
state.replace(ParseLilyPondEnv())
[docs]class ParseLilyPondAttr(Parser):
default = Attribute
items = (
LilyPondAttrEnd,
)
[docs]class ParseLilyPondFile(Parser):
items = (
LilyPondAttrStart,
LilyPondFileStartBrace,
)
from . import lilypond
[docs]class ParseLilyPondBlock(lilypond.ParseGlobal):
items = (
LilyPondBlockEnd,
) + lilypond.ParseGlobal.items
[docs]class ParseLilyPondEnv(lilypond.ParseGlobal):
items = (
LilyPondEnvEnd,
) + lilypond.ParseGlobal.items