Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
-- fbjson.lua: parse json (for fbcache).
-- This file:
-- http://angg.twu.net/fbcache/fbjson.lua
-- http://angg.twu.net/fbcache/fbjson.lua.html
--  (find-angg        "fbcache/fbjson.lua")



--    _                                                
--   (_)___  ___  _ __       _ __   __ _ _ __ ___  ___ 
--   | / __|/ _ \| '_ \     | '_ \ / _` | '__/ __|/ _ \
--   | \__ \ (_) | | | |    | |_) | (_| | |  \__ \  __/
--  _/ |___/\___/|_| |_|____| .__/ \__,_|_|  |___/\___|
-- |__/               |_____|_|                        
--
-- (find-fbcache "fbcache.lua" "requires")
-- (find-fbcache "fbcache.lua" "json_parse")
-- http://www.json.org/
require "re"
require "posix"

json_grammar0 = [=[
  objrest <- obj {} [%s]* {.*}
  obj     <- bool / num / str / table / list
  objp    <- obj colon obj
  table   <- ("{" (objp (comma objp)*)* "}") -> totable
  list    <- ("[" (obj  (comma obj )*)* "]") -> tolist
  colon   <- [%s]* ":" [%s]*
  comma   <- [%s]* "," [%s]*
  bool    <- ("true" / "false") -> tobool
  num     <- ("-"? [0-9.]+)      -> tonum

  str <- (ustr / str0)
   ustr        <- "u" str0
   str0        <- ("'" (stritem / {'"'})* -> concat "'") /
                  ('"' (stritem / {"'"})* -> concat '"')
   stritem     <- strcnormals / strcc / strcx / strcu / strcU / strcother
   strcnormals <- {[^'"\]+}
   strcc       <- "\"  {['"\/]}
   strcx       <- "\x" ({[%x][%x]}                       -> hextoc)
   strcu       <- "\u" ({[%x][%x][%x][%x]}                 -> utoc)
   strcU       <- "\U" ({[%x][%x][%x][%x][%x][%x][%x][%x]} -> Utoc)
   strcother   <- "\" . -> otherc
]=]
json_chars_b = {n="\n", r="\r", t="\t", b="\b", ["/"]="/"}
json_chars_u = {["2018"]='"', ["2019"]='"', ["201c"]='"', ["201d"]='"',
                ["2013"]="---", ["2022"]="*", }
json_chars_U = {}
json_defs = {
  tobool  = function (s) return s == "True" and true or false end,
  tonum   = function (s) return tonumber(s) end,
  tostr   = function (s) return s end,
  tolist  = function (...) return {...} end,
  totable = function (...)
      local L, T = {...}, {}
      for i=1,#L-1,2 do T[L[i]] = L[i+1] end
      return T
    end,
  hextoc  = function (hh) return string.char(tonumber(hh, 16)) end,
  utoc   = function  (h4)
      local n = tonumber(h4, 16)
      if n < 256 then return string.char(n) end
      return json_chars_u[h4] or "\\u"..h4
    end,
  Utoc   = function  (h8) return "\\U"..h8 end,
  concat  = function (...) return table.concat {...} end,
  otherc  = function (c)
      if json_chars_b[c] then return json_chars_b[c] end
      print("\\"..c)
      return "\\"..c
    end,
}
json_grammar = re.compile(json_grammar0, json_defs)
json_parse   = function (bigstr, pos) return json_grammar:match(bigstr, pos) end
json_test    = function (bigstr, pos) pp(json_parse(bigstr, pos)) end


--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "fbjson.lua"

--]]


-- Local Variables:
-- coding: raw-text-unix
-- End: