@prefix e: . @prefix tln: . @prefix kb: . @prefix list: . @prefix math: . @prefix stoff: . @prefix string: . @prefix func: . # ?word has one or more word parts that overwrite a word => create standoff by calculating startIndex and endIndex from ?part. { ?word a tln:Word; tln:wordHasWordParts ?listOfParts . ?part list:in ?listOfParts; tln:overwritesWord ?overwrittenWord. (?before (?part) ?after) list:append ?listOfParts. # get list of entities before and list of entities after ?part in ?listOfParts. ## get ?startIndex ?SCOPE e:findall (?text { ?before_part list:in ?before; tln:hasText ?text .} ?before_text ). # create list of text before ?part ?before_text string:concatenation ?before_text_concated. # concatenate texts (?before_text_concated) func:string-length ?startIndex. # length of text == startIndex ## get ?endIndex (?before (?part)) list:append ?before_with_part_list. # create list that contains both ?before and ?part. ?SCOPE e:findall (?text { ?item list:in ?before_with_part_list; tln:hasText ?text .} ?part_included_text ). # create list of text. ?part_included_text string:concatenation ?part_included_concated. # concatenate texts. (?part_included_concated) func:string-length ?partLength. # length of text == endIndex + 1 ("_partLength-1" ?partLength) e:calculate ?endIndex. # calculate endIndex == length of text - 1 (?word ?part ?overwrittenWord 'markup') e:skolem ?markup. # create IRI for ?markup } => { ?markup a stoff:StandoffMarkup; stoff:hasCSS "font-weight:bold;"; stoff:standoffMarkupHasStartIndex ?startIndex; stoff:standoffMarkupHasEndIndex ?endIndex. ?word tln:hasStandoffMarkup4PartThatOverwritesWord ?markup; tln:overwritesWord ?overwrittenWord. }.