hexo icon indicating copy to clipboard operation
hexo copied to clipboard

Request for loading custom layout

Open WangNianyi2001 opened this issue 2 years ago • 2 comments

Check List

Please check followings before submitting a new feature request.

  • [x] I have already read Docs page
  • [x] I have already searched existing issues

Feature Request

Happy new year, 2023 here (kinda late tho). This has been talked about back then in 2017 in #2645, but that didn't solve the essential problem.

I think that Hexo should support to load layout automatically from a custom /layout diretory without having to modify theme/*/layout/layout.ejs. This fundamentally means that themes can be decoupled with the actual content of the site.

Let me show you what I mean: Suppose (I'm doing this irl really) that I'm building a website not only containing blog articles, but all other kinds of content, say ideas or song lists, and I want to organize them under different pages, and to have a nav bar linking to all these pages. This could be done by applying categories on posts though, but in my case I want to have different sub-index page for each category. Auto generated category pages won't work, so essentially they have to use different layouts.

Since the nav bar is written in a theme, and the actual content types would be indefinite, I left a configuring option in _config.yml to let the theme EJS know what should be presented in the nav bar (see the actual codes).

After this, I should be able to move all the sub-index layout files out from the theme directory, to /layout under the root directory. But when I actually do this, I noticed that all them pages with a custom layout had gone empty.

This means that custom layouts outside a theme can't be loaded, which further means that such content system can not be decoupled with its theme. Tracing back the old issue I realized this is certainly a design problem of Hexo.

Others

When I first tried to implement such thing, I tried simply setting all individual entries' layouts (for example if I want a new blog article I'd create a new but with layout: blog), and then I can iterate through them in blogs.ejs via <% for(const blog of site.blogs._data) %>. Then I (very sadly) found out that no pages other than those with layout set to post/page can be access in the site variable.

This should be fixed, probably by adding a .layouts member to site.

P.S. If you actually visit my blog site you'll see that I've got it equipped with multilingual support. I personally think that my solution is more elegant than using i18n. I hope to hear some advice of this from you!

WangNianyi2001 avatar Jan 15 '23 20:01 WangNianyi2001

I have the same need

nexmoe avatar Feb 08 '23 06:02 nexmoe