%% Copyright (C) 2017-2018 Achim D. Brucker, https://www.brucker.ch
%%
%% License:
%%   This program can be redistributed and/or modified under the terms
%%   of the LaTeX Project Public License Distributed from CTAN
%%   archives in directory macros/latex/base/lppl.txt; either
%%   version 1.3c of the License, or (at your opinion) any later version.
%%   OR
%%   The 2-clause BSD-style license.
%%
%%   SPDX-License-Identifier: LPPL-1.3c+ OR BSD-2-Clause
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{lh-listings}
   [2016/09/10 v0.0 The LogicalHacking Listings Style.]
\RequirePackage{listings}

\ProcessOptions\relax

\lstloadlanguages{Java, C, HTML, OCL, TeX, SH, Ruby, SQL}



\newenvironment{btHighlight}[1][]
{\begingroup\tikzset{bt@Highlight@par/.style={#1}}\begin{lrbox}{\@tempboxa}}
{\end{lrbox}\bt@HL@box[bt@Highlight@par]{\@tempboxa}\endgroup}

\newcommand\btHL[1][]{%
  \begin{btHighlight}[#1]\bgroup\aftergroup\bt@HL@endenv%
}
\def\bt@HL@endenv{%
  \end{btHighlight}%
  \egroup
}
\newcommand{\bt@HL@box}[2][]{%
  \tikz[#1]{%
    \pgfpathrectangle{\pgfpoint{1pt}{0pt}}{\pgfpoint{\wd #2}{\ht #2}}%
    \pgfusepath{use as bounding box}%
    \node[anchor=base west, fill=orange!30,outer sep=0pt,inner xsep=1pt, inner ysep=0pt, rounded corners=3pt, minimum height=\ht\strutbox+1pt,#1]{\raisebox{1pt}{\strut}\strut\usebox{#2}};
  }%
}




\lstdefinestyle{sh}{language=sh,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
}
\lstdefinestyle{displaysh}{style=sh,
  basicstyle=\ttfamily\footnotesize,
  backgroundcolor=\color{black!4}, frame=lines,
  framexleftmargin=5pt}%

\lstnewenvironment{sh}[1][]{\lstset{style=displaysh, #1}}{}
\def\inlinesh{\lstinline[style=sh, columns=fullflexible]}

\lstdefinestyle{java}{language=Java,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
  moredelim=**[is][{\btHL[fill=green!30,draw=red,dashed,thin]}]{@}{@}
}
\lstdefinestyle{displayjava}{style=java,
                basicstyle=\ttfamily\footnotesize,
                backgroundcolor=\color{black!2}, frame=lines}%

\lstnewenvironment{java}[1][]{\lstset{style=displayjava, #1}}{}
\def\inlinejava{\lstinline[style=java, columns=fullflexible]}

\lstdefinestyle{ruby}{language=Ruby,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
}
\lstdefinestyle{displayruby}{style=ruby,
                basicstyle=\ttfamily\footnotesize,
                backgroundcolor=\color{black!2}, frame=lines}%

\lstnewenvironment{ruby}[1][]{\lstset{style=displayruby, #1}}{}
\def\inlineruby{\lstinline[style=ruby, columns=fullflexible]}

\lstdefinestyle{sql}{language=SQL,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
}
\lstdefinestyle{displaysql}{style=sql,
                basicstyle=\ttfamily\footnotesize,
                backgroundcolor=\color{black!2}, frame=lines}%

\lstnewenvironment{sql}[1][]{\lstset{style=displaysql, #1}}{}
\def\inlinesql{\lstinline[style=sql, columns=fullflexible]}

\lstdefinestyle{c}{language=C,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{lhOrange},
  ndkeywordstyle=\color{lhCyan},
}

\lstdefinestyle{displayc}{style=c,
                basicstyle=\ttfamily\footnotesize,
                backgroundcolor=\color{black!4}, frame=lines,
                numbers=left, numberstyle=\tiny,framexleftmargin=5pt}%

\lstnewenvironment{C}[1][]{\lstset{style=displayc, #1}}{}
\def\inlineC{\lstinline[style=c, columns=fullflexible]}


\lstdefinestyle{ltx}{language=[LaTeX]TeX,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
}
\lstdefinestyle{displayltx}{style=ltx,
                basicstyle=\ttfamily\footnotesize,
                backgroundcolor=\color{black!2}, frame=lines}%

\lstnewenvironment{ltx}[1][]{\lstset{style=displayltx, #1}}{}
\def\inlineltx{\lstinline[style=ltx, columns=fullflexible]}


\lstdefinestyle{html}{language=XML,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
}
\lstdefinestyle{displayhtml}{style=html,
                floatplacement={tbp}, captionpos=b, framexleftmargin=0pt,
                basicstyle=\ttfamily\scriptsize,
                backgroundcolor=\color{black!2}, frame=lines,
                % numbers=left, numberstyle=\tiny, stepnumber=5
              }

\lstnewenvironment{html}[1][]{\lstset{style=displayhtml, #1}}{}
\def\inlinehtml{\lstinline[style=html, columns=fullflexible]}

\lstdefinelanguage{AnB}{
  keywords={Protocol, Types, Agent, Number, Function, Knowledge, Actions,
  Goals, Symmetric_key},
  keywordstyle=\color{lhOrange},
  ndkeywords={inv},
  ndkeywordstyle=\color{lhCyan},
  %identifierstyle=\color{black},
  sensitive=false,
  escapeinside={\%*}{*)},
  comment=[l]{\#},
  %morecomment=[s]{/*}{*/},
  commentstyle=\color{purple}\ttfamily,
  %stringstyle=\color{red}\ttfamily,
  %morestring=[b]',
  %morestring=[b]"
}

\lstdefinestyle{AnB}{language=AnB,
  basicstyle=\small\ttfamily,
}
\lstnewenvironment{AnB}[1][]{\lstset{style=AnB, #1}}{}
\def\inlineAnB{\lstinline[style=AnB, columns=fullflexible]}

\lstdefinelanguage{JavaScript}{
  keywords={typeof, new, true, false, catch, function, return, null, catch, switch, var, if, in, while, do, else, case, break},
  keywordstyle=\color{blue}\bfseries,
  ndkeywords={class, export, boolean, throw, implements, import, this},
  ndkeywordstyle=\color{darkgray}\bfseries,
  identifierstyle=\color{black},
  sensitive=false,
  comment=[l]{//},
  morecomment=[s]{/*}{*/},
  commentstyle=\color{purple}\ttfamily,
  stringstyle=\color{red}\ttfamily,
  morestring=[b]',
  morestring=[b]"
}

\lstdefinestyle{js}{language=JavaScript,
  basicstyle=\ttfamily,
  commentstyle=\itshape,
  keywordstyle=\color{blue},
  ndkeywordstyle=\color{blue},
  moredelim=**[is][{\btHL[fill=green!30,draw=red,dashed,thin]}]{@}{@},
}

\lstdefinestyle{displayjs}{style=js,
                floatplacement={tbp}, captionpos=b, framexleftmargin=0pt,
                basicstyle=\ttfamily\scriptsize,
                backgroundcolor=\color{black!2}, frame=lines,
                % numbers=left, numberstyle=\tiny, stepnumber=5
              }

\lstnewenvironment{js}[1][]{\lstset{style=displayjs, #1}}{}
\def\inlinejs{\lstinline[style=js, columns=fullflexible]}

\endinput
