hexo-util
Utilities for Hexo.
Table of contents
Installation
$ npm install hexo-util --save
Usage
var util = require('hexo-util');
Cache()
A simple plain object cache
const cache = new Cache();
cache.set('foo', 'bar');
cache.get('foo');
cache.has('foo');
cache.has('bar');
cache.apply('baz', () => 123);
cache.apply('baz', () => 456);
cache.apply('qux', 456);
cache.apply('qux', '789');
cache.size();
cache.dump();
cache.del('baz');
cache.has('baz');
cache.flush();
cache.has('foo');
cache.size();
CacheStream()
Caches contents piped to the stream.
var stream = new CacheStream();
fs.createReadStream('/path/to/file').pipe(stream);
stream.on('finish', function(){
console.log(stream.getCache());
stream.destroy();
});
camelCaseKeys(obj, options)
Convert object keys to camelCase. Original keys will be converted to getter/setter and sync to the camelCase keys.
camelCaseKeys({
foo_bar: 'test'
});
createSha1Hash()
return SHA1 hash object.
This is the same as calling createHash('utf8')
in the node.js native module crypto.
const sha1 = createSha1Hash();
fs.createReadStream('/path/to/file')
.pipe(sha1)
.on('finish', () => {
console.log(sha1.read());
});
decodeURL(str)
Decode encoded URL or path. An alternative to the native decodeURI()
function, with added ability to decode punycoded domain.
decodeURL('http://foo.com/b%C3%A1r')
decodeURL('http://xn--br-mia.com/baz')
decodeURL('/foo/b%C3%A1r/')
const {format} = require('url')
decodeURI(format(new URL('http://xn--br-mia.com.com/b%C3%A1r'), {unicode: true}))
deepMerge(target, source)
Merges the enumerable properties of two objects deeply. target
and source
remain untouched.
const obj1 = {a: {b: 1, c: 1, d: {e: 1, f: 1}}};
const obj2 = {a: {b: 2, d: {f: 'f'} }};
deepMerge(obj1, obj2);
const obj1 = { 'a': [{ 'b': 2 }, { 'd': 4 }] };
const obj2 = { 'a': [{ 'c': 3 }, { 'e': 5 }] };
deepMerge(obj1, obj2);
encodeURL(str)
Encode URL or path into a safe format.
encodeURL('http://foo.com/bár')
encodeURL('/foo/bár/')
escapeDiacritic(str)
Escapes diacritic characters in a string.
escapeHTML(str)
Escapes HTML entities in a string.
escapeHTML('<p>Hello "world".</p>')
escapeHTML('<foo>bar</foo>')
escapeRegex(str)
Escapes special characters in a regular expression.
full_url_for(path)
Returns a url with the config.url prefixed. Output is encoded automatically. Requires bind(hexo)
.
_config.yml
url: https://example.com/blog
full_url_for('/a/path')
gravatar(str, [options])
Returns the gravatar image url from an email.
If you didn't specify the [options] parameter, the default options will apply. Otherwise, you can set it to a number which will then be passed on as the size parameter to Gravatar. Finally, if you set it to an object, it will be converted into a query string of parameters for Gravatar.
Option | Description | Default |
---|
s | Output image size | 80 |
d | Default image | |
f | Force default | |
r | Rating | |
More info: Gravatar
gravatar('a@abc.com')
gravatar('a@abc.com', 40)
gravatar('a@abc.com' {s: 40, d: 'https://via.placeholder.com/150'})
hash(str)
Generates SHA1 hash.
hash('123456');
highlight(str, [options])
Syntax highlighting for a code block.
Option | Description | Default |
---|
gutter | Whether to show line numbers | true |
wrap | Whether to wrap the code block in <table> | true |
firstLine | First line number | 1 |
hljs | Whether to use the hljs-* prefix for CSS classes | false |
lang | Language | |
caption | Caption | |
tab | Replace tabs | |
autoDetect | Detect language automatically (warning: slow) Sublanguage highlight requires autoDetect to be enabled and lang to be unset | false |
mark | Line highlight specific line(s) | |
languageAttr | Output code language into data-language attr | false |
stripIndent | Whether to strip leading whitespace via strip-indent | true |
htmlTag(tag, attrs, text, escape)
Creates a html tag.
Option | Description | Default |
---|
tag | Tag / element name | |
attrs | Attribute(s) and its value. Value is always escaped, URL is always encoded. | |
text | Text, the value is always escaped (except for <style> tag) | |
escape | Whether to escape the text | true |
htmlTag('img', {src: 'example.png'})
htmlTag('a', {href: 'http://hexo.io/'}, 'Hexo')
htmlTag('link', {href: 'http://foo.com/'}, '<a>bar</a>')
htmlTag('a', {href: 'http://foo.com/'}, '<b>bold</b>', false)
htmlTag('style', {}, 'p { content: "<"; background: url("bár.jpg"); }')
htmlTag('script', {src: '/foo.js', async: true}, '')
isExternalLink(url, sitehost, [exclude])
Option | Description | Default |
---|
url | The input URL. | |
sitehost | The hostname / url of website. You can also pass hexo.config.url . | |
exclude | Exclude hostnames. Specific subdomain is required when applicable, including www. | [] |
Returns if a given url is external link relative to given sitehost
and [exclude]
.
isExternalLink('https://example.com', 'example.com');
isExternalLink('https://example.com', 'https://example.com');
isExternalLink('https://example.com', '//example.com/blog/');
isExternalLink('/archives/foo.html', 'example.com');
isExternalLink('https://foo.com/', 'example.com');
isExternalLink('https://foo.com', 'example.com', ['foo.com', 'bar.com']);
isExternalLink('https://bar.com', 'example.com', ['foo.com', 'bar.com']);
isExternalLink('https://baz.com/', 'example.com', ['foo.com', 'bar.com']);
Pattern(rule)
Parses the string and tests if the string matches the rule. rule
can be a string, a regular expression or a function.
var pattern = new Pattern('posts/:id');
pattern.match('posts/89');
var pattern = new Pattern('posts/*path');
pattern.match('posts/2013/hello-world');
Permalink(rule, [options])
Parses a permalink.
Option | Description |
---|
segments | Customize the rule of a segment in the permalink |
var permalink = new Permalink(':year/:month/:day/:title', {
segments: {
year: /(\d{4})/,
month: /(\d{2})/,
day: /(\d{2})/
}
});
permalink.parse('2014/01/31/test');
permalink.test('2014/01/31/test');
permalink.stringify({year: '2014', month: '01', day: '31', title: 'test'})
prettyUrls(url, [options])
Rewrite urls to pretty URLs.
Option | Description | Default |
---|
trailing_index | /about/index.html -> /about/ when false | true |
trailing_html | /about.html -> /about when false | true |
Note: trailing_html
ignores any link with a trailing index.html
. (will not be rewritten to index
).
prettyUrls('/foo/bar.html');
prettyUrls('/foo/bar/index.html');
prettyUrls('/foo/bar.html', { trailing_index: false });
prettyUrls('/foo/bar/index.html', { trailing_index: false });
prettyUrls('/foo/bar.html', { trailing_html: false });
prettyUrls('/foo/bar/index.html', { trailing_html: false });
prettyUrls('/foo/bar.html', { trailing_index: false, trailing_html: false });
prettyUrls('/foo/bar/index.html', { trailing_index: false, trailing_html: false });
prismHighlight(str, [options])
Syntax highlighting for a code block using PrismJS.
Option | Description | Default |
---|
lineNumber | Whether to show line numbers | true |
lang | Language | 'none' |
tab | Replace tabs | |
isPreprocess | Enable preprocess or not | true |
mark | Highlight specific line | |
firstLine | First line number | |
caption | Caption | |
stripIndent | Whether to strip leading whitespace via strip-indent | true |
When isPreprocess
is enabled, prismHighlight()
will return PrismJS processed HTML snippet. Otherwise str
will only be escaped and prismHighlight()
will return the HTML snippet that is suitable for prism.js
working in the Browser.
mark
and firstLine
options will have effect only when isPreprocess
is disabled.
relative_url(from, to)
Returns the relative URL from from
to to
. Output is encoded automatically. Requires bind(hexo)
.
relative_url('foo/bar/', 'css/style.css')
slugize(str, [options])
Transforms a string into a clean URL-friendly string.
Option | Description | Default |
---|
separator | Separator | - |
transform | Transform the string into lower case (1 ) or upper case (2 ) | |
slugize('Hello World') = 'Hello-World'
slugize('Hellô Wòrld') = 'Hello-World'
slugize('Hello World', {separator: '_'}) = 'Hello_World'
slugize('Hello World', {transform: 1}) = 'hello-world'
slugize('Hello World', {transform: 2}) = 'HELLO-WORLD'
spawn(command, [args], [options])
Launches a new process with the given command
. This method returns a promise.
Option | Description | Default |
---|
cwd | Current working directory of the child process | |
env | Environment key-value pairs | |
stdio | Child's stdio configuration | pipe |
detached | The child will be a process group leader | |
uid | Sets the user identity of the process | |
gid | Sets the group identity of the process | |
verbose | Display messages on the console | false |
encoding | Sets the encoding of the output string | utf8 |
More info: child_process.spawn()
spawn('cat', 'test.txt').then((content) => {
console.log(content);
});
spawn('cat', ['foo.txt', 'bar.txt'], { cwd: '/target/folder' }).then((content) => {
console.log(content);
});
stripHTML(str)
Removes HTML tags in a string.
stripIndent(str)
Strip leading whitespace from each line in a string. The line with the least number of leading whitespace, ignoring empty lines, determines the number to remove. Useful for removing redundant indentation.
wordWrap(str, [options])
Wraps the string no longer than line width. This method breaks on the first whitespace character that does not exceed line width.
Option | Description | Default |
---|
width | Line width | 80 |
wordWrap('Once upon a time')
wordWrap('Once upon a time, in a kingdom called Far Far Away, a king fell ill, and finding a successor to the throne turned out to be more trouble than anyone could have imagined...')
wordWrap('Once upon a time', {width: 8})
wordWrap('Once upon a time', {width: 1})
tocObj(str, [options])
Generate a table of contents in JSON format based on the given html string. Headings with attribute data-toc-unnumbered="true"
will be marked as unnumbered.
Option | Description | Default |
---|
min_depth | The minimum level of TOC | 1 |
max_depth | The maximum level of TOC | 6 |
const html = [
'<h1 id="title_1">Title 1</h1>',
'<div id="title_1_1"><h2>Title 1.1</h2></div>',
'<h3 id="title_1_1_1">Title 1.1.1</h3>',
'<h2 id="title_1_2">Title 1.2</h2>',
'<h2 id="title_1_3">Title 1.3</h2>',
'<h3 id="title_1_3_1">Title 1.3.1</h3>',
'<h1 id="title_2">Title 2</h1>',
'<h2 id="title_2_1">Title 2.1</h2>'
].join('\n');
tocObj(html);
tocObj(html, { min_depth: 2 });
tocObj(html, { max_depth: 2 });
tocObj('<h1 id="reference" data-toc-unnumbered="true">Reference</h1>')
truncate(str, [options])
Truncates a given text after a given length
if text is longer than length
. The last characters will be replaced with the omission
option for a total length not exceeding length
.
Option | Description | Default |
---|
length | Max length of the string | 30 |
omission | Omission text | ... |
separator | truncate text at a natural break | |
truncate('Once upon a time in a world far far away')
truncate('Once upon a time in a world far far away', {length: 17})
truncate('Once upon a time in a world far far away', {length: 17, separator: ' '})
truncate('And they found that many people were sleeping better.', {length: 25, omission: '... (continued)'})
unescapeHTML(str)
Unescapes HTML entities in a string.
unescapeHTML('<p>Hello "world".</p>')
url_for(path, [option])
Returns a url with the root path prefixed. Output is encoded automatically. Requires bind(hexo)
.
Option | Description | Default |
---|
relative | Output relative link | Value of config.relative_link |
_config.yml
root: /blog/
url_for('/a/path')
Relative link, follows relative_link
option by default
e.g. post/page path is '/foo/bar/index.html'
_config.yml
relative_link: true
url_for('/css/style.css')
url_for('/css/style.css', {relative: false})
bind(hexo)
Following utilities require bind(hexo)
/ bind(this)
/ call(hexo, input)
/ call(this, input)
to parse the user config when initializing:
Below examples demonstrate different approaches to creating a helper (each example is separated by /******/
),
const url_for = require('hexo-util').url_for.bind(hexo);
hexo.extend.helper.register('test_url', (str) => {
return url_for(str);
})
const url_for = require('hexo-util').url_for.bind(hexo)
function testurlHelper(str) {
return url_for(str);
}
hexo.extend.helper.register('test_url', testurlHelper);
module.exports = function(str) {
const url_for = require('hexo-util').url_for.bind(this);
return url_for(str);
}
hexo.extend.helper.register('test_url', require('./test_url'));
const {url_for} = require('hexo-util');
module.exports = function(str) {
return url_for.call(this, str);
}
hexo.extend.helper.register('test_url', require('./test_url'));
function testurlHelper(str) {
const url_for = require('hexo-util').url_for.bind(this);
return url_for(str);
}
module.exports = {
testurlHelper: testurlHelper
}
hexo.extend.helper.register('test_url', require('./test_url').testurlHelper);
License
MIT