]> Sergey Matveev's repositories - public-inbox.git/commitdiff
examples: cgit filter for use with WwwHighlight
authorEric Wong <e@80x24.org>
Wed, 24 Apr 2019 22:44:04 +0000 (22:44 +0000)
committerEric Wong <e@80x24.org>
Thu, 25 Apr 2019 03:12:08 +0000 (03:12 +0000)
I'm using this as the cgit about-filter and source-filter
in https://80x24.org/public-inbox.git

MANIFEST
examples/cgit-wwwhighlight-filter.lua [new file with mode: 0644]

index 9858b9ee57e4d6563911fc6c584f8caab24283e4..ed8ff49140ce67d8251d53081e963786333e0835 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -39,6 +39,7 @@ examples/apache2_perl.conf
 examples/apache2_perl_old.conf
 examples/cgi-webrick.rb
 examples/cgit-commit-filter.lua
 examples/apache2_perl_old.conf
 examples/cgi-webrick.rb
 examples/cgit-commit-filter.lua
+examples/cgit-wwwhighlight-filter.lua
 examples/cgit.psgi
 examples/highlight.psgi
 examples/logrotate.conf
 examples/cgit.psgi
 examples/highlight.psgi
 examples/logrotate.conf
diff --git a/examples/cgit-wwwhighlight-filter.lua b/examples/cgit-wwwhighlight-filter.lua
new file mode 100644 (file)
index 0000000..a267d1c
--- /dev/null
@@ -0,0 +1,105 @@
+-- Copyright (C) 2019 all contributors <meta@public-inbox.org>
+-- License: GPL-2.0+ <https://www.gnu.org/licenses/gpl-2.0.txt>
+--
+-- This filter accesses the PublicInbox::WwwHighlight PSGI endpoint
+-- (see examples/highlight.psgi)
+--
+-- Dependencies: lua-http
+--
+-- disclaimer: written by someone who does not know Lua.
+--
+-- This requires cgit linked with Lua
+-- Usage (in your cgitrc(5) config file):
+--
+--   source-filter=lua:/path/to/this/script.lua
+--   about-filter=lua:/path/to/this/script.lua
+--
+local wwwhighlight_url = 'http://127.0.0.1:9090/'
+local req_timeout = 10
+local too_big = false
+
+-- match $PublicInbox::HTTP::MAX_REQUEST_BUFFER
+local max_len = 10 * 1024 * 1024
+
+-- about-filter needs surrounding <pre> tags if all we do is
+-- highlight and linkify
+local pre = true
+
+function filter_open(...)
+       req_body = ""
+
+       -- detect when we're used in an about-filter
+       local repo_url = os.getenv('CGIT_REPO_URL')
+       if repo_url then
+               local path_info = os.getenv('PATH_INFO')
+               rurl = path_info:match("^/(.+)/about/?$")
+               pre = rurl == repo_url
+       end
+
+       -- hand filename off for language detection
+       local fn = select(1, ...)
+       if fn then
+               local http_util = require 'http.util'
+               wwwhighlight_url = wwwhighlight_url .. http_util.encodeURI(fn)
+       end
+end
+
+-- try to buffer the entire source in memory
+function filter_write(str)
+       if too_big then
+               html(str)
+       elseif (req_body:len() + str:len()) > max_len then
+               too_big = true
+               req_body = ""
+               html(req_body)
+               html(str)
+       else
+               req_body = req_body .. str
+       end
+end
+
+function fail(err)
+       io.stderr:write(tostring(err), "\n")
+       if pre then
+               html("<pre>")
+       end
+       html_txt(req_body)
+       if pre then
+               html("</pre>")
+       end
+       return 1
+end
+
+function filter_close()
+       if too_big then
+               return 0
+       end
+       local request = require 'http.request'
+       local req = request.new_from_uri(wwwhighlight_url)
+       req.headers:upsert(':method', 'PUT')
+       req:set_body(req_body)
+
+       -- don't wait for 100-Continue message from the PSGI app
+       req.headers:delete('expect')
+
+       local headers, stream = req:go(req_timeout)
+       if headers == nil then
+               return fail(stream)
+       end
+       local status = headers:get(':status')
+       if status ~= '200' then
+               return fail('status ' .. status)
+       end
+       local body, err = stream:get_body_as_string()
+       if not body and err then
+               return fail(err)
+       end
+       if pre then
+               html("<pre>")
+       end
+       html(body)
+       if pre then
+               html("</pre>")
+       end
+       return 0
+end