Translate metadata to field content
J. Landman Gay
jacque at hyperactivesw.com
Thu Feb 20 19:29:32 EST 2020
So glad you chimed in, Mark. This is pretty impressive. I'll need to use the "for each element"
structure because my tags are not unique, but it still is much faster. When clicking a tag at
the top of the document that links to the last anchor at the bottom of the text, I get a timing
of about 25ms. If I omit the timing for loading the htmltext and the selection of the text at
the end of the handler it brings the timing to almost 0. The test text is long, but not nearly
as long as Bernd's sample.
I need to select the entire range of text covered by the metadata span, not just a single word.
I've got that working, but since we're on a roll here, I wonder if there's a more optimal way
to do it.
I'm using chars instead of codepoints because when I tried it, they both gave the same number.
Should I change that?
put the styledText of fld 1 into tDataA
put 0 into tTotalChars
put 0 into tStartChar
repeat with i = 1 to the number of elements in tDataA
put tDataA[i]["runs"] into tRunsA
repeat with j = 1 to the number of elements in tRunsA
put tRunsA[j] into tRunA
add the num of chars in tRunA["text"] to tTotalChars
if tRunA["metadata"] is pTag then
if tStartChar = 0 then
put tTotalChars - len(tRunA["text"]) + 3 into tStartChar
end if
else if tStartChar > 0 then
put tTotalChars - len(tRunA["text"]) into tEndChar
select char tStartChar to tEndChar of fld 1
select empty
set the backcolor of char tStartChar to tEndChar of fld 1 to "yellow"
return tStartChar & comma & tEndChar
end if
end repeat
end repeat
Also, I had to add 3 to tStartChar to get the right starting point but I can't figure out why.
Otherwise it selects the last character before the metadata span as the starting point.
On 2/20/20 2:13 AM, Mark Waddingham via use-livecode wrote:
> Of course *all* three of my suggested approaches are wrong - I messed up the inner loop in each...
>
> On 2020-02-20 07:56, Mark Waddingham via use-livecode wrote:
>> NON-UNIQUE ANCHORS
>> repeat with i = 1 to the number of elements in tDataA
>> local tRunsA
>> put tDataA[i]["runs"] into tRunsA
>> repeat with j = 1 to the number of elements in tRunsA
>> if tRunsA[j]["metadata"] is tSearchText then
>> repeat with m = 1 to j
>> add the number of words of tRunsA[m]["text"] to tNumWords
>> put true into tFlagExit
>> exit repeat
>> end repeat
>> end if
>> end repeat
>> if tFlagExit then
>> exit repeat
>> end if
>> end repeat
>> select word tNumWords of line i of field "x"
>
> Should be:
>
> repeat with i = 1 to the number of elements in tDataA
> local tRunsA
> put tDataA[i]["runs"] into tRunsA
> repeat with j = 1 to the number of elements in tRunsA
> if tRunsA[j]["metadata"] is tSearchText then
> repeat with m = 1 to j
> add the number of words of tRunsA[m]["text"] to tNumWords
> end repeat
> put true into tFlagExit
> exit repeat
> end if
> end repeat
> if tFlagExit then
> exit repeat
> end if
> end repeat
> select word tNumWords of line i of field "x"
>
>> UNIQUE ANCHORS
>
>> repeat for each key i in tDataA
>> local tRunsA
>> put tDataA[i]["runs"] into tRunsA
>> repeat for each key j in tRunsA
>> if tRunsA[j]["metadata"] is tSearchText then
>> repeat with m = 1 to j
>> add the number of words of tRunsA[m]["text"] to tNumWords
>> put true into tFlagExit
>> exit repeat
>> end repeat
>> end if
>> end repeat
>> if tFlagExit then
>> exit repeat
>> end if
>> end repeat
>> select word tNumWords of line i of field "x"
>
> Should be:
>
> repeat for each key i in tDataA
> local tRunsA
> put tDataA[i]["runs"] into tRunsA
> repeat for each key j in tRunsA
> if tRunsA[j]["metadata"] is tSearchText then
> repeat with m = 1 to j
> add the number of words of tRunsA[m]["text"] to tNumWords
> end repeat
> put true into tFlagExit
> exit repeat
> end if
> end repeat
> if tFlagExit then
> exit repeat
> end if
> end repeat
> select word tNumWords of line i of field "x"
>
>> RUN WITH METADATA DEFINES SELECTION - NON-UNIQUE SEARCH
>>
>> repeat with i = 1 to the number of elements in tDataA
>> local tRunsA
>> put tDataA[i]["runs"] into tRunsA
>> repeat with j = 1 to the number of elements in tRunsA
>> local tRunA
>> put tRunsA[j] into tRunA
>> if tRunA["metadata"] is tSearchText then
>> repeat with m = 1 to j - 1
>> add the number of codeunits of tRunsA[m]["text"] to tNumCodeunitsBefore
>> put the number of codeunits in tRunA["text"] into tNumCodeunits
>> put true into tFlagExit
>> exit repeat
>> end repeat
>> end if
>> end repeat
>> if tFlagExit then
>> exit repeat
>> end if
>> end repeat
>> select codeunit tNumCodeunitsBefore to tNumCodeunitsBefore +
>> tNumCodeunits - 1 of line i of field "x"
>
> Should be:
>
> repeat with i = 1 to the number of elements in tDataA
> local tRunsA
> put tDataA[i]["runs"] into tRunsA
> repeat with j = 1 to the number of elements in tRunsA
> local tRunA
> put tRunsA[j] into tRunA
> if tRunA["metadata"] is tSearchText then
> repeat with m = 1 to j - 1
> add the number of codeunits of tRunsA[m]["text"] to tNumCodeunitsBefore
> end repeat
> put the number of codeunits in tRunA["text"] into tNumCodeunits
> put true into tFlagExit
> exit repeat
> end if
> end repeat
> if tFlagExit then
> exit repeat
> end if
> end repeat
> select codeunit tNumCodeunitsBefore to tNumCodeunitsBefore + tNumCodeunits - 1 of line i of
> field "x"
>
> Oops!
>
> Mark.
>
--
Jacqueline Landman Gay | jacque at hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
More information about the use-livecode
mailing list