---
layout: default
---

<small>{{ page.date | date: "%-d %B %Y" }} - 字数统计：{% if page.layout == "encrypt" %}God Knows {% else %}{{ page.content | strip_html | strip_newlines | remove: " " | size }} - 阅读大约需要{{ page.content | strip_html | strip_newlines | remove: "" | size | divided_by: 350 | plus: 1 }}分钟{% endif %} - Hits: <span id="{{ page.url }}" class="visitors">Loading...</span></small>
<h1>{{ page.title }}</h1>

<p class="view">by <a href="//github.com/{{ page.author | default: "Mabbs" }}">{{ page.author | default: site.author }}</a></p>
<div id="outdate" style="display:none;">
  <hr />
  这是一篇创建于 <span id="outime"></span> 天前的文章，其中的信息可能已经有所发展或是发生改变。
  <br /><br />
</div>
<script>
  BirthDay = new Date("{{ page.date | date: "%m/%d/%Y" }} 00:00:00");
  today = new Date();
  timeold = (today.getTime() - BirthDay.getTime());
  secondsold = Math.floor(timeold / 1000);
  e_daysold = timeold / (24 * 60 * 60 * 1000);
  daysold = Math.floor(e_daysold);
  if (daysold > 90) {
    document.getElementById("outdate").style.display = "block";
    document.getElementById("outime").innerHTML = daysold;
  }
</script>

<hr />
{% if page.layout != "encrypt" %}
<!--[if !IE]> -->
<b>AI摘要</b>
<p id="ai-output">正在生成中……</p>
<script>
  async function sha(str) {
    const encoder = new TextEncoder();
    const data = encoder.encode(str);
    const hashBuffer = await crypto.subtle.digest("SHA-256", data);
    const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
    const hashHex = hashArray
      .map((b) => b.toString(16).padStart(2, "0"))
      .join(""); // convert bytes to hex string
    return hashHex;
  }
  async function ai_gen(){
    var postContent = "文章标题：" + {{ page.title | jsonify }} + "；文章内容：" + {{ page.content | strip_html | strip_newlines | jsonify }};
    var postContentSign = await sha(postContent);
    var outputContainer = document.getElementById("ai-output");
    $.get(BlogAPI + "/is_uploaded?id={{ page.url }}&sign=" + postContentSign, function (data) {
      if (data == "yes") {
        $.get(BlogAPI + "/get_summary?id={{ page.url }}&sign=" + postContentSign, function (data2) {
          outputContainer.textContent = data2;
        });
      } else {
        $.post(BlogAPI + "/upload_blog?id={{ page.url }}", postContent, function (data) {
          $.get(BlogAPI + "/get_summary?id={{ page.url }}&sign=" + postContentSign);
          const evSource = new EventSource(BlogAPI + "/summary?id={{ page.url }}");
          outputContainer.textContent = "";
          evSource.onmessage = (event) => {
            if (event.data == "[DONE]") {
              evSource.close();
              return;
            } else {
              const data = JSON.parse(event.data);
              outputContainer.textContent += data.response;
            }
          }
        });
      }
    });
  }
  ai_gen();
</script>
<hr />
<!-- <![endif]-->
{% endif %}

{% include toc.html html=content sanitize=true h_max=3 %}

{{content}}

{% if page.tags %}
<small>tags: <em>{{ page.tags | join: "</em> - <em>" }}</em></small>
{% endif %}
<br />
<br />
<p id="suggest-container"></p>
<script>
var blogurl = "{{ page.url }}";
var suggest = $("#suggest-container")[0];
suggest.innerHTML = "Loading...";
$.get(BlogAPI + "/suggest?id=" + blogurl + "&update=" + lastUpdated.valueOf(), function (data) {
    if (data.length) {
        getSearchJSON(function (search) {
            suggest.innerHTML = '<b>推荐文章</b><hr style="margin: 0 0 5px"/>';
            const searchMap = new Map(search.map(item => [item.url, item]));
            const merged = data.map(suggestObj => {
                const searchObj = searchMap.get(suggestObj.id);
                return searchObj ? { ...searchObj } : null;
            });
            merged.forEach(element => {
                if (element) {
                    suggest.innerHTML += "<a href=" + element.url + ">" + element.title + "</a> - " + element.date + "<br />";
                }
            });
        });
    } else {
        suggest.innerHTML = "暂无推荐文章……";
    }
});
</script>
<div class="pagination">
  {% if page.previous.url %}
  <span class="prev">
    <a href="{{ site.baseurl }}{{ page.previous.url }}">
      上一篇：{{ page.previous.title }}
    </a>
  </span>
  {% endif %}
  <br />
  {% if page.next.url %}
  <span class="next">
    <a href="{{ site.baseurl }}{{ page.next.url }}">
      下一篇：{{ page.next.title }}
    </a>
  </span>
  {% endif %}
</div>

<!--[if !IE]> -->
<link rel="stylesheet" href="/css/gitalk.css">
<script src="/js/gitalk.min.js"></script>

<div id="gitalk-container"></div>

<script>
  if (window.location.host != "mabbs.github.io") {
    var gitalk = new Gitalk({
      clientID: '098934a2556425f19d6e',
      clientSecret: '0bd44eed8425e5437ce43c4ba9b2791fbc04581d',
      repo: 'mabbs.github.io',
      owner: 'Mabbs',
      admin: ['Mabbs'],
      id: '{{ page.id }}',      // Ensure uniqueness and length less than 50
      distractionFreeMode: false  // Facebook-like distraction free mode
    })
  }
  else {
    var gitalk = new Gitalk({
      clientID: '36557aec4c3cb04f7ac6',
      clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb',
      repo: 'mabbs.github.io',
      owner: 'Mabbs',
      admin: ['Mabbs'],
      id: '{{ page.id }}',      // Ensure uniqueness and length less than 50
      distractionFreeMode: false  // Facebook-like distraction free mode
    })
  }

  gitalk.render('gitalk-container')
</script>
<!-- <![endif]-->