|
What this is
Other links
The source code
/*
* ASPTokenMarker.java
* Copyright (c) 1999 André Kaplan
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.gjt.sp.jedit.syntax;
import java.util.Enumeration;
import java.util.Stack;
import javax.swing.text.Segment;
import gnu.regexp.*;
/**
* An utility class to save some relevant infos (language and client/server side)
* found in SCRIPT Tags or <%@ like Tags
*
* @author Andre Kaplan
* @version 0.6
*/
class ASPStateInfo
{
ASPStateInfo() {}
ASPStateInfo(boolean client, String language)
{
this.client = client;
this.language = language;
}
void init(boolean client, String language)
{
this.client = client;
this.language = language;
}
public boolean equals(Object o)
{
if (o == null || !(o instanceof ASPStateInfo))
{
return false;
}
ASPStateInfo other = (ASPStateInfo)o;
return ((this.client == other.client) && this.language.equals(other.language));
}
byte toASPMode()
{
for (int i = 0; i < modes.length; i++)
{
if (this.equals(modes[i][0]))
{
return ((Byte)modes[i][1]).byteValue();
}
}
return ASPMode.HTML;
}
void display(java.io.PrintStream o)
{
o.println("LANGUAGE: [" + this.language + "]");
o.println("CLIENT: [" + this.client + "]");
}
boolean client = true;
String language = "javascript";
private static Object[][] modes = new Object[][] {
new Object[] { new ASPStateInfo(true, "html"), new Byte(ASPMode.HTML) }
,new Object[] { new ASPStateInfo(false, "html"), new Byte(ASPMode.HTML) }
,new Object[] { new ASPStateInfo(true, "javascript"), new Byte(ASPMode.CSJS) }
,new Object[] { new ASPStateInfo(true, "jscript"), new Byte(ASPMode.CSJS) }
,new Object[] { new ASPStateInfo(false, "javascript"), new Byte(ASPMode.SSJS) }
,new Object[] { new ASPStateInfo(false, "jscript"), new Byte(ASPMode.SSJS) }
,new Object[] { new ASPStateInfo(true, "vbscript"), new Byte(ASPMode.CSVB) }
,new Object[] { new ASPStateInfo(false, "vbscript"), new Byte(ASPMode.SSVB) }
,new Object[] { new ASPStateInfo(true, "perlscript"), new Byte(ASPMode.CSPS) }
,new Object[] { new ASPStateInfo(false, "perlscript"), new Byte(ASPMode.SSPS) }
};
}
/**
* ASP Token Marker.
* TO DO: CSS support, HTML Entities, HTML Attributes & Values colorizing
*
* @author Andre Kaplan
* @version 0.6
*/
public class ASPTokenMarker
extends TokenMarker
implements TokenMarkerWithAddToken
{
// Token to request next line parsing when the mode has changed
public static final byte MODE_CHANGE = Token.INTERNAL_FIRST;
public ASPTokenMarker()
{
}
public void addToken(int length, byte id)
{
super.addToken(length, id);
}
// **************
// markTokensImpl
// **************
protected byte markTokensImpl(byte token, Segment line, int lineIndex)
{
TokenMarkerContext tokenContext = new TokenMarkerContext(line, lineIndex, this, this.lineInfo);
// We store the old defaultASPMode
byte defaultASPMode = this.defaultASPMode;
MultiModeToken prevLineToken = MultiModeToken.NULL;
if ( tokenContext.prevLineInfo != null
&& tokenContext.prevLineInfo.obj != null
&& tokenContext.prevLineInfo.obj instanceof MultiModeToken
)
{
prevLineToken = (MultiModeToken)tokenContext.prevLineInfo.obj;
}
MultiModeToken currLineToken = MultiModeToken.NULL;
if ( tokenContext.currLineInfo != null
&& tokenContext.currLineInfo.obj != null
&& tokenContext.currLineInfo.obj instanceof MultiModeToken
)
{
currLineToken = (MultiModeToken)tokenContext.currLineInfo.obj;
}
MultiModeToken res = this.markTokensImpl(prevLineToken, tokenContext);
byte retval = res.token;
// We check if mode has changed
if (
(defaultASPMode != this.defaultASPMode || currLineToken.mode != res.mode)
&& (currLineToken.token == res.token)
)
{
// We inform markTokens that the mode has changed
retval = MODE_CHANGE;
}
tokenContext.currLineInfo.obj = res;
return retval;
}
// **************
// markTokensImpl
// **************
MultiModeToken markTokensImpl(final MultiModeToken token, TokenMarkerContext tokenContext)
{
MultiModeToken res = new MultiModeToken(token);
loop: for (this.debug.reset(); tokenContext.hasMoreChars(); )
{
char c = tokenContext.getChar();
if (!this.debug.isOK(tokenContext)) {
// We got stuck here at some point
// Log this and increment tokenContext.pos to escape this
tokenContext.pos++;
}
// Switch to ASP Mode if <% found at pos
// Except if already in a server-side mode
if ( (res.mode != ASPMode.HTML_SCRIPT)
&& (res.mode != ASPMode.SSI)
&& (res.mode != ASPMode.ASP)
&& (res.mode != ASPMode.ASP_CFG)
&& (res.mode != ASPMode.SSVB)
&& (res.mode != ASPMode.SSJS)
&& (res.mode != ASPMode.SSPS)
)
{
if (this.doASP(res, tokenContext)) {
continue; }
}
// Switch to HTML_SCRIPT Mode if "))
{
tokenContext.addTokenToPos(mmt.token);
byte b = Token.KEYWORD1;
if (this.modes.empty()) {
mmt.reset();
} else {
mmt.assign((MultiModeToken)(this.modes.pop()));
if (mmt.mode == ASPMode.HTML_COMMENT) {
b = mmt.token;
}
}
tokenContext.pos += 9;
tokenContext.addTokenToPos(b);
return true;
}
return false;
}
// private members
private KeywordMap keywords;
private ASPStateInfo stateInfo = new ASPStateInfo();
private byte defaultASPMode = ASPMode.SSVB;
private TokenMarkerDebugger debug = new TokenMarkerDebugger();
private MultiModeTokenMarkerWithContext vbs = new ASPVBScriptTokenMarker(false);
private MultiModeTokenMarkerWithContext js = new ASPJavascriptTokenMarker(false);
private MultiModeTokenMarkerWithContext ps = new ASPPerlscriptTokenMarker(false);
private Stack modes = new Stack();
private static RE language = null;
private static RE runat = null;
static {
try {
language = new RE(
"^language\\s*=\\s*[\"']?(jscript|javascript|perlscript|vbscript)([0-9]*|[0-9]+(?:\\.[0-9]+){0,2})[\"']?", RE.REG_ICASE);
}
catch (REException ree)
{
}
try {
runat = new RE("^runat\\s*=\\s*[\"']?(server)[\"']?", RE.REG_ICASE);
}
catch (REException ree)
{
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.