Merge lines.love

[?]
Apr 3, 2023, 4:23 PM
KWIVKQQ7AANRG6R4ZRB5TDBZ2TZTXAXIR2P6JNT362KIAJ7JQ4VQC

Dependencies

  • [2] HNZMFBMQ Merge lines.love
  • [3] Q7XPSKII Merge lines.love
  • [4] ZLJYLPOT Merge lines.love
  • [5] GZ5WULJV switch source side to new screen-line-based render
  • [6] 3QNOKBFM beginnings of a test harness
  • [7] 4SR3Z4Y3 document the version of LÖVE I've been using
  • [8] ORKN6EOB Merge lines.love
  • [9] 3PSFWAIL Merge lines.love
  • [10] OGUV4HSA remove some memory leaks from rendered fragments
  • [11] AVTNUQYR basic test-enabled framework
  • [12] 2CTN2IEF Merge lines.love
  • [13] VXORMHME delete experimental REPL
  • [14] 4YDBYBA4 clean up memory leak experiments
  • [15] BJ5X5O4A let's prevent the text cursor from ever getting on a drawing
  • [16] VHQCNMAR several more modules
  • [17] KMSL74GA support selections in the source editor
  • [18] G54H3YG2 get rid of all bifold text
  • [19] TFM6F5OD Merge lines.love
  • [20] ORRSP7FV deduce test names on failures
  • [21] PQN7CU4H Merge lines.love
  • [22] TVCPXAAU rename
  • [23] R5QXEHUI somebody stop me
  • [24] K74U4BAU Merge lines.love
  • [25] XX7G2FFJ intermingle freehand line drawings with text
  • [26] MD3W5IRA new fork: rip out drawing support
  • [27] 2TQUKHBC Merge lines.love
  • [28] AYX33NBC Merge lines.love
  • [29] ZTZOO2OQ Merge lines.love
  • [30] 73OCE2MC after much struggle, a brute-force undo
  • [31] VP5KC4XZ Merge lines.love
  • [32] VHUNJHXB Merge lines.love
  • [33] 2L5MEZV3 experiment: new edit namespace
  • [34] KKMFQDR4 editing source code from within the app
  • [35] BULPIBEG beginnings of a module for the text editor
  • [36] D4B52CQ2 Merge lines.love
  • [37] TLOAPLBJ add a license
  • [38] K2X6G75Z start writing some tests for drawings
  • [39] 66X36NZN a little more prose describing manual_tests
  • [40] A4BSGS2C Merge lines.love
  • [41] JOPVPUSA editing source code from within the app
  • [42] VBU5YHLR Merge lines.love
  • [43] D2GCFTTT clean up repl functionality
  • [44] RSZD5A7G forgot to add json.lua
  • [45] CE4LZV4T drop last couple of manual tests
  • [46] R3KXFRZN get rid of to_text
  • [47] UN7GKYV5 support hyperlinks in the source editor
  • [48] OI4FPFIN support drawings in the source editor
  • [49] H4R5BHVY no more Text allocations
  • [50] BLWAYPKV extract a module
  • [51] 6LJZN727 handle chords
  • [52] S2QMLRXL stop creating a singleton table for every word
  • [53] LXTTOB33 extract a couple of files
  • [54] V5SYDHPQ start thinking of compute_fragments as a detail
  • [55] T4FRZSYL delete an ancient, unused file
  • [56] FS2ITYYH record a known issue
  • [57] OTIBCAUJ love2d scaffold

Change contents

  • file deletion: source_text_tests.lua (----------)source_text_tests.lua (----------)
    [6.2][6.83676:83721](),[6.2][6.83676:83721](),[6.83721][6.3498:3498]()
    App.screen.check(y, 'mn', 'screen:3')
    end
    function test_pagedown_never_moves_up()
  • file deletion: source_text.lua (----------)source_text.lua (----------)
    [6.2][6.147062:147101](),[6.2][6.147062:147101](),[6.147101][6.83723:83723]()
    State.line_cache[line_index].link_offsets = nil
    end
    function trim(s)
    return s:gsub('^%s+', ''):gsub('%s+$', '')
    end
    function ltrim(s)
    return s:gsub('^%s+', '')
    end
    function rtrim(s)
    return s:gsub('%s+$', '')
    edit.draw(State)
    return State.cursor_y == nil
    -- this approach is cheaper and almost works, except on the final screen
    -- where file ends above bottom of screen
    --? local botpos = Text.pos_at_start_of_screen_line(State, State.cursor1)
    --? local botline1 = {line=State.cursor1.line, pos=botpos}
    --? return Text.lt1(State.screen_bottom1, botline1)
    end
    --? print(s, e, soff, eoff, loff, hoff)
    return App.width(line.data:sub(1, loff-1)), App.width(line.data:sub(1, hoff))
    end
    end
    local loff = math.max(s, soff)
    local hoff
    if eoff then
    hoff = math.min(e, eoff)
    else
    hoff = e
    end
    local s, e = 1, 0
    while s <= #line.data do
    s, e = line.data:find('%[%[%S+%]%]', s)
    if s == nil then break end
    local word = line.data:sub(s+2, e-2) -- strip out surrounding '[[..]]'
    --? print('wikiword:', s, e, word)
    table.insert(line_cache.link_offsets, {s, e, word})
    s = e + 1
    end
    end
    -- Intersect the filename between byte offsets s,e with the bounds of screen line i.
    -- Return the left/right pixel coordinates of of the intersection,
    -- or nil if it doesn't intersect with screen line i.
    function Text.clip_wikiword_with_screen_line(line, line_cache, i, s, e)
    local spos = line_cache.screen_line_starting_pos[i]
    local soff = Text.offset(line.data, spos)
    if e < soff then
    return
    end
    local eoff
    if i < #line_cache.screen_line_starting_pos then
    local epos = line_cache.screen_line_starting_pos[i+1]
    eoff = Text.offset(line.data, epos)
    if s > eoff then
    return
    end
    line_cache.link_offsets = {}
    local pos = 1
    -- try to wrap at word boundaries
    if line_cache.link_offsets then
    return
    end
    function Text.populate_link_offsets(State, line_index)
    local line = State.lines[line_index]
    pos = pos + utf8.len(frag)
    end
    end
    x = 0 -- new screen line
    end
    x = x + frag_width
    -- try to wrap at word boundaries
    for frag in line.data:gmatch('%S*%s*') do
    local frag_width = App.width(frag)
    --? print('-- frag:', frag, pos, x, frag_width, State.width)
    while x + frag_width > State.width do
    --? print('frag:', frag, pos, x, frag_width, State.width)
    if x < 0.8 * State.width then
    -- long word; chop it at some letter
    -- We're not going to reimplement TeX here.
    local bpos = Text.nearest_pos_less_than(frag, State.width - x)
    -- everything works if bpos == 0, but is a little inefficient
    pos = pos + bpos
    local boffset = Text.offset(frag, bpos+1) -- byte _after_ bpos
    frag = string.sub(frag, boffset)
    --? if bpos > 0 then
    --? print('after chop:', frag)
    --? end
    frag_width = App.width(frag)
    end
    --? print('screen line:', pos)
    table.insert(line_cache.screen_line_starting_pos, pos)
    local x = 0
    local pos = 1
    local endpos = line_cache.screen_line_starting_pos[i+1]-1
    local end_offset = Text.offset(line.data, endpos)
    return line.data:sub(offset, end_offset)
    end
    function Text.draw_cursor(State, x, y)
    -- blink every 0.5s
    if math.floor(Cursor_time*2)%2 == 0 then
    App.color(Cursor_color)
    love.graphics.rectangle('fill', x,y, 3,State.line_height)
    end
    State.cursor_x = x
    State.cursor_y = y+State.line_height
    end
    function Text.populate_screen_line_starting_pos(State, line_index)
    local line = State.lines[line_index]
    return y, final_screen_line_starting_pos
    end
    function Text.screen_line(line, line_cache, i)
    local pos = line_cache.screen_line_starting_pos[i]
    local offset = Text.offset(line.data, pos)
    if i >= #line_cache.screen_line_starting_pos then
    return line.data:sub(offset)
    end
    y = y + State.line_height
    if y >= App.screen.height then
    break
    end
    end
    Text.draw_cursor(State, State.left+Text.x(f, State.cursor1.pos-pos+1), y)
    end
    end
    end
    love.graphics.print(State.search_term, State.left+lo_px,y)
    end
    elseif Focus == 'edit' then
    local lo_px = Text.draw_highlight(State, line, State.left,y, pos, State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term))
    App.color(Text_color)
    if not hide_cursor and line_index == State.cursor1.line then
    if pos <= State.cursor1.pos and pos + frag_len >= State.cursor1.pos then
    if State.search_term then
    if State.lines[State.cursor1.line].data:sub(State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term)-1) == State.search_term then
    select_color(f)
    App.screen.print(f, State.left,y)
    -- render cursor if necessary
    Text.draw_highlight(State, line, State.left,y, pos, lo,hi)
    end
    -- render fragment
    if State.selection1.line then
    local lo, hi = Text.clip_selection(State, line_index, pos, pos+frag_len)
    final_screen_line_starting_pos = pos
    local f = Text.screen_line(line, line_cache, i)
    --? print('text.draw:', f, 'at', line_index,pos, 'after', x,y)
    local frag_len = utf8.len(f)
    -- render any link decorations
    for _,link_offsets in ipairs(line_cache.link_offsets) do
    local s,e,filename = unpack(link_offsets)
    local lo, hi = Text.clip_wikiword_with_screen_line(line, line_cache, i, s, e)
    if lo then
    button(State, 'link', {x=State.left+lo, y=y, w=hi-lo, h=State.line_height, color={1,1,1},
    icon = icon.hyperlink_decoration,
    onpress1 = function()
    if file_exists(filename) then
    source.switch_to_file(filename)
    end
    end,
    })
    end
    assert(#line_cache.screen_line_starting_pos >= 1)
    for i=1,#line_cache.screen_line_starting_pos do
    local pos = line_cache.screen_line_starting_pos[i]
    if pos < startpos then
    -- render nothing
    Text.populate_link_offsets(State, line_index)
    initialize_color()
    local final_screen_line_starting_pos = startpos -- track value to return
    Text.populate_screen_line_starting_pos(State, line_index)
    -- return y for the next line, and position of start of final screen line drawn
    function Text.draw(State, line_index, y, startpos, hide_cursor)
  • file deletion: log_browser.lua (----------)log_browser.lua (----------)
    [6.2][6.203223:203262](),[6.2][6.203223:203262](),[6.203262][6.191782:191782]()
    Text.draw(State, line_index, y, --[[startpos]] 1)
    State.left,State.right = old_left,old_right
    else
    height = log_render[line.data.name](line.data, xleft, y, xright-xleft)
    end
    end
    if App.mouse_x() > Log_browser_state.left and line_index == mouse_line_index then
    App.color(Cursor_line_background_color)
    love.graphics.rectangle('fill', xleft,y, xright-xleft, height)
    end
    y = y + height
    end
    end
    end
    function render_stack_left_margin(State, line_index, line, y)
    if line.section_stack == nil then
    -- assertion message
    for k,v in pairs(line) do
    print(k)
    end
    end
    App.color(Section_border_color)
    for i=1,#line.section_stack do
    local x = State.left + (i-1)*Section_border_padding_horizontal
    love.graphics.line(x,y, x,y+log_browser.height(State, line_index))
    if y < 30 then
    love.graphics.print(line.section_stack[i].name, x+State.font_height+5, y+5, --[[vertically]] math.pi/2)
    end
    if y > App.screen.height-log_browser.height(State, line_index) then
  • replacement in source_text_tests.lua at line 980
    [6.35939][6.8363:8405]()
    App.screen.check(y, 'mno ', 'screen:3')
    [6.35939]
    [6.36043]
    App.screen.check(y, 'mn', 'screen:3')
  • replacement in source_text.lua at line 5
    [6.84027][6.971:1043]()
    -- return the final y, and position of start of final screen line drawn
    [6.84027]
    [6.1043]
    -- return y for the next line, and position of start of final screen line drawn
  • replacement in source_text.lua at line 12
    [6.1129][6.1129:1168](),[6.1168][6.87368:87412](),[6.87368][6.87368:87412]()
    local x = State.left
    local pos = 1
    local screen_line_starting_pos = startpos
    [6.1129]
    [4.359]
    local final_screen_line_starting_pos = startpos -- track value to return
  • replacement in source_text.lua at line 14
    [4.419][6.87456:87472](),[6.87456][6.87456:87472]()
    local pos = 1
    [4.419]
    [6.87472]
    Text.populate_link_offsets(State, line_index)
  • replacement in source_text.lua at line 16
    [6.87493][6.87493:87565](),[6.87565][4.420:540]()
    for _, f in ipairs(line_cache.fragments) do
    App.color(Text_color)
    select_color(f)
    local frag_len = utf8.len(f)
    --? print('text.draw:', f, 'at', line_index,pos, 'after', x,y)
    [6.87493]
    [6.87737]
    assert(#line_cache.screen_line_starting_pos >= 1)
    for i=1,#line_cache.screen_line_starting_pos do
    local pos = line_cache.screen_line_starting_pos[i]
  • replacement in source_text.lua at line 23
    [6.87831][6.87831:87856](),[6.87856][4.573:611](),[4.611][6.87902:88090](),[6.87902][6.87902:88090](),[6.88090][6.1169:1214]()
    -- render fragment
    local frag_width = App.width(f)
    if x + frag_width > State.right then
    assert(x > State.left) -- no overfull lines
    y = y + State.line_height
    if y + State.line_height > App.screen.height then
    return y, screen_line_starting_pos
    [6.87831]
    [6.88168]
    final_screen_line_starting_pos = pos
    local f = Text.screen_line(line, line_cache, i)
    --? print('text.draw:', f, 'at', line_index,pos, 'after', x,y)
    local frag_len = utf8.len(f)
    -- render any link decorations
    for _,link_offsets in ipairs(line_cache.link_offsets) do
    local s,e,filename = unpack(link_offsets)
    local lo, hi = Text.clip_wikiword_with_screen_line(line, line_cache, i, s, e)
    if lo then
    button(State, 'link', {x=State.left+lo, y=y, w=hi-lo, h=State.line_height, color={1,1,1},
    icon = icon.hyperlink_decoration,
    onpress1 = function()
    if file_exists(filename) then
    source.switch_to_file(filename)
    end
    end,
    })
  • edit in source_text.lua at line 41
    [6.88180][6.88180:88242]()
    screen_line_starting_pos = pos
    x = State.left
  • edit in source_text.lua at line 42
    [6.20777]
    [6.20777]
    -- render fragment
  • replacement in source_text.lua at line 45
    [6.20894][6.20894:20952]()
    Text.draw_highlight(State, line, x,y, pos, lo,hi)
    [6.20894]
    [6.88242]
    Text.draw_highlight(State, line, State.left,y, pos, lo,hi)
  • replacement in source_text.lua at line 47
    [6.88252][6.7:84](),[6.84][4.612:697](),[4.697][6.172:367](),[6.172][6.172:367](),[6.367][4.698:816](),[4.816][6.578:779](),[6.578][6.578:779](),[6.779][4.817:848]()
    -- Make [[WikiWords]] (single word, all in one screen line) clickable.
    local trimmed_word = rtrim(f) -- compute_fragments puts whitespace at the end
    if starts_with(trimmed_word, '[[') and ends_with(trimmed_word, ']]') then
    local filename = trimmed_word:gsub('^..(.*)..$', '%1')
    if source.link_exists(State, filename) then
    button(State, 'link', {x=x+App.width('[['), y=y, w=App.width(filename), h=State.line_height, color={1,1,1},
    icon = icon.hyperlink_decoration,
    onpress1 = function()
    source.switch_to_file(filename)
    end,
    })
    end
    end
    App.screen.print(f, x,y)
    [6.88252]
    [6.88290]
    select_color(f)
    App.screen.print(f, State.left,y)
  • replacement in source_text.lua at line 50
    [6.88326][6.1215:1262](),[6.1262][6.88395:88475](),[6.88395][6.88395:88475]()
    if line_index == State.cursor1.line then
    if pos <= State.cursor1.pos and pos + frag_len > State.cursor1.pos then
    [6.88326]
    [6.88475]
    if not hide_cursor and line_index == State.cursor1.line then
    if pos <= State.cursor1.pos and pos + frag_len >= State.cursor1.pos then
  • replacement in source_text.lua at line 54
    [6.88661][6.88661:88798]()
    local lo_px = Text.draw_highlight(State, line, x,y, pos, State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term))
    [6.88661]
    [6.88798]
    local lo_px = Text.draw_highlight(State, line, State.left,y, pos, State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term))
  • replacement in source_text.lua at line 56
    [6.88834][6.88834:88898]()
    love.graphics.print(State.search_term, x+lo_px,y)
    [6.88834]
    [6.88898]
    love.graphics.print(State.search_term, State.left+lo_px,y)
  • replacement in source_text.lua at line 59
    [6.88952][4.849:926](),[4.926][6.89032:89066](),[6.89032][6.89032:89066]()
    Text.draw_cursor(State, x+Text.x(f, State.cursor1.pos-pos+1), y)
    App.color(Text_color)
    [6.88952]
    [6.89066]
    Text.draw_cursor(State, State.left+Text.x(f, State.cursor1.pos-pos+1), y)
  • replacement in source_text.lua at line 63
    [6.89102][6.89102:89127]()
    x = x + frag_width
    [6.89102]
    [6.89127]
    y = y + State.line_height
    if y >= App.screen.height then
    break
    end
  • edit in source_text.lua at line 68
    [6.89135][6.89135:89160]()
    pos = pos + frag_len
  • replacement in source_text.lua at line 69
    [6.89166][6.1263:1448](),[6.1448][6.91082:91090](),[6.91082][6.91082:91090]()
    if Focus == 'edit' and not hide_cursor and State.search_term == nil then
    if line_index == State.cursor1.line and State.cursor1.pos == pos then
    Text.draw_cursor(State, x, y)
    end
    [6.89166]
    [6.91115]
    return y, final_screen_line_starting_pos
    end
    function Text.screen_line(line, line_cache, i)
    local pos = line_cache.screen_line_starting_pos[i]
    local offset = Text.offset(line.data, pos)
    if i >= #line_cache.screen_line_starting_pos then
    return line.data:sub(offset)
  • replacement in source_text.lua at line 78
    [6.91121][6.1449:1486]()
    return y, screen_line_starting_pos
    [6.91121]
    [6.91172]
    local endpos = line_cache.screen_line_starting_pos[i+1]-1
    local end_offset = Text.offset(line.data, endpos)
    return line.data:sub(offset, end_offset)
  • edit in source_text.lua at line 100
    [6.91661][6.91661:91746]()
    -- duplicate some logic from Text.draw
    Text.compute_fragments(State, line_index)
  • replacement in source_text.lua at line 101
    [6.91790][6.91790:91813]()
    local x = State.left
    [6.91790]
    [6.91813]
    local x = 0
  • replacement in source_text.lua at line 103
    [6.91829][6.91829:91875](),[6.91918][6.91918:91941](),[6.91941][4.927:963](),[4.963][6.91985:92047](),[6.91985][6.91985:92047]()
    for _, f in ipairs(line_cache.fragments) do
    -- render fragment
    local frag_width = App.width(f)
    if x + frag_width > State.right then
    x = State.left
    [6.91829]
    [6.92047]
    -- try to wrap at word boundaries
    for frag in line.data:gmatch('%S*%s*') do
    local frag_width = App.width(frag)
    --? print('-- frag:', frag, pos, x, frag_width, State.width)
    while x + frag_width > State.width do
    --? print('frag:', frag, pos, x, frag_width, State.width)
    if x < 0.8 * State.width then
    -- long word; chop it at some letter
    -- We're not going to reimplement TeX here.
    local bpos = Text.nearest_pos_less_than(frag, State.width - x)
    -- everything works if bpos == 0, but is a little inefficient
    pos = pos + bpos
    local boffset = Text.offset(frag, bpos+1) -- byte _after_ bpos
    frag = string.sub(frag, boffset)
    --? if bpos > 0 then
    --? print('after chop:', frag)
    --? end
    frag_width = App.width(frag)
    end
    --? print('screen line:', pos)
  • edit in source_text.lua at line 124
    [6.92108]
    [6.92108]
    x = 0 -- new screen line
  • replacement in source_text.lua at line 127
    [6.92139][4.964:992]()
    pos = pos + utf8.len(f)
    [6.92139]
    [6.92200]
    pos = pos + utf8.len(frag)
  • replacement in source_text.lua at line 131
    [6.92211][6.92211:92262]()
    function Text.compute_fragments(State, line_index)
    [6.92211]
    [6.92343]
    function Text.populate_link_offsets(State, line_index)
  • replacement in source_text.lua at line 135
    [6.92432][6.92432:92463]()
    if line_cache.fragments then
    [6.92432]
    [6.92463]
    if line_cache.link_offsets then
  • replacement in source_text.lua at line 138
    [6.92480][6.92480:92531]()
    line_cache.fragments = {}
    local x = State.left
    [6.92480]
    [6.92531]
    line_cache.link_offsets = {}
    local pos = 1
  • replacement in source_text.lua at line 141
    [6.92567][6.92567:92611](),[6.92611][4.993:1032](),[4.1032][6.92837:92879](),[6.92837][6.92837:92879](),[6.93003][6.93003:93065](),[6.93096][6.93096:93264](),[6.93296][6.93296:93454](),[6.93549][6.93549:93602](),[6.93602][4.1033:1078](),[4.1078][6.93808:93855](),[6.93808][6.93808:93855](),[6.93855][4.1079:1129](),[4.1129][6.93929:93970](),[6.93929][6.93929:93970](),[6.93970][4.1130:1167](),[4.1167][6.94075:94149](),[6.94075][6.94075:94149](),[6.94149][4.1168:1215]()
    for frag in line.data:gmatch('%S*%s*') do
    local frag_width = App.width(frag)
    while x + frag_width > State.right do
    if (x-State.left) < 0.8 * (State.right-State.left) then
    -- long word; chop it at some letter
    -- We're not going to reimplement TeX here.
    local bpos = Text.nearest_pos_less_than(frag, State.right - x)
    if bpos == 0 then break end -- avoid infinite loop when window is too narrow
    local boffset = Text.offset(frag, bpos+1) -- byte _after_ bpos
    local frag1 = string.sub(frag, 1, boffset-1)
    local frag1_width = App.width(frag1)
    assert(x + frag1_width <= State.right)
    table.insert(line_cache.fragments, frag1)
    frag = string.sub(frag, boffset)
    frag_width = App.width(frag)
    end
    x = State.left -- new line
    end
    if #frag > 0 then
    table.insert(line_cache.fragments, frag)
    [6.92567]
    [6.94996]
    local s, e = 1, 0
    while s <= #line.data do
    s, e = line.data:find('%[%[%S+%]%]', s)
    if s == nil then break end
    local word = line.data:sub(s+2, e-2) -- strip out surrounding '[[..]]'
    --? print('wikiword:', s, e, word)
    table.insert(line_cache.link_offsets, {s, e, word})
    s = e + 1
    end
    end
    -- Intersect the filename between byte offsets s,e with the bounds of screen line i.
    -- Return the left/right pixel coordinates of of the intersection,
    -- or nil if it doesn't intersect with screen line i.
    function Text.clip_wikiword_with_screen_line(line, line_cache, i, s, e)
    local spos = line_cache.screen_line_starting_pos[i]
    local soff = Text.offset(line.data, spos)
    if e < soff then
    return
    end
    local eoff
    if i < #line_cache.screen_line_starting_pos then
    local epos = line_cache.screen_line_starting_pos[i+1]
    eoff = Text.offset(line.data, epos)
    if s > eoff then
    return
  • replacement in source_text.lua at line 168
    [6.95004][6.95004:95027]()
    x = x + frag_width
    [6.95004]
    [6.95088]
    end
    local loff = math.max(s, soff)
    local hoff
    if eoff then
    hoff = math.min(e, eoff)
    else
    hoff = e
  • edit in source_text.lua at line 176
    [6.95094]
    [6.95094]
    --? print(s, e, soff, eoff, loff, hoff)
    return App.width(line.data:sub(1, loff-1)), App.width(line.data:sub(1, hoff))
  • replacement in source_text.lua at line 1003
    [6.146159][6.146159:146172]()
    App.draw()
    [6.146159]
    [6.146172]
    edit.draw(State)
  • edit in source_text.lua at line 1012
    [6.146518][6.780:1037]()
    function source.link_exists(State, filename)
    if State.link_cache == nil then
    State.link_cache = {}
    end
    if State.link_cache[filename] == nil then
    State.link_cache[filename] = file_exists(filename)
    end
    return State.link_cache[filename]
    end
  • edit in source_text.lua at line 1018
    [6.146669][6.1038:1062]()
    State.link_cache = {}
  • edit in source_text.lua at line 1021
    [6.146731][6.146731:146778]()
    State.line_cache[line_index].fragments = nil
  • edit in source_text.lua at line 1022
    [6.146888]
    [6.146951]
    State.line_cache[line_index].link_offsets = nil
  • edit in source_edit.lua at line 187
    [6.368][6.19763:19795](),[6.8799][6.19763:19795](),[6.19763][6.19763:19795]()
    y = y + State.line_height
  • edit in source_edit.lua at line 510
    [6.164233][6.164233:164251]()
    Text_cache = {}
  • edit in source.lua at line 53
    [6.166636][6.166636:166728]()
    -- a few text objects we can avoid recomputing unless the font changes
    Text_cache = {}
  • edit in run.lua at line 9
    [6.178259][6.178259:178351]()
    -- a few text objects we can avoid recomputing unless the font changes
    Text_cache = {}
  • replacement in log_browser.lua at line 120
    [6.196035][6.196035:196099]()
    y = Text.draw(State, line_index, y, --[[startpos]] 1)
    [6.196035]
    [6.196099]
    Text.draw(State, line_index, y, --[[startpos]] 1)
  • edit in edit.lua at line 118
    [6.9735][6.9735:9765]()
    y = y + State.line_height