Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 37 additions & 1 deletion src/parser/commands_data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,43 @@ combining_accents = [
]

punctuation_symbols = split(raw", ; . !")
delimiter_symbols = split(raw"| / ( ) [ ] < >")
delimiter_symbols = split(raw"| / \ ( ) [ ] ⟨ ⟩ ‖ ⌈ ⌉ ⌊ ⌋ ⌜ ⌝ ⌞ ⌟")
## NOTE `<` and `>` not included in `delimiter_symbols` because
## they should not be used as such. In math mode, they are relation symbols and
## we don't want to change that by overwriting the `symbol_to_canonical` entries.
## **However**, `\left<` and `\right>` should work to produce `\left\langle` and
## `\right\rangle`, respectively, due to intercepting `delimiter(...)`.
## NOTE `{` and `}` not included because they are group delimiters that the tokenizer
## should recognize as `lcurly` and `rcurly`.
## The symbols have to be typed by command.

## some delimiter symbols can also be typed with commands;
### instead of relying on `get_symbol_char` (like with `space_commands` in `commands_registration.jl`)
### we define them explicitly, because `latex_symbols` misses some
delimiter_commands = Dict(
raw"\vert" => '|',
raw"\slash" => '/', # NOTE seems to work with LaTeX, but not MathJax
raw"\backslash" => '\\',
raw"\lbrack" => '[',
raw"\rbrack" => ']',
raw"\langle" => '⟨',
raw"\rangle" => '⟩',
raw"\|" => '‖',
raw"\Vert" => '‖',
raw"\lceil" => '⌈',
raw"\rceil" => '⌉',
raw"\lfloor" => '⌊',
raw"\lfloor" => '⌊',
raw"\ulcorner" => '⌜',
raw"\urcorner" => '⌝',
raw"\llcorner" => '⌞',
raw"\lrcorner" => '⌟',
raw"\{" => '{',
raw"\}" => '}',
raw"\lbrace" => '{',
raw"\rbrace" => '}',
)

font_names = split(raw"rm cal it tt sf bf default bb frak scr regular")

# TODO Add to the parser what come below, if needed
Expand Down
11 changes: 9 additions & 2 deletions src/parser/commands_registration.jl
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,6 @@ const command_definitions = Dict(
raw"\frac" => (TeXExpr(:frac), 2),
raw"\sqrt" => (TeXExpr(:sqrt), 1),
raw"\overline" => (TeXExpr(:overline), 1),
raw"\{" => (TeXExpr(:delimiter, '{'), 0),
raw"\}" => (TeXExpr(:delimiter, '}'), 0),
raw"\_" => (TeXExpr(:symbol, '_'), 0),
raw"\%" => (TeXExpr(:symbol, '%'), 0),
raw"\$" => (TeXExpr(:symbol, '$'), 0),
Expand Down Expand Up @@ -150,11 +148,20 @@ for symbol in punctuation_symbols
symbol_to_canonical[symbol] = TeXExpr(:punctuation, symbol)
end

# Delimiters
for symbol in delimiter_symbols
symbol = first(symbol)
symbol_to_canonical[symbol] = TeXExpr(:delimiter, symbol)
end

for (com_str, symbol) in pairs(delimiter_commands)
delim_expr = TeXExpr(:delimiter, symbol)
if !haskey(symbol_to_canonical, symbol)
symbol_to_canonical[symbol] = delim_expr
end
command_definitions[com_str] = (delim_expr, 0)
end

##
## Default behavior
##
Expand Down
8 changes: 7 additions & 1 deletion src/parser/parser.jl
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,13 @@ end
function delimiter(com_str, str)
str = str[length(com_str)+1:end]
if length(str) == 1
return TeXExpr(:delimiter, only(str))
char = only(str)
if char == '<'
char = '⟨'
elseif char == '>'
char = '⟩'
end
return TeXExpr(:delimiter, char)
else
return only(texparse(str).args)
end
Expand Down
7 changes: 4 additions & 3 deletions src/parser/tokenizer.jl
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
const token_command = re"\\[a-zA-Z]+" | re"\\."
tex_tokens = [
:char => re".",
:primes => re"'+",
:caret => re"\^",
:underscore => re"_",
:rcurly => re"}",
:lcurly => re"{",
:command => re"\\[a-zA-Z]+" | re"\\.",
:right => re"\\right.",
:left => re"\\left.",
:command => token_command,
:right => re"\\right." | re"\\right" * token_command,
:left => re"\\left." | re"\\left" * token_command,
:newline => (re"\\" * re"\\") | re"\\n",
:dollar => re"$"
]
Expand Down
59 changes: 59 additions & 0 deletions test/parser.jl
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,65 @@ end

@test_throws TeXParseError texparse(raw"\left( x")
@test_throws TeXParseError texparse(raw"x \right)")

## all `delimiter_symbols`
test_parse(raw"|", (:delimiter, '|'))
test_parse(raw"/", (:delimiter, '/'))
test_parse(raw"\\", (:delimiter, '\\'))
test_parse(raw"(", (:delimiter, '('))
test_parse(raw")", (:delimiter, ')'))
test_parse(raw"[", (:delimiter, '['))
test_parse(raw"]", (:delimiter, ']'))
test_parse(raw"⟨", (:delimiter, '⟨'))
test_parse(raw"⟩", (:delimiter, '⟩'))
test_parse(raw"‖", (:delimiter, '‖'))
test_parse(raw"⌈", (:delimiter, '⌈'))
test_parse(raw"⌉", (:delimiter, '⌉'))
test_parse(raw"⌊", (:delimiter, '⌊'))
test_parse(raw"⌋", (:delimiter, '⌋'))
test_parse(raw"⌜", (:delimiter, '⌜'))
test_parse(raw"⌝", (:delimiter, '⌝'))
test_parse(raw"⌞", (:delimiter, '⌞'))
test_parse(raw"⌟", (:delimiter, '⌟'))

test_parse(raw"<", (:space, '<')) # formerly, this was a delimiter
test_parse(raw">", (:space, '>'))

## all `delimiter_commands`
test_parse(raw"\vert", (:delimiter, '|'))
test_parse(raw"\slash", (:delimiter, '/'))
test_parse(raw"\backslash", (:delimiter, '\\'))
test_parse(raw"\lbrack", (:delimiter, '['))
test_parse(raw"\rbrack", (:delimiter, ']'))
test_parse(raw"\langle", (:delimiter, '⟨'))
test_parse(raw"\rangle", (:delimiter, '⟩'))
test_parse(raw"\|", (:delimiter, '‖'))
test_parse(raw"\Vert", (:delimiter, '‖'))
test_parse(raw"\lceil", (:delimiter, '⌈'))
test_parse(raw"\rceil", (:delimiter, '⌉'))
test_parse(raw"\lfloor", (:delimiter, '⌊'))
test_parse(raw"\lfloor", (:delimiter, '⌊'))
test_parse(raw"\ulcorner", (:delimiter, '⌜'))
test_parse(raw"\urcorner", (:delimiter, '⌝'))
test_parse(raw"\llcorner", (:delimiter, '⌞'))
test_parse(raw"\lrcorner", (:delimiter, '⌟'))
test_parse(raw"\{", (:delimiter, '{'))
test_parse(raw"\}", (:delimiter, '}'))
test_parse(raw"\lbrace", (:delimiter, '{'))
test_parse(raw"\rbrace", (:delimiter, '}'))

### test commands as arguments to a delimited group
for (cmd_str, delim_symb) in pairs(MathTeXEngine.delimiter_commands)
## NOTE this does not check for "correct" left right pairs like `\lbrack` and `\rbrack`
test_parse(
"\\left$(cmd_str)\\right$(cmd_str)",
(:delimited,
(:delimiter, delim_symb),
(:group,),
(:delimiter, delim_symb)
)
)
end
end

@testset "Fonts" begin
Expand Down
Loading