diff options
author | Albert Krewinkel <albert@zeitkraut.de> | 2017-04-15 09:31:09 +0200 |
---|---|---|
committer | Albert Krewinkel <albert@zeitkraut.de> | 2017-04-15 09:31:09 +0200 |
commit | 3d6edbd9e39dfccdd76ec32f9aa34977b7b56fe0 (patch) | |
tree | 7a488a94a66a970e4757c146d3241847608c425e /data | |
parent | ac275528c22940ca02124bd0b59ee961af1461b6 (diff) | |
download | pandoc-3d6edbd9e39dfccdd76ec32f9aa34977b7b56fe0.tar.gz |
Lua filter: use Attributes constructor for Attrs
Element attributes are pushed to the stack via the `Attributes`
function. `Attributes` creates an Attr like triple, but the triple also
allows table-like access to key-value pairs.
Diffstat (limited to 'data')
-rw-r--r-- | data/pandoc.lua | 66 |
1 files changed, 50 insertions, 16 deletions
diff --git a/data/pandoc.lua b/data/pandoc.lua index 1d94e5825..bc63ed038 100644 --- a/data/pandoc.lua +++ b/data/pandoc.lua @@ -550,16 +550,6 @@ M.Superscript = M.Inline:create_constructor( -- Attributes M.Attributes = {} -setmetatable(M.Attributes, M.Attributes) -M.Attributes.__index = function(t, k) - if k == "id" then - return t[1] - elseif k == "class" then - return table.concat(t[2], ' ') - else - return t.kv[k] - end -end --- Create a new set of attributes (Attr). -- @function Attributes -- @tparam table key_values table containing string keys and values @@ -567,17 +557,61 @@ end -- @tparam[opt] {string,...} classes element classes -- @return element attributes M.Attributes.__call = function(t, key_values, id, classes) - local kv = {} - for i = 1, #key_values do - kv[key_values[i][1]] = key_values[i][2] - end id = id or '' classes = classes or {} - local attr = {id, classes, key_values, kv = kv} + local attr = {id, classes, key_values} setmetatable(attr, t) return attr end -M.Attributes.empty = M.Attributes('', {}, {}) +M.Attributes.__index = function(t, k) + if rawget(t, k) then + return rawget(t, k) + elseif k == "id" then + if rawget(t, 1) == '' then + return nil + else + return rawget(t, 1) + end + elseif k == "class" then + if #(rawget(t, 2)) == 0 then + return nil + else + return table.concat(t[2], ' ') + end + else + for _, p in ipairs(t[3]) do + if k == p[1] then + return p[2] + end + end + return nil + end +end +M.Attributes.__newindex = function(t, k, v) + if rawget(t, k) then + rawset(t, k, v) + elseif k == "id" then + rawset(t, 1, v) + elseif k == "class" then + if type(v) == "string" then + rawset(t, 2, {v}) + else + rawset(t, 2, v) + end + else + for _, p in ipairs(rawget(t, 3)) do + if k == p[1] then + p[2] = v + return + end + end + kv = rawget(t, 3) + kv[#kv + 1] = {k, v} + rawset(t, 3, kv) + end +end +setmetatable(M.Attributes, M.Attributes) + --- Creates a single citation. -- @function Citation |