Added escape sequences to FC18 maisdoc

This commit is contained in:
Willem Cazander 2025-05-23 01:57:14 +02:00
parent 9078b2b60d
commit d401b4c083
9 changed files with 158 additions and 29 deletions

View file

@ -36,6 +36,11 @@ import org.x4o.fc18.cake2.FourCornerDotCakeTower;
import org.x4o.fc18.cake2.FourCornerX00PetitVide;
import org.x4o.fc18.cake2.FourCornerX18CakePointDotName;
import org.x4o.fc18.cake2.FourCornerX21CodePointSequence;
import org.x4o.fc18.cake2.zero33.dec1.FCDotCMD5401Dash2D;
import org.x4o.fc18.cake2.zero33.dec1.FCDotDEC0801DashE10;
import org.x4o.fc18.cake2.zero33.dec1.FCDotINC0801DashP8;
import org.x4o.fc18.cake2.zero33.vt06.VTDash06DotZeroACursor;
import org.x4o.fc18.cake2.zero33.vt06.VTDash06DotZeroCClear;
import org.x4o.maisdoc.flake.MaisDocGenerator;
import org.x4o.maisdoc.flake.DefaultPageWriterHelp;
import org.x4o.maisdoc.flake.DefaultPageWriterTree;
@ -67,6 +72,7 @@ public class FCDocWriter {
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 static final String[] C_FC_ESC = {"fc-esc","Escape Sequence","An escape sequence.","The escape sequences."};
private MaisDocGenerator writer = null;
private MaisDoc doc = null;
@ -164,8 +170,9 @@ public class FCDocWriter {
doc.addTreeNodeClassExclude(TDocCakeWord.class);
doc.addTreeNodeClassExclude(KanjiDictLiteral.class);
doc.setFrameNavConceptClass(TDocCakeSlice.class);
doc.addTreeNodeClassExclude(TDocCakeWordEscape.class);
doc.setFrameNavConceptClass(TDocCakeSlice.class);
doc.addTreeNodePageModeClass(TDocCake.class);
doc.addTreeNodePageModeClass(TDocCakeTower.class);
doc.addTreeNodePageModeClass(KanjiDict.class);
@ -178,7 +185,10 @@ public class FCDocWriter {
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 adc3 = doc.addConcept(new MaisDocConcept(adc2,C_FC_SLICE,TDocCakeSlice.class));
/*ApiDocConcept adc4 = */doc.addConcept(new MaisDocConcept(adc3,C_FC_WORD,TDocCakeWord.class));
MaisDocConcept adc4 = doc.addConcept(new MaisDocConcept(adc3,C_FC_WORD,TDocCakeWord.class));
MaisDocConcept sliceEscapeSeq = new MaisDocConcept(adc4,C_FC_ESC,TDocCakeWordEscape.class);
adc4.addChildConcept(sliceEscapeSeq);
MaisDocConcept kanjiDoc = new MaisDocConcept(adc1,C_FC_KD,KanjiDict.class);
MaisDocConcept kanjiDocLit = new MaisDocConcept(adc1,C_FC_KDL,KanjiDictLiteral.class);
@ -202,20 +212,45 @@ public class FCDocWriter {
}
MaisDocNode sliceNode = towerNode.addNode(createNodeCakeSlice(dotCake));
for (int i = 0; i < dotCake.getLength(); i++) {
/*ApiDocNode wordNode =*/ sliceNode.addNode(createNodeCakeWord(dotCake, i));
MaisDocNode wordNode = sliceNode.addNode(createNodeCakeWord(dotCake, i));
if (FourCornerDotCake.FC_DEC2701_PX0.equals(dotCake)) {
if ("ESC_DEC0801_E10".equals(wordNode.getName())) {
for (FCDotDEC0801DashE10 vide : FCDotDEC0801DashE10.values()) {
wordNode.addNode(createNodeCakeWordEscape(vide, vide.name()));
}
}
if ("ESC68_INC0801_P8".equals(wordNode.getName())) {
for (FCDotINC0801DashP8 vide : FCDotINC0801DashP8.values()) {
wordNode.addNode(createNodeCakeWordEscape(vide, vide.name()));
}
}
if ("ESC68_CMD5401_2D".equals(wordNode.getName())) {
for (FCDotCMD5401Dash2D vide : FCDotCMD5401Dash2D.values()) {
wordNode.addNode(createNodeCakeWordEscape(vide, vide.name()));
}
}
if ("ESC_VT06".equals(wordNode.getName())) {
for (VTDash06DotZeroACursor vide : VTDash06DotZeroACursor.values()) {
wordNode.addNode(createNodeCakeWordEscape(vide, vide.name()));
}
for (VTDash06DotZeroCClear vide : VTDash06DotZeroCClear.values()) {
wordNode.addNode(createNodeCakeWordEscape(vide, vide.name()));
}
}
}
}
// 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));
kanjiDictNode208.addNode(createNodeKanjiDictLiteral(literal, literal.getKuTen208()));
}
MaisDocNode kanjiDictNode213 = rootNode.addNode(createNodeKanjiDict("213"));
for (KanjiDictLiteral literal : kanjiDict.mapKuTen213Sorted()) {
kanjiDictNode213.addNode(createNodeKanjiDictLiteral(literal, false));
kanjiDictNode213.addNode(createNodeKanjiDictLiteral(literal, literal.getKuTen213()));
}
}
return doc;
@ -225,10 +260,8 @@ public class FCDocWriter {
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();
private MaisDocNode createNodeKanjiDictLiteral(KanjiDictLiteral literal, String kuTen) {
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) {
@ -249,6 +282,15 @@ public class FCDocWriter {
return new MaisDocNode(new TDocCakeSlice(slice), slice.name(), slice.nameSpec(), slice.description());
}
private MaisDocNode createNodeCakeWordEscape(FourCornerX00PetitVide vide, String name) {
String desc = name;
// Optional<FourCornerX06BaklavaPointSequence> x06BaklavaSequence = vide.kaasX06BaklavaSequence();
// if (x06BaklavaSequence.isPresent()) {
// desc = x06BaklavaSequence.get().baklavaPointSequence().stream().map(v -> FCDotCDC1604DashP6.valueOf(v).name()).collect(Collectors.joining(", "));
// }
return new MaisDocNode(new TDocCakeWordEscape(vide), name, name ,desc);
}
private MaisDocNode createNodeCakeWord(FourCornerDotCake dotCake, int offset) {
int cakePoint = dotCake.getStart() + offset;
String idStr = String.format("0x%06X", cakePoint);

View file

@ -0,0 +1,44 @@
/*
* 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;
import org.x4o.fc18.cake2.FourCornerX00PetitVide;
/**
* Cake slice escape sequence doc model type.
*
* @author Willem Cazander
* @version 1.0 May 22, 2025
*/
public class TDocCakeWordEscape {
private final FourCornerX00PetitVide value;
public TDocCakeWordEscape(FourCornerX00PetitVide value) {
this.value = value;
}
public FourCornerX00PetitVide getValue() {
return value;
}
}

View file

@ -38,12 +38,14 @@ import org.x4o.fc18.cake2.FourCornerX21CodePointSequence;
import org.x4o.maisdoc.flake.MaisDocContentCss;
import org.x4o.maisdoc.flake.MaisDocContentWriter;
import org.x4o.maisdoc.flake.MaisDocNodeWriterMethod;
import org.x4o.maisdoc.model.MaisDocConcept;
import org.x4o.maisdoc.model.MaisDocNode;
import org.x4o.maisdoc.model.MaisDocNodeBody;
import org.x4o.maisdoc.model.MaisDocWriteEvent;
import org.x4o.fc18.cake2.FourCornerX00PetitVide;
import org.x4o.sax3.SAX3WriterHtml.Tag;
import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCakeWordEscape;
import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCakeWord;
/**
@ -54,18 +56,51 @@ import love.distributedrebirth.nx01.mushroom.mais.fc18.TDocCakeWord;
*/
public class FCDocSegmentWriterCakeWord implements FCDocSegmentWriter {
@MaisDocNodeWriterMethod(nodeBody=MaisDocNodeBody.SUMMARY,targetClasses={TDocCakeWord.class})
public void writeCakeWordSummary(MaisDocWriteEvent<MaisDocNode> event) throws IOException {
//@MaisDocNodeWriterMethod(nodeBody=MaisDocNodeBody.DETAIL, targetClasses={TDocCakeWord.class}, nodeBodyOrders=20)
public void writeDefaultSummary(MaisDocWriteEvent<MaisDocNode> event) throws IOException {
// NOTE: copyed from defaultWriteSummary as that only called with zero summaries + changes name end in; Words
MaisDocContentWriter writer = event.getWriter();
TDocCakeWord word = event.getEventObject().toUserData(TDocCakeWord.class);
FourCornerX00PetitVide[] videPoints = word.getSlice().getVidePoints();
if (videPoints.length == 0) {
writer.printTagStart(Tag.pre);
writer.printCharacters("No PetitVide data for: " + word.toString());
writer.printTagEnd(Tag.pre);
MaisDocNode parent = event.getEventObject();
MaisDocConcept concept = event.getDoc().findConceptByClass(parent.getUserData().getClass());
List<MaisDocNode> nodes = parent.getNodes();
if (nodes.isEmpty()) {
return;
}
FourCornerX00PetitVide videPoint = videPoints[word.getOffset()];
String name = concept.getName()+" Escape Sequences";
writer.docTableStart(name, "All childeren in "+name,MaisDocContentCss.overviewSummary);
writer.docTableHeader("Name", "Description");
for (MaisDocNode child : nodes) {
String link = MaisDocContentWriter.toSafeUri(child.getId())+"/index.html";
if (parent.getParent()==null) {
link = MaisDocContentWriter.toSafeUri(parent.getId())+"/"+link; // root node
}
writer.docTableRowLink(link,child.getName(),child.getDescription());
}
writer.docTableEnd();
}
@MaisDocNodeWriterMethod(nodeBody=MaisDocNodeBody.SUMMARY,targetClasses={TDocCakeWord.class, TDocCakeWordEscape.class}, nodeBodyOrders= {10, 10})
public void writeCakeWordSummary(MaisDocWriteEvent<MaisDocNode> event) throws IOException {
MaisDocContentWriter writer = event.getWriter();
FourCornerX00PetitVide videPoint = null;
if (TDocCakeWord.class.isAssignableFrom(event.getEventObject().getUserData().getClass())) {
TDocCakeWord word = event.getEventObject().toUserData(TDocCakeWord.class);
FourCornerX00PetitVide[] videPoints = word.getSlice().getVidePoints();
if (videPoints.length == 0) {
writer.printTagStart(Tag.pre);
writer.printCharacters("No PetitVide data for: " + word.toString());
writer.printTagEnd(Tag.pre);
return;
}
videPoint = videPoints[word.getOffset()];
} else if (TDocCakeWordEscape.class.isAssignableFrom(event.getEventObject().getUserData().getClass())) {
TDocCakeWordEscape seq = event.getEventObject().toUserData(TDocCakeWordEscape.class);
videPoint = seq.getValue();
} else {
throw new IllegalStateException("Unsupported event object: " + event.getEventObject().getUserData().getClass());
}
Optional<FourCornerX21CodePointSequence> x21CodeDisplay = videPoint.kaasX21CodeSequence();
Optional<FourCornerX06BaklavaPointSequence> x06BaklavaSequence = videPoint.kaasX06BaklavaSequence();
Optional<FourCornerX08MuffinPointSequence> x08MuffinSequence = videPoint.kaasX08MuffinSequence();
@ -74,7 +109,7 @@ public class FCDocSegmentWriterCakeWord implements FCDocSegmentWriter {
writer.docTableStart("Word Summary", "The cake word point value information.",MaisDocContentCss.overviewSummary);
writer.docTableHeader("Point", "Value");
String name = word.toString();
String name = ""; //word.toString();
String value = "";
if (x18DotName.isPresent()) {
name = x18DotName.get().name();
@ -138,5 +173,10 @@ public class FCDocSegmentWriterCakeWord implements FCDocSegmentWriter {
writer.docTableRow("Bottom", cornerKerning.coinCarneFrapper().kerningBottom().name());
writer.docTableEnd();
}
List<MaisDocNode> nodes = event.getEventObject().getNodes();
if (!nodes.isEmpty()) {
writeDefaultSummary(event);
}
}
}