1
0
mirror of https://github.com/alecthomas/chroma.git synced 2025-02-13 13:28:27 +02:00

Add bibtex support.

Fixes #271.
This commit is contained in:
Alec Thomas 2019-10-06 18:10:30 +11:00
parent 20b4f5f89b
commit b618823c9b
6 changed files with 535 additions and 168 deletions

76
lexers/b/bibtex.go Normal file
View File

@ -0,0 +1,76 @@
package b
import (
. "github.com/alecthomas/chroma" // nolint
"github.com/alecthomas/chroma/lexers/internal"
)
// Bibtex lexer.
var Bibtex = internal.Register(MustNewLexer(
&Config{
Name: "BibTeX",
Aliases: []string{"bib", "bibtex",},
Filenames: []string{"*.bib",},
MimeTypes: []string{"text/x-bibtex",},
NotMultiline: true,
CaseInsensitive: true,
},
Rules{
"root": {
Include("whitespace"),
{`@comment`, Comment, nil},
{`@preamble`, NameClass, Push("closing-brace", "value", "opening-brace")},
{`@string`, NameClass, Push("closing-brace", "field", "opening-brace")},
{"@[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameClass, Push("closing-brace", "command-body", "opening-brace")},
{`.+`, Comment, nil},
},
"opening-brace": {
Include("whitespace"),
{`[{(]`, Punctuation, Pop(1)},
},
"closing-brace": {
Include("whitespace"),
{`[})]`, Punctuation, Pop(1)},
},
"command-body": {
Include("whitespace"),
{`[^\s\,\}]+`, NameLabel, Push("#pop", "fields")},
},
"fields": {
Include("whitespace"),
{`,`, Punctuation, Push("field")},
Default(Pop(1)),
},
"field": {
Include("whitespace"),
{"[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameAttribute, Push("value", "=")},
Default(Pop(1)),
},
"=": {
Include("whitespace"),
{`=`, Punctuation, Pop(1)},
},
"value": {
Include("whitespace"),
{"[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameVariable, nil},
{`"`, LiteralString, Push("quoted-string")},
{`\{`, LiteralString, Push("braced-string")},
{`[\d]+`, LiteralNumber, nil},
{`#`, Punctuation, nil},
Default(Pop(1)),
},
"quoted-string": {
{`\{`, LiteralString, Push("braced-string")},
{`"`, LiteralString, Pop(1)},
{`[^\{\"]+`, LiteralString, nil},
},
"braced-string": {
{`\{`, LiteralString, Push()},
{`\}`, LiteralString, Pop(1)},
{`[^\{\}]+`, LiteralString, nil},
},
"whitespace": {
{`\s+`, Text, nil},
},
},
))

22
lexers/testdata/bib.actual vendored Normal file
View File

@ -0,0 +1,22 @@
% a sample bibliography file
%
@article{small,
author = {Freely, I.P.},
title = {A small paper},
journal = {The journal of small papers},
year = 1997,
volume = {-1},
note = {to appear},
}
@article{big,
author = {Jass, Hugh},
title = {A big paper},
journal = {The journal of big papers},
year = 7991,
volume = {MCMXCVII},
}
% The authors mentioned here are almost, but not quite,
% entirely unrelated to Matt Groening.

101
lexers/testdata/bib.expected vendored Normal file
View File

@ -0,0 +1,101 @@
[
{"type":"Comment","value":"% a sample bibliography file"},
{"type":"Text","value":"\n"},
{"type":"Comment","value":"% "},
{"type":"Text","value":"\n\n"},
{"type":"NameClass","value":"@article"},
{"type":"Punctuation","value":"{"},
{"type":"NameLabel","value":"small"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"author"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{Freely, I.P.}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"title"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{A small paper}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"journal"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{The journal of small papers}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"year"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralNumber","value":"1997"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"volume"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{-1}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"note"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{to appear}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"Punctuation","value":"}"},
{"type":"Text","value":"\n\n"},
{"type":"NameClass","value":"@article"},
{"type":"Punctuation","value":"{"},
{"type":"NameLabel","value":"big"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"author"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{Jass, Hugh}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"title"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{A big paper}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"journal"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{The journal of big papers}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"year"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralNumber","value":"7991"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"NameAttribute","value":"volume"},
{"type":"Text","value":" "},
{"type":"Punctuation","value":"="},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"{MCMXCVII}"},
{"type":"Punctuation","value":","},
{"type":"Text","value":"\n"},
{"type":"Punctuation","value":"}"},
{"type":"Text","value":"\n\n"},
{"type":"Comment","value":"% The authors mentioned here are almost, but not quite,"},
{"type":"Text","value":"\n"},
{"type":"Comment","value":"% entirely unrelated to Matt Groening."},
{"type":"Text","value":"\n"}
]

View File

@ -1,170 +1,44 @@
[
{
"type": "NameDecorator",
"value": "#pragma"
},
{
"type": "Text",
"value": " rtGlobals=3\n\n"
},
{
"type": "NameDecorator",
"value": "#include"
},
{
"type": "Text",
"value": " "
},
{
"type": "LiteralString",
"value": "\"someFile\""
},
{
"type": "Text",
"value": "\n\n"
},
{
"type": "KeywordType",
"value": "StrConstant"
},
{
"type": "Text",
"value": " myConstString="
},
{
"type": "LiteralString",
"value": "\"abcd\""
},
{
"type": "Text",
"value": "\n"
},
{
"type": "CommentSingle",
"value": "// some comment"
},
{
"type": "Text",
"value": "\n"
},
{
"type": "KeywordType",
"value": "Constant"
},
{
"type": "Text",
"value": " myConst=123\n\n"
},
{
"type": "KeywordReserved",
"value": "static"
},
{
"type": "Text",
"value": " "
},
{
"type": "KeywordReserved",
"value": "Structure"
},
{
"type": "Text",
"value": " struct1\n\t"
},
{
"type": "KeywordType",
"value": "string"
},
{
"type": "Text",
"value": " str\n\t"
},
{
"type": "KeywordType",
"value": "variable"
},
{
"type": "Text",
"value": " var\n"
},
{
"type": "KeywordReserved",
"value": "EndStructure"
},
{
"type": "Text",
"value": "\n\n"
},
{
"type": "KeywordReserved",
"value": "Function"
},
{
"type": "Text",
"value": "/"
},
{
"type": "KeywordType",
"value": "WAVE"
},
{
"type": "Text",
"value": " myFunction(var)\n\t"
},
{
"type": "KeywordType",
"value": "Variable"
},
{
"type": "Text",
"value": " var\n\n\t"
},
{
"type": "NameClass",
"value": "Make"
},
{
"type": "Text",
"value": "/N=(var) test\n\n\t"
},
{
"type": "Keyword",
"value": "return"
},
{
"type": "Text",
"value": " test\n"
},
{
"type": "KeywordReserved",
"value": "End"
},
{
"type": "Text",
"value": "\n\n"
},
{
"type": "NameDecorator",
"value": "#ifdef"
},
{
"type": "Text",
"value": " NOT_DEFINED\n\t"
},
{
"type": "CommentSingle",
"value": "// conditional compilation"
},
{
"type": "Text",
"value": "\n"
},
{
"type": "NameDecorator",
"value": "#endif"
},
{
"type": "Text",
"value": "\n"
}
{"type":"NameDecorator","value":"#pragma"},
{"type":"Text","value":" rtGlobals=3\n\n"},
{"type":"NameDecorator","value":"#include"},
{"type":"Text","value":" "},
{"type":"LiteralString","value":"\"someFile\""},
{"type":"Text","value":"\n\n"},
{"type":"KeywordType","value":"StrConstant"},
{"type":"Text","value":" myConstString="},
{"type":"LiteralString","value":"\"abcd\""},
{"type":"Text","value":"\n"},
{"type":"CommentSingle","value":"// some comment"},
{"type":"Text","value":"\n"},
{"type":"KeywordType","value":"Constant"},
{"type":"Text","value":" myConst=123\n\n"},
{"type":"KeywordReserved","value":"static"},
{"type":"Text","value":" "},
{"type":"KeywordReserved","value":"Structure"},
{"type":"Text","value":" struct1\n\t"},
{"type":"KeywordType","value":"string"},
{"type":"Text","value":" str\n\t"},
{"type":"KeywordType","value":"variable"},
{"type":"Text","value":" var\n"},
{"type":"KeywordReserved","value":"EndStructure"},
{"type":"Text","value":"\n\n"},
{"type":"KeywordReserved","value":"Function"},
{"type":"Text","value":"/"},
{"type":"KeywordType","value":"WAVE"},
{"type":"Text","value":" myFunction(var)\n\t"},
{"type":"KeywordType","value":"Variable"},
{"type":"Text","value":" var\n\n\t"},
{"type":"NameClass","value":"Make"},
{"type":"Text","value":"/N=(var) test\n\n\t"},
{"type":"Keyword","value":"return"},
{"type":"Text","value":" test\n"},
{"type":"KeywordReserved","value":"End"},
{"type":"Text","value":"\n\n"},
{"type":"NameDecorator","value":"#ifdef"},
{"type":"Text","value":" NOT_DEFINED\n\t"},
{"type":"CommentSingle","value":"// conditional compilation"},
{"type":"Text","value":"\n"},
{"type":"NameDecorator","value":"#endif"},
{"type":"Text","value":"\n"}
]

46
lexers/testdata/tex.actual vendored Normal file
View File

@ -0,0 +1,46 @@
\documentclass[12pt]{article}
\usepackage{lingmacros}
\usepackage{tree-dvips}
\begin{document}
\section*{Notes for My Paper}
Don't forget to include examples of topicalization.
They look like this:
{\small
\enumsentence{Topicalization from sentential subject:\\
\shortex{7}{a John$_i$ [a & kltukl & [el &
{\bf l-}oltoir & er & ngii$_i$ & a Mary]]}
{ & {\bf R-}clear & {\sc comp} &
{\bf IR}.{\sc 3s}-love & P & him & }
{John, (it's) clear that Mary loves (him).}}
}
\subsection*{How to handle topicalization}
I'll just assume a tree structure like (\ex{1}).
{\small
\enumsentence{Structure of A$'$ Projections:\\ [2ex]
\begin{tabular}[t]{cccc}
& \node{i}{CP}\\ [2ex]
\node{ii}{Spec} & &\node{iii}{C$'$}\\ [2ex]
&\node{iv}{C} & & \node{v}{SAgrP}
\end{tabular}
\nodeconnect{i}{ii}
\nodeconnect{i}{iii}
\nodeconnect{iii}{iv}
\nodeconnect{iii}{v}
}
}
\subsection*{Mood}
Mood changes when there is a topic, as well as when
there is WH-movement. \emph{Irrealis} is the mood when
there is a non-subject topic or WH-phrase in Comp.
\emph{Realis} is the mood when there is a subject topic
or WH-phrase.
\end{document}

248
lexers/testdata/tex.expected vendored Normal file
View File

@ -0,0 +1,248 @@
[
{"type":"Keyword","value":"\\documentclass"},
{"type":"NameAttribute","value":"[12pt]"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"article"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\usepackage"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"lingmacros"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\usepackage"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"tree-dvips"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\begin"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"document"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n\n"},
{"type":"Keyword","value":"\\section*"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"Notes for My Paper"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n\nDon't forget to include examples of topicalization.\nThey look like this:\n\n"},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\small"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\enumsentence"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"Topicalization from sentential subject:"},
{"type":"Keyword","value":"\\\\"},
{"type":"Text","value":" \n"},
{"type":"Keyword","value":"\\shortex"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"7"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"a John"},
{"type":"LiteralString","value":"$"},
{"type":"NameBuiltin","value":"_i"},
{"type":"LiteralString","value":"$"},
{"type":"Text","value":" [a "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" kltukl "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" [el "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" \n "},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\bf"},
{"type":"Text","value":" l-"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"oltoir "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" er "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" ngii"},
{"type":"LiteralString","value":"$"},
{"type":"NameBuiltin","value":"_i"},
{"type":"LiteralString","value":"$"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" a Mary]]"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\bf"},
{"type":"Text","value":" R-"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"clear "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\sc"},
{"type":"Text","value":" comp"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" \n "},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\bf"},
{"type":"Text","value":" IR"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"."},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\sc"},
{"type":"Text","value":" 3s"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"-love "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" P "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" him "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"John, (it's) clear that Mary loves (him)."},
{"type":"NameBuiltin","value":"}}"},
{"type":"Text","value":"\n"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n\n"},
{"type":"Keyword","value":"\\subsection*"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"How to handle topicalization"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n\nI'll just assume a tree structure like ("},
{"type":"Keyword","value":"\\ex"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"1"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":").\n\n"},
{"type":"NameBuiltin","value":"{"},
{"type":"Keyword","value":"\\small"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\enumsentence"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"Structure of A"},
{"type":"LiteralString","value":"$"},
{"type":"NameBuiltin","value":"'"},
{"type":"LiteralString","value":"$"},
{"type":"Text","value":" Projections:"},
{"type":"Keyword","value":"\\\\"},
{"type":"Text","value":" [2ex]\n"},
{"type":"Keyword","value":"\\begin"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"tabular"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"[t]"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"cccc"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"\\node"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"i"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"CP"},
{"type":"NameBuiltin","value":"}"},
{"type":"Keyword","value":"\\\\"},
{"type":"Text","value":" [2ex]\n "},
{"type":"Keyword","value":"\\node"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"ii"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"Spec"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Keyword","value":"\\node"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"iii"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"C"},
{"type":"LiteralString","value":"$"},
{"type":"NameBuiltin","value":"'"},
{"type":"LiteralString","value":"$"},
{"type":"NameBuiltin","value":"}"},
{"type":"Keyword","value":"\\\\"},
{"type":"Text","value":" [2ex]\n "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Keyword","value":"\\node"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"iv"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"C"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"NameBuiltin","value":"\u0026"},
{"type":"Text","value":" "},
{"type":"Keyword","value":"\\node"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"v"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"SAgrP"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\end"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"tabular"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\nodeconnect"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"i"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"ii"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\nodeconnect"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"i"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"iii"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\nodeconnect"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"iii"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"iv"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"Keyword","value":"\\nodeconnect"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"iii"},
{"type":"NameBuiltin","value":"}{"},
{"type":"Text","value":"v"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n\n"},
{"type":"Keyword","value":"\\subsection*"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"Mood"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n\nMood changes when there is a topic, as well as when\nthere is WH-movement. "},
{"type":"Keyword","value":"\\emph"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"Irrealis"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":" is the mood when\nthere is a non-subject topic or WH-phrase in Comp.\n"},
{"type":"Keyword","value":"\\emph"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"Realis"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":" is the mood when there is a subject topic\nor WH-phrase.\n\n"},
{"type":"Keyword","value":"\\end"},
{"type":"NameBuiltin","value":"{"},
{"type":"Text","value":"document"},
{"type":"NameBuiltin","value":"}"},
{"type":"Text","value":"\n"}
]