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:
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);