Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
-- By Edrx, 2007dec27
-- (find-es "blogme" "parsechangelog-tests")
-- (find-angg "LUA/parsechangelog.lua")
-- (find-es "lua5" "lpeg-quickref")
-- (find-blogme3 "escripts.lua")

loadlpeg()
LF = lpeg.P("\n")   -- todo: add support for \r and \r\n

CommentChar  =     lpeg.S("#")
SpaceChar    =     lpeg.S(     " \t")
HeadChar     = 1 - lpeg.S("\r\n# \t")
LineChar     = 1 - lpeg.S("\r\n")
NonSpaceChar = 1 - lpeg.S("\r\n \t")

HeadLine     = HeadChar    * LineChar^0 * LF
CommentLine  = CommentChar * LineChar^0 * LF
NonHeadLine  = SpaceChar^1 * LineChar^0 * LF
EmptyLine    = SpaceChar^0 * LF

Field        = HeadLine * (EmptyLine^0 * NonHeadLine)^0
Separator    = (EmptyLine + CommentLine)^0
SeparatorT   = Separator:Cs()
FieldsT      = (Field:C()^1):Ct()

-- For tests, from:
-- http://zumbi/~silas/_/tmp/pr
-- http://zumbi/~silas/_/tmp/pr.html
-- (find-fline "~/tmp/Changelog")
-- (find-es "blogme" "parsechangelog-tests")
--
fields = {
  "title: aplicar filtro etc\n",
  "state: open\n",
  "responsible: andre.luiz@\n",
  "class: feature-request\n",
  "release: ihmtelm-0-9\n",
  "arrival date: 2007dez21\n",
}

-- Iterate over fieldname/fieldvalue pairs.
-- (find-angg "LUA/lua50init.lua" "each2")
-- Note: I'm stripping the spaces after the ":" - is that right?
--
prfields = function (fields)
    local i = 1
    return function ()
        if i <= #fields then
	  local fieldname, body = fields[i]:match"^([^:]+):%s*(.*)\n$"
          i = i + 1
          return fieldname, body
        end
      end
  end

-- "#fields - 1" because the last field is always "egnahc" (like a "fi")
changelogfields = function (fields)
    local i = 1
    return function ()
        if i <= #fields - 1 then
	  local fieldname, body = fields[i]:match"^(%S+)%s*(.*)\n$"
          i = i + 1
          return fieldname, body
        end
      end
  end

fieldsandvalues = function (fields, iterateoverfields)
    local fieldnames  = {}
    local fieldvalues = {}
    for fieldname, fieldvalue in iterateoverfields(fields) do
      tinsert(fieldnames,  fieldname)
      tinsert(fieldvalues, fieldvalue)
    end
    return fieldnames, fieldvalues
  end
prfieldsandvalues        = function (fields)
    return fieldsandvalues(fields, prfields)
  end
changelogfieldsandvalues = function (fields)
    return fieldsandvalues(fields, changelogfields)
  end

sqlizefieldname = function (fieldname)
    return (fieldname:gsub(" ", "_"))
  end
sqlizefieldvalue = function (fieldvalue)
    return "'"..fieldvalue:gsub("'", "''").."'"
  end

sqlizefields = function (tablename, fieldnames, fieldvalues)
    local fns = table.concat(map(sqlizefieldname,  fieldnames), ", ")
    local fvs = table.concat(map(sqlizefieldvalue, fieldvalues), ",\n    ")
    return format("insert into tbl1 (%s)\n  values (\n    %s\n  );\n", fns, fvs)
  end