RFC 6901 JSONポインター ?

チルダ(\u007e)でハマってしまった。今日の睡眠時間2時間。完全にボケている。

<!DOCTYPE html>
<title>RFC 6901 JSONポインター</title>
<meta charset="UTF-8"/>
<style>
</style>
<body>
<h1>RFC 6901 JSONポインター</h1>
<h2>tools.ietf.org/html/rfc6901</h2>
<p>
<textarea cols="30" rows="12">
//以下を JSON として扱う
{
      "foo": ["bar", "baz"],
      "": 0,
      "a/b": 1,
      "c%d": 2,
      "e^f": 3,
      "g|h": 4,
      "i\\j": 5,
      "k\"l": 6,
      " ": 7,
      "m~n": 8
}
</textarea>
<textarea cols="30" rows="12">
//取り出すためのパラメータ
[
  "/foo",
  "/foo/0",
  "/",
  "/a~1b",
  "/c%d",
  "/e^f",
  "/g|h",
  "/i\\j",
  "k\"l",
  "/ ",
  "/m~0n"
]
</textarea>
<textarea cols="30" rows="12">
</textarea>

<p>
  <input type="text" id="fragment" value="">
  <input type="button" value="Test" onclick="demo();">
</p>

<p>
  result:<br>
  <textarea cols="30" rows="2"></textarea>
</p>

<script>

(function () {
  var or = "|";
  var identifier = "\\u002F";
  var unicode   = "[\\u0000-\\u002E\\u0030-\\u10FFFF]";
  var other = "(.*|$)";
  var reg_str = "^" + identifier + "?(" + unicode + "+)?" + other;

  var token_parser = new RegExp (reg_str);
  var escaped1 = /(~0*1)/g;
  var escaped0 = /(~0)/g;
  

  function pointerParse (json, fragment) {
    var result = json;
    var parse = fragment;
    var token;
    var pointer;

    while (parse) {
      token = token_parser.exec (parse);

      if (! token)
        throw new Error;

      pointer = (token[1])
      ? token[1].replace (escaped1, '\u002F').replace (escaped0, '\u007E') // ~, /
      : '';
      result = result[pointer];
      parse = token[2];
    }

    return result;
  }
  
  
  this.JSON_Pointer = pointerParse;
}) ();


//検証
var view = document.querySelectorAll ('textarea');
var json = eval ('(' + view[0].value + ')');
var frgm = eval ('(' + view[1].value + ')');
view[2].value = "// 取り出した結果\n[\n" +
  frgm.map (function (q) { return "  " + [q, JSON_Pointer (this, q)].join (" \t= "); }, json).join ("\n") +
  "\n]";

function demo () {
  view[3].value = JSON_Pointer (json, document.querySelector ('#fragment').value);
}
</script>