diff options
author | Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> | 2024-03-10 15:22:36 +0000 |
---|---|---|
committer | Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> | 2024-03-10 15:22:36 +0000 |
commit | b3ddebcbb456295d79d5f67fbb2985d653b6b43c (patch) | |
tree | a0b7993f935754400975ea1977c6f759cd473fd4 /app/src | |
parent | 6d2e2bed67658fb49e225a1c008a6c080ec7511a (diff) | |
download | infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.tar infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.tar.gz infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.tar.bz2 infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.tar.lz infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.tar.xz infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.tar.zst infinity-for-reddit-b3ddebcbb456295d79d5f67fbb2985d653b6b43c.zip |
Table richtext_json.
Diffstat (limited to '')
-rw-r--r-- | app/src/main/java/ml/docilealligator/infinityforreddit/markdown/RichTextJSONConverter.java | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/RichTextJSONConverter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/RichTextJSONConverter.java index c2ebc35a..5fb2c294 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/RichTextJSONConverter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/RichTextJSONConverter.java @@ -3,6 +3,11 @@ package ml.docilealligator.infinityforreddit.markdown; import androidx.annotation.Nullable; import org.commonmark.ext.gfm.strikethrough.Strikethrough; +import org.commonmark.ext.gfm.tables.TableBlock; +import org.commonmark.ext.gfm.tables.TableBody; +import org.commonmark.ext.gfm.tables.TableCell; +import org.commonmark.ext.gfm.tables.TableHead; +import org.commonmark.ext.gfm.tables.TableRow; import org.commonmark.node.BlockQuote; import org.commonmark.node.BulletList; import org.commonmark.node.Code; @@ -66,6 +71,11 @@ public class RichTextJSONConverter implements Visitor { private static final String URL = "u"; private static final String LEVEL = "l"; private static final String IS_ORDERED_LIST = "o"; + private static final String TABLE_HEADER_CONTENT = "h"; + private static final String TABLE_CELL_ALIGNMENT = "a"; + private static final String TABLE_CELL_ALIGNMENT_LEFT = "l"; + private static final String TABLE_CELL_ALIGNMENT_CENTER = "c"; + private static final String TABLE_CELL_ALIGNMENT_RIGHT = "r"; private static final String DOCUMENT = "document"; private final Map<String, Integer> formatMap; @@ -502,7 +512,40 @@ public class RichTextJSONConverter implements Visitor { @Override public void visit(CustomBlock customBlock) { + if (customBlock instanceof TableBlock) { + try { + JSONObject nodeJSON = new JSONObject(); + nodeJSON.put(TYPE, TABLE_E); + + Node child = customBlock.getFirstChild(); + while (child != null) { + if (child instanceof TableHead) { + contentArrayStack.push(new JSONArray()); + + child.accept(this); + + JSONArray hArray = contentArrayStack.pop(); + nodeJSON.put(TABLE_HEADER_CONTENT, hArray); + } else if (child instanceof TableBody) { + contentArrayStack.push(new JSONArray()); + + child.accept(this); + + JSONArray cArray = contentArrayStack.pop(); + nodeJSON.put(CONTENT, cArray); + } + child = child.getNext(); + } + + contentArrayStack.peek().put(nodeJSON); + + formats = new ArrayList<>(); + textSB.delete(0, textSB.length()); + } catch (JSONException e) { + throw new RuntimeException(e); + } + } } @Override @@ -541,6 +584,79 @@ public class RichTextJSONConverter implements Visitor { } catch (JSONException e) { throw new RuntimeException(e); } + } else if (customNode instanceof TableHead) { + Node child = customNode.getFirstChild(); + while (child != null) { + child.accept(this); + child = child.getNext(); + } + } else if (customNode instanceof TableBody) { + Node child = customNode.getFirstChild(); + while (child != null) { + if (child instanceof TableRow) { + contentArrayStack.push(new JSONArray()); + + child.accept(this); + + JSONArray array = contentArrayStack.pop(); + contentArrayStack.peek().put(array); + } + child = child.getNext(); + } + } else if(customNode instanceof TableRow) { + Node child = customNode.getFirstChild(); + while (child != null) { + child.accept(this); + child = child.getNext(); + } + } else if (customNode instanceof TableCell) { + try { + JSONObject nodeJSON = new JSONObject(); + + contentArrayStack.push(new JSONArray()); + + Node child = customNode.getFirstChild(); + while (child != null) { + child.accept(this); + child = child.getNext(); + } + + JSONArray cArray = contentArrayStack.pop(); + + if (textSB.length() > 0) { + JSONObject content = new JSONObject(); + content.put(TYPE, TEXT_E); + content.put(TEXT, textSB.toString()); + if (!formats.isEmpty()) { + JSONArray formatsArray = new JSONArray(); + for (JSONArray f : formats) { + formatsArray.put(f); + } + content.put(FORMAT, formatsArray); + } + + cArray.put(content); + } + + nodeJSON.put(CONTENT, cArray); + switch (((TableCell) customNode).getAlignment()) { + case LEFT: + nodeJSON.put(TABLE_CELL_ALIGNMENT, TABLE_CELL_ALIGNMENT_LEFT); + break; + case CENTER: + nodeJSON.put(TABLE_CELL_ALIGNMENT, TABLE_CELL_ALIGNMENT_CENTER); + break; + case RIGHT: + nodeJSON.put(TABLE_CELL_ALIGNMENT, TABLE_CELL_ALIGNMENT_RIGHT); + break; + } + contentArrayStack.peek().put(nodeJSON); + + formats = new ArrayList<>(); + textSB.delete(0, textSB.length()); + } catch (JSONException e) { + throw new RuntimeException(e); + } } } } |