PageRenderTime 20ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/rdf/ntriple/ntriple.factor

http://github.com/x6j8x/factor-rdf
Unknown | 111 lines | 87 code | 24 blank | 0 comment | 0 complexity | 8b03393b2f7e79e002e56598efdad43c MD5 | raw file
  1. USING: accessors arrays assocs byte-arrays combinators math math.parser
  2. combinators.short-circuit io io.encodings io.streams.string
  3. kernel namespaces peg peg.ebnf rdf rdf.util sequences strings ;
  4. IN: rdf.ntriple
  5. SINGLETON: ntriple
  6. <PRIVATE
  7. : ?skip-whitespace ( -- char )
  8. read1 dup whitespace?
  9. [ drop ?skip-whitespace ] [ ] if ; inline recursive
  10. : read-literal ( -- literal )
  11. "\"" cs-read-until drop >string
  12. read1
  13. {
  14. { [ dup CHAR: @ = ] [ drop " ." cs-read-until drop >string <lang-literal> ] }
  15. { [ dup CHAR: ^ = ] [ drop 2 read drop read-uriref <type-literal> ] }
  16. [ drop <literal> ]
  17. } cond ;
  18. : read-subject ( -- subject )
  19. ?skip-whitespace
  20. {
  21. { [ dup CHAR: < = ] [ drop read-uriref ] }
  22. { [ dup CHAR: _ = ] [ drop read-bnode ] }
  23. [ drop f ]
  24. } cond ;
  25. : read-predicate ( -- predicate )
  26. ?skip-whitespace CHAR: < =
  27. [ read-uriref ] [ f ] if ;
  28. : read-object ( -- object )
  29. ?skip-whitespace
  30. {
  31. { [ dup CHAR: < = ] [ drop read-uriref ] }
  32. { [ dup CHAR: _ = ] [ drop read-bnode ] }
  33. { [ dup CHAR: " = ] [ drop read-literal ] }
  34. [ drop f ]
  35. } cond ;
  36. : (collect) ( acc value -- acc value )
  37. [ [ over push ] keep ] [ f ] if* ; inline
  38. : read-ntriple ( line -- triple )
  39. [
  40. V{ } clone {
  41. [ read-subject (collect) ]
  42. [ read-predicate (collect) ]
  43. [ read-object (collect) ]
  44. } 0&&
  45. [ >array ] [ drop f ] if
  46. ] with-string-reader ; inline
  47. : read-ntriples ( -- seq )
  48. V{ } clone [ read-ntriple [ over push ] when* ] each-line ;
  49. GENERIC: write-ntriple-part ( object -- )
  50. M: uriref write-ntriple-part ( object -- )
  51. CHAR: < write1 cs-output
  52. [ [ ns>> uri>> ] dip stream-write ]
  53. [ [ id>> ] dip stream-write ] 2bi
  54. B{ CHAR: > CHAR: space } write ;
  55. M: bnode write-ntriple-part ( object -- )
  56. B{ CHAR: _ CHAR: : } write
  57. id>> >byte-array write
  58. CHAR: space write1 ;
  59. : write-lang ( lang -- )
  60. CHAR: @ write1 >byte-array write ;
  61. : write-type ( uriref -- )
  62. B{ CHAR: ^ CHAR: ^ } write write-ntriple-part ;
  63. : write-string ( string -- )
  64. CHAR: " write1 cs-output stream-write CHAR: " write1 ; inline
  65. M: literal write-ntriple-part ( object -- )
  66. [ value>> write-string ]
  67. [
  68. dup lang>>
  69. [ nip write-lang ]
  70. [ type>> [ write-type ] when* ] if*
  71. ] bi
  72. CHAR: space write1 ;
  73. M: number write-ntriple-part ( object -- )
  74. number>string write-string CHAR: space write1 ;
  75. : write-triple ( object predicate subject -- )
  76. [ write-ntriple-part ] tri@
  77. B{ CHAR: space CHAR: . CHAR: \n } write ; inline
  78. PRIVATE>
  79. M: ntriple import-triples ( string graph format -- graph )
  80. drop swap [ read-ntriples ] with-string-reader
  81. [ add-triple-seq ] each ;
  82. M: ntriple serialize-graph ( graph format -- )
  83. drop spo>>
  84. [ [ keys [ [ 2dup ] dip write-triple ] each drop ] assoc-each drop ] assoc-each ;
  85. M: ntriple serialize-triples ( seq format -- )
  86. drop [ [ s>> ] [ p>> ] [ o>> ] tri write-triple ] each ;
  87. M: ntriple mime-type drop "text/plain" ;