Closed Detachment closed 7 years ago
@MikeCoder 对的,指的就是 TOC。 我用的是 Next 主题,默认模版的修改方式 这一段讲的不是加密 TOC 吗?还是说加入这段代码后解密的时候目录会恢复正常? 再次感谢~
并不是恢复正常,只是按照原有内容生成 TOC,然后默认隐藏了。等到输入密码后再出现。
加密的时候,post.content 会变成加密后的串,所以原来的 TOC 生成逻辑就会针对加密后的内容。 所以这边我只能把原来的内容存进 post.origin 字段。
<div id="toc-div" class="toc-article" <% if (post.encrypt == true) { %>style="display:none" <% } %>>
<strong class="toc-title">Index</strong>
<% if (post.encrypt == true) { %>
<%- toc(post.origin, {list_number: true}) %>
<% } else { %>
<%- toc(post.content, {list_number: true}) %>
<% } %>
</div>
这段代码的目的就是判断文章是否加密,然后针对不同的内容进行 TOC 生成。 但是生成的 TOC 是基于原文的,所以默认是隐藏的,得输入密码后显示。所以这边的 div 的 id 务必是 toc-div。
具体的插入代码还是得基于不同的模版引擎进行修改。
@MikeCoder 嗯嗯,说的通俗易懂。 我找到了一段与之相关的代码,因为对 Nxet 主题文件和 这个插件不太熟悉,实在是不知道要怎么改,不知道能否给点意见?谢谢~
{% if display_toc %}
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
{% if page.toc_number === undefine %}
{% set toc = toc(page.content, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.content, {"class": "nav", list_number: page.toc_number}) %}
{% endif %}
{% if toc.length <= 1 %}
<p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
{% else %}
<div class="post-toc-content">{{ toc }}</div>
{% endif %}
</div>
</section>
{% endif %}
试试把 next/layout/_macro/sidebar.swig 这个文件内容替换如下:
{% macro render(is_post) %}
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<aside id="sidebar" class="sidebar">
<div class="sidebar-inner">
{% set display_toc = is_post and theme.toc.enable %}
{% if display_toc %}
{% if (!page.encrypt and toc(page.content).length > 1) or (page.encrypt and toc(page.origin).length > 1) %}
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
{{ __('sidebar.toc') }}
</li>
<li class="sidebar-nav-overview" data-target="site-overview">
{{ __('sidebar.overview') }}
</li>
</ul>
{% endif %}
{% endif %}
<section class="site-overview sidebar-panel{% if not display_toc or toc(page.content).length <= 1 %} sidebar-panel-active{% endif %}">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image"
src="{{ url_for( theme.avatar | default(theme.images + '/avatar.gif') ) }}"
alt="{{ theme.author }}" />
<p class="site-author-name" itemprop="name">{{ theme.author }}</p>
<p class="site-description motion-element" itemprop="description">{{ theme.description }}</p>
</div>
<nav class="site-state motion-element">
<div class="site-state-item site-state-posts">
<a href="{{ url_for(theme.menu.archives) }}">
<span class="site-state-item-count">{{ site.posts.length }}</span>
<span class="site-state-item-name">{{ __('state.posts') }}</span>
</a>
</div>
{% if site.categories.length > 0 %}
<div class="site-state-item site-state-categories">
{% if theme.menu.categories %}<a href="{{ url_for(theme.menu.categories) }}">{% endif %}
<span class="site-state-item-count">{{ site.categories.length }}</span>
<span class="site-state-item-name">{{ __('state.categories') }}</span>
{% if theme.menu.categories %}</a>{% endif %}
</div>
{% endif %}
{% if site.tags.length > 0 %}
<div class="site-state-item site-state-tags">
{% if theme.menu.tags %}<a href="{{ url_for(theme.menu.tags) }}">{% endif %}
<span class="site-state-item-count">{{ site.tags.length }}</span>
<span class="site-state-item-name">{{ __('state.tags') }}</span>
{% if theme.menu.tags %}</a>{% endif %}
</div>
{% endif %}
</nav>
{% if theme.rss %}
<div class="feed-link motion-element">
<a href="{{ url_for(theme.rss) }}" rel="alternate">
<i class="fa fa-rss"></i>
RSS
</a>
</div>
{% endif %}
<div class="links-of-author motion-element">
{% if theme.social %}
{% for name, link in theme.social %}
<span class="links-of-author-item">
<a href="{{ link }}" target="_blank" title="{{ name }}">
{% if theme.social_icons.enable %}
<i class="fa fa-fw fa-{{ theme.social_icons[name] | default('globe') | lower }}"></i>
{% endif %}
{{ name }}
</a>
</span>
{% endfor %}
{% endif %}
</div>
{% set cc = {'by': 1, 'by-nc': 1, 'by-nc-nd': 1, 'by-nc-sa': 1, 'by-nd': 1, 'by-sa': 1, 'zero': 1} %}
{% if theme.creative_commons in cc %}
<div class="cc-license motion-element" itemprop="license">
<a href="https://creativecommons.org/{% if theme.creative_commons === 'zero' %}publicdomain/zero/1.0{% else %}licenses/{{ theme.creative_commons }}/4.0{% endif %}/" class="cc-opacity" target="_blank">
<img src="{{ url_for(theme.images) }}/cc-{{ theme.creative_commons }}.svg" alt="Creative Commons" />
</a>
</div>
{% endif %}
{# Blogroll #}
{% if theme.links %}
<div class="links-of-blogroll motion-element {{ "links-of-blogroll-" + theme.links_layout | default('inline') }}">
<div class="links-of-blogroll-title">
<i class="fa fa-fw fa-{{ theme.links_icon | default('globe') | lower }}"></i>
{{ theme.links_title }}
</div>
<ul class="links-of-blogroll-list">
{% for name, link in theme.links %}
<li class="links-of-blogroll-item">
<a href="{{ link }}" title="{{ name }}" target="_blank">{{ name }}</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% include '../_custom/sidebar.swig' %}
</section>
{% if display_toc %}
{% if (!page.encrypt and toc(page.content).length > 1) or (page.encrypt and toc(page.origin).length > 1) %}
<!--noindex-->
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
{% if page.toc_number === undefined %}
{% if page.encrypt %}
{% set toc = toc(page.origin, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.content, { "class": "nav", list_number: theme.toc.number }) %}
{% endif %}
{% else %}
{% if page.encrypt %}
{% set toc = toc(page.origin, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.content, { "class": "nav", list_number: theme.toc.number }) %}
{% endif %}
{% endif %}
{% if toc.length <= 1 %}
<p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
{% else %}
<div class="post-toc-content">{{ toc }}</div>
{% endif %}
</div>
</section>
<!--/noindex-->
{% endif %}
{% endif %}
{% if site.tags.length > 1 %}
<script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
<script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
<div class="widget-wrap">
<h3 class="widget-title">Tag Cloug</h3>
<div id="myCanvasContainer" class="widget tagcloud">
<canvas width="250" height="250" id="resCanvas" style="width=100%">
{{ list_tags() }}
</canvas>
</div>
</div>
{% endif %}
</div>
</aside>
{% endmacro %}
@MikeCoder 修改测试后报错,错误信息如下:
改起来太麻烦就算了,我自己再找找,不过已经很感谢你啦~
其实我认为也可能是渲染顺序的问题:页面初始加载的时候就会根据文章内容生成目录,当按钮触发解密函数的时候,页面内容虽然发生了变化,但目录部分是否会监听内容变化从而热更新? 因为对 Next 主题不熟悉,所以这也只是我的一个猜想~
TOC 生成是在 hexo g
时已经完成了。
@MikeCoder Hexo 默认主题 Landscape 的 TOC 加密你测试过吗?文件生成后(hexo g)还可以更改 display 属性? 不好意思,问的有点多,打扰了。。。
恩,可以的,在页面解析的 js 里面
...
if (content == '') {
alert("密码错误!!");
} else {
document.getElementById("encrypt-blog").style.display = "inline";
document.getElementById("encrypt-blog").innerHTML = content;
document.getElementById("encrypt-message").style.display = "none";
document.getElementById("security").style.display = "none";
if (document.getElementById("toc-div")) {
document.getElementById("toc-div").style.display = "inline"; // 这里就是把隐藏的 toc 显示出来,也就是之前在模版里隐藏的那个
}
...
Fix this issue
next/layout/_macro/sidebar.swig
,该文件有两个地方需要修改,搜索display_toc
大概有4个位置,主要是第2个和第4个位置。
修改方法:
page.encrypt==true
page.content
改为 page.origin
为了不容易出错,直接把相关代码复制一份,然后写一个外层if else控制
display_toc
{% set display_toc = is_post and theme.toc.enable %}
{% if page.encrypt == true %}
{% if display_toc and toc(page.origin).length > 1 %}
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
{{ __('sidebar.toc') }}
</li>
<li class="sidebar-nav-overview" data-target="site-overview">
{{ __('sidebar.overview') }}
</li>
</ul>
{% endif %}
{% else %}
{% if display_toc and toc(page.content).length > 1 %}
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
{{ __('sidebar.toc') }}
</li>
<li class="sidebar-nav-overview" data-target="site-overview">
{{ __('sidebar.overview') }}
</li>
</ul>
{% endif %}
{% endif %}
display_toc
{% if page.encrypt == true %}
{% if display_toc and toc(page.origin).length > 1 %}
<!--noindex-->
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
{% if page.toc_number === undefined %}
{% set toc = toc(page.origin, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.origin, { "class": "nav", list_number: page.toc_number }) %}
{% endif %}
{% if toc.length <= 1 %}
<p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
{% else %}
<div class="post-toc-content">{{ toc }}</div>
{% endif %}
</div>
</section>
<!--/noindex-->
{% endif %}
{% else %}
{% if display_toc and toc(page.content).length > 1 %}
<!--noindex-->
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
{% if page.toc_number === undefined %}
{% set toc = toc(page.content, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.content, { "class": "nav", list_number: page.toc_number }) %}
{% endif %}
{% if toc.length <= 1 %}
<p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
{% else %}
<div class="post-toc-content">{{ toc }}</div>
{% endif %}
</div>
</section>
<!--/noindex-->
{% endif %}
{% endif %}
替换以下文件:next/layout/_macro/sidebar.swig
`{% macro render(is_post) %}
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<aside id="sidebar" class="sidebar">
<div class="sidebar-inner">
{% set display_toc = is_post and theme.toc.enable %}
{% if page.encrypt == true %}
{% if display_toc and toc(page.origin).length > 1 %}
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
{{ __('sidebar.toc') }}
</li>
<li class="sidebar-nav-overview" data-target="site-overview">
{{ __('sidebar.overview') }}
</li>
</ul>
{% endif %}
{% else %}
{% if display_toc and toc(page.content).length > 1 %}
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
{{ __('sidebar.toc') }}
</li>
<li class="sidebar-nav-overview" data-target="site-overview">
{{ __('sidebar.overview') }}
</li>
</ul>
{% endif %}
{% endif %}
<section class="site-overview sidebar-panel{% if not display_toc or toc(page.content).length <= 1 %} sidebar-panel-active{% endif %}">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image"
src="{{ url_for( theme.avatar | default(theme.images + '/avatar.gif') ) }}"
alt="{{ theme.author }}" />
<p class="site-author-name" itemprop="name">{{ theme.author }}</p>
{% if theme.seo %}
<p class="site-description motion-element" itemprop="description">{{ theme.signature }}</p>
{% else %}
<p class="site-description motion-element" itemprop="description">{{ theme.description }}</p>
{% endif %}
</div>
<nav class="site-state motion-element">
{% if config.archive_dir != '/' %}
<div class="site-state-item site-state-posts">
<a href="{{ url_for(theme.menu.archives) }}">
<span class="site-state-item-count">{{ site.posts.length }}</span>
<span class="site-state-item-name">{{ __('state.posts') }}</span>
</a>
</div>
{% endif %}
{% if site.categories.length > 0 %}
{% set categoriesPageQuery = site.pages.find({type: 'categories'}, {lean: true}) %}
{% set hasCategoriesPage = categoriesPageQuery.length > 0 %}
<div class="site-state-item site-state-categories">
{% if hasCategoriesPage %}<a href="{{ url_for(categoriesPageQuery[0].path) }}">{% endif %}
<span class="site-state-item-count">{{ site.categories.length }}</span>
<span class="site-state-item-name">{{ __('state.categories') }}</span>
{% if hasCategoriesPage %}</a>{% endif %}
</div>
{% endif %}
{% if site.tags.length > 0 %}
{% set tagsPageQuery = site.pages.find({type: 'tags'}, {lean: true}) %}
{% set hasTagsPage = tagsPageQuery.length > 0 %}
<div class="site-state-item site-state-tags">
{% if hasTagsPage %}<a href="{{ url_for(tagsPageQuery[0].path) }}">{% endif %}
<span class="site-state-item-count">{{ site.tags.length }}</span>
<span class="site-state-item-name">{{ __('state.tags') }}</span>
{% if hasTagsPage %}</a>{% endif %}
</div>
{% endif %}
</nav>
{% if theme.rss %}
<div class="feed-link motion-element">
<a href="{{ url_for(theme.rss) }}" rel="alternate">
<i class="fa fa-rss"></i>
RSS
</a>
</div>
{% endif %}
<div class="links-of-author motion-element">
{% if theme.social %}
{% for name, link in theme.social %}
<span class="links-of-author-item">
<a href="{{ link }}" target="_blank" title="{{ name }}">
{% if theme.social_icons.enable %}
<i class="fa fa-fw fa-{{ theme.social_icons[name] | default('globe') | lower }}"></i>
{% endif %}
{{ name }}
</a>
</span>
{% endfor %}
{% endif %}
</div>
{% set cc = {'by': 1, 'by-nc': 1, 'by-nc-nd': 1, 'by-nc-sa': 1, 'by-nd': 1, 'by-sa': 1, 'zero': 1} %}
{% if theme.creative_commons in cc %}
<div class="cc-license motion-element" itemprop="license">
<a href="https://creativecommons.org/{% if theme.creative_commons === 'zero' %}publicdomain/zero/1.0{% else %}licenses/{{ theme.creative_commons }}/4.0{% endif %}/" class="cc-opacity" target="_blank">
<img src="{{ url_for(theme.images) }}/cc-{{ theme.creative_commons }}.svg" alt="Creative Commons" />
</a>
</div>
{% endif %}
{# Blogroll #}
{% if theme.links %}
<div class="links-of-blogroll motion-element {{ "links-of-blogroll-" + theme.links_layout | default('inline') }}">
<div class="links-of-blogroll-title">
<i class="fa fa-fw fa-{{ theme.links_icon | default('globe') | lower }}"></i>
{{ theme.links_title }}
</div>
<ul class="links-of-blogroll-list">
{% for name, link in theme.links %}
<li class="links-of-blogroll-item">
<a href="{{ link }}" title="{{ name }}" target="_blank">{{ name }}</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% include '../_custom/sidebar.swig' %}
</section>
{% if page.encrypt == true %}
{% if display_toc and toc(page.origin).length > 1 %}
<!--noindex-->
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
{% if page.toc_number === undefined %}
{% set toc = toc(page.origin, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.origin, { "class": "nav", list_number: page.toc_number }) %}
{% endif %}
{% if toc.length <= 1 %}
<p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
{% else %}
<div class="post-toc-content">{{ toc }}</div>
{% endif %}
</div>
</section>
<!--/noindex-->
{% endif %}
{% else %}
{% if display_toc and toc(page.content).length > 1 %}
<!--noindex-->
<section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
<div class="post-toc">
{% if page.toc_number === undefined %}
{% set toc = toc(page.content, { "class": "nav", list_number: theme.toc.number }) %}
{% else %}
{% set toc = toc(page.content, { "class": "nav", list_number: page.toc_number }) %}
{% endif %}
{% if toc.length <= 1 %}
<p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
{% else %}
<div class="post-toc-content">{{ toc }}</div>
{% endif %}
</div>
</section>
<!--/noindex-->
{% endif %}
{% endif %}
{% if theme.sidebar.b2t %}
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
{% if theme.sidebar.scrollpercent %}
<span id="scrollpercent"><span>0</span>%</span>
{% endif %}
</div>
{% endif %}
</div>
</aside>
{% endmacro %}
补充楼上,解决加密文章在NexT-Mist下sidebar显示问题
是由于<section class="site-overview sidebar-panel sidebar-panel-active">
引起的,正确的因为
<section class="site-overview sidebar-panel">
(不应该有sidebar-panel-active)
修改
<section class="site-overview sidebar-panel{% if not display_toc or toc(page.content).length <= 1 %} sidebar-panel-active{% endif %}">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
为
<section class="site-overview sidebar-panel{% if not display_toc or (toc(page.origin).length <= 1 and toc(page.content).length <= 1) %} sidebar-panel-active{% endif %}">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
即把条件toc(page.content).length <= 1
替换为(toc(page.content).length <= 1 and toc(page.origin).length <= 1)
@xmeng1 我按照第一种方式,修改 display_toc ,没有成功。 @edward-p 单独按照你的方式,或者和 @xmeng 1 的一种方式一起,都没有成功。
Hexo: 3.5.0 NexT: 5.1.4 scheme: Mist
@Yalhu 最好能把错误消息贴出来,这样才能定位错误
没有报错,就是没有目录
indigo主题求改~
<% if(theme.toc){
var topic = toc(post.content, {
class: 'post-toc',
list_number: theme.toc.list_number
})
if(topic) {
%>
<aside class="post-widget">
<nav class="post-toc-wrap" id="post-toc">
<h4>TOC</h4>
<%- toc(post.content, {
class: 'post-toc',
list_number: theme.toc.list_number
}) %>
</nav>
</aside>
<% }
} %>
解密之前目录会将 message 中的内容作为标题显示,这很好。 但是解密之后文章内容更新,目录却并未更新。 有没有办法解决这个问题? 谢谢~