<div dir="ltr"><div>Very cool! And unexpected. That reminds me, I think I actually need to upload a fresh version of the FPC multiline strings patch to that bugtracker issue... had to fix some merge conflicts recently in my personal branch, so the currently uploaded patch probably is not properly applicable.</div><div dir="ltr"><br></div><div dir="ltr">On Tue, Dec 8, 2020 at 8:33 PM Michael Van Canneyt <<a href="mailto:michael@freepascal.org">michael@freepascal.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Hello,<br>
<br>
I have implemented support for multiline strings and the $INCLUDESTRING or<br>
INCLUDESTRINGFILE directive.<br>
<br>
I have used the same approach as the patches for the same features in<br>
Free Pascal: These are currently only in the bugtracker, but are scheduled<br>
to be applied in the hopefully near future...<br>
<br>
How does it work ?<br>
<br>
Multiline strings must be enabled with a modeswitch:<br>
<br>
{$MODESWITCH MULTILINESTRINGS}<br>
<br>
When enabled, you can use multiline strings.<br>
<br>
The backtick indicates a multi-line string:<br>
<br>
Const<br>
   SMyMulti = `My<br>
string<br>
that <br>
spans multiple lines`;<br>
<br>
Will create a multiple-line string.<br>
<br>
To include a backtick in the string itself, duplicate it:<br>
Const<br>
   SMyMulti = `My<br>
string<br>
that   ``is quoted`` and<br>
spans multiple lines`;<br>
<br>
#12 etc. will work as for normal strings.<br>
<br>
The line endings in the literal string are controlled by the MULTILINESTRINGLINEENDING<br>
directive:<br>
<br>
{$MULTILINESTRINGLINEENDING CR|LF|CRLF|SOURCE|PLATFORM}<br>
<br>
The value SOURCE means the line ending of the source file is taken,<br>
the other values enforce a particular line ending, where PLATFORM is the<br>
line ending of the compiler platform. CR, LF or CRLF are<br>
self-explanatory.<br>
<br>
'Platform' is the default.<br>
<br>
The multiline string can also have initial spaces stripped; This is<br>
controlled by the MULTILINESTRINGTRIMLEFT directive:<br>
<br>
{$MULTILINESTRINGTRIMLEFT N|AUTO|ALL}<br>
<br>
N is an integer: At most N spaces will be stripped.<br>
AUTO means the position of the initial backtick is used to determine how<br>
many spaces will be stripped..<br>
ALL means all spaces will be stripped.<br>
<br>
{$MULTILINESTRINGTRIMLEFT AUTO}<br>
Const<br>
  S = `SELECT<br>
         *<br>
       FROM<br>
         MyTable`;<br>
<br>
is equivalent to<br>
<br>
{$MULTILINESTRINGTRIMLEFT 0}<br>
Const<br>
  S = `SELECT<br>
   *<br>
FROM<br>
   MyTable`;<br>
<br>
<br>
<br>
The $INCLUDESTRING directive will include the file as a literal string.<br>
<br>
This means that:<br>
<br>
Const<br>
   A = {$INCLUDESTRING myinclude.inc};<br>
<br>
Will define a constant A that has as a value the contents of myinclude.inc<br>
{$INCLUDESTRINGFILE myinclude.inc)<br>
has the same effect.<br>
<br>
The line endings in the constant A are determined also from the <br>
MULTILINESTRINGLINEENDING directive: the include file is read line by line<br>
and lines will be separated using the same mechanism as for multiline<br>
strings.<br>
<br>
The include file is searched using the include file path, just as for $I.<br>
<br>
These mechanisms have been implemented in the scanner/parser for pas2js in<br>
trunk. The 2.0 version will not have this.<br>
<br>
Some details may change when FPC gets the support for these features (for<br>
compatibility) but they will probably be minor.<br>
<br>
Enjoy,<br>
<br>
Michael.<br>
<br>
_______________________________________________<br>
Pas2js maillist  -  <a href="mailto:Pas2js@lists.freepascal.org" target="_blank">Pas2js@lists.freepascal.org</a><br>
<a href="https://lists.freepascal.org/cgi-bin/mailman/listinfo/pas2js" rel="noreferrer" target="_blank">https://lists.freepascal.org/cgi-bin/mailman/listinfo/pas2js</a><br>
</blockquote></div></div>