Added Kanji JIS spec to FC18 maisdoc

This commit is contained in:
Willem Cazander 2025-05-22 15:52:55 +02:00
parent 7ba8a6426d
commit c245c4b5d2
14 changed files with 284 additions and 55 deletions

View file

@ -23,7 +23,9 @@
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -42,6 +44,15 @@ import org.x4o.maisdoc.model.MaisDocConcept;
import org.x4o.maisdoc.model.MaisDocNode; import org.x4o.maisdoc.model.MaisDocNode;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import love.distributedrebirth.nx01.mushroom.mais.fc18.kanji.KanjiDict;
import love.distributedrebirth.nx01.mushroom.mais.fc18.kanji.KanjiDictLiteral;
import love.distributedrebirth.nx01.mushroom.mais.fc18.print.FCDocPageWriterBaklava;
import love.distributedrebirth.nx01.mushroom.mais.fc18.print.FCDocPageWriterMuffin;
import love.distributedrebirth.nx01.mushroom.mais.fc18.print.FCDocSegmentWriterCake;
import love.distributedrebirth.nx01.mushroom.mais.fc18.print.FCDocSegmentWriterCakeSlice;
import love.distributedrebirth.nx01.mushroom.mais.fc18.print.FCDocSegmentWriterCakeWord;
import love.distributedrebirth.nx01.mushroom.mais.fc18.print.FCDocSegmentWriterKanjiDictLiteral;
/** /**
* Cake doc writer. * Cake doc writer.
* *
@ -54,14 +65,18 @@ public class FCDocWriter {
private static final String[] C_FC_TOWER = {"fc-tower","Tower","All cake slices.","The cake slices of the four corner cake tower."}; private static final String[] C_FC_TOWER = {"fc-tower","Tower","All cake slices.","The cake slices of the four corner cake tower."};
private static final String[] C_FC_SLICE = {"fc-slice","Cake","The cake slice information.","The four corner cake slice provides the layout of boundries."}; private static final String[] C_FC_SLICE = {"fc-slice","Cake","The cake slice information.","The four corner cake slice provides the layout of boundries."};
private static final String[] C_FC_WORD = {"fc-word","Word","An FC18 word.","The word of an number."}; private static final String[] C_FC_WORD = {"fc-word","Word","An FC18 word.","The word of an number."};
private static final String[] C_FC_KD = {"fc-kd","Kanji","An kanji spec.","The format spec of kanji."};
private static final String[] C_FC_KDL = {"fc-kdl","Kanji Literal","An kanji literal.","The kanji defined literal."};
private MaisDocGenerator writer = null; private MaisDocGenerator writer = null;
private MaisDoc doc = null; private MaisDoc doc = null;
private KanjiDict kanjiDict = null;
static public void main(String[] args) { static public void main(String[] args) {
Iterator<String> arguments = Arrays.asList(args).iterator(); Iterator<String> arguments = Arrays.asList(args).iterator();
String outputFolder = null; String outputFolder = null;
Integer stopCakePoint = null; Integer stopCakePoint = null;
KanjiDict kanjiDictArgu = null;
while (arguments.hasNext()) { while (arguments.hasNext()) {
String arg = arguments.next(); String arg = arguments.next();
if ("-output".equals(arg)) { if ("-output".equals(arg)) {
@ -81,6 +96,21 @@ public class FCDocWriter {
String stopNum = arguments.next(); String stopNum = arguments.next();
stopCakePoint = Integer.parseInt(stopNum); stopCakePoint = Integer.parseInt(stopNum);
} }
if ("-kanji".equals(arg)) {
if (!arguments.hasNext()) {
System.err.println("No kanji file argument given.");
System.exit(1);
return;
}
kanjiDictArgu = new KanjiDict();
try (InputStream in = new FileInputStream(new File(arguments.next()))) {
kanjiDictArgu.parseXML(in);
System.out.println("Parsed kanji, mapKuTen208=" + kanjiDictArgu.mapKuTen208().size());
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
} }
if (outputFolder == null) { if (outputFolder == null) {
System.err.println("Missing output argument"); System.err.println("Missing output argument");
@ -91,7 +121,7 @@ public class FCDocWriter {
if (stopCakePoint != null) { if (stopCakePoint != null) {
System.out.println("Writing fcdoc, stop requested at: " + stopCakePoint); System.out.println("Writing fcdoc, stop requested at: " + stopCakePoint);
} }
FCDocWriter run = new FCDocWriter(stopCakePoint); FCDocWriter run = new FCDocWriter(stopCakePoint, kanjiDictArgu);
try { try {
File out = new File(outputFolder); File out = new File(outputFolder);
//out.mkdir(); //out.mkdir();
@ -102,7 +132,8 @@ public class FCDocWriter {
System.out.println("Writing fcdoc, DONE"); System.out.println("Writing fcdoc, DONE");
} }
public FCDocWriter(Integer stopCakePoint) { public FCDocWriter(Integer stopCakePoint, KanjiDict kanjiDict) {
this.kanjiDict = kanjiDict;
this.doc = buildApiDoc(new TDocCake(), stopCakePoint); this.doc = buildApiDoc(new TDocCake(), stopCakePoint);
this.writer = new MaisDocGenerator(); this.writer = new MaisDocGenerator();
} }
@ -132,22 +163,27 @@ public class FCDocWriter {
doc.setGroupTypeName("overview", "Overview",2); doc.setGroupTypeName("overview", "Overview",2);
doc.addTreeNodeClassExclude(TDocCakeWord.class); doc.addTreeNodeClassExclude(TDocCakeWord.class);
doc.addTreeNodeClassExclude(KanjiDictLiteral.class);
doc.setFrameNavConceptClass(TDocCakeSlice.class); doc.setFrameNavConceptClass(TDocCakeSlice.class);
doc.addTreeNodePageModeClass(TDocCake.class); doc.addTreeNodePageModeClass(TDocCake.class);
doc.addTreeNodePageModeClass(TDocCakeTower.class); doc.addTreeNodePageModeClass(TDocCakeTower.class);
doc.addTreeNodePageModeClass(KanjiDict.class);
doc.addAnnotatedClasses(FCDocSegmentWriterCake.class); doc.addAnnotatedClasses(FCDocSegmentWriterCake.class);
doc.addAnnotatedClasses(FCDocSegmentWriterCakeWord.class); doc.addAnnotatedClasses(FCDocSegmentWriterCakeWord.class);
doc.addAnnotatedClasses(FCDocSegmentWriterCakeSlice.class); doc.addAnnotatedClasses(FCDocSegmentWriterCakeSlice.class);
doc.addAnnotatedClasses(FCDocSegmentWriterKanjiDictLiteral.class);
MaisDocConcept adc1 = doc.addConcept(new MaisDocConcept(null,C_FC_ROOT,TDocCake.class)); MaisDocConcept adc1 = doc.addConcept(new MaisDocConcept(null,C_FC_ROOT,TDocCake.class));
MaisDocConcept adc2 = doc.addConcept(new MaisDocConcept(adc1,C_FC_TOWER,TDocCakeTower.class)); MaisDocConcept adc2 = doc.addConcept(new MaisDocConcept(adc1,C_FC_TOWER,TDocCakeTower.class));
MaisDocConcept adc3 = doc.addConcept(new MaisDocConcept(adc2,C_FC_SLICE,TDocCakeSlice.class)); MaisDocConcept adc3 = doc.addConcept(new MaisDocConcept(adc2,C_FC_SLICE,TDocCakeSlice.class));
/*ApiDocConcept adc4 = */doc.addConcept(new MaisDocConcept(adc3,C_FC_WORD,TDocCakeWord.class)); /*ApiDocConcept adc4 = */doc.addConcept(new MaisDocConcept(adc3,C_FC_WORD,TDocCakeWord.class));
//ApiDocConcept adc4 = doc.addConcept(new ApiDocConcept(adc3,C_TABLE,Table.class)); MaisDocConcept kanjiDoc = new MaisDocConcept(adc1,C_FC_KD,KanjiDict.class);
//adc4.addChildConcepts(new ApiDocConcept(adc4, CC_RS, Relationship.class)); MaisDocConcept kanjiDocLit = new MaisDocConcept(adc1,C_FC_KDL,KanjiDictLiteral.class);
adc1.addChildConcept(kanjiDoc);
adc1.addChildConcept(kanjiDocLit);
doc.addDocPage(FCDocPageWriterMuffin.createDocPage()); doc.addDocPage(FCDocPageWriterMuffin.createDocPage());
doc.addDocPage(FCDocPageWriterBaklava.createDocPage()); doc.addDocPage(FCDocPageWriterBaklava.createDocPage());
@ -172,9 +208,39 @@ public class FCDocWriter {
// TODO: print full 21 bit unicode range too // TODO: print full 21 bit unicode range too
} }
} }
if (kanjiDict != null) {
MaisDocNode kanjiDictNode208 = rootNode.addNode(createNodeKanjiDict("208"));
for (KanjiDictLiteral literal : kanjiDict.mapKuTen208Sorted()) {
kanjiDictNode208.addNode(createNodeKanjiDictLiteral(literal, true));
}
MaisDocNode kanjiDictNode213 = rootNode.addNode(createNodeKanjiDict("213"));
for (KanjiDictLiteral literal : kanjiDict.mapKuTen213Sorted()) {
kanjiDictNode213.addNode(createNodeKanjiDictLiteral(literal, false));
}
}
return doc; return doc;
} }
private MaisDocNode createNodeKanjiDict(String version) {
return new MaisDocNode(kanjiDict, "jis_x_0" + version, "JIS X 0" + version, "Kanji JIS X 0" + version);
}
private MaisDocNode createNodeKanjiDictLiteral(KanjiDictLiteral literal, boolean is208) {
//String hexPoint = Integer.toHexString(literal.getCodePoint()).toUpperCase();
String utfPoint = new StringBuilder().appendCodePoint(literal.getCodePoint()).toString();
String kuTen = is208?literal.getKuTen208():literal.getKuTen213();
String kuTenPath = kuTen.replaceAll("-", "_");
String firstMean = "";
if (literal.getMeaningDefault() != null) {
firstMean = literal.getMeaningDefault().stream().findFirst().orElse("");
}
String desc = utfPoint;
if (!firstMean.isEmpty()) {
desc = desc + " (" + firstMean + ")";
}
return new MaisDocNode(literal, kuTenPath, kuTen, desc);
}
private MaisDocNode createNodeCakeTower(FourCornerDotCakeTower tower) { private MaisDocNode createNodeCakeTower(FourCornerDotCakeTower tower) {
return new MaisDocNode(new TDocCakeTower(tower), tower.name(), tower.nameNice(), tower.description()); return new MaisDocNode(new TDocCakeTower(tower), tower.name(), tower.nameNice(), tower.description());
} }

View file

@ -24,7 +24,10 @@ package love.distributedrebirth.nx01.mushroom.mais.fc18.kanji;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
@ -46,13 +49,43 @@ import org.xml.sax.XMLReader;
*/ */
public class KanjiDict { public class KanjiDict {
Map<String, KanjiDictLiteral> mapKuTen208 = new HashMap<>(); private final Map<String, KanjiDictLiteral> mapKuTen208 = new HashMap<>();
Map<String, KanjiDictLiteral> mapKuTen213 = new HashMap<>(); private final Map<String, KanjiDictLiteral> mapKuTen213 = new HashMap<>();
Map<Integer, KanjiDictLiteral> mapFourCorner = new HashMap<>(); private final Map<Integer, KanjiDictLiteral> mapFourCorner = new HashMap<>();
public KanjiDict() { public KanjiDict() {
} }
public Map<String, KanjiDictLiteral> mapKuTen208() {
return mapKuTen208;
}
public List<KanjiDictLiteral> mapKuTen208Sorted() {
return new ArrayList<>(mapKuTen208.values()).stream().sorted(new Comparator<KanjiDictLiteral>() {
@Override
public int compare(KanjiDictLiteral arg0, KanjiDictLiteral arg1) {
return arg0.getKuTen208().compareTo(arg1.getKuTen208());
}
}).toList();
}
public Map<String, KanjiDictLiteral> mapKuTen213() {
return mapKuTen213;
}
public List<KanjiDictLiteral> mapKuTen213Sorted() {
return new ArrayList<>(mapKuTen213.values()).stream().sorted(new Comparator<KanjiDictLiteral>() {
@Override
public int compare(KanjiDictLiteral arg0, KanjiDictLiteral arg1) {
return arg0.getKuTen213().compareTo(arg1.getKuTen213());
}
}).toList();
}
public Map<Integer, KanjiDictLiteral> mapFourCorner() {
return mapFourCorner;
}
public void parseXML(InputStream input) throws ParserConfigurationException, SAXException, IOException { public void parseXML(InputStream input) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser(); SAXParser parser = factory.newSAXParser();

View file

@ -59,8 +59,8 @@ public class KanjiDictTest {
dict.parseXML(in); dict.parseXML(in);
} }
System.out.println("======================================="); System.out.println("=======================================");
for (Integer key : dict.mapFourCorner.keySet()) { for (Integer key : dict.mapFourCorner().keySet()) {
KanjiDictLiteral lit = dict.mapFourCorner.get(key); KanjiDictLiteral lit = dict.mapFourCorner().get(key);
int meanCnt = lit.getMeaningDefault().size(); int meanCnt = lit.getMeaningDefault().size();
String meaning = lit.getMeaningDefault().stream().map(v -> v.replaceAll(" ", "\u3000")).collect(Collectors.joining(" - ")); String meaning = lit.getMeaningDefault().stream().map(v -> v.replaceAll(" ", "\u3000")).collect(Collectors.joining(" - "));
System.out.print(new StringBuilder().appendCodePoint(lit.getCodePoint()).toString()); System.out.print(new StringBuilder().appendCodePoint(lit.getCodePoint()).toString());
@ -76,16 +76,16 @@ public class KanjiDictTest {
} }
List<Integer> kuTen2UNI2K = new ArrayList<>(); List<Integer> kuTen2UNI2K = new ArrayList<>();
for (String key : dict.mapKuTen208.keySet()) { for (String key : dict.mapKuTen208().keySet()) {
KanjiDictLiteral lit = dict.mapKuTen208.get(key); KanjiDictLiteral lit = dict.mapKuTen208().get(key);
String valueUnicode = new StringBuilder().appendCodePoint(lit.getCodePoint()).toString(); String valueUnicode = new StringBuilder().appendCodePoint(lit.getCodePoint()).toString();
kuTen2UNI2K.addAll(FourCornerUnicodeImport.strict().convertToInt18(key)); kuTen2UNI2K.addAll(FourCornerUnicodeImport.strict().convertToInt18(key));
kuTen2UNI2K.add(FCDotCDC1604DashP6.NY09_EQUALS.cakePointDotIndex()); kuTen2UNI2K.add(FCDotCDC1604DashP6.NY09_EQUALS.cakePointDotIndex());
kuTen2UNI2K.addAll(FourCornerUnicodeMapper.DICTIONARY.embedUNI2K(valueUnicode)); kuTen2UNI2K.addAll(FourCornerUnicodeMapper.DICTIONARY.embedUNI2K(valueUnicode));
kuTen2UNI2K.addAll(FCDotCMD5401Dash2D.CMD_F4TTY0001_NL.cakePointSequence()); kuTen2UNI2K.addAll(FCDotCMD5401Dash2D.CMD_F4TTY0001_NL.cakePointSequence());
} }
for (String key : dict.mapKuTen213.keySet()) { for (String key : dict.mapKuTen213().keySet()) {
KanjiDictLiteral lit = dict.mapKuTen213.get(key); KanjiDictLiteral lit = dict.mapKuTen213().get(key);
String valueUnicode = new StringBuilder().appendCodePoint(lit.getCodePoint()).toString(); String valueUnicode = new StringBuilder().appendCodePoint(lit.getCodePoint()).toString();
kuTen2UNI2K.addAll(FourCornerUnicodeImport.strict().convertToInt18(key)); kuTen2UNI2K.addAll(FourCornerUnicodeImport.strict().convertToInt18(key));
kuTen2UNI2K.add(FCDotCDC1604DashP6.NY09_EQUALS.cakePointDotIndex()); kuTen2UNI2K.add(FCDotCDC1604DashP6.NY09_EQUALS.cakePointDotIndex());
@ -119,8 +119,8 @@ public class KanjiDictTest {
int meanUse2 = 0; int meanUse2 = 0;
int meanUse1 = 0; int meanUse1 = 0;
Map<String, KanjiDictLiteral> uniqMean = new HashMap<>(); Map<String, KanjiDictLiteral> uniqMean = new HashMap<>();
for (Integer key : dict.mapFourCorner.keySet()) { for (Integer key : dict.mapFourCorner().keySet()) {
KanjiDictLiteral lit = dict.mapFourCorner.get(key); KanjiDictLiteral lit = dict.mapFourCorner().get(key);
if (lit.getMeaningDefault().isEmpty()) { if (lit.getMeaningDefault().isEmpty()) {
meanEmpty++; meanEmpty++;
continue; continue;
@ -156,9 +156,9 @@ public class KanjiDictTest {
// JIS X 0213 + 0208 have total characters 11233 // JIS X 0213 + 0208 have total characters 11233
// Japanese engineers have defined // Japanese engineers have defined
System.out.println("======================================="); System.out.println("=======================================");
System.out.println("mapFourCorner: " + dict.mapFourCorner.size()); System.out.println("mapFourCorner: " + dict.mapFourCorner().size());
System.out.println("mapKuTen208: " + dict.mapKuTen208.size()); System.out.println("mapKuTen208: " + dict.mapKuTen208().size());
System.out.println("mapKuTen213: " + dict.mapKuTen213.size()); System.out.println("mapKuTen213: " + dict.mapKuTen213().size());
System.out.println("======================================="); System.out.println("=======================================");
System.out.println("meanUniq: " + uniqMean.size()); System.out.println("meanUniq: " + uniqMean.size());
System.out.println("meanEmpty: " + meanEmpty); System.out.println("meanEmpty: " + meanEmpty);

View file

@ -20,7 +20,7 @@
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -20,7 +20,7 @@
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;

View file

@ -20,9 +20,10 @@
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import org.x4o.fc18.cake2.FourCornerDotCake; import org.x4o.fc18.cake2.FourCornerDotCake;
@ -155,4 +156,18 @@ public interface FCDocSegmentWriter {
} }
writer.printTagEnd(Tag.tr); writer.printTagEnd(Tag.tr);
} }
default void writeTableRowSequenceHex(MaisDocContentWriter writer, String system, int minHex, List<Integer> sequence) throws IOException {
String displayFormat = "0x%0" + minHex + "X";
StringBuilder buf = new StringBuilder();
for (int i = 0; i < sequence.size(); i++) {
int seq = sequence.get(i);
String hex = String.format(displayFormat, seq);
buf.append(hex);
if (i + 1 < sequence.size()) {
buf.append(" - ");
}
}
writer.docTableRow(system, buf.toString());
}
} }

View file

@ -20,7 +20,7 @@
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException; import java.io.IOException;
import java.util.HashSet; import java.util.HashSet;
@ -39,6 +39,9 @@ import org.x4o.maisdoc.model.MaisDocWriteEvent;
import org.x4o.sax3.SAX3WriterHtml.Tag; import org.x4o.sax3.SAX3WriterHtml.Tag;
import org.x4o.sax3.io.ContentCloseable; import org.x4o.sax3.io.ContentCloseable;
import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCake;
import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCakeSlice;
/** /**
* Cake doc slice writer. * Cake doc slice writer.
* *
@ -159,6 +162,9 @@ public class FCDocSegmentWriterCake implements FCDocSegmentWriter {
Set<FourCornerDotCake> linkableSlices = new HashSet<>(); Set<FourCornerDotCake> linkableSlices = new HashSet<>();
for (MaisDocNode towerNode : e.getEventObject().getNodes()) { for (MaisDocNode towerNode : e.getEventObject().getNodes()) {
for (MaisDocNode sliceNode : towerNode.getNodes()) { for (MaisDocNode sliceNode : towerNode.getNodes()) {
if (!(sliceNode.getUserData() instanceof TDocCakeSlice)) {
continue;
}
FourCornerDotCake slice = sliceNode.toUserData(TDocCakeSlice.class).getSlice(); FourCornerDotCake slice = sliceNode.toUserData(TDocCakeSlice.class).getSlice();
linkableSlices.add(slice); linkableSlices.add(slice);
StringBuilder buf = new StringBuilder(); StringBuilder buf = new StringBuilder();

View file

@ -20,7 +20,7 @@
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@ -35,6 +35,8 @@ import org.x4o.maisdoc.model.MaisDocNodeBody;
import org.x4o.maisdoc.model.MaisDocWriteEvent; import org.x4o.maisdoc.model.MaisDocWriteEvent;
import org.x4o.sax3.io.ContentCloseable; import org.x4o.sax3.io.ContentCloseable;
import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCakeSlice;
/** /**
* Cake doc segment slice writer. * Cake doc segment slice writer.
* *

View file

@ -20,7 +20,7 @@
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package love.distributedrebirth.nx01.mushroom.mais.fc18; package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -44,6 +44,8 @@ import org.x4o.maisdoc.model.MaisDocWriteEvent;
import org.x4o.fc18.cake2.FourCornerX00PetitVide; import org.x4o.fc18.cake2.FourCornerX00PetitVide;
import org.x4o.sax3.SAX3WriterHtml.Tag; import org.x4o.sax3.SAX3WriterHtml.Tag;
import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCakeWord;
/** /**
* Cake doc word writer. * Cake doc word writer.
* *
@ -85,16 +87,16 @@ public class FCDocSegmentWriterCakeWord implements FCDocSegmentWriter {
writer.docTableRow(name, value); writer.docTableRow(name, value);
if (x06BaklavaSequence.isPresent()) { if (x06BaklavaSequence.isPresent()) {
writeSequence(writer, "Sequence-X06", 2, x06BaklavaSequence.get().baklavaPointSequence()); writeTableRowSequenceHex(writer, "Sequence-X06", 2, x06BaklavaSequence.get().baklavaPointSequence());
} }
if (x08MuffinSequence.isPresent()) { if (x08MuffinSequence.isPresent()) {
writeSequence(writer, "Sequence-X08", 2, x08MuffinSequence.get().muffinPointSequence()); writeTableRowSequenceHex(writer, "Sequence-X08", 2, x08MuffinSequence.get().muffinPointSequence());
} }
if (x18CakeSequence.isPresent()) { if (x18CakeSequence.isPresent()) {
writeSequence(writer, "Sequence-X18", 6, x18CakeSequence.get().cakePointSequence()); writeTableRowSequenceHex(writer, "Sequence-X18", 6, x18CakeSequence.get().cakePointSequence());
} }
if (x21CodeDisplay.isPresent()) { if (x21CodeDisplay.isPresent()) {
writeSequence(writer, "Sequence-X21", 6, x21CodeDisplay.get().codePointSequence()); writeTableRowSequenceHex(writer, "Sequence-X21", 6, x21CodeDisplay.get().codePointSequence());
StringBuilder bufUTF8 = new StringBuilder(); StringBuilder bufUTF8 = new StringBuilder();
x21CodeDisplay.get().codePointSequence().forEach(v -> bufUTF8.appendCodePoint(v)); x21CodeDisplay.get().codePointSequence().forEach(v -> bufUTF8.appendCodePoint(v));
byte[] sequenceUTF8Bytes = bufUTF8.toString().getBytes(StandardCharsets.UTF_8); byte[] sequenceUTF8Bytes = bufUTF8.toString().getBytes(StandardCharsets.UTF_8);
@ -102,7 +104,7 @@ public class FCDocSegmentWriterCakeWord implements FCDocSegmentWriter {
for (int i = 0; i < sequenceUTF8Bytes.length; i++) { for (int i = 0; i < sequenceUTF8Bytes.length; i++) {
sequenceUTF8.add(Byte.toUnsignedInt(sequenceUTF8Bytes[i])); sequenceUTF8.add(Byte.toUnsignedInt(sequenceUTF8Bytes[i]));
} }
writeSequence(writer, "Sequence-X21-UTF8", 2, sequenceUTF8); writeTableRowSequenceHex(writer, "Sequence-X21-UTF8", 2, sequenceUTF8);
StringBuilder bufXML = new StringBuilder(); StringBuilder bufXML = new StringBuilder();
PrimitiveIterator.OfInt codePoints = bufUTF8.codePoints().iterator(); PrimitiveIterator.OfInt codePoints = bufUTF8.codePoints().iterator();
@ -137,19 +139,4 @@ public class FCDocSegmentWriterCakeWord implements FCDocSegmentWriter {
writer.docTableEnd(); writer.docTableEnd();
} }
} }
private void writeSequence(MaisDocContentWriter writer, String system, int minHex, List<Integer> sequence) throws IOException {
String displayFormat = "0x%0" + minHex + "X";
StringBuilder buf = new StringBuilder();
for (int i = 0; i < sequence.size(); i++) {
int seq = sequence.get(i);
String hex = String.format(displayFormat, seq);
buf.append(hex);
if (i + 1 < sequence.size()) {
buf.append(" - ");
}
}
writer.docTableRow(system, buf.toString());
}
} }

View file

@ -0,0 +1,114 @@
/*
* Copyright (c) 2004-2014, Willem Cazander
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package love.distributedrebirth.nx01.mushroom.mais.fc18.print;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.PrimitiveIterator;
import java.util.stream.Collectors;
import org.x4o.maisdoc.flake.MaisDocContentCss;
import org.x4o.maisdoc.flake.MaisDocContentWriter;
import org.x4o.maisdoc.flake.MaisDocNodeWriterMethod;
import org.x4o.maisdoc.model.MaisDocNode;
import org.x4o.maisdoc.model.MaisDocNodeBody;
import org.x4o.maisdoc.model.MaisDocWriteEvent;
import org.x4o.sax3.SAX3WriterHtml.Tag;
import love.distributedrebirth.nx01.mushroom.mais.fc18.kanji.KanjiDictLiteral;
/**
* Kanji dict literal doc segment writer.
*
* @author Willem Cazander
* @version 1.0 May 21, 2025
*/
public class FCDocSegmentWriterKanjiDictLiteral implements FCDocSegmentWriter {
@MaisDocNodeWriterMethod(nodeBody=MaisDocNodeBody.SUMMARY,targetClasses={KanjiDictLiteral.class})
public void writeCakeWordSummary(MaisDocWriteEvent<MaisDocNode> event) throws IOException {
MaisDocContentWriter writer = event.getWriter();
KanjiDictLiteral literal = event.getEventObject().toUserData(KanjiDictLiteral.class);
if (literal == null) {
writer.printTagStart(Tag.pre);
writer.printCharacters("No literal data for: " + event.getEventObject());
writer.printTagEnd(Tag.pre);
return;
}
writer.docTableStart("Literal Summary", "The kanji literal value information.",MaisDocContentCss.overviewSummary);
writer.docTableHeader("Point", "Value");
String name = "" + literal.getCodePoint();
String value = "";
StringBuilder buf = new StringBuilder();
buf.appendCodePoint(literal.getCodePoint());
value = buf.toString();
writer.docTableRow(name, value);
if (literal.getFourCorner() != null) {
writer.docTableRow("Four-Corner", "" + literal.getFourCorner());
}
if (literal.getKuTen208() != null) {
writer.docTableRow("KuTen-208", "" + literal.getKuTen208());
}
if (literal.getKuTen213() != null) {
writer.docTableRow("KuTen-213", "" + literal.getKuTen213());
}
writeTableRowSequenceHex(writer, "Sequence-X21", 6, List.of(literal.getCodePoint()));
StringBuilder bufUTF8 = new StringBuilder();
bufUTF8.appendCodePoint(literal.getCodePoint());
byte[] sequenceUTF8Bytes = bufUTF8.toString().getBytes(StandardCharsets.UTF_8);
List<Integer> sequenceUTF8 = new ArrayList<>();
for (int i = 0; i < sequenceUTF8Bytes.length; i++) {
sequenceUTF8.add(Byte.toUnsignedInt(sequenceUTF8Bytes[i]));
}
writeTableRowSequenceHex(writer, "Sequence-X21-UTF8", 2, sequenceUTF8);
StringBuilder bufXML = new StringBuilder();
PrimitiveIterator.OfInt codePoints = bufUTF8.codePoints().iterator();
while (codePoints.hasNext()) {
int codePoint = codePoints.nextInt();
bufXML.append("&amp;#x"); // manual &amp to show literal escape string
bufXML.append(Integer.toHexString(codePoint));
bufXML.append(";");
}
writer.docTableRow("Sequence-X21-XML", bufXML.toString());
writer.docTableEnd();
writer.docTableStart("Meaning Summary", "The kanji literal meaning information.",MaisDocContentCss.overviewSummary);
writer.docTableHeader("Locale", "Value");
for (String key : literal.getMeaning().keySet()) {
String meanLocale = key;
if (key.isEmpty()) {
meanLocale = "en";
}
List<String> meanings = literal.getMeaning().get(key);
String meanLocal = meanings.stream().collect(Collectors.joining(", "));
writer.docTableRow(meanLocale, meanLocal);
}
writer.docTableEnd();
}
}

View file

@ -111,7 +111,7 @@ public class DocModelWriter {
MaisDocConcept adc3 = doc.addConcept(new MaisDocConcept(adc2,C_SCHEMA,Schema.class)); MaisDocConcept adc3 = doc.addConcept(new MaisDocConcept(adc2,C_SCHEMA,Schema.class));
MaisDocConcept adc4 = doc.addConcept(new MaisDocConcept(adc3,C_TABLE,Table.class)); MaisDocConcept adc4 = doc.addConcept(new MaisDocConcept(adc3,C_TABLE,Table.class));
adc4.addChildConcepts(new MaisDocConcept(adc4, CC_RS, Relationship.class)); adc4.addChildConcept(new MaisDocConcept(adc4, CC_RS, Relationship.class));
doc.addDocPage(DefaultPageWriterTree.createDocPage()); doc.addDocPage(DefaultPageWriterTree.createDocPage());
doc.addDocPage(DefaultPageWriterIndexAll.createDocPage()); doc.addDocPage(DefaultPageWriterIndexAll.createDocPage());

View file

@ -52,7 +52,6 @@ import org.x4o.xml.element.ElementNamespace;
import org.x4o.xml.lang.X4OLanguage; import org.x4o.xml.lang.X4OLanguage;
import org.x4o.xml.lang.X4OLanguageModule; import org.x4o.xml.lang.X4OLanguageModule;
import org.x4o.xml.lang.X4OLanguageSession; import org.x4o.xml.lang.X4OLanguageSession;
import org.xml.sax.SAXException;
/** /**
* EldDocWriter writes the x4o eld documentation. * EldDocWriter writes the x4o eld documentation.
@ -210,13 +209,13 @@ public class EldDocWriter {
MaisDocConcept adcEc = doc.addConcept(new MaisDocConcept(adcNs,C_ELEMENT,ElementClass.class)); MaisDocConcept adcEc = doc.addConcept(new MaisDocConcept(adcNs,C_ELEMENT,ElementClass.class));
// mm maybe redo something here // mm maybe redo something here
adcMod.addChildConcepts(new MaisDocConcept(adcMod,CC_ATTRIBUTE_H,ElementNamespaceAttribute.class)); adcMod.addChildConcept(new MaisDocConcept(adcMod,CC_ATTRIBUTE_H,ElementNamespaceAttribute.class));
adcMod.addChildConcepts(new MaisDocConcept(adcMod,CC_CONFIGURATOR_G,ElementConfiguratorGlobal.class)); adcMod.addChildConcept(new MaisDocConcept(adcMod,CC_CONFIGURATOR_G,ElementConfiguratorGlobal.class));
adcMod.addChildConcepts(new MaisDocConcept(adcMod,CC_BINDING,ElementBindingHandler.class)); adcMod.addChildConcept(new MaisDocConcept(adcMod,CC_BINDING,ElementBindingHandler.class));
adcIface.addChildConcepts(new MaisDocConcept(adcMod,CC_ATTRIBUTE,ElementClassAttribute.class)); adcIface.addChildConcept(new MaisDocConcept(adcMod,CC_ATTRIBUTE,ElementClassAttribute.class));
adcIface.addChildConcepts(new MaisDocConcept(adcMod,CC_CONFIGURATOR,ElementConfigurator.class)); adcIface.addChildConcept(new MaisDocConcept(adcMod,CC_CONFIGURATOR,ElementConfigurator.class));
adcEc.addChildConcepts(new MaisDocConcept(adcEc,CC_CONFIGURATOR,ElementConfigurator.class)); adcEc.addChildConcept(new MaisDocConcept(adcEc,CC_CONFIGURATOR,ElementConfigurator.class));
adcEc.addChildConcepts(new MaisDocConcept(adcEc,CC_ATTRIBUTE,ElementClassAttribute.class)); adcEc.addChildConcept(new MaisDocConcept(adcEc,CC_ATTRIBUTE,ElementClassAttribute.class));
// Non-tree pages config // Non-tree pages config
if (propertyConfig.getPropertyBoolean(PAGE_PRINT_XTREE)) { doc.addDocPage(EldDocXTreePageWriter.createDocPage()); } if (propertyConfig.getPropertyBoolean(PAGE_PRINT_XTREE)) { doc.addDocPage(EldDocXTreePageWriter.createDocPage()); }

View file

@ -196,9 +196,16 @@ public class MaisDoc {
if (concept.getConceptClass().isAssignableFrom(objClass)) { if (concept.getConceptClass().isAssignableFrom(objClass)) {
return concept; return concept;
} }
// NOTE: only 2 level search for sub child concepts
for (MaisDocConcept c:concept.getChildConcepts()) { for (MaisDocConcept c:concept.getChildConcepts()) {
if (c.getConceptClass().isAssignableFrom(objClass)) { if (c.getConceptClass().isAssignableFrom(objClass)) {
return concept; //return concept;
return c;
}
for (MaisDocConcept cc:c.getChildConcepts()) {
if (cc.getConceptClass().isAssignableFrom(objClass)) {
return cc;
}
} }
} }
} }

View file

@ -133,7 +133,7 @@ public class MaisDocConcept {
this.conceptClass = conceptClass; this.conceptClass = conceptClass;
} }
public void addChildConcepts(MaisDocConcept childConcept) { public void addChildConcept(MaisDocConcept childConcept) {
childConcepts.add(childConcept); childConcepts.add(childConcept);
} }