Message ID | 20240104204614.1426027-7-pvorel@suse.cz |
---|---|
State | Changes Requested |
Headers | show |
Series | metadata: improvements | expand |
Hi! > +static inline bool item_is_str_list_member(struct data_node *self) > +{ > + if (self->type != DATA_STRING) > + return false; > + > + return self->string.val[0] == '*' && self->string.val[1] == ' '; The lists in asciidoc may also start with '-' and I tend to use it instead of asterisk because it's easier to see inside the C style comments. > +} > + > +static inline bool item_is_str_empty(struct data_node *self) > +{ > + if (self->type != DATA_STRING) > + return false; > + > + return !strlen(self->string.val); This is fancy way of doing !self->string.val[0] > +} > + > +static inline bool missing_space_for_list(struct data_node *cur, struct > + data_node *prev) > +{ > + return item_is_str_list_member(cur) && !item_is_str_empty(prev) && > + !item_is_str_list_member(prev); > +} > + > static inline void data_node_print(struct data_node *self) > { > printf("{\n"); > @@ -357,6 +381,16 @@ static inline void data_to_json_(struct data_node *self, FILE *f, unsigned int p > case DATA_ARRAY: > data_fprintf(f, do_padd ? padd : 0, "[\n"); > for (i = 0; i < self->array.array_used; i++) { > + > + if (i > 0 && > + missing_space_for_list(self->array.array[i], > + self->array.array[i-1])) { > + fprintf(stderr, > + "%s:%d: WARNING: missing blank line before first list item, add it\n", > + __FILE__, __LINE__); > + data_fprintf(f, padd+1, "\"\",\n"); > + } > + > data_to_json_(self->array.array[i], f, padd+1, 1); > if (i < self->array.array_used - 1) > fprintf(f, ",\n"); I'm not sure if we should add the asciidoc validation into the metadata parser. It feels like this could have been done easier in a perl script, especially if we are going to add more checks.
Hi! > I'm not sure if we should add the asciidoc validation into the metadata > parser. It feels like this could have been done easier in a perl script, > especially if we are going to add more checks. To make this clear, maybe this would be better as a perl script that is executed as a part of 'make check'.
> Hi! > > +static inline bool item_is_str_list_member(struct data_node *self) > > +{ > > + if (self->type != DATA_STRING) > > + return false; > > + > > + return self->string.val[0] == '*' && self->string.val[1] == ' '; > The lists in asciidoc may also start with '-' and I tend to use it > instead of asterisk because it's easier to see inside the C style > comments. +1 > > +} > > + > > +static inline bool item_is_str_empty(struct data_node *self) > > +{ > > + if (self->type != DATA_STRING) > > + return false; > > + > > + return !strlen(self->string.val); > This is fancy way of doing !self->string.val[0] +2 (thanks for teaching me proper C :)) ... > > for (i = 0; i < self->array.array_used; i++) { > > + > > + if (i > 0 && > > + missing_space_for_list(self->array.array[i], > > + self->array.array[i-1])) { > > + fprintf(stderr, > > + "%s:%d: WARNING: missing blank line before first list item, add it\n", > > + __FILE__, __LINE__); > > + data_fprintf(f, padd+1, "\"\",\n"); > > + } > > + > > data_to_json_(self->array.array[i], f, padd+1, 1); > > if (i < self->array.array_used - 1) > > fprintf(f, ",\n"); > I'm not sure if we should add the asciidoc validation into the metadata > parser. It feels like this could have been done easier in a perl script, > especially if we are going to add more checks. You're right. I thought it'd be out of context in perl script, but we works with arrays there as well, detection should be as easy as here in metadata parser. I'll change this in v2. Kind regards, Petr
diff --git a/metadata/data_storage.h b/metadata/data_storage.h index 91ea70a02..0f4d42a13 100644 --- a/metadata/data_storage.h +++ b/metadata/data_storage.h @@ -7,9 +7,10 @@ #define DATA_STORAGE_H__ #include <stdarg.h> +#include <stdbool.h> #include <stdio.h> -#include <string.h> #include <stdlib.h> +#include <string.h> enum data_type { DATA_ARRAY, @@ -275,6 +276,29 @@ static inline void data_node_print_(struct data_node *self, unsigned int padd) } } +static inline bool item_is_str_list_member(struct data_node *self) +{ + if (self->type != DATA_STRING) + return false; + + return self->string.val[0] == '*' && self->string.val[1] == ' '; +} + +static inline bool item_is_str_empty(struct data_node *self) +{ + if (self->type != DATA_STRING) + return false; + + return !strlen(self->string.val); +} + +static inline bool missing_space_for_list(struct data_node *cur, struct + data_node *prev) +{ + return item_is_str_list_member(cur) && !item_is_str_empty(prev) && + !item_is_str_list_member(prev); +} + static inline void data_node_print(struct data_node *self) { printf("{\n"); @@ -357,6 +381,16 @@ static inline void data_to_json_(struct data_node *self, FILE *f, unsigned int p case DATA_ARRAY: data_fprintf(f, do_padd ? padd : 0, "[\n"); for (i = 0; i < self->array.array_used; i++) { + + if (i > 0 && + missing_space_for_list(self->array.array[i], + self->array.array[i-1])) { + fprintf(stderr, + "%s:%d: WARNING: missing blank line before first list item, add it\n", + __FILE__, __LINE__); + data_fprintf(f, padd+1, "\"\",\n"); + } + data_to_json_(self->array.array[i], f, padd+1, 1); if (i < self->array.array_used - 1) fprintf(f, ",\n");
Correct list in JSON for correct HTML/PDFformatting via asciidoctor requires extra space: * My CORRECT list (with extra blank line before first item): * * * foo2 * * bar2 But people often forget to add it: * My BROKEN list (missing blank line before first item): * * foo * * bar Therefore add this blank line to fix doc formatting. Signed-off-by: Petr Vorel <pvorel@suse.cz> --- metadata/data_storage.h | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-)