This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit d565afc484e6ff47dd2b1447ec2e34be02a6a84b Author: Andy Seaborne <[email protected]> AuthorDate: Tue Mar 17 17:08:14 2026 +0000 Fix: TurtleJCC: Handle text direction --- .../atlas/json/io/parserjavacc/JSONPrinter.java | 109 +++++++++------------ .../lang/turtlejcc/LangTurtleJCCParserBase.java | 22 +++-- .../apache/jena/arq/junit/riot/RiotSyntaxTest.java | 2 +- .../org/apache/jena/riot/Scripts_AltTurtle.java | 12 +-- 4 files changed, 65 insertions(+), 80 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/atlas/json/io/parserjavacc/JSONPrinter.java b/jena-arq/src/main/java/org/apache/jena/atlas/json/io/parserjavacc/JSONPrinter.java index 2f4a670e27..79d2fbe450 100644 --- a/jena-arq/src/main/java/org/apache/jena/atlas/json/io/parserjavacc/JSONPrinter.java +++ b/jena-arq/src/main/java/org/apache/jena/atlas/json/io/parserjavacc/JSONPrinter.java @@ -21,113 +21,96 @@ package org.apache.jena.atlas.json.io.parserjavacc; -import org.apache.jena.atlas.io.IndentedWriter ; -import org.apache.jena.atlas.json.io.JSONHandler ; +import org.apache.jena.atlas.io.IndentedWriter; +import org.apache.jena.atlas.json.io.JSONHandler; /** Parser debugging */ -public class JSONPrinter implements JSONHandler -{ +public class JSONPrinter implements JSONHandler { + + IndentedWriter out; - IndentedWriter out ; - @Override - public void startParse(long currLine, long currCol) - { - out = new IndentedWriter(System.out, true) ; - //out.setPadString("> ") ; + public void startParse(long currLine, long currCol) { + out = new IndentedWriter(System.out); + out.setLineNumbers(true); + // out.setPadString("> "); } @Override - public void finishParse(long currLine, long currCol) - { - out.flush() ; + public void finishParse(long currLine, long currCol) { + out.flush(); } @Override - public void startObject(long currLine, long currCol) - { - out.println(">>Object") ; - out.incIndent() ; + public void startObject(long currLine, long currCol) { + out.println(">>Object"); + out.incIndent(); } @Override - public void finishObject(long currLine, long currCol) - { - out.decIndent() ; - out.println("<<Object") ; - + public void finishObject(long currLine, long currCol) { + out.decIndent(); + out.println("<<Object"); + } - + @Override - public void startPair(long currLine, long currCol) - { - out.println(">Pair") ; - out.incIndent() ; + public void startPair(long currLine, long currCol) { + out.println(">Pair"); + out.incIndent(); } @Override - public void keyPair(long currLine, long currCol) - {} + public void keyPair(long currLine, long currCol) {} @Override - public void finishPair(long currLine, long currCol) - { - out.decIndent() ; - out.println("<Pair") ; + public void finishPair(long currLine, long currCol) { + out.decIndent(); + out.println("<Pair"); } - + @Override - public void startArray(long currLine, long currCol) - { - out.println(">>Array") ; - out.incIndent() ; + public void startArray(long currLine, long currCol) { + out.println(">>Array"); + out.incIndent(); } @Override - public void element(long currLine, long currCol) - {} + public void element(long currLine, long currCol) {} @Override - public void finishArray(long currLine, long currCol) - { - out.decIndent() ; - out.println("<<Array") ; + public void finishArray(long currLine, long currCol) { + out.decIndent(); + out.println("<<Array"); } @Override - public void valueBoolean(boolean b, long currLine, long currCol) - { - out.println("Boolean: "+b) ; + public void valueBoolean(boolean b, long currLine, long currCol) { + out.println("Boolean: " + b); } @Override - public void valueDecimal(String image, long currLine, long currCol) - { - out.println("Decimal: "+image) ; + public void valueDecimal(String image, long currLine, long currCol) { + out.println("Decimal: " + image); } @Override - public void valueDouble(String image, long currLine, long currCol) - { - out.println("Double: "+image) ; + public void valueDouble(String image, long currLine, long currCol) { + out.println("Double: " + image); } @Override - public void valueInteger(String image, long currLine, long currCol) - { - out.println("Integer: "+image) ; + public void valueInteger(String image, long currLine, long currCol) { + out.println("Integer: " + image); } @Override - public void valueNull(long currLine, long currCol) - { - out.println("Null") ; + public void valueNull(long currLine, long currCol) { + out.println("Null"); } @Override - public void valueString(String image, long currLine, long currCol) - { - out.println("String: "+image) ; + public void valueString(String image, long currLine, long currCol) { + out.println("String: " + image); } - } diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/LangTurtleJCCParserBase.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/LangTurtleJCCParserBase.java index 3c5f7a3864..04ad3a12f8 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/LangTurtleJCCParserBase.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/turtlejcc/LangTurtleJCCParserBase.java @@ -158,16 +158,24 @@ public class LangTurtleJCCParserBase { } protected Node createLiteral(String lexicalForm, String langTag, String datatypeURI, int line, int column) { - Node n = null ; + checkRDFString(lexicalForm, line, column); // Can't have type and lang tag in parsing. + // langTag include text direction, if any. if ( datatypeURI != null ) { RDFDatatype dType = TypeMapper.getInstance().getSafeTypeByName(datatypeURI) ; - n = profile.createTypedLiteral(lexicalForm, dType, line, column) ; - } else if ( langTag != null && !langTag.isEmpty() ) - n = profile.createLangLiteral(lexicalForm, langTag, line, column) ; - else - n = profile.createStringLiteral(lexicalForm, line, column) ; - return n ; + return profile.createTypedLiteral(lexicalForm, dType, line, column) ; + } + if ( langTag != null && !langTag.isEmpty() ) { + // Extract text direction. + int idx = langTag.indexOf("--"); + if ( idx >= 0 ) { + String textDir = langTag.substring(idx+2); + String langTagNoDir = langTag.substring(0, idx); + return profile.createLangDirLiteral(lexicalForm, langTagNoDir, textDir, line, column); + } + return profile.createLangLiteral(lexicalForm, langTag, line, column) ; + } + return profile.createStringLiteral(lexicalForm, line, column) ; } protected Node createTripleTerm(Node s, Node p, Node o, int line, int column) { diff --git a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java index 8e6713f53d..c18d949d37 100644 --- a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java +++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java @@ -119,6 +119,6 @@ public class RiotSyntaxTest extends AbstractManifestTest { } private void outputFailure(String reason, String fn, Throwable th) { - fail("Parsing succeeded in a bad syntax test"); + fail("Parsing succeeded in a bad syntax test: "+fn); } } diff --git a/jena-arq/src/test/java/org/apache/jena/riot/Scripts_AltTurtle.java b/jena-arq/src/test/java/org/apache/jena/riot/Scripts_AltTurtle.java index 6bd47c5d19..f7f7839086 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/Scripts_AltTurtle.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/Scripts_AltTurtle.java @@ -23,7 +23,6 @@ package org.apache.jena.riot; import java.util.stream.Stream; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DynamicNode; import org.junit.jupiter.api.TestFactory; @@ -31,7 +30,6 @@ import org.junit.jupiter.api.TestFactory; import org.apache.jena.arq.TestConsts; import org.apache.jena.arq.junit.Scripts; import org.apache.jena.riot.lang.turtlejcc.TurtleJCC; -import org.apache.jena.sys.JenaSystem; /** Execute turtle test with alt parser. */ public class Scripts_AltTurtle { @@ -39,12 +37,8 @@ public class Scripts_AltTurtle { @TestFactory @DisplayName("Scripts AltTurtle rdf-tests") public Stream<DynamicNode> testFactory() { - return Scripts.manifestTestFactoryRIOT(TestConsts.RDF12_TESTS_DIR+"rdf-turtle/manifest.ttl"); - } - - // If run on its own. - @BeforeAll public static void beforeAll() { - JenaSystem.init(); - TurtleJCC.register(); + return Scripts.withAltParserFactory(Lang.TURTLE, + TurtleJCC.factory, + TestConsts.RDF12_TESTS_DIR+"rdf-turtle/manifest.ttl"); } }
