<%
'======================================================================
'NextL and NextT use horrible method to parse text:
'insted to move cursor they cut text each time.
'======================================================================
sub stoper(s)
stope t & vh & "... short-ml error message ... " & vh & s
end sub
'======================================================================
' fuctions for language file compilation
'======================================================================
'======================================================================
' Parsing subroutines
' Method is ugly: parsed text variable (called "short" here)
' cut each time. No sliding pointer.
'======================================================================
'======================================================================
' takes word limited by < .33 chars
' result may be empty
' does not move along parsing file `short`
'----------------------------------------------------------------------
function ThisT ' just take current tocken, maybe empty
dim i
l = len(short)
for i=1 to l
if asc(mid(short,i,1)) < 33 then exit for
next
ThisT = left(short, i-1)
end function
'======================================================================
'======================================================================
' skips current tocken (=ThisT, which may be empty )
' goes to next tocken (>32) or lf
' takes next tocken or "" if nothing met before lf
' stops at this taken tocken
' never goes beyond lf
'----------------------------------------------------------------------
function NextT
dim ll, w, i, wi
NextT = ThisT
ll = len(NextT)
short = mid(short, ll+1 )
for ll = 1 to l
w = asc(mid(short, ll, 1))
if w > 32 or w = 10 then exit for
next
'Clean_div ttt...nnn
' lf
' ll
' lf
'
short = mid(short, ll )
'''''''''''''''''''''''''
wi = instr(short, vblf)
if wi = 0 then wi = len(short) + 1
saved_the_rest_of_line = left(short,wi-1)
saved_the_rest_of_line = replace(saved_the_rest_of_line, vbcr,"")
'''''''''''''''''''''''''
NextT = ThisT
end function
'======================================================================
'======================================================================
' lines
function ThisL
dim i, ii
i = instr(short, vblf)
if i > 1 and instr(short, i-1) = vbcr then i = i - 1
ThisL = left(short, i)
end function
'======================================================================
'======================================================================
' skipping current line, taking following line
function NextL
short = mid( short, instr(short, vblf)+1 )
NextL = ThisL
end function
'======================================================================
'========================================================
' goes to next block which can be
' rigth on the next line;
' NOTE: CURRENT LINE IS ALWAYS SKIPPED;
'--------------------------------------------------------
function NextB
NextL
do until ThisT <> ""
NextL
loop
NextB = ThisL
end function
'========================================================
'========================================================
' fuctions for source file compilation '
' find and return index of element or belonging (scope):
' with name s:
' returns 0 if not found.
'--------------------------------------------------------
function get_i(s)
dim i
i = 0
for i=1 to enumb
if s = element(i) then get_i = i
next
end function
'====================================================
'====================================================
'find index of element based on
'shortcut-character=c and currrent-scope=pcurrent:
'----------------------------------------------------
sub get_i_el(c)
dim i
c_control = lcase(c)
i = asc(c_control)
if i > 127 then stoper _
"control `" & c & "` asc > 127 ... "
i_next_el = tar(i,pcurrent)
if i_next_el = 0 then
i_next_el = tar(i,icommon)
if i_next_el > 0 then
if deb then printl _
"found in common state ..."
end if
end if
e_next_el = element(i_next_el)
if i_next_el > 0 then
if deb then printl " `" & e_next_el & _
"' found in common state ..."
end if
end sub
'====================================================
'====================================================
'DESC find element parameter index.
'
'programmed ugly: variable i is global and
'is source text cursor
'----------------------------------------------------
function get_i_sub_el(ll,c)
dim k,j,s
get_i_sub_el = 0
if ll < 1 or ll > enumb then _
exit function
'search index k by cycling
'via all element parameters:
'may be slow:
for k = 1 to tlim
s = sub_el_cut(ll,k)
'first empty paramenter name
'terminates search:
if s = "" then exit for
'Why not to make this simple:
'instr(i,source, s) = i
if c = left(s,1) then
if len(s) = 1 then
get_i_sub_el = k
exit function
else
if instr(i,source, s) = i then
' great, long element found
get_i_sub_el = k
i=i+len(s)-1
exit function
end if
end if
end if
next
end function
'====================================================
'====================================================
' make indenting string according nesting level
sub makei(d)
dim i
if IndentFlag = "" then exit sub
indents = IndentFlag
if d > 7 then
indents = indents & chr(9) & space(d-7) ' make more tabs here ...
else
indents = indents & space(d+1)
end if
end sub
'====================================================
' make indenting string and insert it
sub indent(d)
if IndentFlag = "" then exit sub
makei(d)
if indented then exit sub
'if deb then printl "now indenting with = " & d
t = t & indents
indented = true
end sub
'====================================================
'====================================================
sub add(s)
t = t & s
indented = false
end sub
'====================================================
'======================================================
sub addi(s) 'to indent text which starts from new line
'======================================================
if IndentFlag <> "" then
s = replace (s, vbcr, "")
s = replace (s, vblf, indents)
end if
t = t & s
indented = false
end sub
'====================================================
'======================================================
sub open_e 'opening element or tag of element;
'considering abbr. as element and
'putting it;
'opening
'------------------------------------------------------
if not tagable(i_next_el) then
'-----------------------
'NOT TAGABLE
'- - - - - - - - - - - -
if abbr(i_next_el) then
add e_next_el
else
if foreign(i_next_el) or extended(i_next_el) then indent d
add "<" & e_next_el
if not halftag(i_next_el) then add ">"
end if
if extended(i_next_el) then ' extended
d = d + 1
p(d) = i_next_el
'pscut - perhaps "past shortcut":
pscut(d) = c_control
if mark(p(d)) then add "<!+" & d & "+>"
end if
'-----------------------
else ' TAGABLE:
'- - - - - - - - - - - -
'if deb then printl " now must indent title ..."
if extended(i_next_el) then indent d
'ultimate indent may creates extra empty lines;
add "<" & e_next_el
'setup sub-state:-------------
d = d + 1
p(d) = get_i(ucase(e_next_el))
'-----------------------------
'perhaps memorize char, which
'triggered to this element:
pscut(d) = c_control
tag_state = true
'always allow to accept tagelements
'shortcuts from the beginning of tag:
no_more_scuts = false
end if
set_state_attr
end sub
'======================================================================
' tags which not need string input
' to extend a tag this is enough to decrease its case
' if it is not extendable, it will simply be closed ...
'----------------------------------------------------------------------
sub extend_e ' extend tag
dim wi
add ">"
tag_state = false
if extended(ilowcurr) then
p(d) = ilowcurr ' just decrease the case to change the state ...
if mark(p(d)) then add "<!+" & d & "+>" ' indent d
' not extended elements do not imply indenting ...
if ilowcurr = ibody then _
html_header_sent = true ' to make debug nice
' but may not optimal
else
test_d_low_limit
d = d - 1 ' not extendable must just disappear
' from levels ...
makei d
end if
set_state_attr
end sub
'======================================================================
'======================================================================
' closing state and decreasing level
'----------------------------------------------------------------------
sub close_e ' terminating tag
'set_debug
'if deb then printl " indenting with less on 1 than d=" & d & " indented= " & indented
'KK.07.17.01:
' SelfNamedFlag is a variable with tree possible values:
' "", SelfNamed, and SelfClosed:
if SelfNamedFlag <> SelfNamed and SelfNamedFlag <> SelfClosed _
then indent (d-1)
test_d_low_limit()
'if deb then printl " now adding after indenting closing element = " & elemcur
'graphics part -------------------
'KK.07.17.01:
if SelfNamedFlag <> SelfNamed then
'for self-named this is already done:
if not_halfcurr then add "</"
add elemcur & ">"
end if
'graphics part end ---------------
if mark(p(d)) then add "<!-" & d & "->"
d = d - 1
makei d
set_state_attr
end sub
'======================================================================
'======================================================================
sub test_d_low_limit()
if element(p(d)) = "#start" then stoper _
"shortml error: cannot close element when `html` is closed ... "
end sub
'======================================================================
'======================================================================
' functions for getting extra chars from the front ...
function get_next()
i= i + 1
if i>TLen then
stoper "getting next char ... i=" & i & " length of text=" _
& Tlen & ve & _
"error: end of file in the middle of compilation: <br> " & _
"possibly unclosed text string or missing read " & _
"termination condition ... "
else
get_next = mid(source,i,1)
end if
end function
'======================================================================
function fill_numbers
do while i <= Tlen
i= i + 1
if i>TLen then
stoper "error: end of file in the middle of compilation: <br> " _
& "tableState=" & tableState & " rowState=" & _
rowState & " text=" & right(source,TLen)
else
c = mid(source,i,1)
select case c
case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
t = t & c
case else
i = i - 1
exit function
end select
end if
loop
end function
'======================================================================
'======================================================================
function isNeutral(c)
if c = vbcr or c = vblf or c = " " or c=chr(9) then _
isNeutral = true else isNeutral = false
end function
'======================================================================
%>