lorid

convert chordpro to pdf
git clone git://git.relim.de/lorid.git
Log | Files | Refs | README | LICENSE

commit 8567b91e537bcecafc0e4421b626af0b403b48d1
parent 7419d0df168048afd56dbdefe78ab6a21f218d0e
Author: nibo <nibo@relim.de>
Date:   Mon, 24 Feb 2025 09:56:36 +0100

Support metadata substitution inside attr values

Diffstat:
Msrc/chordpro.c | 21+++++++++++++++++++++
1 file changed, 21 insertions(+), 0 deletions(-)

diff --git a/src/chordpro.c b/src/chordpro.c @@ -5751,6 +5751,11 @@ cho_songs_parse(const char *str, const char *chordpro_filepath, struct Config *c avs = AVS_QUOTATION_MARK; } else { avs = AVS_UNQUOTED; + if (c == '%') { + ctx.state_before_metadata_substitution = STATE_MARKUP_ATTR_VALUE; + ctx.state = STATE_MAYBE_METADATA_SUBSTITUTION; + break; + } ctx.tags[ctx.ta]->attrs[ctx.at]->value = erealloc(ctx.tags[ctx.ta]->attrs[ctx.at]->value, (ctx.atv+1) * sizeof(char)); ctx.tags[ctx.ta]->attrs[ctx.at]->value[ctx.atv] = c; ctx.atv++; @@ -5825,6 +5830,11 @@ cho_songs_parse(const char *str, const char *chordpro_filepath, struct Config *c ctx.state = STATE_MARKUP_ATTR_NAME; break; } + if (c == '%') { + ctx.state_before_metadata_substitution = STATE_MARKUP_ATTR_VALUE; + ctx.state = STATE_MAYBE_METADATA_SUBSTITUTION; + break; + } ctx.tags[ctx.ta]->attrs[ctx.at]->value = erealloc(ctx.tags[ctx.ta]->attrs[ctx.at]->value, (ctx.atv+1) * sizeof(char)); ctx.tags[ctx.ta]->attrs[ctx.at]->value[ctx.atv] = c; ctx.atv++; @@ -5857,6 +5867,10 @@ cho_songs_parse(const char *str, const char *chordpro_filepath, struct Config *c directive_value[ctx.dv] = '%'; ctx.dv++; break; + case STATE_MARKUP_ATTR_VALUE: + ctx.tags[ctx.ta]->attrs[ctx.at]->value = erealloc(ctx.tags[ctx.ta]->attrs[ctx.at]->value, (ctx.atv+1) * sizeof(char)); + ctx.tags[ctx.ta]->attrs[ctx.at]->value[ctx.atv] = '%'; + break; default: } ctx.state = ctx.state_before_metadata_substitution; @@ -5895,6 +5909,13 @@ cho_songs_parse(const char *str, const char *chordpro_filepath, struct Config *c ctx.dv++; } break; + case STATE_MARKUP_ATTR_VALUE: + for (ch = substituted; *ch; ch++) { + ctx.tags[ctx.ta]->attrs[ctx.at]->value = erealloc(ctx.tags[ctx.ta]->attrs[ctx.at]->value, (ctx.atv+1) * sizeof(char)); + ctx.tags[ctx.ta]->attrs[ctx.at]->value[ctx.atv] = *ch; + ctx.atv++; + } + break; default: } free(substituted);