D0n9X1n / hexo-blog-encrypt

Yet, just another hexo plugin for security.
https://www.npmjs.com/package/hexo-blog-encrypt
MIT License
970 stars 101 forks source link

解密后目录不会更新 #16

Closed Detachment closed 7 years ago

Detachment commented 7 years ago

解密之前目录会将 message 中的内容作为标题显示,这很好。 但是解密之后文章内容更新,目录却并未更新。 有没有办法解决这个问题? 谢谢~

D0n9X1n commented 7 years ago

是指 TOC 吗? 如果是文章的 TOC,需要配合模版进行修改的。 可以参考这个:默认模版的修改方式

Detachment commented 7 years ago

@MikeCoder 对的,指的就是 TOC。 我用的是 Next 主题,默认模版的修改方式 这一段讲的不是加密 TOC 吗?还是说加入这段代码后解密的时候目录会恢复正常? 再次感谢~

D0n9X1n commented 7 years ago

并不是恢复正常,只是按照原有内容生成 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

具体的插入代码还是得基于不同的模版引擎进行修改。

Detachment commented 7 years ago

@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 %}
D0n9X1n commented 7 years ago

试试把 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 %}
Detachment commented 7 years ago

@MikeCoder 修改测试后报错,错误信息如下:

image

改起来太麻烦就算了,我自己再找找,不过已经很感谢你啦~

Detachment commented 7 years ago

其实我认为也可能是渲染顺序的问题:页面初始加载的时候就会根据文章内容生成目录,当按钮触发解密函数的时候,页面内容虽然发生了变化,但目录部分是否会监听内容变化从而热更新? 因为对 Next 主题不熟悉,所以这也只是我的一个猜想~

D0n9X1n commented 7 years ago

TOC 生成是在 hexo g 时已经完成了。

Detachment commented 7 years ago

@MikeCoder Hexo 默认主题 Landscape 的 TOC 加密你测试过吗?文件生成后(hexo g)还可以更改 display 属性? 不好意思,问的有点多,打扰了。。。

D0n9X1n commented 7 years ago

恩,可以的,在页面解析的 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 显示出来,也就是之前在模版里隐藏的那个
            }
...
xmeng1 commented 7 years ago

Fix this issue next/layout/_macro/sidebar.swig,该文件有两个地方需要修改,搜索display_toc大概有4个位置,主要是第2个和第4个位置。

修改方法:

  1. 判断加密: 需要用 page.encrypt==true
  2. 如果加密则 将其中的 page.content 改为 page.origin

为了不容易出错,直接把相关代码复制一份,然后写一个外层if else控制

关键代码1,第2个 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 %}

关键代码2,第4个 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 版本为 5.1.1

替换以下文件: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 %}
edward-p commented 6 years ago

补充楼上,解决加密文章在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)

Yalhu commented 6 years ago

@xmeng1 我按照第一种方式,修改 display_toc ,没有成功。 @edward-p 单独按照你的方式,或者和 @xmeng 1 的一种方式一起,都没有成功。

Hexo: 3.5.0 NexT: 5.1.4 scheme: Mist

xmeng1 commented 6 years ago

@Yalhu 最好能把错误消息贴出来,这样才能定位错误

Yalhu commented 6 years ago

没有报错,就是没有目录

Brywmzl commented 5 years ago

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>
    <% }
} %>