aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/org/pacien/pandoc/filter/plantuml/PandocNode.kt
blob: edf122b21a38f68a87731ad2fd68e68e51820c3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * pandoc-filter-plantuml, a Pandoc AST filter rendering PlantUML diagrams
 * Copyright (C) 2018 Pacien TRAN-GIRARD
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package org.pacien.pandoc.filter.plantuml

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node.ObjectNode
import com.fasterxml.jackson.databind.node.TextNode

// Structure of a content node:
// {
//   "t": "CodeBlock",
//   "c": [
//     [
//       "",
//       [ "puml", "otherClass" ],
//       [ ["scale", "0.5"], ["key", "value"] ]
//     ],
//     "@startuml\n@enduml"
//   ]
// }

fun JsonNode.type(): String = path("t").asText()
fun JsonNode.classes(): JsonNode = path("c").path(0).path(1)
fun JsonNode.classNames(): List<String> = classes().map(JsonNode::asText)
fun JsonNode.attributes(): JsonNode = path("c").path(0).path(2)
fun JsonNode.attributePair(): Pair<String, String> = Pair(path(0).asText(), path(1).asText())
fun JsonNode.attributeMap(): Map<String, String> = attributes().associate(JsonNode::attributePair)
fun JsonNode.content(): String = path("c").path(1).asText()

fun ObjectNode.setBlockType(type: String) = apply { set("t", TextNode.valueOf(type)) }
fun ObjectNode.setBlockContent(content: JsonNode) = apply { set("c", content) }
fun ObjectNode.setBlock(type: String, content: JsonNode) = setBlockType(type).setBlockContent(content)