Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
jio_mebibou
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Alexandra Rogova
jio_mebibou
Commits
d963b0a5
Commit
d963b0a5
authored
Mar 28, 2018
by
Xiaowu Zhang
Committed by
Romain Courteaud
Apr 19, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ParserStorage: add Atom parser
/reviewed-on
nexedi/jio!83
parent
70754e8f
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
348 additions
and
3 deletions
+348
-3
src/jio.storage/parserstorage.js
src/jio.storage/parserstorage.js
+74
-2
test/jio.storage/parserstorage.tests.js
test/jio.storage/parserstorage.tests.js
+274
-1
No files found.
src/jio.storage/parserstorage.js
View file @
d963b0a5
...
@@ -79,6 +79,77 @@
...
@@ -79,6 +79,77 @@
}
}
return
result_list
;
return
result_list
;
};
};
/////////////////////////////////////////////////////////////
// ATOM Parser
/////////////////////////////////////////////////////////////
function
ATOMParser
(
txt
)
{
this
.
_dom_parser
=
new
DOMParser
().
parseFromString
(
txt
,
'
text/xml
'
);
}
ATOMParser
.
prototype
.
parseElement
=
function
(
element
)
{
var
tag_element
,
i
,
j
,
tag_name
,
attribute
,
result
=
{};
for
(
i
=
element
.
childNodes
.
length
-
1
;
i
>=
0
;
i
-=
1
)
{
tag_element
=
element
.
childNodes
[
i
];
if
((
tag_element
.
nodeType
===
Node
.
ELEMENT_NODE
)
&&
(
tag_element
.
tagName
!==
'
entry
'
))
{
tag_name
=
tag_element
.
tagName
;
// may have several links, with different rel value
// default is alternate
if
(
tag_name
===
'
link
'
)
{
tag_name
+=
'
_
'
+
(
tag_element
.
getAttribute
(
'
rel
'
)
||
'
alternate
'
);
}
else
{
result
[
tag_name
]
=
tag_element
.
textContent
;
}
for
(
j
=
tag_element
.
attributes
.
length
-
1
;
j
>=
0
;
j
-=
1
)
{
attribute
=
tag_element
.
attributes
[
j
];
if
(
attribute
.
value
)
{
result
[
tag_name
+
'
_
'
+
attribute
.
name
]
=
attribute
.
value
;
}
}
}
}
return
result
;
};
ATOMParser
.
prototype
.
getDocumentList
=
function
(
include
,
id
)
{
var
result_list
,
item_list
=
this
.
_dom_parser
.
querySelectorAll
(
"
feed > entry
"
),
i
;
if
((
id
===
'
/0
'
)
||
(
id
===
undefined
))
{
result_list
=
[{
id
:
'
/0
'
,
value
:
{}
}];
if
(
include
)
{
result_list
[
0
].
doc
=
this
.
parseElement
(
this
.
_dom_parser
.
querySelector
(
"
feed
"
)
);
}
}
else
{
result_list
=
[];
}
for
(
i
=
0
;
i
<
item_list
.
length
;
i
+=
1
)
{
if
((
id
===
'
/0/
'
+
i
)
||
(
id
===
undefined
))
{
result_list
.
push
({
id
:
'
/0/
'
+
i
,
value
:
{}
});
if
(
include
)
{
result_list
[
result_list
.
length
-
1
].
doc
=
this
.
parseElement
(
item_list
[
i
]);
}
}
}
return
result_list
;
};
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
// RSS Parser
// RSS Parser
...
@@ -151,7 +222,8 @@
...
@@ -151,7 +222,8 @@
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
var
parser_dict
=
{
var
parser_dict
=
{
'
rss
'
:
RSSParser
,
'
rss
'
:
RSSParser
,
'
opml
'
:
OPMLParser
'
opml
'
:
OPMLParser
,
'
atom
'
:
ATOMParser
};
};
function
getParser
(
storage
)
{
function
getParser
(
storage
)
{
...
@@ -203,4 +275,4 @@
...
@@ -203,4 +275,4 @@
jIO
.
addStorage
(
'
parser
'
,
ParserStorage
);
jIO
.
addStorage
(
'
parser
'
,
ParserStorage
);
}(
jIO
,
DOMParser
,
Node
));
}(
jIO
,
DOMParser
,
Node
));
\ No newline at end of file
test/jio.storage/parserstorage.tests.js
View file @
d963b0a5
...
@@ -51,7 +51,57 @@
...
@@ -51,7 +51,57 @@
};
};
jIO
.
addStorage
(
'
rssstorage200
'
,
RSSStorage200
);
jIO
.
addStorage
(
'
rssstorage200
'
,
RSSStorage200
);
/////////////////////////////////////////////////////////////////
// Custom atom test substorage definition
/////////////////////////////////////////////////////////////////
function
ATOMStorage200
()
{
return
this
;
}
ATOMStorage200
.
prototype
.
getAttachment
=
function
(
id
,
name
)
{
equal
(
id
,
'
foo
'
);
equal
(
name
,
'
bar
'
);
var
txt
=
'
<?xml version="1.0" encoding="utf-8"?>
'
+
'
<feed xmlns="http://www.w3.org/2005/Atom">
'
+
'
<title>Example Feed</title>
'
+
'
<subtitle>A subtitle.</subtitle>
'
+
'
<link href="http://example.org/feed/" rel="self" />
'
+
'
<link href="http://example.org/" />
'
+
'
<id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
'
+
'
<updated>2003-12-13T18:30:02Z</updated>
'
+
'
<entry>
'
+
'
<id>tag:example.org,2018-03-29:81102</id>
'
+
'
<title>Atom-Powered Robots Run Amok</title>
'
+
'
<link href="/2003/12/13/atom03" />
'
+
'
<link rel="alternate" type="text/html"
'
+
'
href="http://example.org/2003/12/13/atom03.html"/>
'
+
'
<link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>
'
+
'
<author>
'
+
'
<name>John Doe</name>
'
+
'
<email>johndoe@example.com</email>
'
+
'
</author>
'
+
'
<updated>2003-12-13T18:30:02Z</updated>
'
+
'
<summary>Some text.</summary>
'
+
'
</entry>
'
+
'
<entry>
'
+
'
<title>Atom-Powered Robots Run Amok</title>
'
+
'
<link href="http://example.org/2003/12/13/atom03" />
'
+
'
<link rel="alternate" type="text/html"
'
+
'
href="http://example.org/2003/12/13/atom03.html"/>
'
+
'
<link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>
'
+
'
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
'
+
'
<author>
'
+
'
<name>John Doe</name>
'
+
'
<email>johndoe@example.com</email>
'
+
'
</author>
'
+
'
<updated>2004-12-13T18:30:02Z</updated>
'
+
'
<summary>Some text.</summary>
'
+
'
</entry>
'
+
'
</feed>
'
;
return
new
Blob
([
txt
]);
};
jIO
.
addStorage
(
'
atomstorage200
'
,
ATOMStorage200
);
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// Custom OPML test substorage definition
// Custom OPML test substorage definition
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
...
@@ -244,6 +294,131 @@
...
@@ -244,6 +294,131 @@
});
});
});
});
test
(
"
get all IDs from ATOM
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
type
:
'
parser
'
,
document_id
:
'
foo
'
,
attachment_id
:
'
bar
'
,
parser
:
'
atom
'
,
sub_storage
:
{
type
:
'
atomstorage200
'
}
});
var
expected_dict
=
{
"
data
"
:
{
"
rows
"
:
[
{
"
id
"
:
"
/0
"
,
"
value
"
:
{}
},
{
"
id
"
:
"
/0/0
"
,
"
value
"
:
{}
},
{
"
id
"
:
"
/0/1
"
,
"
value
"
:
{}
}
],
"
total_rows
"
:
3
}
};
stop
();
expect
(
3
);
this
.
jio
.
allDocs
()
.
then
(
function
(
result
)
{
deepEqual
(
result
,
expected_dict
,
"
Check documents
"
);
})
.
fail
(
function
(
error
)
{
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
get all documents from ATOM
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
type
:
'
parser
'
,
document_id
:
'
foo
'
,
attachment_id
:
'
bar
'
,
parser
:
'
atom
'
,
sub_storage
:
{
type
:
'
atomstorage200
'
}
});
var
expected_dict
=
{
"
data
"
:
{
"
rows
"
:
[
{
"
doc
"
:
{
"
id
"
:
"
urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6
"
,
"
link_alternate_href
"
:
"
http://example.org/
"
,
"
link_self_href
"
:
"
http://example.org/feed/
"
,
"
link_self_rel
"
:
"
self
"
,
"
subtitle
"
:
"
A subtitle.
"
,
"
title
"
:
"
Example Feed
"
,
"
updated
"
:
"
2003-12-13T18:30:02Z
"
},
"
id
"
:
"
/0
"
,
"
value
"
:
{}
},
{
"
doc
"
:
{
"
author
"
:
"
John Doejohndoe@example.com
"
,
"
id
"
:
"
tag:example.org,2018-03-29:81102
"
,
"
link_alternate_href
"
:
"
/2003/12/13/atom03
"
,
"
link_alternate_rel
"
:
"
alternate
"
,
"
link_alternate_type
"
:
"
text/html
"
,
"
link_edit_href
"
:
"
http://example.org/2003/12/13/atom03/edit
"
,
"
link_edit_rel
"
:
"
edit
"
,
"
summary
"
:
"
Some text.
"
,
"
title
"
:
"
Atom-Powered Robots Run Amok
"
,
"
updated
"
:
"
2003-12-13T18:30:02Z
"
},
"
id
"
:
"
/0/0
"
,
"
value
"
:
{}
},
{
"
doc
"
:
{
"
author
"
:
"
John Doejohndoe@example.com
"
,
"
id
"
:
"
urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
"
,
"
link_alternate_href
"
:
"
http://example.org/2003/12/13/atom03
"
,
"
link_alternate_rel
"
:
"
alternate
"
,
"
link_alternate_type
"
:
"
text/html
"
,
"
link_edit_href
"
:
"
http://example.org/2003/12/13/atom03/edit
"
,
"
link_edit_rel
"
:
"
edit
"
,
"
summary
"
:
"
Some text.
"
,
"
title
"
:
"
Atom-Powered Robots Run Amok
"
,
"
updated
"
:
"
2004-12-13T18:30:02Z
"
},
"
id
"
:
"
/0/1
"
,
"
value
"
:
{}
}
],
"
total_rows
"
:
3
}
};
stop
();
expect
(
3
);
this
.
jio
.
allDocs
({
include_docs
:
true
})
.
then
(
function
(
result
)
{
deepEqual
(
result
,
expected_dict
,
"
Check documents
"
);
})
.
fail
(
function
(
error
)
{
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
get all IDs from OPML
"
,
function
()
{
test
(
"
get all IDs from OPML
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
this
.
jio
=
jIO
.
createJIO
({
type
:
'
parser
'
,
type
:
'
parser
'
,
...
@@ -542,6 +717,104 @@
...
@@ -542,6 +717,104 @@
start
();
start
();
});
});
});
});
test
(
"
get Atom feed
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
type
:
'
parser
'
,
document_id
:
'
foo
'
,
attachment_id
:
'
bar
'
,
parser
:
'
atom
'
,
sub_storage
:
{
type
:
'
atomstorage200
'
}
});
stop
();
expect
(
3
);
this
.
jio
.
get
(
'
/0
'
)
.
then
(
function
(
result
)
{
deepEqual
(
result
,
{
"
id
"
:
"
urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6
"
,
"
link_alternate_href
"
:
"
http://example.org/
"
,
"
link_self_href
"
:
"
http://example.org/feed/
"
,
"
link_self_rel
"
:
"
self
"
,
"
subtitle
"
:
"
A subtitle.
"
,
"
title
"
:
"
Example Feed
"
,
"
updated
"
:
"
2003-12-13T18:30:02Z
"
},
"
Check document
"
);
})
.
fail
(
function
(
error
)
{
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
get ATOM entry
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
type
:
'
parser
'
,
document_id
:
'
foo
'
,
attachment_id
:
'
bar
'
,
parser
:
'
atom
'
,
sub_storage
:
{
type
:
'
atomstorage200
'
}
});
stop
();
expect
(
3
);
this
.
jio
.
get
(
'
/0/1
'
)
.
then
(
function
(
result
)
{
deepEqual
(
result
,
{
"
author
"
:
"
John Doejohndoe@example.com
"
,
"
id
"
:
"
urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
"
,
"
link_alternate_href
"
:
"
http://example.org/2003/12/13/atom03
"
,
"
link_alternate_rel
"
:
"
alternate
"
,
"
link_alternate_type
"
:
"
text/html
"
,
"
link_edit_href
"
:
"
http://example.org/2003/12/13/atom03/edit
"
,
"
link_edit_rel
"
:
"
edit
"
,
"
summary
"
:
"
Some text.
"
,
"
title
"
:
"
Atom-Powered Robots Run Amok
"
,
"
updated
"
:
"
2004-12-13T18:30:02Z
"
},
"
Check document
"
);
})
.
fail
(
function
(
error
)
{
ok
(
false
,
error
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
get unknown atom entry
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
type
:
'
parser
'
,
document_id
:
'
foo
'
,
attachment_id
:
'
bar
'
,
parser
:
'
atom
'
,
sub_storage
:
{
type
:
'
atomstorage200
'
}
});
stop
();
expect
(
5
);
this
.
jio
.
get
(
'
foo
'
)
.
then
(
function
(
result
)
{
ok
(
false
,
result
);
})
.
fail
(
function
(
error
)
{
ok
(
error
instanceof
jIO
.
util
.
jIOError
,
error
);
equal
(
error
.
message
,
"
Cannot find parsed document: foo
"
);
equal
(
error
.
status_code
,
404
);
})
.
always
(
function
()
{
start
();
});
});
test
(
"
get OPML head
"
,
function
()
{
test
(
"
get OPML head
"
,
function
()
{
this
.
jio
=
jIO
.
createJIO
({
this
.
jio
=
jIO
.
createJIO
({
...
@@ -635,4 +908,4 @@
...
@@ -635,4 +908,4 @@
});
});
});
});
}(
jIO
,
QUnit
,
Blob
));
}(
jIO
,
QUnit
,
Blob
));
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment