Skip to content

Releases: hexojs/hexo

5.0.0

29 Jul 02:24
1489074
Compare
Choose a tag to compare

Breaking change

  • refactor(external_link): migrate config during load_config @SukkaW [#4414] [#4371]

    • See Writing section for new options (introduced back in v4)
    # _config.yml
    external_link: true|false # deprecated
    
    # New option
    external_link:
      enable: true|false
    # _config.yml
    # https://hexo.io/docs/configuration#Date-Time-format
    use_date_for_updated: true # deprecated
    
    # New option
    updated_option: date
    • If you check external_link for truthy value, since it's now automatically converted to object, it will be always truthy:
    <% if (config.external_link) { %>
    • If you wish to maintain backward compatibility with older Hexo versions:
    <% if ((typeof config.external_link === 'boolean' && config.external_link === true) || (typeof config.external_link === 'object' && config.external_link.enable === true)) { %>
  • refactor(box): remove Bluebird.asCallback @SukkaW [#4379]

    • Callback syntax for Box is never documented nor utilized in Hexo's internal.
    • This is also a reminder that we might drop callbacks from all Hexo API in future. [#3328]
  • feat: bring up config.updated_option @SukkaW [#4278]

    • This can be useful for a theme that prefers to display Updated: only when it's set in the article's front-matter.
  • feat(open_graph): drop 'keywords' option from front-matter @curbengh [#4174]

    • Search engines no longer support keywords.
  • fix(#3464): override permalink use the front-matter @SukkaW [#4359]

    • User config:
    # _config.yml
    permalink: :year/:month/:day/:title/
    • Front-matter
    ---
    title: foo bar
    permalink: breaking-news/
    ---
    • That post will be available on http://yourhexo.com/breaking-news/
    • A reminder that permalink must have a trailing .html or /
    permalink: :year/:month/:day/:title/ # default
    # or
    permalink: :year/:month/:day/:title.html
  • Remove lodash from global variable @SukkaW [#4266]

    • Lodash _ is no longer available on Hexo API.
    // Dropped
    <% const arrayB = _.uniq(arrayA) %>
    • We encourage the use over native JS API over Lodash, we find this guide to be helpful.
    • If you prefer to use Lodash, you can always install it and make it available via Helper API
  • chore/ci: drop Node.js 8 and add Node.js 14 @SukkaW [#4255]

    • Node 8 has reached EOL on 31 Dec 2019.
    • Hexo now requires Node 10+; although Node 10.x is still supported, but it's going to be officially deprecated in less than a year (April 2021), so we recommend Node 12+.
  • refactor: remove site config from theme config @SukkaW [#4145]

    • Previously hexo.theme.config is merged into hexo.config, they are now separated to avoid possible conflict in configuration.

New feature

  • feat(tag): show source of the error & beautify @SukkaW [#4420]
  • feat(post_link): better error message when a post could not be located [#4426]
    • The error message is now clearer when there is an incorrect filename.
  • skip assets of unpublished posts and delete them if exist @DaemondShu [#3489]
    • When there is an unpublished post:
    ---
    title: Still a draft....
    published: false
    ---
    • That post including its assets will not be generated into the public/ folder.
  • feat(extend/injector): bring up new extend Injector @SukkaW [#4049]
  • feat: add prism highlight support @SukkaW [#4119]
  • feat(tagcloud): new option class & level @stevenjoezhang [#4370]
    • Ability to add class name for CSS styling.
  • feat(config): validate config before processing posts @SukkaW [#4381]
  • feat(post_permalink): add :second attribute option for post permalink @kkocdko [#4185]
    • Example:
    permalink: :year/:month/:day/:hour/:minute/:second/:title.html
  • feat(youtube_tag): add cookie option @curbengh [#4155]
    • When disabled, cookie is not set/sent in the youtube video embed.
  • feat(youtube_tag): support playlist @SukkaW [#4139]
    • Ability to embed a playlist.
  • feat(load_theme_config): support alternate theme config @SukkaW [#4120]
    • Theme can be configured in a file _config.[name].yml, e.g. _config.landscape.yml for hexo-theme-landscape.
    • Placed the file in the root folder, same as the current _config.yml.
    • Refer to the documentation for configuration priority.
  • feat(feed_tag): support parsing config.feed @curbengh [#4029]
  • feat(tag): add unregister() method @SukkaW [#4046]
    • This means you can now unregister existing tag plugins and replace it with your own with the same name.
  • feat(filter): add _after_html_render filter @jiangtj [#4051]
    • perf(filter): set after_render:html as alias of _after_html_render @curbengh [#4073]
    • Existing after_render:html filter plugins automatically benefit from this improvement.
  • feat(load_config): support theme_dir in node_modules @SukkaW [#4112]
  • fix(list_tags): custom class for each element @noraj [#4059]
    • Customize the class name for each element <ul>, <li>, <a>, <span> for list_tags plugin.

Performance

Fix

  • fix(box): ignore .git and node modules in the theme folder @jiangtj [#4306]
  • fix: allow empty title @stevenjoezhang [#4344]
  • fix(#4236): don't create "/index" directories when post_asset_folder is true @jiangtj [#4258]
  • fix(#4317): non-greedy regexp for tag escape @SukkaW [#4358]
  • fix(post): use non-greedy regular expressions @stevenjoezhang [#4161]
  • fix(post): properly escape swig tag inside post @SukkaW [#4352]
    • swig tag inside a single backtick is now interpreted as code embed.
    • `{% foo %}{{ bar }}{% endfoo %}`
  • fix(logging): log database only in relevant commands @curbengh [#4387]
    • Writing database to ${dbPath}/db.json message shouldn't show up in hexo clean and hexo version.
  • fix(server-cache): must match exact alias @curbengh [#4388]
    • Improve compatibility with 3rd-party console plugins that may have a name that starts with an 's'.
  • fix(tag-code): parse 'wrap' option @curbengh [#4391]
  • fix: remove unused type check @himself65 [#4398]
  • fix: access error code from error object directly @SukkaW [#4280]
    • Improve compatibility with native JS API
  • fix: load_plugin with extra line EOF @SukkaW [#4256]
  • fix: parsing code error in backticks @seaoak [#4229]
  • fix(toc_helper): escape class name and handle null id @curbengh [#4009]
  • fix(meta_generator): match existing <meta> with different order @SukkaW [#4017]
  • fix(excerpt): stricter regex @curbengh [#4443]
    • Now only the following variants of excerpt tag are valid.
    1. <!--more-->
    2. <!-- more-->
    3. <!--more -->
    4. <!-- more -->

Refactor

Read more

4.2.1

14 May 12:39
e2cbad8
Compare
Choose a tag to compare

Fix

  • Fix compatibility with Node 14 [#4285]

4.2.0

22 Dec 10:10
c0bf222
Compare
Choose a tag to compare

Features

  • Caching is disabled by default in hexo-server [#3963]
    • It's disabled so that any changes (particularly to the theme's layout) can be previewed in real-time.
    • If you use hexo-server in production environment to serve your website, it can be enabled by,
    _config.yml
    server:
      cache: true
  • Add min_depth: option to toc() helper [#3997]
    • Example usage:
    <%- toc(page.content, { min_depth: 2 }) %>
    // table of content would only include <h2>, <h3> and above

Fixes

  • Merges similar theme configs in main config and theme's config [#3967]
    • For example:
    _config.yml
    theme_config:
      a:
        b: 'foo'
    • Plus,
    _config.yml of theme
    a:
      c: 'bar'
    • theme variable should have,
    a: {
      b: 'foo',
      c: 'bar'
    }
    
  • Fixes some caching issue [#3985]
  • Open Graph now applies all pretty_urls options to og:url tag [#3983]

Refactor

  • No longer uses lodash [#3969], [#3987], [#3753]

    • Lodash _ is still available as a global variable, usually utilized in theme layout.
    • However, we plan to completely drop it in the coming Hexo 5.0.0
    • This project page includes all the relevant pull requests which you may find useful
  • Completely drops cheerio [#3850], [#3677]

    • This means Hexo no longer includes cheerio as part of its production dependencies (it's still a development dependency)
    • This also means the following initialization methods no longer work,
    const cheerio = require('./node_modules/hexo/node_modules/cheerio/index')
    const cheerio = require('./node_modules/cheerio/index')
    • To use cheerio,
    $ npm install --save cheerio
    const cheerio = require('cheerio')

4.1.1

12 Dec 07:24
23996dc
Compare
Choose a tag to compare

Feature

  • Add trailing_html: to pretty_urls: option to remove ".html" from url [#3917]
    • Use the following config to remove the trailing ".html" from permalink variables
    _config.yml
    pretty_urls:
      trailing_html: false
    • Example: https://yoursite.com/page/about.html -> https://yoursite.com/page/about

Fixes

  • Set default locales (in "language_TERRITORY" format) for og:locale Open Graph tag [#3921]
    • Previously og:locale was inserted only if language: is configured in "language-TERRITORY" format
    • With this fix, if the language is "en", og:locale will default to "en_US". Refer to the pull request for the full list.
  • meta_generator() helper should output the correct Hexo version [#3925]
  • permalink_defaults: option should be parsed, not replaced [#3926]
  • "node_modules/" and ".git/" folders in themes/ are now always ignored [#3918]

Refactor

  • Further reduces lodash usage [#3880]

4.1.0

09 Dec 03:52
979d1f4
Compare
Choose a tag to compare

Breaking change

  • Requires Node 8.10 or above [#3778]
    • Node 8 is going to be deprecated in less than a month, we strongly urge to upgrade to Node 10 or newer
  • og:locale Open Graph tag won't be inserted if language: (in config, front-matter of post/page or open_graph() helper) is not in language-TERRITORY format [#3808]
    • en is invalid
    • en-GB is valid
    • Not all locales are supported (e.g. en-AU is not valid), see official list
    • Dash (e.g. "en-GB") must be used for multilingual support, dash is automatically transformed to underscore (e.g. "en_GB") in og:locale
    • Verify the corresponding file exists in the languages/ folder of installed theme before changing the language: config

Features

  • Support adding hour and minute to post permalink [#3629]
    • Example usage:
    _config.yml
    permalink: :year/:month/:day/:hour/:minute/:title/
    • Results in https://yoursite.com/2019/12/09/23/59/a-post/
  • Insert article:published_time [#3674] article:author [#3805] Open Graph tags
  • Enable lazyload in iframe-related tag plugins [#3798]
  • meta_generator helper to insert metadata element tag [#3782]
    • Example usage:
    • Insert the following snippet (if EJS is used) inside <head> element of your theme layout,
    <%- meta_generator() %>
    • would output <meta name="generator" content="Hexo 4.1.0">
    • Hexo 3.9.0+ inserts the tag automatically; to get the performance benefit (of the meta_generator helper), meta_generator: option should be disabled,
    _config.yml
    meta_generator: false
  • Support custom attributes in js() [#3681] and css() [#3690] helpers
    • Example usage:
    <%- js({ src: 'script.js', integrity: 'foo', async: true }) %>
    // <script src="/script.js" integrity="foo" async></script>
    
    <%- css({ href: 'style.css', integrity: 'foo' }) %>
    // <link rel="stylesheet" href="/style.css" integrity="foo">
  • Support wrap: option to enable/disable wrapping backtick codeblock in <table> element [#3827]
    • Enabled by default, enabling line_number also enables it
    • Configure in highlight:
    _config.yml
    highlight:
      line_number: false # must be disabled to disable wrap:
      wrap: false
    {% codeblock lang:js wrap:false %}
    const foo = (bar) => {
      return bar;
    };
    {% endcodeblock %}

Fixes

  • Retain blank lines in a codeblock attached in blockquote [#3770]
  • Replaced deprecated og_updated_time Open Graph tag with article:modified_time [#3674]
  • Replaced deprecated keywords Open Graph tag with article:tag [#3805]
  • meta_generator tag should be inserted into <head> that spans multiple lines [#3778]
  • No longer clear database db.json when running hexo new or hexo --help [#3793]
  • Completely ignore files/folders specified in ignore: option [#3797]
    • If you're using Webpack or related tools in your theme, the node_modules folder could cause some issues
    • A temporary workaround is to configure Hexo to ignore that folder,
    _config.yml
    ignore: '**/themes/*/node_modules/**'
    • The workaround will no longer be necessary in future version
  • jsfiddle, vimeo and youtube tag plugins now use https only [#3806]
  • external_link filter should not process data URLs (e.g. mailto: & javascript:) [#3812] and <article> element [#3895]
  • Prevent unnecessary insertion of front-matter when using alias in Hexo CLI [#3830]
    • -p is alias of --path
    • -s is alias of --slug
    • -r is alias of --replace
  • Applies include: and exclude: options to post's asset folder [#3882]
  • ignore: option should work for files, in addition to folders [#3878]

Housekeeping

  • Add FOSSA license analyzer for open-source software license compliance [#3779]
  • Run benchmark in CI to catch regression [#3776]
  • Further reduces lodash usage [#3786], [#3788], [#3790], [#3785], [#3809], [#3791], [#3810], [#3826], [#3867], [#3845]
  • Remove unnecessary file at the end of unit test [#3792]
  • Add funding source to npm [#3851]
  • Update bump strip-ansi from 5.2.0 to 6.0.0 [#3852]
  • Update chalk from 2.4.2 to 3.0.0 [#3853]

4.0.0

16 Oct 00:25
9662366
Compare
Choose a tag to compare

Breaking change

  • chore: drop Node 6 #3598
  • fix post_link, asset_link when title contains unescaped html charaters #3704
    • Affects asset_link, post_link tag plugins
    • If you want to retain unescaped characters, set false to the final argument {% asset_link 'filename 'title' 'false' %}
  • fix: encode permalink by default #3708
    • If you currently use encodeURI(post.permalink) (including permalink of page, tag & category variables), there are three options:
      1. Use encodeURI(decodeURI(post.permalink)) for backward-compatibility with hexo v3.9 (and older)
      2. Use encodeURL() function provided by hexo-util, it is backward-compatible
      3. Drop encodeURI() function, this breaks backward-compatibility
    • If you want to use the variables in decoded form,
    • This change does not apply to this.url variable.
  • fix(paginator): add escape option for compatibility with [email protected] #3728
    • Theme devs, if you customize prev_text/next_text with html (e.g. to insert icons), you need to set escape: false in the parameter.

Feature

  • feat(filter): use existing excerpt if possible #3612

  • switch minimatch to micromatch #3538

  • feat: add option to disable meta generator tag #3653

    • Add meta_generator: false to config to disable
  • feat(generator): allow limit parallel generation #3665

    • If you experience "Out of memory" issue, try lowering the value in hexo g --concurrency <number>
  • Option to use date instead of file mtime for updated date #3235

    • If you prefer not to use file modification time in the post.updated variable, set use_date_for_updated: true in config
  • feat(list_tags): add Schema "keywords" and Microdata "tag" #3678

  • feat(permalink_variable): add pretty_urls option to remove index.html from url #3691

    • Use the following config to remove the trailing index.html from permalink variables
    pretty_urls:
      trailing_index: false
    • Does not apply to this.url variable (see #3661).
    • Should be compatible with existing canonical-related plugins, recommend plugin and theme devs to test
  • feat: add full_url_for helper #3701

    • use this helper full_url_for(page.path) instead of config.url + page.path
  • fix: external_link should use after_render #3675

    • added field and exclude options, see #3675 for guide.

Performance

  • perf(meta_generator): drop cheerio #3671
  • perf(open_graph): drop cheerio and use regex #3680
  • perf(external_link): drop cheerio and use regex #3685
  • perf(cache): enforce caching across modes #3756

Fix

  • fix: set english as default #3654
  • Use filename when title is not specified in the front-matter #3672
  • fix: ignore categories / tags with zero posts #3624
  • fix(open_graph): remove index.html from url #3661
  • fix(open_graph): remove duplicate twitter card tags #3668
  • fix(helpers, tag plugins): encode url by default #3710
    • Refer to #3708 for guide on decoding.
  • fix(open_graph): percent-encode url, not html escape #3686
  • fix: Allow backtick code block in "blockquote" tag plugin #2321
  • fix: Correct processing of backtick code block on blockquote #3765
  • fix: prevent inserting extra new line character into the end of backtick code block #3768

Dependency

  • chore(deps): update tildify requirement from ^1.2.0 to ^2.0.0 #3541
  • chore(deps): update strip-indent requirement from ^2.0.0 to ^3.0.0 #3534
  • chore(deps-dev): update husky requirement from ^1.1.3 to ^3.0.0 #3608
  • chore(deps-dev): update eslint requirement from ^5.9.0 to ^6.0.1 #3606
  • chore(deps-dev): update lint-staged requirement from ^8.1.0 to ^9.1.0 #3615
  • chore: update to [email protected] and [email protected] #3646
  • chore(deps): update hexo-i18n requirement from ^0.2.1 to ^1.0.0 #3698
  • chore(deps): update hexo-fs requirement from ^1.0.0 to ^2.0.0 #3699
  • chore(deps): update hexo-front-matter requirement from ^0.2.3 to ^1.0.0 #3700
  • chore(deps): update hexo-log requirement from ^0.2.0 to ^1.0.0 #3730
  • chore(deps): update warehouse requirement from ^2.2.0 to ^3.0.0 #3736
  • chore(deps): bump hexo-cli from 2.0.0 to 3.0.0 #3743

3.9.0

16 Jun 16:35
3.9.0
Compare
Choose a tag to compare

New Features

  • Updated hexo-renderer-marked to 1.0.1 (#3571)
  • Updated hexo-fs to 1.0.0 (#3301)
  • TOC: Seek anchor id from parent nodes when target is not available (#3404)
  • tag/include_code now can include ranged code lines (#3393)

Bug Fixes

  • DisableNunjucks: true should render markdown code block (#3573)
  • Changing source config should generate assets (#3399)

Refactor

  • Spread function: Hexo built-in plugin blockquote (#3291)
  • ES6 block scoping refactor (#3294)
  • Use spread syntax (#3333)

Housekeeping

It is a great release and thanks for hardworking from all contributors. 🤗

3.8.0

19 Oct 07:35
Compare
Choose a tag to compare

New Features

  • Supported absolute config path (#3118)
  • Added command line option --output to write db.json and _multiconfig to different paths (#3122)
  • Added meta generator injection filter (#3129)

Housekeeping

3.7.1

10 Apr 05:11
Compare
Choose a tag to compare

Fixes

  • Use old language file selection when no default file exists (#3110)
  • invalidate filters when return undefined (#3090)
  • Post.render callback should be triggered (#3051)

Housekeeping

  • remove jscs from contribution docs (#3111)

3.7.0

29 Mar 05:42
Compare
Choose a tag to compare

New Features

  • add after_clean filter (#2886)

Fixes

  • use default language when no language is set (#3069)

Housekeeping