highlight.fsp - Frink Server Pages highlighter
  
   [Try highlight.fsp]
  
  
  <% use ../HTMLUtils.frink %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
<HTML LANG="en">
 <%  if ! isVariableDefined["fileName"]
        if isVariableDefined["f"]
           fileName = f      // Moving to using variable "f"
     fe = HTMLEncode[fileName]
     canonical = "https://frinklang.org/fsp/highlight.fsp?f=$fe"
 %>
 <HEAD>
  <TITLE>$fe - Frink Server Pages Highlighter</TITLE>
  <META HTTP-EQUIV="Default-Style" CONTENT="APE Airy">
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> 
  <META NAME="viewport" CONTENT="width=device-width, initial-scale=1.0">
  <LINK REL="StyleSheet" HREF="/frinkdocs/apeairy.css" TYPE="text/css"
        TITLE="APE Airy"> 
  <LINK REL="Alternate StyleSheet" HREF="/frinkdocs/spaceship.css"
        TYPE="text/css" TITLE="Spaceship">
  <LINK REL="Alternate StyleSheet" HREF="/frinkdocs/style.css" TYPE="text/css"
        TITLE="APE Classic">
  <LINK REL="Alternate StyleSheet" HREF="/frinkdocs/style2.css" TYPE="text/css"
        TITLE="Compact"> 
  <LINK REL="apple-touch-icon" SIZES="180x180" HREF="/frinkdocs/apple-touch-icon.png">
  <LINK REL="icon" type="image/png" SIZES="32x32" HREF="/frinkdocs/favicon-32x32.png">
  <LINK REL="icon" type="image/png" SIZES="16x16" HREF="/frinkdocs/favicon-16x16.png">
  <LINK REL="manifest" HREF="/frinkdocs/site.webmanifest">
  <LINK REL="canonical" HREF="$canonical">
 </HEAD>
 <BODY>
  <H1>$fe - Frink Server Pages highlighter</H1>
  <P CLASS="CENTER">
   [<A HREF="/fsp/$fe">Try $fe</A>]
  </P>
  
  <% 
     baseFile = "file:///$FSPRoot/"
  if ((fileName =~ %r/\.\./) or (! (fileName =~ %r/\.fsp$/)))
     println["<P CLASS=\"CENTER\"><B>Nice try.</B></P>"]
  else
  {
     file = "$baseFile$fileName"
     print["<DIV CLASS=\"code\">" + highlightFile[file] + "</DIV>"]
  }
  highlightFile[filename] :=
  {
     text = read[filename]
     text =~ %s/&/&/g
     text =~ %s/</</g
     text =~ %s/>/>/g
     text =~ %s/ / /g
     // Link "use" programs.
     text =~ %s/^((?: )*use(?: )+(?:\.\.\/)?)(\S+)/$1<A HREF="colorize.fsp?f=$2">$2<\/A>/gm
     
     // Find $varname
     if FrinkGeneration[] == 0
        text =~ %s/(\$[[:alpha:]]([[:alpha:]]|[[:digit:]]|_)*)/<CODE CLASS="fsp">$1<\/CODE>/g
     else
        text =~ %s/(\$\p{Alpha}(\p{Alpha}|\p{Digit}|_)*)/<CODE CLASS="fsp">$1<\/CODE>/g
     // Find ${varname} including possible Unicode escape sequences
     if FrinkGeneration[] == 0
        text =~ %s/(\$\{(?:\\u|[[:alpha:]])(\\u|[[:alpha:]]|[[:digit:]]|_)*\})/<CODE CLASS="fsp">$1<\/CODE>/g
     else 
        text =~ %s/(\$\{(?:\\u|\p{Alpha})(\\u|\p{Alpha}|\p{Digit}|_)*\})/<CODE CLASS="fsp">$1<\/CODE>/g
          
     // Highlight remaining Unicode escape sequences
     text =~ %s/([^${])(\\u[0-9a-fA-F]{4})/$1<CODE CLASS="fsp">$2<\/CODE>/g
     // Matches single-line FSP code snippets
     text =~ %s/<(%=?)([^\r\n]*?)%>/<CODE CLASS="fsp">&llt;$1$2%><\/CODE>/gs
     // Matches code snippets that start and end with FSP block delimiters
     // on their own lines
     text =~ %s/[\r\n]((?: )*)<(%=?.*?%>)(?: )*[\r\n]/<\/DIV><DIV CLASS="fsp">$1&llt;$2<\/DIV><DIV CLASS="code">/gs
     // Matches other not-so-clean multi-line FSP blocks
     text =~ %s/(<%=?[^\r\n]*)([\r\n].*?)([^\r\n]*)%>/<CODE CLASS="fsp">$1<\/CODE><\/DIV><DIV CLASS="fsp">$2<\/DIV><DIV CLASS="code"><CODE CLASS="fsp">$3%><\/CODE>/gs
     text =~ %s/&llt;/</g
     
     text =~ %s/(\r\n|\n\r?)/<BR>\n/g
     return text
  }
  %>
  
  <P CLASS="CENTER">
   [<A HREF="/fsp/$fe">Try $fe</A>]
  </P>
  
  <HR>
  <P>
   <I>Alan Eliasen</I>, <A HREF="mailto:eliasen@mindspring.com">eliasen@mindspring.com</A>
  </P>
  <P>
   Back to <A HREF="/frinkdocs/fspdocs.html">Frink Server Pages
    documentation.</A>
  </P>  
 </BODY>
</HTML>
  
  
   [Try highlight.fsp]
  
  
  
  
   Alan Eliasen, eliasen@mindspring.com
  
  
   Back to Frink Server Pages
    documentation.