From 4a88de54721a6b11220d9b5a747f936e995941e3 Mon Sep 17 00:00:00 2001 From: ArghKevin Date: Thu, 16 May 2024 03:13:50 -0700 Subject: Simple JSON parsing. Will need extension for tables. --- src/JSONReader.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/JSONReader.java b/src/JSONReader.java index 8d670b6..45f6bd5 100644 --- a/src/JSONReader.java +++ b/src/JSONReader.java @@ -1,4 +1,5 @@ import java.util.HashMap; +import java.util.ArrayList; import java.io.*; /* @@ -6,6 +7,8 @@ import java.io.*; * Kian Agheli * * References: + * https://googlefonts.github.io/gf-guide/metadata.html + * https://stackoverflow.com/questions/3880274/how-to-convert-the-object-to-string-in-java * * Date: * 2024-05-08 @@ -15,23 +18,75 @@ import java.io.*; */ public class JSONReader extends Reader { + /* metadata.pb is not exactly JSON, but so close to it + that it's practically a subset of JSON with fewer quotation + marks. If set, this is a pb file. */ + private boolean pb; + public JSONReader(File file) { super(file); + pb = false; + } + + private String composeKey(String key) { + if (!pb) { + key = "\"" + key + "\""; + } + key += ": "; + + return key; } /** * Search for and return the first * match. */ - public String get(String field) { - return null; + public String get(String key) { + key = composeKey(key); + + int start = this.getContents().indexOf(key); + if (start == -1) { + /* No match. */ + return null; + } + + start += key.length(); + /* This JSON is pretty-printed. */ + int nl = this.getContents().indexOf("\n", start); + + /* Extract substring. Remove any quotation marks and commas. */ + String substring = this.getContents().substring(start, nl); + return substring.replaceAll("[\",]", ""); } /** * Search for and return all matches. */ - public String[] getAll(String field) { - return null; + public String[] getAll(String key) { + key = composeKey(key); + + ArrayList list = new ArrayList(); + int lastMatch = 0; + while ((lastMatch = this.getContents().indexOf(key, lastMatch)) != -1) { + lastMatch += key.length(); + int start = lastMatch; + /* This JSON is pretty-printed. */ + int nl = this.getContents().indexOf("\n", start); + if (nl == -1) { + /* EOF. */ + nl = this.getContents().length(); + } + + /* Extract substring. Remove any quotation marks and commas. */ + String substring = this.getContents().substring(start, nl); + list.add(substring.replaceAll("[\",]", "")); + } + + /* The caller doesn't need the capabilites of an ArrayList, only + those of an array. */ + String[] array = new String[list.size()]; + list.toArray(array); + return array; } /** @@ -40,4 +95,11 @@ public class JSONReader extends Reader { public String getTable(HashMap name) { return null; } + + /** + * Specify that this is the special PB format. + * See https://googlefonts.github.io/gf-guide/metadata.html. */ + public void setPb() { + this.pb = true; + } } -- cgit v1.2.3