module VijiN.Syntax type Variable = Variable of string type Term = TextTerm of string | VarTerm of Variable type Character = Character of Term // TODO: Character should probably have more, like selecting portrait outfit/style type DirectivePrefix = string type DirectiveInfix = string type DirectiveOperator = DirectivePrefix * DirectiveInfix type DirectiveArg = Arg of Term list type Directive = DirectiveOperator * DirectiveArg list list // TODO: non-empty list type Directives = Directive list // TODO: non-empty list type ChoiceText = ChoiceText of Term list type ChoiceValue = ChoiceValue of Term list type ChoiceOption = ChoiceText * ChoiceValue option type Choice = Variable * ChoiceOption list // TODO: non-empty list type InlineDirective = Directive type SpokenText = | Plain of Term list | Emphasis of Term list | Yell of Term list | Whisper of Term list type Spoken = Character option * InlineDirective list * SpokenText list // TODO: non-empty list type Comment = Comment of string type Line = | SpokenLine of Spoken | DirectiveLine of Directives | CommentLine of Comment | ChoiceLine of Choice type LineNumber = LineNo of int // TODO: >= 1 type PageNumber = PageNo of int // TODO: >= 1 type ScriptLine = LineNumber * PageNumber * Line // TODO: other diffing metadata type SceneName = SceneName of string type Scene = SceneName * Character list * ScriptLine list