rdf-rdfxml 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.yardopts +2 -1
- data/CONTRIBUTORS +1 -0
- data/History.txt +7 -0
- data/README.rdoc +19 -2
- data/Rakefile +14 -0
- data/VERSION +1 -1
- data/example.rb +0 -1
- data/lib/rdf/rdfxml.rb +14 -6
- data/lib/rdf/rdfxml/format.rb +6 -5
- data/lib/rdf/rdfxml/patches/array_hacks.rb +53 -0
- data/lib/rdf/rdfxml/patches/nokogiri_hacks.rb +8 -0
- data/lib/rdf/rdfxml/patches/rdf_escape.rb +131 -0
- data/lib/rdf/rdfxml/reader.rb +90 -57
- data/lib/rdf/rdfxml/version.rb +1 -1
- data/lib/rdf/rdfxml/vocab.rb +3 -0
- data/lib/rdf/rdfxml/writer.rb +399 -0
- data/rdf-rdfxml.gemspec +448 -0
- data/script/console +10 -0
- data/spec/format_spec.rb +22 -0
- data/spec/matchers.rb +121 -0
- data/spec/rdf_helper.rb +176 -0
- data/spec/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
- data/spec/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
- data/spec/rdf_tests/tm_001.nt +1 -0
- data/spec/rdf_tests/tm_001.rdf +7 -0
- data/spec/rdf_tests/xml-literal-mixed.nt +6 -0
- data/spec/rdf_tests/xml-literal-mixed.rdf +15 -0
- data/spec/rdfcore/Manifest.rdf +5395 -0
- data/spec/rdfcore/Manifest.yml +1970 -0
- data/spec/rdfcore/amp-in-url/test001.nt +16 -0
- data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
- data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
- data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
- data/spec/rdfcore/datatypes/test001.nt +15 -0
- data/spec/rdfcore/datatypes/test001.rdf +29 -0
- data/spec/rdfcore/datatypes/test002.nt +14 -0
- data/spec/rdfcore/datatypes/test002.rdf +27 -0
- data/spec/rdfcore/datatypes/test002b.nt +17 -0
- data/spec/rdfcore/datatypes/test003a.nt +16 -0
- data/spec/rdfcore/datatypes/test003b.nt +16 -0
- data/spec/rdfcore/datatypes/test005a.nt +16 -0
- data/spec/rdfcore/datatypes/test005b.nt +16 -0
- data/spec/rdfcore/datatypes/test006.nt +17 -0
- data/spec/rdfcore/datatypes/test008a.nt +15 -0
- data/spec/rdfcore/datatypes/test008b.nt +15 -0
- data/spec/rdfcore/datatypes/test009a.nt +15 -0
- data/spec/rdfcore/datatypes/test009b.nt +15 -0
- data/spec/rdfcore/datatypes/test010.nt +17 -0
- data/spec/rdfcore/datatypes/test011a.nt +17 -0
- data/spec/rdfcore/datatypes/test011b.nt +17 -0
- data/spec/rdfcore/horst-01/test001.rdf +38 -0
- data/spec/rdfcore/horst-01/test002.rdf +39 -0
- data/spec/rdfcore/horst-01/test003.rdf +40 -0
- data/spec/rdfcore/horst-01/test004.rdf +42 -0
- data/spec/rdfcore/pfps-10/test001a.nt +14 -0
- data/spec/rdfcore/pfps-10/test001b.nt +15 -0
- data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
- data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
- data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
- data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
- data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
- data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
- data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
- data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
- data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
- data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
- data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
- data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
- data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
- data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
- data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
- data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
- data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
- data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
- data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
- data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
- data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
- data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
- data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
- data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
- data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
- data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
- data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
- data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
- data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
- data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
- data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
- data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
- data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
- data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
- data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
- data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
- data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
- data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
- data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
- data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
- data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
- data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
- data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
- data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
- data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
- data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
- data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
- data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
- data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
- data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
- data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
- data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
- data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
- data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
- data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
- data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
- data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
- data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
- data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
- data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
- data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
- data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
- data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
- data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
- data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
- data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
- data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
- data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
- data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
- data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
- data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
- data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
- data/spec/rdfcore/tex-01/test001.rdf +34 -0
- data/spec/rdfcore/tex-01/test002.rdf +33 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
- data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
- data/spec/rdfcore/xml-canon/test001.nt +16 -0
- data/spec/rdfcore/xml-canon/test001.rdf +28 -0
- data/spec/rdfcore/xmlbase/test001.nt +14 -0
- data/spec/rdfcore/xmlbase/test001.rdf +27 -0
- data/spec/rdfcore/xmlbase/test002.nt +14 -0
- data/spec/rdfcore/xmlbase/test002.rdf +28 -0
- data/spec/rdfcore/xmlbase/test003.nt +14 -0
- data/spec/rdfcore/xmlbase/test003.rdf +25 -0
- data/spec/rdfcore/xmlbase/test004.nt +18 -0
- data/spec/rdfcore/xmlbase/test004.rdf +27 -0
- data/spec/rdfcore/xmlbase/test006.nt +15 -0
- data/spec/rdfcore/xmlbase/test006.rdf +26 -0
- data/spec/rdfcore/xmlbase/test007.nt +14 -0
- data/spec/rdfcore/xmlbase/test007.rdf +25 -0
- data/spec/rdfcore/xmlbase/test008.nt +14 -0
- data/spec/rdfcore/xmlbase/test008.rdf +25 -0
- data/spec/rdfcore/xmlbase/test009.nt +14 -0
- data/spec/rdfcore/xmlbase/test009.rdf +26 -0
- data/spec/rdfcore/xmlbase/test010.nt +14 -0
- data/spec/rdfcore/xmlbase/test010.rdf +26 -0
- data/spec/rdfcore/xmlbase/test011.nt +14 -0
- data/spec/rdfcore/xmlbase/test011.rdf +27 -0
- data/spec/rdfcore/xmlbase/test013.nt +15 -0
- data/spec/rdfcore/xmlbase/test013.rdf +28 -0
- data/spec/rdfcore/xmlbase/test014.nt +15 -0
- data/spec/rdfcore/xmlbase/test014.rdf +28 -0
- data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
- data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
- data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
- data/spec/reader_spec.rb +421 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/xml_serializer_spec.rb +386 -0
- metadata +385 -6
data/.gitignore
ADDED
data/.yardopts
CHANGED
data/CONTRIBUTORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* Nicholas Humfrey <nicholas.humfrey@bbc.co.uk>
|
data/History.txt
CHANGED
@@ -1,2 +1,9 @@
|
|
1
|
+
=== 0.0.2
|
2
|
+
* Added specs from RdfContext
|
3
|
+
* Added array_hacks, nokogiri_hacks, and rdf_escape
|
4
|
+
* Fixed most bugs that are not related to the underlying framework.
|
5
|
+
* Specific failing testcases for rdf-isomorphic, RDF::Literaland others need to be constructed and added as issues against those gems.
|
6
|
+
* Removed interal graph in Reader and implement each_triple & each_statement to perform parsing
|
7
|
+
|
1
8
|
=== 0.0.1
|
2
9
|
* First port from RdfContext version 0.5.4
|
data/README.rdoc
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
= RDF::
|
1
|
+
= RDF::RDFXML reader/writer
|
2
2
|
|
3
3
|
RDF/XML parser for RDF.rb.
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
RDF::RDFXML is an RDF/XML
|
7
|
+
RDF::RDFXML is an RDF/XML reader/writer for Ruby using the RDF.rb library suite.
|
8
8
|
|
9
9
|
== FEATURES:
|
10
10
|
RDF::RDFXML parses RDF/XML into statements or triples.
|
@@ -22,10 +22,27 @@ Instantiate a parser and parse source, specifying type and base-URL
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
== Dependencies
|
26
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.1.6)
|
27
|
+
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
|
28
|
+
|
29
|
+
== TODO
|
30
|
+
* Add support for LibXML and REXML bindings, and use the best available
|
31
|
+
* Consider a SAX-based parser for improved performance
|
32
|
+
* Add generic RDF/XML Writer
|
33
|
+
|
25
34
|
== Resources:
|
26
35
|
* Distiller[http://kellogg-assoc/distiller]
|
27
36
|
* RDoc[http://rdoc.info/projects/gkellogg/rdf-rdfxml]
|
28
37
|
* History[http://github.com/gkellogg/rdf-rdfxml/blob/master/History.txt]
|
38
|
+
* "XHTML+RDFXML 1.1 Core"[http://www.w3.org/TR/2010/WD-xhtml-rdfa-20100422/]
|
39
|
+
* "RDF Tests"[http://www.w3.org/2000/10/rdf-tests/rdfcore/allTestCases.html]
|
40
|
+
|
41
|
+
== AUTHOR:
|
42
|
+
* Gregg Kellogg <gregg@kellogg-assoc.com>
|
43
|
+
|
44
|
+
== CONTRIBUTORS:
|
45
|
+
* Nicholas Humfrey <nicholas.humfrey@bbc.co.uk>
|
29
46
|
|
30
47
|
== LICENSE:
|
31
48
|
|
data/Rakefile
CHANGED
@@ -44,4 +44,18 @@ Spec::Rake::SpecTask.new("doc:spec") do |spec|
|
|
44
44
|
spec.spec_opts = ["--format", "html:doc/spec.html"]
|
45
45
|
end
|
46
46
|
|
47
|
+
desc "Generate RDF Core Manifest.yml"
|
48
|
+
namespace :spec do
|
49
|
+
task :prepare do
|
50
|
+
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
51
|
+
require 'rdf/rdfxml'
|
52
|
+
require 'spec/rdf_helper'
|
53
|
+
require 'fileutils'
|
54
|
+
|
55
|
+
yaml = File.join(RDFCORE_DIR, "Manifest.yml")
|
56
|
+
FileUtils.rm_f(yaml)
|
57
|
+
RdfHelper::TestCase.to_yaml(RDFCORE_TEST, RDFCORE_DIR, yaml)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
47
61
|
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/example.rb
CHANGED
@@ -6,7 +6,6 @@ require 'rubygems'
|
|
6
6
|
require 'rdf/rdfxml'
|
7
7
|
|
8
8
|
data = <<-EOF;
|
9
|
-
<?xml version="1.0" ?>
|
10
9
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
11
10
|
xmlns:ex="http://www.example.org/" xml:lang="en" xml:base="http://www.example.org/foo">
|
12
11
|
<ex:Thing rdf:about="http://example.org/joe" ex:name="bar">
|
data/lib/rdf/rdfxml.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
$:.unshift(File.
|
1
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
|
2
2
|
require 'rdf'
|
3
3
|
|
4
4
|
module RDF
|
@@ -8,7 +8,7 @@ module RDF
|
|
8
8
|
# @example Requiring the `RDF::RDFXML` module
|
9
9
|
# require 'rdf/rdfxml'
|
10
10
|
#
|
11
|
-
# @example Parsing RDF statements from an XHTML+
|
11
|
+
# @example Parsing RDF statements from an XHTML+RDFXML file
|
12
12
|
# RDF::RDFXML::Reader.open("etc/foaf.xml") do |reader|
|
13
13
|
# reader.each_statement do |statement|
|
14
14
|
# puts statement.inspect
|
@@ -19,10 +19,18 @@ module RDF
|
|
19
19
|
# @see http://www.w3.org/TR/REC-rdf-syntax/
|
20
20
|
#
|
21
21
|
# @author [Gregg Kellogg](http://kellogg-assoc.com/)
|
22
|
-
module
|
23
|
-
require 'rdfxml/format'
|
24
|
-
require 'rdfxml/vocab'
|
22
|
+
module RDFXML
|
23
|
+
require 'rdf/rdfxml/format'
|
24
|
+
require 'rdf/rdfxml/vocab'
|
25
|
+
require 'rdf/rdfxml/patches/array_hacks'
|
26
|
+
require 'rdf/rdfxml/patches/nokogiri_hacks'
|
27
|
+
require 'rdf/rdfxml/patches/rdf_escape'
|
25
28
|
autoload :Reader, 'rdf/rdfxml/reader'
|
29
|
+
autoload :Writer, 'rdf/rdfxml/writer'
|
26
30
|
autoload :VERSION, 'rdf/rdfxml/version'
|
31
|
+
autoload :XML, 'rdf/rdfxml/vocab'
|
32
|
+
|
33
|
+
# Fixme: RDF.to_s should generate this, but it doesn't
|
34
|
+
RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
27
35
|
end
|
28
|
-
end
|
36
|
+
end
|
data/lib/rdf/rdfxml/format.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module RDF::RDFXML
|
2
2
|
##
|
3
|
-
#
|
3
|
+
# RDFXML format specification.
|
4
4
|
#
|
5
|
-
# @example Obtaining an
|
6
|
-
# RDF::Format.for(:
|
5
|
+
# @example Obtaining an RDFXML format class
|
6
|
+
# RDF::Format.for(:rdf) # RDF::RDFXML::Format
|
7
|
+
# RDF::Format.for(:xml) # RDF::RDFXML::Format
|
7
8
|
# RDF::Format.for("etc/foaf.xml")
|
8
9
|
# RDF::Format.for(:file_name => "etc/foaf.xml")
|
9
10
|
# RDF::Format.for(:file_extension => "xml")
|
@@ -23,7 +24,7 @@ module RDF::RDFXML
|
|
23
24
|
content_type 'application/rdf+xml', :extension => :rdf
|
24
25
|
content_encoding 'utf-8'
|
25
26
|
|
26
|
-
reader { RDF::
|
27
|
-
writer { RDF::
|
27
|
+
reader { RDF::RDFXML::Reader }
|
28
|
+
writer { RDF::RDFXML::Writer }
|
28
29
|
end
|
29
30
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class Array
|
2
|
+
# http://wiki.rubygarden.org/Ruby/page/show/ArrayPermute
|
3
|
+
# Permute an array, and call a block for each permutation
|
4
|
+
# Author: Paul Battley
|
5
|
+
def permute(prefixed=[])
|
6
|
+
if (length < 2)
|
7
|
+
# there are no elements left to permute
|
8
|
+
yield(prefixed + self)
|
9
|
+
else
|
10
|
+
# recursively permute the remaining elements
|
11
|
+
each_with_index do |e, i|
|
12
|
+
(self[0,i]+self[(i+1)..-1]).permute(prefixed+[e]) { |a| yield a }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end unless Array.method_defined?(:permute)
|
16
|
+
|
17
|
+
# Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options:
|
18
|
+
# * <tt>:words_connector</tt> - The sign or word used to join the elements in arrays with two or more elements (default: ", ")
|
19
|
+
# * <tt>:two_words_connector</tt> - The sign or word used to join the elements in arrays with two elements (default: " and ")
|
20
|
+
# * <tt>:last_word_connector</tt> - The sign or word used to join the last element in arrays with three or more elements (default: ", and ")
|
21
|
+
def to_sentence(options = {})
|
22
|
+
default_words_connector = ", "
|
23
|
+
default_two_words_connector = " and "
|
24
|
+
default_last_word_connector = ", and "
|
25
|
+
|
26
|
+
# Try to emulate to_senteces previous to 2.3
|
27
|
+
if options.has_key?(:connector) || options.has_key?(:skip_last_comma)
|
28
|
+
::ActiveSupport::Deprecation.warn(":connector has been deprecated. Use :words_connector instead", caller) if options.has_key? :connector
|
29
|
+
::ActiveSupport::Deprecation.warn(":skip_last_comma has been deprecated. Use :last_word_connector instead", caller) if options.has_key? :skip_last_comma
|
30
|
+
|
31
|
+
skip_last_comma = options.delete :skip_last_comma
|
32
|
+
if connector = options.delete(:connector)
|
33
|
+
options[:last_word_connector] ||= skip_last_comma ? connector : ", #{connector}"
|
34
|
+
else
|
35
|
+
options[:last_word_connector] ||= skip_last_comma ? default_two_words_connector : default_last_word_connector
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
|
40
|
+
options = {:words_connector => default_words_connector, :two_words_connector => default_two_words_connector, :last_word_connector => default_last_word_connector}.merge(options)
|
41
|
+
|
42
|
+
case length
|
43
|
+
when 0
|
44
|
+
""
|
45
|
+
when 1
|
46
|
+
self[0].to_s
|
47
|
+
when 2
|
48
|
+
"#{self[0]}#{options[:two_words_connector]}#{self[1]}"
|
49
|
+
else
|
50
|
+
"#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
|
51
|
+
end
|
52
|
+
end unless Array.method_defined?(:to_sentence)
|
53
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'iconv'
|
3
|
+
|
4
|
+
class String
|
5
|
+
#private
|
6
|
+
# "Borrowed" from JSON utf8_to_json
|
7
|
+
RDF_MAP = {
|
8
|
+
"\x0" => '\u0000',
|
9
|
+
"\x1" => '\u0001',
|
10
|
+
"\x2" => '\u0002',
|
11
|
+
"\x3" => '\u0003',
|
12
|
+
"\x4" => '\u0004',
|
13
|
+
"\x5" => '\u0005',
|
14
|
+
"\x6" => '\u0006',
|
15
|
+
"\x7" => '\u0007',
|
16
|
+
"\b" => '\b',
|
17
|
+
"\t" => '\t',
|
18
|
+
"\n" => '\n',
|
19
|
+
"\xb" => '\u000B',
|
20
|
+
"\f" => '\f',
|
21
|
+
"\r" => '\r',
|
22
|
+
"\xe" => '\u000E',
|
23
|
+
"\xf" => '\u000F',
|
24
|
+
"\x10" => '\u0010',
|
25
|
+
"\x11" => '\u0011',
|
26
|
+
"\x12" => '\u0012',
|
27
|
+
"\x13" => '\u0013',
|
28
|
+
"\x14" => '\u0014',
|
29
|
+
"\x15" => '\u0015',
|
30
|
+
"\x16" => '\u0016',
|
31
|
+
"\x17" => '\u0017',
|
32
|
+
"\x18" => '\u0018',
|
33
|
+
"\x19" => '\u0019',
|
34
|
+
"\x1a" => '\u001A',
|
35
|
+
"\x1b" => '\u001B',
|
36
|
+
"\x1c" => '\u001C',
|
37
|
+
"\x1d" => '\u001D',
|
38
|
+
"\x1e" => '\u001E',
|
39
|
+
"\x1f" => '\u001F',
|
40
|
+
'"' => '\"',
|
41
|
+
'\\' => '\\\\',
|
42
|
+
'/' => '/',
|
43
|
+
} # :nodoc:
|
44
|
+
|
45
|
+
if defined?(::Encoding)
|
46
|
+
# Funky way to define constant, but if parsed in 1.8 it generates an 'invalid regular expression' error otherwise
|
47
|
+
eval %(ESCAPE_RE = %r([\u{80}-\u{10ffff}]))
|
48
|
+
else
|
49
|
+
ESCAPE_RE = %r(
|
50
|
+
[\xc2-\xdf][\x80-\xbf] |
|
51
|
+
[\xe0-\xef][\x80-\xbf]{2} |
|
52
|
+
[\xf0-\xf4][\x80-\xbf]{3}
|
53
|
+
)nx
|
54
|
+
end
|
55
|
+
|
56
|
+
# Convert a UTF8 encoded Ruby string _string_ to an escaped string, encoded with
|
57
|
+
# UTF16 big endian characters as \U????, and return it.
|
58
|
+
#
|
59
|
+
# \\:: Backslash
|
60
|
+
# \':: Single quote
|
61
|
+
# \":: Double quot
|
62
|
+
# \n:: ASCII Linefeed
|
63
|
+
# \r:: ASCII Carriage Return
|
64
|
+
# \t:: ASCCII Horizontal Tab
|
65
|
+
# \uhhhh:: character in BMP with Unicode value U+hhhh
|
66
|
+
# \U00hhhhhh:: character in plane 1-16 with Unicode value U+hhhhhh
|
67
|
+
def rdf_escape
|
68
|
+
string = self + '' # XXX workaround: avoid buffer sharing
|
69
|
+
string.gsub!(/["\\\/\x0-\x1f]/) { RDF_MAP[$&] }
|
70
|
+
if defined?(::Encoding)
|
71
|
+
string.force_encoding(Encoding::UTF_8)
|
72
|
+
string.gsub!(ESCAPE_RE) { |c|
|
73
|
+
s = c.dump.sub(/\"\\u\{(.+)\}\"/, '\1').upcase
|
74
|
+
(s.length <= 4 ? "\\u0000"[0,6-s.length] : "\\U00000000"[0,10-s.length]) + s
|
75
|
+
}
|
76
|
+
string.force_encoding(Encoding::ASCII_8BIT)
|
77
|
+
else
|
78
|
+
string.gsub!(ESCAPE_RE) { |c|
|
79
|
+
s = Iconv.new('utf-16be', 'utf-8').iconv(c).unpack('H*').first.upcase
|
80
|
+
"\\u" + s
|
81
|
+
}
|
82
|
+
end
|
83
|
+
string
|
84
|
+
end
|
85
|
+
|
86
|
+
# Unescape characters in strings.
|
87
|
+
RDF_UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
|
88
|
+
RDF_UNESCAPE_MAP.update({
|
89
|
+
?" => '"',
|
90
|
+
?\\ => '\\',
|
91
|
+
?/ => '/',
|
92
|
+
?b => "\b",
|
93
|
+
?f => "\f",
|
94
|
+
?n => "\n",
|
95
|
+
?r => "\r",
|
96
|
+
?t => "\t",
|
97
|
+
?u => nil,
|
98
|
+
})
|
99
|
+
|
100
|
+
if defined?(::Encoding)
|
101
|
+
UNESCAPE_RE = %r(
|
102
|
+
(?:\\[\\bfnrt"/]) # Escaped control characters, " and /
|
103
|
+
|(?:\\U00\h{6}) # 6 byte escaped Unicode
|
104
|
+
|(?:\\u\h{4}) # 4 byte escaped Unicode
|
105
|
+
)x
|
106
|
+
else
|
107
|
+
UNESCAPE_RE = %r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n
|
108
|
+
end
|
109
|
+
|
110
|
+
# Reverse operation of escape
|
111
|
+
# From JSON parser
|
112
|
+
def rdf_unescape
|
113
|
+
return '' if self.empty?
|
114
|
+
string = self.gsub(UNESCAPE_RE) do |c|
|
115
|
+
case c[1,1]
|
116
|
+
when 'U'
|
117
|
+
raise RDF::ReaderError, "Long Unicode escapes no supported in Ruby 1.8" unless defined?(::Encoding)
|
118
|
+
eval(c.sub(/\\U00(\h+)/, '"\u{\1}"'))
|
119
|
+
when 'u'
|
120
|
+
bytes = [c[2, 2].to_i(16), c[4, 2].to_i(16)]
|
121
|
+
Iconv.new('utf-8', 'utf-16').iconv(bytes.pack("C*"))
|
122
|
+
else
|
123
|
+
RDF_UNESCAPE_MAP[c[1]]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
string.force_encoding(Encoding::UTF_8) if defined?(::Encoding)
|
127
|
+
string
|
128
|
+
rescue Iconv::Failure => e
|
129
|
+
raise RDF::ReaderError, "Caught #{e.class}: #{e}"
|
130
|
+
end
|
131
|
+
end unless String.method_defined?(:rdf_escape)
|
data/lib/rdf/rdfxml/reader.rb
CHANGED
@@ -72,8 +72,8 @@ module RDF::RDFXML
|
|
72
72
|
|
73
73
|
# Extract Evaluation Context from an element
|
74
74
|
def extract_from_element(el)
|
75
|
-
b = el.attribute_with_ns("base",
|
76
|
-
lang = el.attribute_with_ns("lang",
|
75
|
+
b = el.attribute_with_ns("base", RDF::XML.to_s)
|
76
|
+
lang = el.attribute_with_ns("lang", RDF::XML.to_s)
|
77
77
|
self.base = self.base.join(b) if b
|
78
78
|
self.language = lang if lang
|
79
79
|
self.uri_mappings.merge!(extract_mappings(el))
|
@@ -88,8 +88,7 @@ module RDF::RDFXML
|
|
88
88
|
abbr, suffix = attr_name.to_s.split(":")
|
89
89
|
if abbr == "xmlns"
|
90
90
|
attr_value = self.base.to_s + attr_value if attr_value.match(/^\#/)
|
91
|
-
mappings[suffix] =
|
92
|
-
@graph.bind(mappings[suffix])
|
91
|
+
mappings[suffix] = attr_value
|
93
92
|
end
|
94
93
|
end
|
95
94
|
mappings
|
@@ -98,14 +97,13 @@ module RDF::RDFXML
|
|
98
97
|
# Produce the next list entry for this context
|
99
98
|
def li_next
|
100
99
|
@li_counter += 1
|
101
|
-
predicate =
|
100
|
+
predicate = RDF["_#{@li_counter}"]
|
102
101
|
end
|
103
102
|
|
104
103
|
# Set XML base. Ignore any fragment
|
105
104
|
def base=(b)
|
106
|
-
b = Addressable::URI.parse(b.to_s)
|
107
|
-
b.fragment = nil
|
108
105
|
@base = RDF::URI.new(b)
|
106
|
+
@base.fragment = nil
|
109
107
|
end
|
110
108
|
|
111
109
|
def inspect
|
@@ -128,48 +126,87 @@ module RDF::RDFXML
|
|
128
126
|
# @raise [Error]:: Raises RDF::ReaderError if _strict_
|
129
127
|
def initialize(input = $stdin, options = {}, &block)
|
130
128
|
super do
|
131
|
-
@graph = RDF::Graph.new
|
132
129
|
@debug = options[:debug]
|
133
130
|
@strict = options[:strict]
|
134
|
-
@base_uri = options[:base_uri]
|
135
|
-
|
131
|
+
@base_uri = RDF::URI.parse(options[:base_uri]) if options[:base_uri]
|
132
|
+
|
133
|
+
@id_mapping = Hash.new
|
136
134
|
|
137
|
-
@doc = case
|
138
|
-
when Nokogiri::XML::Document then
|
139
|
-
else Nokogiri::XML.parse(
|
135
|
+
@doc = case input
|
136
|
+
when Nokogiri::XML::Document then input
|
137
|
+
else Nokogiri::XML.parse(input, @base_uri.to_s)
|
140
138
|
end
|
141
139
|
|
142
|
-
raise RDF::ReaderError, "
|
143
|
-
@
|
144
|
-
|
145
|
-
# Look for rdf:RDF elements and process each.
|
146
|
-
rdf_nodes = root.xpath("//rdf:RDF", RDF.prefix => RDF.uri.to_s)
|
147
|
-
if rdf_nodes.length == 0
|
148
|
-
# If none found, root element may be processed as an RDF Node
|
140
|
+
raise RDF::ReaderError, "Synax errors:\n#{@doc.errors}" if !@doc.errors.empty? && @strict
|
141
|
+
raise RDF::ReaderError, "Empty document" if (@doc.nil? || @doc.root.nil?) && @strict
|
149
142
|
|
150
|
-
ec = EvaluationContext.new(@uri, root, @graph)
|
151
|
-
nodeElement(root, ec)
|
152
|
-
else
|
153
|
-
rdf_nodes.each do |node|
|
154
|
-
# XXX Skip this element if it's contained within another rdf:RDF element
|
155
|
-
|
156
|
-
# Extract base, lang and namespaces from parents to create proper evaluation context
|
157
|
-
ec = EvaluationContext.new(@uri, nil, @graph)
|
158
|
-
ec.extract_from_ancestors(node)
|
159
|
-
node.children.each {|el|
|
160
|
-
next unless el.elem?
|
161
|
-
new_ec = ec.clone(el)
|
162
|
-
nodeElement(el, new_ec)
|
163
|
-
}
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
143
|
block.call(self) if block_given?
|
168
144
|
end
|
169
145
|
end
|
170
146
|
|
147
|
+
# XXX Invoke the parser, and allow add_triple to make the callback?
|
148
|
+
##
|
149
|
+
# Iterates the given block for each RDF statement in the input.
|
150
|
+
#
|
151
|
+
# @yield [statement]
|
152
|
+
# @yieldparam [RDF::Statement] statement
|
153
|
+
# @return [void]
|
154
|
+
def each_statement(&block)
|
155
|
+
# Block called from add_statement
|
156
|
+
@callback = block
|
157
|
+
|
158
|
+
root = @doc.root
|
159
|
+
|
160
|
+
add_debug(root, "base_uri: #{@base_uri || 'nil'}")
|
161
|
+
|
162
|
+
rdf_nodes = root.xpath("//rdf:RDF", "rdf" => RDF_NS)
|
163
|
+
if rdf_nodes.length == 0
|
164
|
+
# If none found, root element may be processed as an RDF Node
|
165
|
+
|
166
|
+
ec = EvaluationContext.new(@base_uri, root, @graph)
|
167
|
+
nodeElement(root, ec)
|
168
|
+
else
|
169
|
+
rdf_nodes.each do |node|
|
170
|
+
# XXX Skip this element if it's contained within another rdf:RDF element
|
171
|
+
|
172
|
+
# Extract base, lang and namespaces from parents to create proper evaluation context
|
173
|
+
ec = EvaluationContext.new(@base_uri, nil, @graph)
|
174
|
+
ec.extract_from_ancestors(node)
|
175
|
+
node.children.each {|el|
|
176
|
+
next unless el.elem?
|
177
|
+
new_ec = ec.clone(el)
|
178
|
+
nodeElement(el, new_ec)
|
179
|
+
}
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# Iterates the given block for each RDF triple in the input.
|
186
|
+
#
|
187
|
+
# @yield [subject, predicate, object]
|
188
|
+
# @yieldparam [RDF::Resource] subject
|
189
|
+
# @yieldparam [RDF::URI] predicate
|
190
|
+
# @yieldparam [RDF::Value] object
|
191
|
+
# @return [void]
|
192
|
+
def each_triple(&block)
|
193
|
+
each_statement do |statement|
|
194
|
+
block.call(*statement.to_triple)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
171
198
|
private
|
172
199
|
|
200
|
+
# Keep track of allocated BNodes
|
201
|
+
def bnode(value = nil)
|
202
|
+
if value
|
203
|
+
@bnode_cache ||= {}
|
204
|
+
@bnode_cache[value.to_s] ||= RDF::Node.new(value)
|
205
|
+
else
|
206
|
+
RDF::Node.new
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
173
210
|
# Figure out the document path, if it is a Nokogiri::XML::Element or Attribute
|
174
211
|
def node_path(node)
|
175
212
|
case node
|
@@ -199,12 +236,7 @@ module RDF::RDFXML
|
|
199
236
|
def add_triple(node, subject, predicate, object)
|
200
237
|
statement = RDF::Statement.new(subject, predicate, object)
|
201
238
|
add_debug(node, "statement: #{statement}")
|
202
|
-
@
|
203
|
-
statement
|
204
|
-
rescue RDF::ReaderError => e
|
205
|
-
add_debug(node, "add_triple raised #{e.class}: #{e.message}")
|
206
|
-
puts e.backtrace if $DEBUG
|
207
|
-
raise if @strict
|
239
|
+
@callback.call(statement)
|
208
240
|
end
|
209
241
|
|
210
242
|
# XML nodeElement production
|
@@ -221,14 +253,14 @@ module RDF::RDFXML
|
|
221
253
|
add_debug(el, "nodeElement, el: #{el.uri}")
|
222
254
|
add_debug(el, "nodeElement, subject: #{subject.nil? ? 'nil' : subject.to_s}")
|
223
255
|
|
224
|
-
unless el.uri == RDF.Description.to_s
|
256
|
+
unless el.uri.to_s == RDF.Description.to_s
|
225
257
|
add_triple(el, subject, RDF.type, el.uri)
|
226
258
|
end
|
227
259
|
|
228
260
|
# produce triples for attributes
|
229
261
|
el.attribute_nodes.each do |attr|
|
230
262
|
add_debug(el, "propertyAttr: #{attr.uri}='#{attr.value}'")
|
231
|
-
if attr.uri == RDF.type
|
263
|
+
if attr.uri.to_s == RDF.type.to_s
|
232
264
|
# If there is an attribute a in propertyAttr with a.URI == rdf:type
|
233
265
|
# then u:=uri(identifier:=resolve(a.string-value))
|
234
266
|
# and the following triple is added to the graph:
|
@@ -237,7 +269,7 @@ module RDF::RDFXML
|
|
237
269
|
elsif is_propertyAttr?(attr)
|
238
270
|
# Attributes not RDF.type
|
239
271
|
predicate = attr.uri
|
240
|
-
lit = Literal.
|
272
|
+
lit = RDF::Literal.new(attr.value, :language => ec.language)
|
241
273
|
add_triple(attr, subject, predicate, lit)
|
242
274
|
end
|
243
275
|
end
|
@@ -283,9 +315,9 @@ module RDF::RDFXML
|
|
283
315
|
# MAY choose to warn when the unqualified form is seen in a document.
|
284
316
|
add_debug(el, "Unqualified attribute '#{attr}'")
|
285
317
|
#attrs[attr.to_s] = attr.value unless attr.to_s.match?(/^xml/)
|
286
|
-
elsif attr.namespace.href ==
|
318
|
+
elsif attr.namespace.href == RDF::XML.to_s
|
287
319
|
# No production. Lang and base elements already extracted
|
288
|
-
elsif attr.namespace.href ==
|
320
|
+
elsif attr.namespace.href == RDF_NS
|
289
321
|
case attr.name
|
290
322
|
when "ID" then id = attr.value
|
291
323
|
when "datatype" then datatype = attr.value
|
@@ -342,7 +374,7 @@ module RDF::RDFXML
|
|
342
374
|
end
|
343
375
|
|
344
376
|
# For element e with possibly empty element content c.
|
345
|
-
n =
|
377
|
+
n = bnode
|
346
378
|
add_triple(child, subject, predicate, n)
|
347
379
|
|
348
380
|
# Reification
|
@@ -423,16 +455,16 @@ module RDF::RDFXML
|
|
423
455
|
if resourceAttr
|
424
456
|
resource = ec.base.join(resourceAttr)
|
425
457
|
elsif nodeID
|
426
|
-
resource =
|
458
|
+
resource = bnode(nodeID)
|
427
459
|
else
|
428
|
-
resource =
|
460
|
+
resource = bnode
|
429
461
|
end
|
430
462
|
|
431
463
|
# produce triples for attributes
|
432
464
|
attrs.each_pair do |attr, val|
|
433
465
|
add_debug(el, "attr: #{attr.name}='#{val}'")
|
434
466
|
|
435
|
-
if attr.uri.to_s == RDF.type
|
467
|
+
if attr.uri.to_s == RDF.type.to_s
|
436
468
|
add_triple(child, resource, RDF.type, val)
|
437
469
|
else
|
438
470
|
# Check for illegal attributes
|
@@ -463,7 +495,7 @@ module RDF::RDFXML
|
|
463
495
|
add_triple(el, rsubject, RDF.subject, subject)
|
464
496
|
add_triple(el, rsubject, RDF.predicate, predicate)
|
465
497
|
add_triple(el, rsubject, RDF.object, object)
|
466
|
-
add_triple(el, rsubject, RDF.type, RDF
|
498
|
+
add_triple(el, rsubject, RDF.type, RDF["Statement"])
|
467
499
|
end
|
468
500
|
|
469
501
|
# Figure out the subject from the element.
|
@@ -491,14 +523,14 @@ module RDF::RDFXML
|
|
491
523
|
# The value of rdf:nodeID must match the XML Name production
|
492
524
|
nodeID = nodeID_check(el, nodeID.value.rdf_escape)
|
493
525
|
add_debug(el, "parse_subject, nodeID: '#{nodeID}")
|
494
|
-
|
526
|
+
bnode(nodeID)
|
495
527
|
when about
|
496
528
|
about = about.value.rdf_escape
|
497
529
|
add_debug(el, "parse_subject, about: '#{about}'")
|
498
530
|
ec.base.join(about)
|
499
531
|
else
|
500
532
|
add_debug(el, "parse_subject, BNode")
|
501
|
-
|
533
|
+
bnode
|
502
534
|
end
|
503
535
|
end
|
504
536
|
|
@@ -507,7 +539,8 @@ module RDF::RDFXML
|
|
507
539
|
if NC_REGEXP.match(id)
|
508
540
|
# ID may only be specified once for the same URI
|
509
541
|
if base
|
510
|
-
|
542
|
+
# FIXME: Known bug in RDF::URI#join
|
543
|
+
uri = base.join("##{id}")
|
511
544
|
if @id_mapping[id] && @id_mapping[id] == uri
|
512
545
|
warn = "ID addtribute '#{id}' may only be defined once for the same URI"
|
513
546
|
add_debug(el, warn)
|
@@ -548,7 +581,7 @@ module RDF::RDFXML
|
|
548
581
|
raise RDF::ReaderError.new(warn) if @strict
|
549
582
|
return false
|
550
583
|
end
|
551
|
-
!CORE_SYNTAX_TERMS.include?(attr.uri.to_s) && attr.namespace && attr.namespace.href !=
|
584
|
+
!CORE_SYNTAX_TERMS.include?(attr.uri.to_s) && attr.namespace && attr.namespace.href != RDF::XML.to_s
|
552
585
|
end
|
553
586
|
|
554
587
|
# Check Node Element name
|