182 lines
4.8 KiB
Plaintext
182 lines
4.8 KiB
Plaintext
MODULE GLOBAL interpret {
|
|
global filename$="base1.xml"
|
|
module latest {
|
|
PrintConsoleLn("The latest entry is:")
|
|
if exist(filename$) else exit
|
|
declare xml xmlData
|
|
with xml, "xml" as doc$, "beautify" as beautify
|
|
doc$=string$(eval$(buffer(filename$)) as UTF8dec)
|
|
with xml, "lastchild" set child
|
|
with child,"attr" as attr$()
|
|
PrintConsoleLn(attr$("name")+","+@tag$()+","+attr$("date"))
|
|
declare xml nothing
|
|
}
|
|
module latestForEachTag {
|
|
PrintConsoleLn("latest entry for each tag:")
|
|
if exist(filename$) else exit
|
|
declare xml xmlData
|
|
with xml, "xml" as doc$, "beautify" as beautify
|
|
doc$=string$(eval$(buffer("base1.xml")) as UTF8dec)
|
|
with xml, "firstchild" as firstchild
|
|
child=firstchild
|
|
with child,"attr" as attr$()
|
|
inventory alfa
|
|
do
|
|
if not exist(alfa, @tag$()) then
|
|
append alfa, @tag$():=child
|
|
else
|
|
return alfa, @tag$():=child
|
|
end if
|
|
Method xml, "EndOffChilds", &child as ok
|
|
when ok
|
|
sort alfa
|
|
k=each(alfa)
|
|
while k
|
|
child=eval(k)
|
|
PrintConsoleLn(attr$("name")+","+@tag$()+","+attr$("date"))
|
|
end while
|
|
declare xml nothing
|
|
}
|
|
module All {
|
|
PrintConsoleLn("All entries sorted by date:")
|
|
if exist(filename$) else exit
|
|
declare xml xmlData
|
|
with xml, "xml" as doc$, "beautify" as beautify
|
|
doc$=string$(eval$(buffer("base1.xml")) as UTF8dec)
|
|
with xml, "firstchild" as firstchild
|
|
child=firstchild
|
|
with child,"attr" as attr$()
|
|
inventory alfa
|
|
i=0
|
|
do
|
|
// prevent same keys using a unique patch key
|
|
append alfa, attr$("date")+str$(i,"000000"):=child
|
|
i++
|
|
Method xml, "EndOffChilds", &child as ok
|
|
when ok
|
|
sort alfa
|
|
k=each(alfa)
|
|
while k
|
|
child=eval(k)
|
|
PrintConsoleLn(attr$("name")+","+@tag$()+","+attr$("date"))
|
|
end while
|
|
declare xml nothing
|
|
}
|
|
module add (line$) {
|
|
line$=trim$(line$)
|
|
if line$="" then exit
|
|
declare xml xmlData
|
|
with xml, "xml" as doc$, "beautify" as beautify
|
|
bom$=str$(format$("\uef\ubb\ubf"))
|
|
// len(bom$)=1.5 (1.5*2=3 bytes)
|
|
k=0
|
|
if exist(filename$) then try {k=filelen(filename$)}
|
|
if k<10 then
|
|
method xml, "PrepareNodeSimple", "xml" as ProcessInstructions
|
|
method xml, "PlaceAttributeToNode", ProcessInstructions, "version", "1.0"
|
|
method xml, "PlaceAttributeToNode", ProcessInstructions, "encoding", "utf-8-sig"
|
|
method xml, "PlaceProcessingInstructions", ProcessInstructions
|
|
method xml, "PrepareNode", "MyFile" as Node
|
|
method xml, "InsertNode", Node
|
|
else
|
|
doc$=string$(eval$(buffer(filename$)) as UTF8dec)
|
|
end if
|
|
a$=""""+line$
|
|
def name$, tag$,date$
|
|
do
|
|
a$=rightpart$(a$, """") : what$=lcase$(trim$(leftpart$(a$, """")))
|
|
if what$="" then exit
|
|
a$=rightpart$(a$, """") :par$=leftpart$(a$, """")
|
|
select case what$
|
|
case "name"
|
|
name$=par$
|
|
case "tag"
|
|
tag$=par$
|
|
case "date"
|
|
date$=par$
|
|
end select
|
|
always
|
|
if name$<>"" and date$<>"" then
|
|
method xml, "PrepareNode", "Row", "" as Node1
|
|
method xml, "PlaceAttributeToNode", Node1, "name", name$
|
|
if tag$<>"" then method xml, "PlaceAttributeToNode", Node1, "tag", tag$
|
|
method xml, "PlaceAttributeToNode", Node1, "date", date$
|
|
method xml, "AppendChild", Node1
|
|
open filename$ for wide output as #f
|
|
print #f, bom$;string$(doc$ as UTF8enc);
|
|
close #f
|
|
beautify=-4
|
|
PrintConsoleLn(doc$)
|
|
end if
|
|
declare xml nothing
|
|
}
|
|
declare FreeConsole lib "Kernel32.FreeConsole"
|
|
declare GetStdHandle lib "Kernel32.GetStdHandle" {long a}
|
|
declare AttachConsole lib "Kernel32.AttachConsole" {long a}
|
|
declare CloseHandle lib "Kernel32.CloseHandle" {long a}
|
|
declare global WriteCons Lib "Kernel32.WriteConsoleW" {long cons, a$, long n, Long p, long u}
|
|
long STD_OUTPUT_HANDLE=-11
|
|
global retvalue
|
|
buffer clear retvalue as long
|
|
ret=AttachConsole(-1)
|
|
global m=GetStdHandle(STD_OUTPUT_HANDLE)
|
|
if ret=0 then beep: exit
|
|
if not islet then
|
|
try {
|
|
open "tool.bat" for output as #f
|
|
print #f, {@}+shortdir$(appdir$)+{m2000.exe data {%*}: dir %cd%:load tool
|
|
}
|
|
close #f
|
|
}
|
|
PrintConsoleLn("")
|
|
dos "tool.bat"
|
|
|
|
else
|
|
read cmd$
|
|
cmd$=trim$(cmd$)+" "
|
|
select case lcase$(leftpart$(cmd$, " "))
|
|
case "add"
|
|
add rightpart$(cmd$," ")
|
|
case "latest"
|
|
latest
|
|
case "latest-per-tag"
|
|
latestForEachTag
|
|
case "all-entries"
|
|
all
|
|
case else
|
|
help()
|
|
end select
|
|
end if
|
|
call void closehandle(m)
|
|
call void freeconsole()
|
|
|
|
Sub PrintConsole(a$)
|
|
Call Void WriteCons(m, a$, Len(a$), retvalue(0), 0)
|
|
End Sub
|
|
Sub PrintConsoleLn(a$)
|
|
a$+={
|
|
}
|
|
Call Void WriteCons(m, a$, Len(a$), retvalue(0), 0)
|
|
End Sub
|
|
// function is static here but can be called from child modules, because there are in the same block of code
|
|
// although attr$() must defined in each module. (scope constrain to module block, for local identifiers).
|
|
function tag$()
|
|
try { // if no tag exist error raised
|
|
=attr$("tag")
|
|
}
|
|
end function
|
|
Sub Help()
|
|
h$={Commands:
|
|
tool add name "anyname" tag "tagtext" date "YYYY.MM.DD.HH:MM"
|
|
tool latest
|
|
tool latest-per-tag
|
|
tool all-entries
|
|
}
|
|
PrintConsole(h$)
|
|
End Sub
|
|
}
|
|
module interpret1 {
|
|
try {interpret}
|
|
}
|
|
interpret1: end
|