Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Remixml is an XML/HTML macro language/template engine.
The language and primitives used blend in completely with standard XML/HTML syntax and therefore integrate smoothly with existing XML/HTML syntax colouring editors.
It runs inside any webbrowser environment (starting at IE11 and up).
The engine uses browser primitives to accellerate parsing; most notably it uses documentFragments and will therefore have trouble running in a plain NodeJS environment.
It has zero dependencies on other modules.
In essence Remixml is a macro language that has HTML/XML-like syntax and uses special entities to fill in templates. The entities that are recognised by Remixml are always of the form: &scope.varname; I.e. they distinguish themselves from regular HTML entities by always having at least one dot in the entity name.
The following sample code will illustrate the point:
Remixml.parse('<h1>Title of &_.sitename; for &_.description;</h1>'
+ '<p at="&anything.whatever;"> Some global variables &var.some; '
+ 'or &var.globalvars; or'
+ ' &var.arrays.1; or &var.arrays.2; or &var.objects.foo; or '
+ '&anything.really;',
{_: {
sitename: "foo.bar",
description: "faster than lightning templates"
},
var: {
some: "other",
globalvars: 7,
arrays: ["abc", 14, "def"],
objects: {"foo":"bar", "indeed":"yes"}
},
anything: {
really: "other",
whatever: 7
}
});
& scope . variablename : encoding % formatting ;
scope
variablename
encoding
(optional)html
uric
path
json
none
recurse
or r
none
but immediately searches for new entities to substitute
inside the replaced content.formatting
(optional)%t
: any string following it will be parsed
as a strftime()-like formatting
specification
.Note: the entity reference must not contain spaces (the spaces shown above are there to clarify the format, they should not be used in a real entity reference).
<set var="" variable="" expr="" regexp="" split="" join="" mkmapping="" selector="" json="" tag="" args="" noparse="" scope="">...</set>
Attributes:
var
or variable
expr
regexp
split
join
mkmapping
selector
json
tag
&_._contents;
can be used to reference
the contents of the tag. All argument values are accessible
as variables from the local scope (_
). E.g. an attribute
foo="bar"
can be referenced as &_.foo;
inside the tag definition.args
&_._restargs;
.
Using something like <img ::="&_._restargs;" />
allows you to pass
on all the remaining arguments. The special argument ::
accepts
an object and spreads out the elements as individual attributes.noparse
&_._contents;
to be returned unparsed in this tag definition.scope
<unset var="" variable=""></unset>
Attributes:
var
or variable
<if expr="">...</if>
Attributes:
expr
<then>...</then>
If the last truth value was true, include the content
of the then tag. Not needed for a typical if/else
construction; usually used after a for tag
to specify code that needs to be included if the for tag
actually completed at least one iteration.
<elif expr="">...</elif>
Attributes:
expr
<else>...</else>
If the last truth value was false, include the content of
the else tag. Can also be used after a for to specify
code that needs to be included if the for tag did not iterate
at all.
<for from="" to="" step="" in="" orderby="" scope="" mkmapping="">...</for>
Upon iteration the following special variables are defined:
&_._recno;
&_._index;
&_._value;
Attributes:
from
to
step
in
orderby
scope
mkmapping
<delimiter>...</delimiter>
Should be used inside a for loop. It will suppress its content
upon the first iteration.
<insert var="" variable="" quote="" format="" offset="" limit="" join="" variables="" scope=""></insert>
More explicit way to access variable content instead of through
entities.
Attributes:
var
or variable
quote
none
(contrary to the
entities, which default to html
).format
offset
limit
join
variables
dump
scope
<replace from="" regexp="" flags="" to="">...</replace>
Attributes:
from
regexp
flags
to
<trim>...</trim>
Truncates whitespace at both ends, and reduce other whitespace runs of
more than one character to a single space.
<maketag name="">...</maketag>
Attributes:
name
<attrib name="">...</attrib>
name
<eval recurse="">...</eval>
Reevaluate the content (e.g. useful to execute a tag
created with maketag).
Attributes:
recurse
0
.
Specifying no value sets the maximum depth to unlimited.
Evaluation stops automatically as soon as no changes are detected
anymore.<script>...</script>
Copy the contents of this tag verbatim without further parsing
(and leave the script
tag itself). To force parsing inside
script
tags use <maketag name="script">...</maketag>
instead.
<noparse>...</noparse>
Copy the contents of this tag verbatim without further parsing
(but strip the noparse
tag itself).
<nooutput>...</nooutput>
Suppress output inside this tag.
<comment>...</comment>
Strip and skip this tag with content.
These are extra helperfunctions which will be available in the inline Remixml Javascript scripts.
sizeof(x)
Returns the number of elements in an array or object, or the size of the
string. It is implemented as a definition in the global scope.
desc(x)
This function is only available inside the orderby
parameter of the
for
loop. It causes the argument to be sorted in reverse.
Simple assigment:
<set var="_.variablename">the new value</set>
Simple calculations:
<set var="_.variablename" expr="_.variablename + 1"></set>
Conditionals:
<if expr="_.variablename > 1">
yes
</if>
<elif expr="_.variablename == 'foobar'">
second condition valid
</elif>
<else>
otherwise
</else>
Counted loop:
<for from="1" to="42">
This is line &_._recno;<br />
</for>
Iterating through an object or array:
<set var="_.foo" split=",">aa,b,cc,d,eee,f</set>
<for in="_.foo">
This is record &_._recno; value: &_._value;<br />
</for>
Specified parameters:
template
context
$
. The local scope will always exist
as $._
and that can always be referenced using a direct _
shortcut. I.e. in Javascript $._.foo
and _.foo
will both refer
to the same variable.Exposed API-list:
Remixml.preparse(template, context)
Remixml.parse(template, context)
Remixml.parse2txt(template, context)
Remixml.parse_tagged(template, context)
<remixml>...</remixml>
tags.Remixml.parse_document(context)
Remixml.set_tag(callback, context, name, scope?, noparse?, args?)
context
just like
<set tag="name"></set>
would have done.
callback
is a javascript function
which will be called as callback(context)
and must return
the replacing DOM-template. E.g. when the tag
is referenced as <name foo="bar"></name>
then inside the
callback function context._.foo
will have the value bar
.
noparse
is a boolean that defaults to false.Remixml.dom2txt(template)
Remixml.txt2dom(template)
Remixml.path_encode(string)
string
to something which can be safely inserted in
an url (compare path
encoding for entities).Remixml.trim(template)
<trim>
tag and returns the
trimmed template..Remixml.set_log_callback(callback)
console.log()
. This callback function is used
to log remixml runtime errors.$.sys.lang
Card-carrying member of the zerodeps
movement.
FAQs
XML/HTML-like macro language/template compiler engine
We found that remixml demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.