diff options
author | Thomas White <taw@physics.org> | 2019-10-03 16:47:38 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2019-10-05 17:03:43 +0200 |
commit | 54b33a62d7d1dd5e70ee2d54a0bba51a59bac76f (patch) | |
tree | d6b3cc6723367075c81007ed4be84257f78d296b /libstorycode | |
parent | 74ace225ceec792896b4c778c013830809d45d6d (diff) |
Get rid of spctx completely
Diffstat (limited to 'libstorycode')
-rw-r--r-- | libstorycode/scparse_priv.h | 59 | ||||
-rw-r--r-- | libstorycode/storycode.c | 10 | ||||
-rw-r--r-- | libstorycode/storycode.y | 312 |
3 files changed, 199 insertions, 182 deletions
diff --git a/libstorycode/scparse_priv.h b/libstorycode/scparse_priv.h deleted file mode 100644 index 7e1e6db..0000000 --- a/libstorycode/scparse_priv.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * scparse_priv.h - * - * Copyright © 2019 Thomas White <taw@bitwiz.org.uk> - * - * This file is part of Colloquium. - * - * Colloquium 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 3 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, see <http://www.gnu.org/licenses/>. - * - */ - -#ifndef SCPARSE_PRIV_H -#define SCPARSE_PRIV_H - -#include "narrative.h" -#include "slide.h" - -enum style_mask -{ - STYMASK_GEOM = 1<<0, - STYMASK_FONT = 1<<1, - STYMASK_ALIGNMENT = 1<<2, - STYMASK_PADDING = 1<<3, - STYMASK_PARASPACE = 1<<4, - STYMASK_FGCOL = 1<<5, - STYMASK_BGCOL = 1<<6, -}; - -struct scpctx -{ - Narrative *n; - - /* Current style or frame options. - * These will be copied to a stylesheet entry or frame when the - * top-level rule is matched. */ - enum style_mask mask; - struct frame_geom geom; - char *font; - enum alignment alignment; - struct length padding[4]; - struct length paraspace[4]; - struct colour fgcol; - enum gradient bggrad; - struct colour bgcol; - struct colour bgcol2; -}; - -#endif /* SCPARSE_PRIV_H */ diff --git a/libstorycode/storycode.c b/libstorycode/storycode.c index 18e5270..139af67 100644 --- a/libstorycode/storycode.c +++ b/libstorycode/storycode.c @@ -37,7 +37,6 @@ #include "storycode_parse.h" #include "storycode_lex.h" -#include "scparse_priv.h" extern int scdebug; @@ -46,15 +45,16 @@ extern int scdebug; Narrative *storycode_parse_presentation(const char *sc) { YY_BUFFER_STATE b; - struct scpctx parse_ctx; + Narrative *n; b = sc_scan_string(sc); //scdebug = 1; - scparse(&parse_ctx); + n = narrative_new(); + scparse(n); sc_delete_buffer(b); - //narrative_debug(parse_ctx.n); + //narrative_debug(n); - return parse_ctx.n; + return n; } diff --git a/libstorycode/storycode.y b/libstorycode/storycode.y index a0d4757..c6ba2eb 100644 --- a/libstorycode/storycode.y +++ b/libstorycode/storycode.y @@ -31,7 +31,30 @@ #include "slide.h" #include "stylesheet.h" - #include "scparse_priv.h" + enum style_mask + { + STYMASK_GEOM = 1<<0, + STYMASK_FONT = 1<<1, + STYMASK_ALIGNMENT = 1<<2, + STYMASK_PADDING = 1<<3, + STYMASK_PARASPACE = 1<<4, + STYMASK_FGCOL = 1<<5, + STYMASK_BGCOL = 1<<6, + }; + + struct style + { + enum style_mask mask; + struct frame_geom geom; + char *font; + enum alignment alignment; + struct length padding[4]; + struct length paraspace[4]; + struct colour fgcol; + enum gradient bggrad; + struct colour bgcol; + struct colour bgcol2; + }; struct paragraph { struct text_run *runs; @@ -59,6 +82,8 @@ struct paragraph para; struct many_paragraphs many_paragraphs; + struct style style; + struct length len; struct length lenquad[4]; struct frame_geom geom; @@ -77,7 +102,7 @@ extern int sclex(); extern int scparse(); - void scerror(struct scpctx *ctx, const char *s); + void scerror(Narrative *n, const char *s); extern int lineno; %} @@ -105,11 +130,11 @@ %type <n> narrative %type <slide> slide %type <slide> slide_parts -%type <ss> stylesheet %type <slide_item> slide_part -%type <many_paragraphs> textframe -%type <many_paragraphs> slide_prestitle -%type <many_paragraphs> slidetitle +%type <slide_item> imageframe +%type <slide_item> slidetitle +%type <slide_item> textframe +%type <slide_item> slide_prestitle %type <many_paragraphs> multi_line_string %type <para> text_line %type <para> slide_bulletpoint @@ -118,9 +143,22 @@ %type <str> RUN_TEXT %type <str> one_or_more_runs +%type <ss> stylesheet +%type <style> style_narrative_bp +%type <style> style_narrative_prestitle +%type <style> styledefs +%type <style> styledef +%type <style> slide_geom +%type <style> background +%type <style> frame_options +%type <style> frame_option +%type <style> frameopt +%type <style> style_slide_prestitle +%type <style> style_slide_text +%type <style> style_slide_title +%type <style> style_slide_footer + %type <str> FONTNAME -%type <str> imageframe -%type <str> frameopt %type <str> FILENAME %type <geom> geometry @@ -133,16 +171,10 @@ %type <val> VALUE %type <grad> gradtype -%parse-param { struct scpctx *ctx }; -%initial-action -{ - ctx->n = narrative_new(); - ctx->mask = 0; -} +%parse-param { Narrative *n }; %{ - static void copy_col(struct colour *to, struct colour from) { int i; @@ -151,6 +183,52 @@ static void copy_col(struct colour *to, struct colour from) } +static void merge_style(struct style *combined, struct style inp) +{ + int i; + + switch ( inp.mask ) { + + case STYMASK_GEOM : + combined->geom = inp.geom; + break; + + case STYMASK_FONT : + combined->font = inp.font; + break; + + case STYMASK_ALIGNMENT : + combined->alignment = inp.alignment; + break; + + case STYMASK_PADDING : + for ( i=0; i<4; i++ ) combined->padding[i] = inp.padding[i]; + break; + + case STYMASK_PARASPACE : + for ( i=0; i<4; i++ ) combined->paraspace[i] = inp.paraspace[i]; + break; + + case STYMASK_FGCOL : + copy_col(&combined->fgcol, inp.fgcol); + break; + + case STYMASK_BGCOL : + copy_col(&combined->bgcol, inp.bgcol); + copy_col(&combined->bgcol2, inp.bgcol2); + combined->bggrad = inp.bggrad; + break; + + default : + printf("Can't merge style %i\n", inp.mask); + return; + + } + + combined->mask |= inp.mask; +} + + static int hex_to_double(const char *v, double *r) { char c[5]; @@ -207,25 +285,17 @@ struct text_run **combine_paras(struct many_paragraphs mp, int **pn_runs) } -void set_style(struct scpctx *ctx, const char *element) +void set_stylesheet(Narrative *n, struct style *style, const char *element) { - if ( ctx->mask & STYMASK_GEOM ) stylesheet_set_geometry(narrative_get_stylesheet(ctx->n), - element, ctx->geom); - if ( ctx->mask & STYMASK_FONT ) stylesheet_set_font(narrative_get_stylesheet(ctx->n), - element, ctx->font); - if ( ctx->mask & STYMASK_ALIGNMENT ) stylesheet_set_alignment(narrative_get_stylesheet(ctx->n), - element, ctx->alignment); - if ( ctx->mask & STYMASK_PADDING ) stylesheet_set_padding(narrative_get_stylesheet(ctx->n), - element, ctx->padding); - if ( ctx->mask & STYMASK_PARASPACE ) stylesheet_set_paraspace(narrative_get_stylesheet(ctx->n), - element, ctx->paraspace); - if ( ctx->mask & STYMASK_FGCOL ) stylesheet_set_fgcol(narrative_get_stylesheet(ctx->n), - element, ctx->fgcol); - if ( ctx->mask & STYMASK_BGCOL ) stylesheet_set_background(narrative_get_stylesheet(ctx->n), - element, ctx->bggrad, - ctx->bgcol, ctx->bgcol2); - ctx->mask = 0; - ctx->alignment = ALIGN_INHERIT; + Stylesheet *ss = narrative_get_stylesheet(n); + if ( style->mask & STYMASK_GEOM ) stylesheet_set_geometry(ss, element, style->geom); + if ( style->mask & STYMASK_FONT ) stylesheet_set_font(ss, element, style->font); + if ( style->mask & STYMASK_ALIGNMENT ) stylesheet_set_alignment(ss, element, style->alignment); + if ( style->mask & STYMASK_PADDING ) stylesheet_set_padding(ss, element, style->padding); + if ( style->mask & STYMASK_PARASPACE ) stylesheet_set_paraspace(ss, element, style->paraspace); + if ( style->mask & STYMASK_FGCOL ) stylesheet_set_fgcol(ss, element, style->fgcol); + if ( style->mask & STYMASK_BGCOL ) stylesheet_set_background(ss, element, style->bggrad, + style->bgcol, style->bgcol2); } %} @@ -248,11 +318,11 @@ narrative: ; narrative_el: - PRESTITLE TEXT_START text_line { narrative_add_prestitle(ctx->n, $3.runs, $3.n_runs); } -| BP TEXT_START text_line { narrative_add_bp(ctx->n, $3.runs, $3.n_runs); } -| TEXT_START text_line { narrative_add_text(ctx->n, $2.runs, $2.n_runs); } -| slide { narrative_add_slide(ctx->n, $1); } -| EOP { narrative_add_eop(ctx->n); } + PRESTITLE TEXT_START text_line { narrative_add_prestitle(n, $3.runs, $3.n_runs); } +| BP TEXT_START text_line { narrative_add_bp(n, $3.runs, $3.n_runs); } +| TEXT_START text_line { narrative_add_text(n, $2.runs, $2.n_runs); } +| slide { narrative_add_slide(n, $1); } +| EOP { narrative_add_eop(n); } ; text_line: { $<para>$.n_runs = 0; @@ -318,40 +388,61 @@ slide_parts: { $<slide>$ = slide_new(); } ; slide_part: - slide_prestitle { struct text_run **cp; - int *n_runs; - cp = combine_paras($1, &n_runs); - $$ = slide_item_prestitle(cp, n_runs, $1.n_paras); } -| textframe { struct text_run **cp; - int *n_runs; - cp = combine_paras($1, &n_runs); - $$ = slide_item_text(cp, n_runs, $1.n_paras, - ctx->geom, ctx->alignment); } -| slidetitle { struct text_run **cp; - int *n_runs; - cp = combine_paras($1, &n_runs); - $$ = slide_item_slidetitle(cp, n_runs, $1.n_paras); } -| imageframe { $$ = slide_item_image($1, ctx->geom); } + slide_prestitle { $$ = $1; } +| textframe { $$ = $1; } +| slidetitle { $$ = $1; } +| imageframe { $$ = $1; } | FOOTER { $$ = slide_item_footer(); } ; slide_prestitle: - PRESTITLE frame_options multi_line_string { $$ = $3; } -| PRESTITLE frame_options '{' multi_line_string '}' { $$ = $4; } + PRESTITLE multi_line_string { struct text_run **cp; + int *n_runs; + cp = combine_paras($2, &n_runs); + $$ = slide_item_prestitle(cp, n_runs, $2.n_paras); + } +| PRESTITLE '{' multi_line_string '}' { struct text_run **cp; + int *n_runs; + cp = combine_paras($3, &n_runs); + $$ = slide_item_prestitle(cp, n_runs, $3.n_paras); + } ; slidetitle: - SLIDETITLE frame_options multi_line_string { $$ = $3; } -| SLIDETITLE frame_options '{' multi_line_string '}' { $$ = $4; } + SLIDETITLE multi_line_string { struct text_run **cp; + int *n_runs; + cp = combine_paras($2, &n_runs); + $$ = slide_item_slidetitle(cp, n_runs, $2.n_paras); + } +| SLIDETITLE '{' multi_line_string '}' { struct text_run **cp; + int *n_runs; + cp = combine_paras($3, &n_runs); + $$ = slide_item_slidetitle(cp, n_runs, $3.n_paras); + } ; imageframe: - IMAGEFRAME frame_options TEXT_START FILENAME { $$ = $FILENAME; } + IMAGEFRAME frame_options TEXT_START FILENAME { if ( $2.mask & STYMASK_GEOM ) { + $$ = slide_item_image($4, $2.geom); + } else { + printf("Image frame must have geometry.\n"); + } + } ; textframe: - TEXTFRAME frame_options multi_line_string { $$ = $3; } -| TEXTFRAME frame_options '{' multi_line_string '}' { $$ = $4; } + TEXTFRAME frame_options multi_line_string { struct text_run **cp; + int *n_runs; + cp = combine_paras($3, &n_runs); + $$ = slide_item_text(cp, n_runs, $3.n_paras, + $2.geom, $2.alignment); + } +| TEXTFRAME frame_options '{' multi_line_string '}' { struct text_run **cp; + int *n_runs; + cp = combine_paras($4, &n_runs); + $$ = slide_item_text(cp, n_runs, $4.n_paras, + $2.geom, $2.alignment); + } ; text_line_with_start: @@ -372,19 +463,19 @@ multi_line_string: { $<many_paragraphs>$.n_paras = 0; ; /* There can be any number of options */ -frame_options: +frame_options: { $<style>$.mask = 0; $<style>$.alignment = ALIGN_INHERIT; } %empty -| frame_options frame_option +| frame_options frame_option { merge_style(&$<style>$, $2); } ; /* Each option is enclosed in square brackets */ frame_option: - SQOPEN frameopt SQCLOSE + SQOPEN frameopt SQCLOSE { $$ = $2; } ; frameopt: - geometry { ctx->geom = $1; } -| alignment { ctx->alignment = $1; } + geometry { $$.geom = $1; $$.mask = STYMASK_GEOM; } +| alignment { $$.alignment = $1; $$.mask = STYMASK_ALIGNMENT; } ; /* Primitives for describing styles (used in frame options and stylesheets) */ @@ -431,102 +522,87 @@ gradtype: /* ------ Stylesheet ------ */ -stylesheet: +stylesheet: { $<ss>$ = stylesheet_new(); } STYLES '{' - style_narrative - style_slide - '}' { } -; - -style_narrative: - NARRATIVE '{' style_narrative_def '}' { } + NARRATIVE '{' style_narrative_def '}' + SLIDE '{' style_slide_def '}' + '}' { } ; style_narrative_def: %empty -| style_narrative_def style_narrative_prestitle -| style_narrative_def style_narrative_bp -| style_narrative_def styledef { set_style(ctx, "NARRATIVE"); } +| style_narrative_def style_narrative_prestitle { set_stylesheet(n, &$2, "NARRATIVE.PRESTITLE"); } +| style_narrative_def style_narrative_bp { set_stylesheet(n, &$2, "NARRATIVE.BP"); } +| style_narrative_def styledefs { set_stylesheet(n, &$2, "NARRATIVE"); } ; style_narrative_prestitle: - PRESTITLE '{' styledefs '}' { set_style(ctx, "NARRATIVE.PRESTITLE"); } + PRESTITLE '{' styledefs '}' { $$ = $3; } ; style_narrative_bp: - BP '{' styledefs '}' { set_style(ctx, "NARRATIVE.BP"); } -; - -style_slide: - SLIDE '{' style_slide_def '}' { } + BP '{' styledefs '}' { $$ = $3; } ; style_slide_def: %empty - /* Call set_style() immediately */ -| style_slide_def background { set_style(ctx, "SLIDE"); } -| style_slide_def slide_geom { set_style(ctx, "SLIDE"); } - /* The ones below will call set_style() themselves */ -| style_slide_def style_slide_prestitle { } -| style_slide_def style_slide_text { } -| style_slide_def style_slide_title { } -| style_slide_def style_slide_footer { } +| style_slide_def background { set_stylesheet(n, &$2, "SLIDE"); } +| style_slide_def slide_geom { set_stylesheet(n, &$2, "SLIDE"); } +| style_slide_def style_slide_prestitle { set_stylesheet(n, &$2, "SLIDE.PRESTITLE"); } +| style_slide_def style_slide_text { set_stylesheet(n, &$2, "SLIDE.TEXT"); } +| style_slide_def style_slide_title { set_stylesheet(n, &$2, "SLIDE.SLIDETITLE"); } +| style_slide_def style_slide_footer { set_stylesheet(n, &$2, "SLIDE.FOOTER"); } ; background: - BGCOL colour { copy_col(&ctx->bgcol, $2); - ctx->bggrad = GRAD_NONE; - ctx->mask |= STYMASK_BGCOL; } -| BGCOL gradtype colour colour { copy_col(&ctx->bgcol, $3); - copy_col(&ctx->bgcol2, $4); - ctx->bggrad = $2; - ctx->mask |= STYMASK_BGCOL; } + BGCOL colour { copy_col(&$$.bgcol, $2); + $$.bggrad = GRAD_NONE; + $$.mask = STYMASK_BGCOL; } +| BGCOL gradtype colour colour { copy_col(&$$.bgcol, $3); + copy_col(&$$.bgcol2, $4); + $$.bggrad = $2; + $$.mask = STYMASK_BGCOL; } ; slide_geom: - GEOMETRY geometry { ctx->geom = $2; - ctx->mask |= STYMASK_GEOM; } + GEOMETRY geometry { $$.geom = $2; $$.mask = STYMASK_GEOM; } ; style_slide_prestitle: - PRESTITLE '{' styledefs '}' { set_style(ctx, "SLIDE.PRESTITLE"); } + PRESTITLE '{' styledefs '}' { $$ = $3; } ; style_slide_title: - SLIDETITLE '{' styledefs '}' { set_style(ctx, "SLIDE.SLIDETITLE"); } + SLIDETITLE '{' styledefs '}' { $$ = $3; } ; style_slide_text: - TEXTFRAME '{' styledefs '}' { set_style(ctx, "SLIDE.TEXT"); } + TEXTFRAME '{' styledefs '}' { $$ = $3; } ; style_slide_footer: - FOOTER '{' styledefs '}' { set_style(ctx, "SLIDE.FOOTER"); } + FOOTER '{' styledefs '}' { $$ = $3; } ; -styledefs: +styledefs: { $<style>$.mask = 0; $<style>$.alignment = ALIGN_INHERIT; } %empty -| styledefs styledef +| styledefs styledef { merge_style(&$$, $2); } ; styledef: - FONT FONTNAME { ctx->font = $2; - ctx->mask |= STYMASK_FONT; } -| GEOMETRY geometry { ctx->geom = $2; - ctx->mask |= STYMASK_GEOM; } -| PAD lenquad { for ( int i=0; i<4; i++ ) ctx->padding[i] = $2[i]; - ctx->mask |= STYMASK_PADDING; } -| PARASPACE lenquad { for ( int i=0; i<4; i++ ) ctx->paraspace[i] = $2[i]; - ctx->mask |= STYMASK_PARASPACE; } -| FGCOL colour { copy_col(&ctx->fgcol, $2); - ctx->mask |= STYMASK_FGCOL; } -| background { /* Handled in rule 'background' */ } -| ALIGN alignment { ctx->alignment = $2; - ctx->mask |= STYMASK_ALIGNMENT; } + FONT FONTNAME { $$.font = $2; $$.mask = STYMASK_FONT; } +| GEOMETRY geometry { $$.geom = $2; $$.mask = STYMASK_GEOM; } +| PAD lenquad { for ( int i=0; i<4; i++ ) $$.padding[i] = $2[i]; + $$.mask = STYMASK_PADDING; } +| PARASPACE lenquad { for ( int i=0; i<4; i++ ) $$.paraspace[i] = $2[i]; + $$.mask = STYMASK_PARASPACE; } +| FGCOL colour { copy_col(&$$.fgcol, $2); $$.mask = STYMASK_FGCOL; } +| background { $$ = $1; } +| ALIGN alignment { $$.alignment = $2; $$.mask = STYMASK_ALIGNMENT; } ; %% -void scerror(struct scpctx *ctx, const char *s) { +void scerror(Narrative *n, const char *s) { printf("Storycode parse error at line %i\n", lineno); } |