module VijiN.Syntax type Variable = Variable of string type Term = Text of string | Variable of Variable type Character = Character of Term // TODO: Character should probably have more, like selecting portrait outfit/style type DirectivePrefix = Prefix of string type DirectiveInfix = Infix of string type DirectiveSuffix = Suffix of string type DirectiveOperator = DirectivePrefix * DirectiveInfix option * DirectiveSuffix option type DirectiveArg = Arg of Term type Directive = DirectiveOperator * DirectiveArg list list // TODO: non-empty list type Directives = Directive list // TODO: non-empty list type ChoiceText = Text of Term type ChoiceValue = Value of Term type ChoiceOption = ChoiceText * ChoiceValue option type Choice = Variable * ChoiceOption list // TODO: non-empty list type InlineDirective = Directive type SpokenText = | Plain of Term | Emphasis of Term | Yell of Term | Whisper of Term type Spoken = Character option * InlineDirective list * SpokenText list // TODO: non-empty list type Comment = Comment of string type Line = | Spoken of Spoken | Directive of Directives | Comment of Comment | Choice of Choice type LineNumber = Line of int // TODO: >= 1 type PageNumber = Page of int // TODO: >= 1 type ScriptLine = LineNumber * PageNumber * Line // TODO: other diffing metadata type SceneName = Name of string type Scene = SceneName * Character list * ScriptLine list