<%
'MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
sub compile_source(pnow)
'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
dim WName 'KK.07.17.01
dim c1,c2,c3
dim gosml, godown
dim WSCut, WSCutLen
dim j,k
dim wi,ws
'set_debug
source = source & ve & ve
'set_debug
if deb then printl " source=" & source
i = parse_s_ml_header(1,source,false)
'"false" to not redefine pars. if not found;
TLen = len(source)
t = "" ' great beginning, empty page
tt = ""
d = 0
makei(d)
p(0) = get_i("#start")
tag_state = false
set_state_attr
SelfNamedFlag = "" 'KK.07.17.01
do while i <= Tlen - 2
c1 = mid(source, i, 1)
c2 = mid(source, i+1, 1)
c3 = mid(source, i+2, 1)
c = c1
if deb then printl "curr state(" & pcurrent & ")=`" & elemcur & "` current characters=c1,c2,c3 =`" & _
c1 & "` `" & c2 & "` `" & c3 & "` tag=" & tag_state & " was established by encountering `" & pscut(d) & "` " & " i=" & i
godown = false ' assume that we will meet some special chars ...
gosml = true ' assume not in the foreign script area ...
'======================================================================================
' FOREIGH SCRIPT AREA
'--------------------------------------------------------------------------------------
if ForeignScriptFlag then
'we are inside of Foreign script
gosml = false 'if current element is
'foreign script, then do not shor-ml it ...
if lcase(c1) = contrcurr and _
c2 = xescape and _
isNeutral(c3) then '\ is not Neutral; \\ - won't be caught;
'triggering from foreign script;
gosml = true 'set gosml flag to swith to sml-mode:
'pass c1,c2,c3 to handle in sml code;
else
'byte by byte output is a horrible menthod:
add c1 'make normal output inside of foreign script;
end if
end if
'--------------------------------------------------------------------------------------
'ef FOREIGH SCRIPT AREA
'======================================================================================
if gosml then
'======================================================================================
' SHORT ML AREA
'--------------------------------------------------------------------------------------
' SO "\" CAN NOT BE INPUT IN TAG AREA ITSELF; INLY IN FORM "\."
' EXCEPTIONS: TAG PARAMENTERS STRING AREAS ...
if c1 = xescape then '=A; IF FIRST CHAR IS AN ESCAPE
'first escape is handled only in this =A block;
if c2=xself then
addi xescape 'add xescape char itself;
'\. has maximum precedence for \.x-triple;
i=i+1 'this results in making c3-position current;
elseif c2=SML_E_key then ' ^-mode
'EXTENTION OF SML-SCRIPT: ADDING SHORTCUTS
'LONGER THAN 2 CHARS E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E
'if SML_E_long(i_next_el) then
'so, at position i+1 found the first char of the long-scut;
for SML_E_i = 1 to SML_E_L
WSCut = SML_E_scut(SML_E_i)
WSCutLen = len(WSCut)
if mid( source, i+1, WSCutLen) = WScut then
'no need to terminate longscut;
add SML_E_value(SML_E_i)
i = i + WSCutLen '+1=> swallows terminator char, not good;
exit for
end if
next
'E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E=E
elseif tag_state then ' THIS IS A TAG STATE, CLOSE THE TAG ...
'// tag extends; escape IS PRESERVED (DEFFERED) FOR the next scan
'// and will CLOSE AN ELEMENT if neutral char will be encountered:
'// \D moo \space - will do <td></td>
extend_e
'TO RESET SYNTAX:
'useless closing-chain-reaction cause by \" "
'can be avoided if to put:
'if c2=inNeutral then i=i+1
i=i-1 ' keep escape conditions for next step handling ...
elseif isNeutral(c2) or _
c2 = xescape then ' to the beginning of loop
close_e
'preserve escaper, cr, lf; swallow others:
select case c2
case xescape
case " ", chr(9)
i=i+1
case else
add c2
i=i+1
end select
else
get_i_el c2
if i_next_el > 0 then ' opening normally ...
if i_next_el = p(d) then close_e ' this turns on option \D ..... \D which clolses previous \D
' first and then opens a new \D
' !!!! important turn: <td> ..</td><td> ...
' ..</tr><tr> ...
' make option in header to toggle this turn
' SEEMS nested <font> is not allowed.
open_e ' open el
tt = tt & t
if pnow then response.write t
t = ""
i = i + 1
else
add "<br>" & ve & "Unknown control """ & _
c2 & """ in shortcut: """ & _
c1 & c2 & """"
end if
end if
'''''''' END FIRST CHAR IS AN ESCAPE ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''' END FIRST CHAR IS AN ESCAPE ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
elseif tag_state then '=A; FIRST CHAR IS NORMAL
godown = true
else ' FIRST CHAR IS NORMAL
godown = true
'==========================================================
' HANDLE CLOSING SHORTCUTS LIKE x\
'----------------------------------------------------------
if c2 = xescape and _
( isNeutral(c3) or _
( c3=xescape and (xescape <> xself))) then
'case: x\'spacer'
'if tag_state then extend_e
if isNeutral(c1) then
wi = d
else
wi = index_closest_shortcut( lcase(c1) )
'predecessor might be found ...
if wi <1 then
add "Unspecified control " & c1 & _
" in closing shortcut """ & c1 & c2 & _
"""" & " at position in text " & i & _
ve & "By default, closing all open elements."
wi = d
end if
end if
k = d
for j=k to wi step - 1 'close all elements up to
'level wi;
close_e
next
if c3 = " " or _
c3 = chr(9) _
then
i=i+2 'swallow others;
else
i=i+1 'preserve c3=escaper,cr,lf
end if
godown = false ' go to the next loop step
'----------------------------------------------------------
end if ' HANDLE CLOSING SHORTCUTS
'==========================================================
end if '=A; ef IF FIRST CHAR IS AN ESCAPE or NORMAL
'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
if godown then ' N O S H O R T C U T S B E L O W; M A Y B E O N L Y P A R C U T S
' no else for this if.
'ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
if tag_state then '=1 INSIDE OF TAG
'ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
if isNeutral(c1) then '=2
extend_e 'spacer ultimately extends an element;
elseif c1 = tag_div and c2 = tag_div then '=1b
' escape tag divider char
add c1
i=i+1
elseif c1 = tag_div then '"," --> " "; for ex: \f.moo,boo x \ -->
'<font moo boo >x</font>
add " "
elseif no_more_scuts then '=2
add c1 'normal chars addition
elseif c1 = xtend then 'triggering to unshortcutted tag state
no_more_scuts = true
add " "
else
'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
' PARCUTS
'==========================================================================
tagelem = get_i_sub_el(pcurrent,c)
if tagelem = 0 then stope "parcut `" & c1 & "` does not not exists ... "
'=================================================================
if subelement(pcurrent,tagelem) <> "" then ' PARTYPE
'-----------------------------------------------------------------
if right(t,1) <> " " then add " " ' part of syntax
'then print subelement itself
add subelement(pcurrent, tagelem)
'handle tag element parameters
select case subeltype(pcurrent,tagelem) '==partype
case "#" : fill_numbers
case "#space"
do : ws = get_next
add ws
loop until ws = " "
case "1","2","3","4","5","6","7","8","9"
'"type is a digit"
j = cint(subeltype(pcurrent,tagelem))
'add as many chars as type is:
for k=1 to j
add get_next
next
'POSSIBLE MODIFICATIONS.
' cases can be addes to handle
' additional types
case """" 'assume that area inside of " .... "
WName = ""
do 'until ws = """"
ws = get_next 'get next char
select case ws
case """": add WName & """"
'POSSIBLE MODIFICATIONS.
' cases can be addes to handle
' additional functionality
case SelfNamed 'currently is "+"
SelfNamedFlag = ws
add WName & """"
extend_e
add WName
close_e
ws = """" ' to close do-loop
SelfNamedFlag = "" ' they are + and !
case VarEsc
ws = get_next
if ws=VarEsc then
Wname = WName & VarEsc
else
'this is an access ServerScript Variables:
select case ws
case path_info_esc
WName = WName & path_info
case this_page_esc
WName = WName & this_page
end select
end if
case SelfClosed
case else: WName = Wname & ws
end select
loop until ws = """"
end select
if right(t,1) <> " " then add " " 'part of syntax
'=================================================================
end if ' ef PARTYPE
'===========================================================================
' TRANSFORMING TAG
'---------------------------------------------------------------------------
'if need to tansform the state like T-->RD
i_next_el = enext(pcurrent, tagelem)
if deb then printl "next el found=`" & element(i_next_el)
if i_next_el <> 0 then
extend_e
e_next_el = element(i_next_el)
c_control = lcase(any_scut(i_next_el))
if i_next_el = p(d) then ' this may be wrong improvement
'add(" ") ' this string ... for example, to put something in cells;
close_e ' to treat like \DDDD\-
end if ' end this may be ...
open_e
end if
'--------------------------------------------------------------------------
'ef TRANSFORMING TAG
'===========================================================================
'===========================================================================
'ef PARAMETER SHORTCUTS
'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
end if '=2
else '=1 ef INSIDE OF TAG
'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
addi c1 'NORMAL TEXT OUTSIDE THE TAG
end if '=1
'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
end if '=0; DDD - DOWN BLOCK=SEEMS two first characters are normal
'ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
' E N D N O T O P L E V E L S H O R T C U T S B E L O W
'--------------------------------------------------------------------------------------
end if ' ef SHORT ML AREA
'======================================================================================
i = i + 1 ' this loop always advances pointer i ...
loop
'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
end sub ' ef compile_source
'MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
function index_closest_shortcut(c)
dim i
index_closest_shortcut = 0
for i=d to 1 step - 1
if pscut(i) = c then
index_closest_shortcut = i
exit for
end if
next
end function
'=============================================
sub set_state_attr
pcurrent = p(d)
elemcur = element(pcurrent)
low_elemcur = lcase(elemcur)
ilowcurr = get_i(low_elemcur)
contrcurr = pscut(d)
ForeignScriptFlag = foreign(pcurrent)
'array foreign keeps flag for
'foreign script ...
not_halfcurr = not halftag(pcurrent)
end sub
%>