Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F103740064
xml-writer.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Mar 4, 10:26
Size
2 KB
Mime Type
text/x-c++
Expires
Thu, Mar 6, 10:26 (1 d, 20 h)
Engine
blob
Format
Raw Data
Handle
24643671
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
xml-writer.js
View Options
'use strict'
;
/*
Copyright 2012-2015, Yahoo Inc.
Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
*/
const
INDENT
=
' '
;
function
attrString
(
attrs
)
{
return
Object
.
entries
(
attrs
||
{})
.
map
(([
k
,
v
])
=>
`
$
{
k
}
=
"${v}"
`
)
.
join
(
''
);
}
/**
* a utility class to produce well-formed, indented XML
* @param {ContentWriter} contentWriter the content writer that this utility wraps
* @constructor
*/
class
XMLWriter
{
constructor
(
contentWriter
)
{
this
.
cw
=
contentWriter
;
this
.
stack
=
[];
}
indent
(
str
)
{
return
this
.
stack
.
map
(()
=>
INDENT
).
join
(
''
)
+
str
;
}
/**
* writes the opening XML tag with the supplied attributes
* @param {String} name tag name
* @param {Object} [attrs=null] attrs attributes for the tag
*/
openTag
(
name
,
attrs
)
{
const
str
=
this
.
indent
(
`
<
$
{
name
+
attrString
(
attrs
)}
>
`
);
this
.
cw
.
println
(
str
);
this
.
stack
.
push
(
name
);
}
/**
* closes an open XML tag.
* @param {String} name - tag name to close. This must match the writer's
* notion of the tag that is currently open.
*/
closeTag
(
name
)
{
if
(
this
.
stack
.
length
===
0
)
{
throw
new
Error
(
`
Attempt
to
close
tag
$
{
name
}
when
not
opened
`
);
}
const
stashed
=
this
.
stack
.
pop
();
const
str
=
`
<
/${name}>`;
if
(
stashed
!==
name
)
{
throw
new
Error
(
`
Attempt
to
close
tag
$
{
name
}
when
$
{
stashed
}
was
the
one
open
`
);
}
this
.
cw
.
println
(
this
.
indent
(
str
));
}
/**
* writes a tag and its value opening and closing it at the same time
* @param {String} name tag name
* @param {Object} [attrs=null] attrs tag attributes
* @param {String} [content=null] content optional tag content
*/
inlineTag
(
name
,
attrs
,
content
)
{
let
str
=
'<'
+
name
+
attrString
(
attrs
);
if
(
content
)
{
str
+=
`
>
$
{
content
}
<
/${name}>`;
}
else
{
str
+=
'/>'
;
}
str
=
this
.
indent
(
str
);
this
.
cw
.
println
(
str
);
}
/**
* closes all open tags and ends the document
*/
closeAll
()
{
this
.
stack
.
slice
()
.
reverse
()
.
forEach
(
name
=>
{
this
.
closeTag
(
name
);
});
}
}
module
.
exports
=
XMLWriter
;
Event Timeline
Log In to Comment