%This language support file for julia for the package Tcode is incomplete.

\newcount\catcodebeforejulia \catcodebeforejulia=\catcode`@

\input Tcode.tex %The core
\ThisIsLanguage{julia} %Only needed if julia is mixed with other languages in the same document
\input Tutils-fastfonts-2.tex %In case this is used with Latex, for considerably faster font switch in the snippets. Comment this out
					%if you don't like it. We use the "2" version because we are using also bold (\Cbold below).

%%---------------------------------------------------------------------------------------------

\DeclareCommentChar{#}
\DeclareString %This makes "some text" be recognised as a String.
\DeclareStringLike{'}{CharLiteral}

%Macros begin with @.
\def\OtherCharsInIdent{\catcode`@=11 }

\def\testjuliamacro#1@#2\if{\def\temp{#1}\ifx\temp\empty}
%Recognise @macros, functions( and .modules (the latter can be deactivated)
\def\PrePrintLongHook@julia#1{%
  \ifx\FormatToApply\undefined
    \exP\testjuliamacro\the\WordToPrint @\if
      \@FormatToApply{Macro}
    \else\ifx(#1\@FormatToApply{Function}%
    \else\ifx.#1\ifx\FormatjuliaBeforeDot\empty\else \@FormatToApply{\FormatjuliaBeforeDot}\fi
    \fi\fi\fi
  \fi
  \PrePrintHook
}
\def\FormatjuliaBeforeDot{Module} %By default, module
%\def\FormatjuliaBeforeDot{} %If you don't want those words to be recognized as modules.

%Allow a ! within names, but only if it is not the first character
\def\Ncode@Word@julia{\catcode`!=11 \Ncode@Word@kernel}
\def\NcodeEndWord@julia{\catcode`!=12 \NcodeEndWord@kernel}

\def\ReloadLang@julia{%Only needed if several languages are used in the same document and changes are not local
  \let\PrePrintLongHook\PrePrintLongHook@julia
  \let\Ncode@Word\Ncode@Word@julia
  \let\NcodeEndWord\NcodeEndWord@julia
}
\ReloadLang@julia %But we must execute those \let here, of course.

\catcode`@=\catcodebeforejulia

\unless\ifdefined\color
   \input pdfcolor-rg.tex %Comment out if you prefer to include a colour package later
\fi

%%---------------------------------------------------------------------------------------------

%\input juliahighlighting_1.tex %Rather than writing the definitions directly here

\input highlighting_common.tex %Selects \DefineColor according to what colour package (or none) has been loaded

\DefineColor{julia-comment}{0.4, 0.52, 0.4} %We name colours like this in order to avoid clashes with other language packages
\DefineColor{julia-module}{0.3, 0.06, 0}
\DefineColor{julia-type}{0, 0, 0.5}
\DefineColor{julia-function}{0.45, 0.1, 0.6}
\DefineColor{julia-macro}{0.34, 0.07, 0.45}

%Assume red is already defined
\TcodeDefineFormat{Comment}{\color{julia-comment}}
\TcodeDefineFormat{String}{\color{red}}
\TcodeDefineFormat{CharLiteral}{\color{red}}
\TcodeDefineFormat{Keyword}{\Cbold}
\TcodeDefineFormat{Module}{\color{julia-module}}
\TcodeDefineFormat{Type}{\color{julia-type}}
\TcodeDefineFormat{Function}{\color{julia-function}}
\TcodeDefineFormat{Macro}{\Cbold\color{julia-macro}}

%Now define \Cbold
\unless\ifdefined\Cbold % If we are in Latex, Tutils-fastfonts-2.tex above already defines it.
  \ifdefined\bfseries \let\Cbold\bfseries
  \else \let\Cbold\bf
  \fi
\fi

%%---------------------------------------------------------------------------------------------

%\input juliawords.tex %Rather than write them directly here

\MakeWord{baremodule}{Keyword}
\MakeWord{begin}{Keyword}
\MakeWord{break}{Keyword}
\MakeWord{catch}{Keyword}
\MakeWord{const}{Keyword}
\MakeWord{continue}{Keyword}
\MakeWord{do}{Keyword}
\MakeWord{else}{Keyword}
\MakeWord{elseif}{Keyword}
\MakeWord{end}{Keyword}
\MakeWord{export}{Keyword}
\MakeWord{false}{Keyword}
\MakeWord{finally}{Keyword}
\MakeWord{for}{Keyword}
\MakeWord{function}{Keyword}
\MakeWord{global}{Keyword}
\MakeWord{if}{Keyword}
\MakeWord{import}{Keyword}
\MakeWord{let}{Keyword}
\MakeWord{local}{Keyword}
\MakeWord{macro}{Keyword}
\MakeWord{module}{Keyword}
\MakeWord{quote}{Keyword}
\MakeWord{return}{Keyword}
\MakeWord{struct}{Keyword}
\MakeWord{true}{Keyword}
\MakeWord{try}{Keyword}
\MakeWord{using}{Keyword}
\MakeWord{while}{Keyword}

\MakeWord{abstract}{Keyword}
\MakeWord{mutable}{Keyword}
\MakeWord{primitive}{Keyword}
\MakeWord{type}{Keyword}
\MakeWord{is}{Keyword}
\MakeWord{isa}{Keyword}
\MakeWord{where}{Keyword}
\MakeWord{public}{Keyword}
\MakeWord{outer}{Keyword}
\MakeWord{as}{Keyword}

%Besides those listed here, by default any word followed by a . is recognized as Module, as in MyModule.disc().
%This may be cancelled by writing \let\FormatjuliaBeforeDot\undefined.
\MakeWord{Main}{Module}
\MakeWord{Core}{Module}
\MakeWord{Base}{Module}
%
\MakeWord{Broadcast}{Module}
\MakeWord{Docs}{Module}
\MakeWord{Iterators}{Module}
\MakeWord{Libc}{Module}
\MakeWord{Meta}{Module}
\MakeWord{StackTraces}{Module}
\MakeWord{Sys}{Module}
\MakeWord{Threads}{Module}
\MakeWord{GC}{Module}

\MakeWord{Bool}{Type}
\MakeWord{Int8}{Type}
\MakeWord{Int16}{Type}
\MakeWord{Int32}{Type}
\MakeWord{Int64}{Type}
\MakeWord{Int128}{Type}
\MakeWord{BigInt}{Type}
\MakeWord{UInt8}{Type}
\MakeWord{UInt16}{Type}
\MakeWord{UInt32}{Type}
\MakeWord{UInt64}{Type}
\MakeWord{UInt128}{Type}
\MakeWord{BigUInt}{Type}
\MakeWord{Float16}{Type}
\MakeWord{Float32}{Type}
\MakeWord{Float64}{Type}
\MakeWord{BigFloat}{Type}
%
\MakeWord{Complex}{Type}
\MakeWord{Rational}{Type}
\MakeWord{Irrational}{Type}
\MakeWord{Int}{Type} %Alias
\MakeWord{Uint}{Type} %Alias

%Abstract types
\MakeWord{Number}{Type}
\MakeWord{Real}{Type}
\MakeWord{AbstractFloat}{Type}
\MakeWord{Integer}{Type}
\MakeWord{Signed}{Type}
\MakeWord{Unsigned}{Type}
\MakeWord{AbstractIrrational}{Type}