Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions components.js
Original file line number Diff line number Diff line change
Expand Up @@ -625,6 +625,11 @@ var components = {
"owner": "zeitgeist87",
"after": "unescaped-markup",
"noCSS": true
},
"parse-settings": {
"title": "Parse Settings",
"owner": "zeitgeist87",
"noCSS": true
}
}
};
36 changes: 36 additions & 0 deletions plugins/parse-settings/demo.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<html>
<head><base href="../../.." /></head>
<body data-line-numbers="true" data-spaces-to-tabs="8">
<div>
<div class="no-line-numbers">

<pre class="language-javascript line-numbers left-trim"><code>
// Example code
</code></pre>

</div>
</div>
<script src="prism.js"></script>
<script src="plugins/parse-settings/prism-parse-settings.js"></script>
<script>
// my new Prism plugin
(function() {

var specs = {
'line-numbers': { type: 'bool' },
'user': { type: 'string', 'default': 'user' },
'host': { type: 'string', 'default': 'localhost' },
'spaces-to-tabs': { type: 'int', 'default': 4 },
'left-trim': { type: 'bool', 'default': true }
};

Prism.plugins.ParseSettings.declare(specs);

Prism.hooks.add('before-highlight', function (env) {
console.log(env.getSettings(specs));
});

}());
</script>
</body>
</html>
75 changes: 75 additions & 0 deletions plugins/parse-settings/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="en">
<head>

<meta charset="utf-8" />
<link rel="shortcut icon" href="favicon.png" />
<title>Parse Settings ▲ Prism plugins</title>
<base href="../.." />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="themes/prism.css" data-noprefix />
<script src="prefixfree.min.js"></script>

<script>var _gaq = [['_setAccount', 'UA-33746269-1'], ['_trackPageview']];</script>
<script src="http://www.google-analytics.com/ga.js" async></script>
</head>
<body>

<header>
<div class="intro" data-src="templates/header-plugins.html" data-type="text/html"></div>

<h2>Parse Settings</h2>
<p>Automatically parses settings for other plugins</p>
</header>

<section class="language-markup">
<h1>How to use</h1>

<p>This plugin is not intended to be used on its own.
It is a support plugin for other plugins and only included as a dependency.</p>

<p>All ancestors of the current element are automatically scanned for
<code>data-*</code>-attributes and classes. These attributes and classes are then
parsed into key-value pairs. An element can inherit the <code>data-*</code>-attributes from its ancestors.</p>

<p>The plugin author has to declare the settings the plugin uses. The syntax should be self-explanatory
and is demonstrated with the following example:</p>

<pre class="language-javascript"><code>Prism.plugins.ParseSettings.declare({
'line-numbers': { type: 'bool' },
'user': { type: 'string', 'default': 'user' },
'host': { type: 'string', 'default': 'localhost' },
'spaces-to-tabs': { type: 'int', 'default': 4 },
'left-trim': { type: 'bool', 'default': true }
});
</code></pre>

<p>The following conventions are used to parse the settings:</p>

<ul class="language-javascript">
<li>A normal class name <code>{ 'class-name': true }</code></li>
<li>A class name starting with "no-" <code>{ 'class-name': false }</code></li>
<li>A boolean setting with the string "true" <code>{ 'attr-name': true }</code></li>
<li>A boolean setting with the string "false" <code>{ 'attr-name': false }</code></li>
<li>Integers and floats are converted into their respective types <code>{ 'attr-name': 4.4 }</code></li>
</ul>

</section>

<section class="language-markup">
<h1>Example</h1>

<pre data-src="plugins/parse-settings/demo.html"></pre>
</section>

<footer data-src="templates/footer.html" data-type="text/html"></footer>

<script src="prism.js"></script>
<script src="plugins/parse-settings/prism-parse-settings.js"></script>
<script src="utopia.js"></script>
<script src="components.js"></script>
<script src="code.js"></script>


</body>
</html>
97 changes: 97 additions & 0 deletions plugins/parse-settings/prism-parse-settings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
(function() {

if (typeof self === 'undefined' || !self.Prism || !self.document) {
return;
}

var assign = Object.assign || function (obj1, obj2) {
for (var name in obj2) {
if (obj2.hasOwnProperty(name))
obj1[name] = obj2[name];
}
return obj1;
}

var specs = {},
reloadSettings = false;

Prism.plugins.ParseSettings = {
declare: function(pluginSpecs) {
assign(specs, pluginSpecs);
reloadSettings = true;
}
};

function loadSettings(parent) {
var settings = {};

do {
for (var i = 0, attrs = parent.attributes; i < attrs.length; ++i) {
var name = attrs[i].nodeName,
val = attrs[i].nodeValue;

if (name === 'class') {
for (var j = 0, classes = val.split(/\s+/); j < classes.length; ++j) {
name = classes[j];
if (name.indexOf('no-') === 0) {
name = name.substring(3);
if (specs[name])
settings[name] = false;
} else {
if (specs[name])
settings[name] = true;
}
}
} else if (name.indexOf('data-') === 0) {
name = name.substring(5);
if (specs[name])
settings[name] = val;
}
}
} while ((parent = parent.parentNode) && parent.hasAttribute);

return settings;
}

function applySpecs(settings, specs) {
var out = {};

for (var name in specs) {
var spec = specs[name] || {},
value = settings[name] || spec['default'];

switch(spec.type) {
case 'int':
value = parseInt(value);
break;
case 'boolean':
case 'bool':
value = (value === 'false' || value === 'no') ? false : (value === '') ? true : !!value;
break;
case 'number':
case 'float':
value = parseFloat(value);
break;
}

if (value || value === false || value === 0) {
out[name] = value;
}
}

return out;
}

function getSettings(pluginSpecs) {
if (reloadSettings) {
this.rawSettings = loadSettings(this.element);
}

return applySpecs(this.rawSettings || {}, pluginSpecs || specs);
}

Prism.hooks.add('before-highlight', function (env) {
env.getSettings = getSettings;
});

}());
1 change: 1 addition & 0 deletions plugins/parse-settings/prism-parse-settings.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.