Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
-- brackets.lua, rewritten for blogme4.
-- This file:
--   http://angg.twu.net/blogme4/brackets.lua.html
--   http://angg.twu.net/blogme4/brackets.lua
--            (find-blogme4file "brackets.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2011jan06
-- License: GPL3
--
-- See: (find-blogme3 "brackets.lua" "brackstructure")

-- «.bracketstructure»	(to "bracketstructure")
-- «.test-brackets»	(to "test-brackets")




-- «bracketstructure»  (to ".bracketstructure")
-- Sometimes (actually, VERY often) we will have to jump over pairs of
-- matching brackets in blogme source files... So let's implement a
-- very efficient way to do that.
--
-- Note that these functions are optional, and if they are loaded they
-- are only used by the replacements for parse__block and parse_block,
-- below.
--
bracketstructure = function (subj)
    local pos2pos, stack = {}, {}
    local f = function (pos, c)
        if c == "[" then
          stack[#stack + 1] = pos
        else
          if #stack == 0 then error("Extra ']' at "..pos) end
          local openpos = stack[#stack]
          stack[#stack] = nil
          pos2pos[openpos], pos2pos[pos] = pos, openpos
        end
      end
    subj:gsub("()([%[%]])", f)
    if #stack > 0 then error("Extra '[' at "..stack[#stack]) end
    return pos2pos
  end
bracketstructures = {}              -- the cache
afterclosing = function (subj, pos)
    local bs = bracketstructures[subj] or bracketstructure(subj)
    bracketstructures[subj] = bs    -- store the resulting table into the cache
    if bs[pos] and bs[pos] > pos then return bs[pos] + 1 end
  end

printbracketstructure = function (subj)
    local pos2pos = bracketstructure(subj)
    for _,pos in ipairs(sorted(keys(pos2pos))) do
      local otherpos = pos2pos[pos]
      if pos < otherpos then print(subj:sub(pos, otherpos)) end
    end
  end

-- Override two functions from argparsers.lua with faster versions.
-- The original parse__block and parse_block use string.match with the
-- %b[]" pattern:
--   (find-blogme4 "argparsers.lua" "parse_pattern" "parse__block")
--   (find-blogme4 "argparsers.lua" "parse_pattern" "parse_block")
--   (find-luamanualw3m "#5.4.1" "Patterns" "%b()")
--
parse__block = function ()
    oldpos, pos = pos, afterclosing(subj, pos)
    if not pos then pos = oldpos else return true end
  end
parse_block  = function ()
    if parse__block() then
      result = subj:sub(oldpos, pos)
      return true
    end
  end




-- dump-to: tests
--[=[
-- «test-brackets»  (to ".test-brackets")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
require "brackets"
--
--      /----------\
--      | /-\ /-\  |
str = "a[b[c]d[e]fg]h"
--      ^ ^ ^ ^ ^  ^
--      2 4 6 8 10 13 
PP(bracketstructure(str))
--> {2=13, 4=6, 6=4, 8=10, 10=8, 13=2}
printbracketstructure(str)
--> [b[c]d[e]fg]
--  [c]
--  [e]
print(afterclosing(str, 1))  --> nil
print(afterclosing(str, 2))  --> 14
print(afterclosing(str, 6))  --> nil

-- This very simple function always returns the same results as the
-- complex one above.
afterclosing2 = function (subj, pos) return subj:match("^%b[]()", pos) end
print(afterclosing2(str, 1))  --> nil
print(afterclosing2(str, 2))  --> 14
print(afterclosing2(str, 6))  --> nil

--]=]





-- Local Variables:
-- coding:             raw-text-unix
-- ee-anchor-format:   "«%s»"
-- End: