summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/context/lua/mtx-context.lua5
-rw-r--r--scripts/context/lua/mtx-fonts.lua2
-rw-r--r--scripts/context/lua/mtx-synctex.lua255
-rw-r--r--scripts/context/lua/mtxrun.lua17
-rw-r--r--scripts/context/stubs/mswin/mtxrun.lua17
-rw-r--r--scripts/context/stubs/unix/mtxrun17
-rw-r--r--scripts/context/stubs/win64/mtxrun.lua17
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