)]}'
{
  "commit": "1c382df612df358ff1331293b17a9b7a27d57369",
  "tree": "e4246d4a70e9483ab1bb587e1d3c210694b88fa9",
  "parents": [
    "1cada87c62550446fca6a42a69743688b4539a4c"
  ],
  "author": {
    "name": "Christian Hansen",
    "email": "chansen@cpan.org",
    "time": "Thu Apr 30 11:25:48 2026"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Apr 30 11:25:48 2026"
  },
  "message": "Split EMOJI_MODIFIER_BASE and expand emoji presentation coverage (#18)\n\n* Split EMOJI_MODIFIER_BASE into text and emoji presentation variants\n\nDistinguish between modifier bases that default to text presentation\nand those that default to emoji presentation. Bare text-default modifier\nbases are no longer classified as emoji presentation, aligning with UTS #51.\n\n* Add standalone emoji modifier and regional indicator to emoji presentation\n\nBoth EMOJI_MODIFIER and REGIONAL_INDICATOR have Emoji_Presentation\u003dYes\nin Unicode data, so they should be classified as emoji presentation\neven when they appear outside of a modifier or flag sequence.\n\n* Add unqualified keycap sequence to emoji presentation\n\nRecognize keycap sequences without VS16 (e.g., # + U+20E3) as emoji\npresentation. Previously only the fully qualified form with VS16\nbetween the keycap base and combining enclosing keycap was matched.\n\n* Regenerate emoji_presentation_scanner.c from updated Ragel grammar\n\n* Update README classifier example for modifier base split\n\n* Add test harness with Makefile integration\n\nIntroduces emoji_test.c, emoji_test_data.pl, and a make test target.\nTest data is generated by the Perl script using Unicode properties to\nclassify codepoints, then compiled into a C harness that validates\nscan_emoji_presentation() output for each sequence.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "6cf7a13519973111a4c59f4fbece138c42af2823",
      "old_mode": 33188,
      "old_path": "Makefile",
      "new_id": "7dfc2c32e4f0705ef365977f38c2f0ffbcb08195",
      "new_mode": 33188,
      "new_path": "Makefile"
    },
    {
      "type": "modify",
      "old_id": "571a1a45159b4c0eaca4f90b75021dab77001787",
      "old_mode": 33188,
      "old_path": "README.md",
      "new_id": "a51e4a4bbb3808c1a662699fde85a701918d358f",
      "new_mode": 33188,
      "new_path": "README.md"
    },
    {
      "type": "modify",
      "old_id": "a67db1b5a6f9991805b34f39f4b2a3658041e2cb",
      "old_mode": 33188,
      "old_path": "emoji_presentation_scanner.c",
      "new_id": "9a8f2998aa2dabe53698c8edf2fa2bc992803660",
      "new_mode": 33188,
      "new_path": "emoji_presentation_scanner.c"
    },
    {
      "type": "modify",
      "old_id": "53bf18dcec2383ca97d55418f35c99b95ba9d997",
      "old_mode": 33188,
      "old_path": "emoji_presentation_scanner.rl",
      "new_id": "4efcd5152a8ce62b65d897a84fc08f4f6ffbd2c8",
      "new_mode": 33188,
      "new_path": "emoji_presentation_scanner.rl"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "991b1c1f6c9f17bf29b91abd16506225a4330d8e",
      "new_mode": 33188,
      "new_path": "emoji_test.c"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "940d729ea2702ffcc83ed74cdaf1ce5ba840aba8",
      "new_mode": 33188,
      "new_path": "emoji_test_data.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "eb8f5da52c6274dd1f6701c3891cab04fcbdf8f5",
      "new_mode": 33261,
      "new_path": "emoji_test_data.pl"
    }
  ]
}
