2

I am trying to use listings to display Javascript code. Following the replies to another question, I worked out the following code:

\documentclass{article}
\usepackage{listings}
\lstdefinelanguage{JavaScript}{
    keywords={break, case, catch, continue, debugger, default, delete, do, else, 
              finally, for, function, if, in, instanceof, new, return, switch, 
              this, throw, try, typeof, var, void, while, with},
    morekeywords={class, export, boolean, throw, implements, import, this},
    comment=[l]{//},
    morecomment=[s]{/*}{*/},
    string=[b]",
    morestring=[b]',
    sensitive=true
}

\begin{document}
\begin{lstlisting}[breaklines={true}, language={Javascript}, numbers=left]
var string = "This is special' string";
var alpha = document.selection;
str = str.replace(/[!.:?,;\"]/g, '');
dictionary_access ("" + t );
var alpha = document.selection;
\end{lstlisting}
\end{document}

However the displayed listing does not have proper formatting (whitespaces being highlighted outside the string). I guess it is because the string delimiters are not escaped properly.

listing output

Someone else also had a similar issue with Basic. I have tried replacing [b] in string=[b]" with [bd], [m] for both single and double quote. Also tried using string=[s]"" but no success.

mythealias
  • 3,621

1 Answers1

3

It looks like what's going on is that listings is failing to recognize that the double quote in line 3 is inside a "string" (actually a regex, of course). As such, the double quote on line 3 opens a string literal that is closed by the first double quote on line 4, but then a new string literal is opened by the second double quote on line 4.

I think you should be able to fix this problem just by making / into a string delimiter. In other words, add

morestring=[b]/

to your \lstdefinelanguage.

There shouldn't be any issues with the interaction of " and ' with /, since / doesn't need to be escaped in "...", and vice versa.

senshin
  • 231
  • I tried this but now have the issue that the symbol for division doesn't work for example:

    number = number / 256; /* not a regex */

    some_other_number = number / 2;

    – Betsalel Williamson Sep 11 '19 at 00:12