From a6fe07997148e93387378373a776fe59cc256964 Mon Sep 17 00:00:00 2001 From: Pierre Maillot Date: Mon, 2 Feb 2026 13:46:34 +0100 Subject: [PATCH 1/3] re-opening of the bug --- .../io/parser/turtle/TurtleParserTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java b/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java index 1931c8570..a8c826baa 100644 --- a/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java +++ b/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java @@ -2,15 +2,24 @@ import fr.inria.corese.core.next.api.Model; import fr.inria.corese.core.next.api.ValueFactory; +import fr.inria.corese.core.next.api.base.io.RDFFormat; import fr.inria.corese.core.next.api.io.parser.RDFParser; +import fr.inria.corese.core.next.api.io.serializer.RDFSerializer; +import fr.inria.corese.core.next.impl.io.serialization.SerializerFactory; import fr.inria.corese.core.next.impl.common.vocabulary.RDFS; import fr.inria.corese.core.next.impl.temp.CoreseAdaptedValueFactory; import fr.inria.corese.core.next.impl.temp.CoreseModel; import org.junit.jupiter.api.Test; + + import java.io.StringReader; +import java.io.StringWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Unit tests for the ANTLRTurtle class. @@ -20,6 +29,8 @@ */ public class TurtleParserTest { + private static final Logger logger = LoggerFactory.getLogger(TurtleParserTest.class); + private ValueFactory factory = new CoreseAdaptedValueFactory(); @Test @@ -86,4 +97,30 @@ public void testTripleQuoteLiteralWithDoubleQuoteIncludedNoText() { model.contains(factory.createIRI("http://inria.fr/#0214"), RDFS.comment.getIRI(), factory.createLiteral("\"abc\"")); } + @Test + public void testRdfaManifest() { + String turtle = """ + @base . + @prefix rdf: . + @prefix rdfs: . + + <#0006> rdfs:label \"""Test 0006: @rel and @rev\"""; + rdfs:comment \"""Tests @rev and @rel together, with the object being specified by @href, ignoring content\"""; + . + """; + + Model model = new CoreseModel(); + RDFParser parser = new TurtleParser(model, factory, new TurtleParserOptions.Builder().baseIRI("http://inria.fr/").build()); + parser.parse(new StringReader(turtle)); + + StringWriter writer = new StringWriter(); + RDFSerializer serial = new SerializerFactory().createSerializer(RDFFormat.TURTLE, model); + serial.write(writer); + logger.info(writer.toString()); + + assertTrue(model.contains(factory.createIRI("http://rdfa.info/test-suite/test-cases/rdfa1.1/xml/manifest/#0006"), RDFS.comment.getIRI(), factory.createLiteral("Tests @rev and @rel together, with the object being specified by @href, ignoring content"))); + assertTrue(model.contains(factory.createIRI("http://rdfa.info/test-suite/test-cases/rdfa1.1/xml/manifest/#0006"), RDFS.label.getIRI(), factory.createLiteral("Test 0006: @rel and @rev"))); + assertEquals(18, model.size()); + } + } From 0aec20a0c6ea7fea0937bd2295a198c685d83e05 Mon Sep 17 00:00:00 2001 From: Pierre Maillot Date: Mon, 2 Feb 2026 14:30:34 +0100 Subject: [PATCH 2/3] fix of inner wuote detection for RDFa manifest reading --- src/main/antlr/Turtle.g4 | 36 ++++++++++++++++--- .../io/parser/turtle/TurtleParserTest.java | 26 ++++++++------ 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/main/antlr/Turtle.g4 b/src/main/antlr/Turtle.g4 index ec73f7ca3..647d87eda 100644 --- a/src/main/antlr/Turtle.g4 +++ b/src/main/antlr/Turtle.g4 @@ -183,20 +183,48 @@ EXPONENT // "'''" (("'" | "''")? ([^'\] | ECHAR | UCHAR))* "'''" STRING_LITERAL_LONG_SINGLE_QUOTE : '\'\'\'' ( + ( '\'' | '\'\'' )? + SINGLE_QUOTE_LONG_LITERAL_CONTENT + )+ '\'\'\'' + | '\'\'\'' ( + SINGLE_QUOTE_LONG_LITERAL_CONTENT + ( '\'' | '\'\'' )? + )+ '\'\'\'' + | '\'\'\'' ( ( '\'' | '\'\'' ) - | ( ~['\\] | ECHAR | UCHAR | '"') - )+ '\'\'\'' + SINGLE_QUOTE_LONG_LITERAL_CONTENT+ + ( '\'' | '\'\'' ) + )+ '\'\'\'' | '\'\'\'\'\'\'' + | '\'\'\'\'\'\'\'' + | '\'\'\'\'\'\'\'\'' ; STRING_LITERAL_LONG_QUOTE : '"""' ( + ( '"' | '""' )? + QUOTE_LONG_LITERAL_CONTENT + )+ '"""' + | '"""' ( + QUOTE_LONG_LITERAL_CONTENT + ( '"' | '""' )? + )+ '"""' + | '"""' ( + ( '"' | '""' ) + QUOTE_LONG_LITERAL_CONTENT+ ( '"' | '""' ) - | ( ~["\\] | ECHAR | UCHAR | '\'') - )+ '"""' + )+ '"""' | '""""""' + | '"""""""' + | '""""""""' ; +QUOTE_LONG_LITERAL_CONTENT + : ( ~["\\] | ECHAR | UCHAR ) ; + +SINGLE_QUOTE_LONG_LITERAL_CONTENT + : ( ~['\\] | ECHAR | UCHAR ) ; + STRING_LITERAL_QUOTE : '"' (~["\\\r\n] | ECHAR | UCHAR)* '"' ; diff --git a/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java b/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java index a8c826baa..7e0dfbdea 100644 --- a/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java +++ b/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java @@ -1,6 +1,7 @@ package fr.inria.corese.core.next.impl.io.parser.turtle; import fr.inria.corese.core.next.api.Model; +import fr.inria.corese.core.next.api.Statement; import fr.inria.corese.core.next.api.ValueFactory; import fr.inria.corese.core.next.api.base.io.RDFFormat; import fr.inria.corese.core.next.api.io.parser.RDFParser; @@ -86,9 +87,10 @@ public void testTripleQuoteLiteralWithDoubleQuoteIncludedTextBeforeAndAfter() { @Test public void testTripleQuoteLiteralWithDoubleQuoteIncludedNoText() { - String turtle = "@prefix rdfs: .\n" + - "<#0214> \n" + - " rdfs:comment \"\"\"\"abc\"\"\"\" ."; + String turtle = """ + @prefix rdfs: . + <#0214>\s + rdfs:comment ""\""abc""\"" ."""; Model model = new CoreseModel(); RDFParser parser = new TurtleParser(model, factory, new TurtleParserOptions.Builder().baseIRI("http://inria.fr/").build()); @@ -113,14 +115,18 @@ public void testRdfaManifest() { RDFParser parser = new TurtleParser(model, factory, new TurtleParserOptions.Builder().baseIRI("http://inria.fr/").build()); parser.parse(new StringReader(turtle)); - StringWriter writer = new StringWriter(); - RDFSerializer serial = new SerializerFactory().createSerializer(RDFFormat.TURTLE, model); - serial.write(writer); - logger.info(writer.toString()); + Model refModel = new CoreseModel(); + refModel.add(factory.createIRI("http://rdfa.info/test-suite/test-cases/rdfa1.1/xml/manifest#0006"), RDFS.label.getIRI(), factory.createLiteral("Test 0006: @rel and @rev")); + refModel.add(factory.createIRI("http://rdfa.info/test-suite/test-cases/rdfa1.1/xml/manifest#0006"), RDFS.comment.getIRI(), factory.createLiteral("Tests @rev and @rel together, with the object being specified by @href, ignoring content")); + + for(Statement stat : model) { + assertTrue(refModel.contains(stat)); + } + for(Statement stat : refModel) { + assertTrue(model.contains(stat)); + } - assertTrue(model.contains(factory.createIRI("http://rdfa.info/test-suite/test-cases/rdfa1.1/xml/manifest/#0006"), RDFS.comment.getIRI(), factory.createLiteral("Tests @rev and @rel together, with the object being specified by @href, ignoring content"))); - assertTrue(model.contains(factory.createIRI("http://rdfa.info/test-suite/test-cases/rdfa1.1/xml/manifest/#0006"), RDFS.label.getIRI(), factory.createLiteral("Test 0006: @rel and @rev"))); - assertEquals(18, model.size()); + assertEquals(refModel.size(), model.size()); } } From 90ef0f51f389f31a9eab691646ca4481506cd164 Mon Sep 17 00:00:00 2001 From: Pierre Maillot Date: Mon, 2 Feb 2026 14:36:47 +0100 Subject: [PATCH 3/3] cleanup --- src/main/antlr/Turtle.g4 | 1 - .../core/next/impl/io/parser/turtle/TurtleParserTest.java | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/antlr/Turtle.g4 b/src/main/antlr/Turtle.g4 index 647d87eda..0741d90f0 100644 --- a/src/main/antlr/Turtle.g4 +++ b/src/main/antlr/Turtle.g4 @@ -180,7 +180,6 @@ EXPONENT : ('e' | 'E') ('+' | '-' )? ('0' .. '9')+ ; -// "'''" (("'" | "''")? ([^'\] | ECHAR | UCHAR))* "'''" STRING_LITERAL_LONG_SINGLE_QUOTE : '\'\'\'' ( ( '\'' | '\'\'' )? diff --git a/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java b/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java index 7e0dfbdea..bac9a85c4 100644 --- a/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java +++ b/src/test/java/fr/inria/corese/core/next/impl/io/parser/turtle/TurtleParserTest.java @@ -3,10 +3,7 @@ import fr.inria.corese.core.next.api.Model; import fr.inria.corese.core.next.api.Statement; import fr.inria.corese.core.next.api.ValueFactory; -import fr.inria.corese.core.next.api.base.io.RDFFormat; import fr.inria.corese.core.next.api.io.parser.RDFParser; -import fr.inria.corese.core.next.api.io.serializer.RDFSerializer; -import fr.inria.corese.core.next.impl.io.serialization.SerializerFactory; import fr.inria.corese.core.next.impl.common.vocabulary.RDFS; import fr.inria.corese.core.next.impl.temp.CoreseAdaptedValueFactory; import fr.inria.corese.core.next.impl.temp.CoreseModel; @@ -15,7 +12,7 @@ import java.io.StringReader; -import java.io.StringWriter; + import org.slf4j.Logger; import org.slf4j.LoggerFactory;