diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/context/lua/mtx-context.lua | 5 | ||||
| -rw-r--r-- | scripts/context/lua/mtx-fonts.lua | 2 | ||||
| -rw-r--r-- | scripts/context/lua/mtx-synctex.lua | 255 | ||||
| -rw-r--r-- | scripts/context/lua/mtxrun.lua | 17 | ||||
| -rw-r--r-- | scripts/context/stubs/mswin/mtxrun.lua | 17 | ||||
| -rw-r--r-- | scripts/context/stubs/unix/mtxrun | 17 | ||||
| -rw-r--r-- | scripts/context/stubs/win64/mtxrun.lua | 17 | 
7 files changed, 298 insertions, 32 deletions
| diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua index fac310df2..02d942eb0 100644 --- a/scripts/context/lua/mtx-context.lua +++ b/scripts/context/lua/mtx-context.lua @@ -441,10 +441,9 @@ local function pdf_open(name,method)      pdfview.setmethod(method)      report(pdfview.status())      local pdfname = filenewsuffix(name,"pdf") -    if lfs.isfile(pdfname) then -        pdfview.open(pdfname) +    if not lfs.isfile(pdfname) then +        pdfname = name .. ".pdf" -- agressive      end -    pdfname = name .. ".pdf" -- agressive      pdfview.open(pdfname)  end diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua index 3c86125b5..d077e0198 100644 --- a/scripts/context/lua/mtx-fonts.lua +++ b/scripts/context/lua/mtx-fonts.lua @@ -16,7 +16,7 @@ local lower = string.lower  local concat = table.concat  local write_nl = texio.write_nl -local otlversion  = 3.030 +local otlversion  = 3.031  local helpinfo = [[  <?xml version="1.0"?> diff --git a/scripts/context/lua/mtx-synctex.lua b/scripts/context/lua/mtx-synctex.lua new file mode 100644 index 000000000..30f3e7d51 --- /dev/null +++ b/scripts/context/lua/mtx-synctex.lua @@ -0,0 +1,255 @@ +if not modules then modules = { } end modules ['mtx-synctex'] = { +    version   = 1.002, +    comment   = "companion to mtxrun.lua", +    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", +    copyright = "PRAGMA ADE / ConTeXt Development Team", +    license   = "see context related readme files" +} + +-- InverseSearchCmdLine = scite.exe "%f" "-goto:%l" $ +-- InverseSearchCmdLine = mtxrun.exe --script synctex --edit --name="%f" --line="%l" $ + +local tonumber = tonumber +local find, match, gsub = string.find, string.match, string.gsub +local isfile = lfs.isfile +local longtostring = string.longtostring + +local helpinfo = [[ +<?xml version="1.0"?> +<application> + <metadata> +  <entry name="name">mtx-synctex</entry> +  <entry name="detail">SyncTeX Checker</entry> +  <entry name="version">1.00</entry> + </metadata> + <flags> +  <category name="basic"> +   <subcategory> +    <flag name="edit"><short>open file at line: --line=.. --editor=.. sourcefile</short></flag> +    <flag name="list"><short>show blob: synctexfile</short></flag> +    <flag name="goto"><short>open file at position: --page=.. --x=.. --y=.. --editor=.. synctexfile</short></flag> +   </subcategory> +  </category> + </flags> +</application> +]] + +local application = logs.application { +    name     = "mtx-synctex", +    banner   = "ConTeXt SyncTeX Checker 1.00", +    helpinfo = helpinfo, +} + +local report = application.report + +local editors = { +    scite = sandbox.registerrunner { +        name     = "scite", +        program  = { +            windows = "scite", +            unix    = "SciTE", +        }, +        template = longtostring [[ +            "%filename%" +            "-goto:%linenumber%" +        ]], +    }, +} + +local function validfile(filename) +    if not filename or not isfile(filename) then +        report("invalid synctex log file %a",filename) +        return false +    else +        return true +    end +end + +local function editfile(filename,line,editor) +    if not validfile(filename) then +        return +    end +    local runner = editors[editor or "scite"] or editors.scite +    runner { +        filename   = filename, +        linenumber = tonumber(line) or 1, +    } +end + +-- In context we only care about explicitly marked horizontal blobs. And this is +-- only a check script. I know of no viewer that calls the synctex command line +-- version. Otherwise we could provide our own simplified variant and even +-- consider a more compact format (for instance we could use an "=" when the value +-- of x y w h d is the same as before, which is actually often the case for y, h +-- and d). + +local factor = (7200/7227)/65536 -- we assume unit 1 +local quit   = true              -- we only have one hit anyway + +local function findlocation(filename,page,xpos,ypos) +    if not validfile(filename) then +        return +    elseif not page then +        page = 1 +    elseif not xpos or not ypos then +        report("provide x and y coordinates (unit: basepoints)") +        return +    end +    local files = { } +    local found = false +    local skip  = false +    local dx    = false +    local dy    = false +    local px    = xpos / factor +    local py    = ypos / factor +    local fi    = 0 +    local ln    = 0 +    for line in io.lines(filename) do +        if found then +            if find(line,"^}") then +                break +            else +                -- we only look at positive cases +                local f, l, x, y, w, h, d = match(line,"^h(.-),(.-):(.-),(.-):(.-),(.-),(.-)$") +                if f and f ~= 0 then +                    x = tonumber(x) +                    if px >= x then +                        w = tonumber(w) +                        if px <= x + w then +                            y = tonumber(y) +                            d = tonumber(d) +                            if py >= y - d then +                                h = tonumber(h) +                                if py <= y + h then +                                    if quit then +                                        -- we have no overlapping boxes +                                        fi = f +                                        ln = l +                                        break +                                    else +                                        local lx = px - x +                                        local rx = x + w - px +                                        local by = py - y + d +                                        local ty = y + h - py +                                        mx = lx < rx and lx or rx +                                        my = by < ty and by or ty +                                        if not dx then +                                            dx = mx +                                            dy = my +                                            fi = f +                                            ln = l +                                        else +                                            if mx < dx then +                                                dx = mx +                                                di = f +                                                ln = l +                                            end +                                            if my < dy then +                                                dy = my +                                                fi = f +                                                ln = l +                                            end +                                        end +                                    end +                                end +                            end +                        end +                    end +                end +            end +        elseif skip then +            if find(line,"^}") then +                skip = false +            end +        elseif find(line,"^{(%d+)") then +            local p = tonumber(match(line,"^{(%d+)")) +            if p == page then +                found = true +            else +                skip = true +            end +        elseif find(line,"^Input:") then +            local id, name = match(line,"^Input:(.-):(.-)$") +            if id then +                files[id] = name +            end +        end +    end +    if fi ~= 0 then +        return files[fi], ln +    end +end + +local function showlocation(filename) +    if not validfile(filename) then +        return +    end +    local files = { } +    local found = false +    local page  = 0 +    for line in io.lines(filename) do +        if found then +            if find(line,"^}") then +                found = false +                report("end page: %i",page) +            else +                local f, l, x, y, w, h, d = match(line,"^h(.-),(.-):(.-),(.-):(.-),(.-),(.-)$") +                if f then +                    x = tonumber(x) +                    y = tonumber(y) +                    local llx = factor * ( x               ) +                    local lly = factor * ( y - tonumber(d) ) +                    local urx = factor * ( x + tonumber(w) ) +                    local ury = factor * ( y + tonumber(h) ) +                    f = files[f] +                    if f then +                        report("  [% 4i % 4i % 4i % 4i] : % 5i : %s",llx,lly,urx,ury,l,f) +                    end +                end +            end +        elseif find(line,"^{(%d+)") then +            page  = tonumber(match(line,"^{(%d+)")) +            found = true +            report("begin page: %i",page) +        elseif find(line,"^Input:") then +            local id, name = match(line,"^Input:(.-):(.-)$") +            if id then +                files[id] = name +            end +        end +    end +end + +local function gotolocation(filename,page,xpos,ypos,editor) +    if filename then +        local target, line = findlocation(filename,tonumber(page),tonumber(xpos),tonumber(ypos)) +        if target and line then +            if editor then +                editfile(target,line,editor) +            else +                report("filename=%a linenumber=%a",target,line) +            end +        end +    end +end + +-- print(findlocation("oeps.synctex",4,318,348)) +-- print(findlocation("oeps.synctex",40,378,348)) +-- print(gotolocation("oeps.synctex",4,318,348,"scite")) +-- print(showlocation("oeps.synctex")) + +local argument = environment.argument +local filename = environment.files[1] + +if argument("edit") then +    editfile(filename,argument("line"),argument("editor")) +elseif argument("goto") then +    gotolocation(filename,argument("page"),argument("x"),argument("y"),argument("editor")) +elseif argument("list") then +    showlocation(filename) +elseif argument("exporthelp") then +    application.export(argument("exporthelp"),filename) +else +    application.help() +end + diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index bf45d771e..e27b3712c 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -7041,7 +7041,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7644, stripped down to: 5642  if not modules then modules={} end modules ['util-fil']={    version=1.001, @@ -7070,7 +7070,10 @@ function files.close(f)    f:close()  end  function files.size(f) -  return f:seek("end") +  local current=f:seek() +  local size=f:seek("end") +  f:seek("set",current) +  return size  end  files.getsize=files.size  function files.setposition(f,n) @@ -9541,7 +9544,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8263, stripped down to: 5685 +-- original size: 8253, stripped down to: 5675  if not modules then modules={} end modules ['trac-inf']={    version=1.001, @@ -9577,7 +9580,7 @@ local ticks=clock  local seconds=function(n) return n or 0 end  local function starttiming(instance)    local timer=timers[instance or "notimer"] -  local it=timer.timing or 0 +  local it=timer.timing    if it==0 then      timer.starttime=ticks()      if not timer.loadtime then @@ -9607,7 +9610,7 @@ local function stoptiming(instance)  end  local function elapsed(instance)    if type(instance)=="number" then -    return instance or 0 +    return instance    else      local timer=timers[instance or "notimer"]      return timer and seconds(timer.loadtime) or 0 @@ -20568,8 +20571,8 @@ end -- of closure  -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua  -- skipped libraries : - --- original bytes    : 846296 --- stripped bytes    : 306216 +-- original bytes    : 846363 +-- stripped bytes    : 306226  -- end library merge diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index bf45d771e..e27b3712c 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -7041,7 +7041,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7644, stripped down to: 5642  if not modules then modules={} end modules ['util-fil']={    version=1.001, @@ -7070,7 +7070,10 @@ function files.close(f)    f:close()  end  function files.size(f) -  return f:seek("end") +  local current=f:seek() +  local size=f:seek("end") +  f:seek("set",current) +  return size  end  files.getsize=files.size  function files.setposition(f,n) @@ -9541,7 +9544,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8263, stripped down to: 5685 +-- original size: 8253, stripped down to: 5675  if not modules then modules={} end modules ['trac-inf']={    version=1.001, @@ -9577,7 +9580,7 @@ local ticks=clock  local seconds=function(n) return n or 0 end  local function starttiming(instance)    local timer=timers[instance or "notimer"] -  local it=timer.timing or 0 +  local it=timer.timing    if it==0 then      timer.starttime=ticks()      if not timer.loadtime then @@ -9607,7 +9610,7 @@ local function stoptiming(instance)  end  local function elapsed(instance)    if type(instance)=="number" then -    return instance or 0 +    return instance    else      local timer=timers[instance or "notimer"]      return timer and seconds(timer.loadtime) or 0 @@ -20568,8 +20571,8 @@ end -- of closure  -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua  -- skipped libraries : - --- original bytes    : 846296 --- stripped bytes    : 306216 +-- original bytes    : 846363 +-- stripped bytes    : 306226  -- end library merge diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index bf45d771e..e27b3712c 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -7041,7 +7041,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7644, stripped down to: 5642  if not modules then modules={} end modules ['util-fil']={    version=1.001, @@ -7070,7 +7070,10 @@ function files.close(f)    f:close()  end  function files.size(f) -  return f:seek("end") +  local current=f:seek() +  local size=f:seek("end") +  f:seek("set",current) +  return size  end  files.getsize=files.size  function files.setposition(f,n) @@ -9541,7 +9544,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8263, stripped down to: 5685 +-- original size: 8253, stripped down to: 5675  if not modules then modules={} end modules ['trac-inf']={    version=1.001, @@ -9577,7 +9580,7 @@ local ticks=clock  local seconds=function(n) return n or 0 end  local function starttiming(instance)    local timer=timers[instance or "notimer"] -  local it=timer.timing or 0 +  local it=timer.timing    if it==0 then      timer.starttime=ticks()      if not timer.loadtime then @@ -9607,7 +9610,7 @@ local function stoptiming(instance)  end  local function elapsed(instance)    if type(instance)=="number" then -    return instance or 0 +    return instance    else      local timer=timers[instance or "notimer"]      return timer and seconds(timer.loadtime) or 0 @@ -20568,8 +20571,8 @@ end -- of closure  -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua  -- skipped libraries : - --- original bytes    : 846296 --- stripped bytes    : 306216 +-- original bytes    : 846363 +-- stripped bytes    : 306226  -- end library merge diff --git a/scripts/context/stubs/win64/mtxrun.lua b/scripts/context/stubs/win64/mtxrun.lua index bf45d771e..e27b3712c 100644 --- a/scripts/context/stubs/win64/mtxrun.lua +++ b/scripts/context/stubs/win64/mtxrun.lua @@ -7041,7 +7041,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["util-fil"] = package.loaded["util-fil"] or true --- original size: 7567, stripped down to: 5575 +-- original size: 7644, stripped down to: 5642  if not modules then modules={} end modules ['util-fil']={    version=1.001, @@ -7070,7 +7070,10 @@ function files.close(f)    f:close()  end  function files.size(f) -  return f:seek("end") +  local current=f:seek() +  local size=f:seek("end") +  f:seek("set",current) +  return size  end  files.getsize=files.size  function files.setposition(f,n) @@ -9541,7 +9544,7 @@ do -- create closure to overcome 200 locals limit  package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 8263, stripped down to: 5685 +-- original size: 8253, stripped down to: 5675  if not modules then modules={} end modules ['trac-inf']={    version=1.001, @@ -9577,7 +9580,7 @@ local ticks=clock  local seconds=function(n) return n or 0 end  local function starttiming(instance)    local timer=timers[instance or "notimer"] -  local it=timer.timing or 0 +  local it=timer.timing    if it==0 then      timer.starttime=ticks()      if not timer.loadtime then @@ -9607,7 +9610,7 @@ local function stoptiming(instance)  end  local function elapsed(instance)    if type(instance)=="number" then -    return instance or 0 +    return instance    else      local timer=timers[instance or "notimer"]      return timer and seconds(timer.loadtime) or 0 @@ -20568,8 +20571,8 @@ end -- of closure  -- used libraries    : l-lua.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua  -- skipped libraries : - --- original bytes    : 846296 --- stripped bytes    : 306216 +-- original bytes    : 846363 +-- stripped bytes    : 306226  -- end library merge | 
