Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tippy的链接锚无法正确对应 #5

Closed
CoreJa opened this issue Jan 18, 2020 · 11 comments
Closed

tippy的链接锚无法正确对应 #5

CoreJa opened this issue Jan 18, 2020 · 11 comments

Comments

@CoreJa
Copy link

CoreJa commented Jan 18, 2020

不太确定是上游bug还是你这边的问题,先提出来看看,举例如下:
找到了大佬的blog,其中有一注脚如图:
image

  • 点击后期望的反应:跳转到最底部的注脚详细内容
  • 点击后实际反馈:无反应

观察url可发现点击后链接锚为#fn1-1(如图),而其id(html的id)则为fnref1-1
image

而底部注脚详细内容的注脚则出现了对应错误

  • 期望的链接锚为:#fnref1-1
  • 期望的id为:#fn1-1
  • 实际的链接锚为:#fnref1
  • 实际的id为:#fn1

所以导致无法直接跳转,如果我没记错的话,之前原文的html id和链接锚是没有-1的,不确定是哪里出了问题,如果大佬最近比较忙的话,可以告诉我具体处理环节是否增加了-1,,我也会去看看源码,以便随后提交pr上来。

@Ritsuka314
Copy link
Owner

Ritsuka314 commented Jan 18, 2020 via email

@Ritsuka314
Copy link
Owner

0.4.1 的修复有问题,暂时不要升级

@Ritsuka314 Ritsuka314 reopened this Jan 18, 2020
@Ritsuka314
Copy link
Owner

如果你愿意帮忙一起看源码的话,现在已经确定是 fixFootnotes.js 的问题。

当时为了解决 #3 的时候,发现在 hexo 中 tag 都是独立渲染后嵌入回原文,导致脚注计数器从 1 重新计数。于是 pandocFilter.py 那边就在渲染每一个块时在最外层裹了一个 <div class="fnscope">. fixFootnotes.js 这边首先要确定 div.fnscope 的嵌套,这个是 fixFootnotes 函数递归过程中遇到 div.fnscope 调用 doScopeDiv 做的事(名字起得很不好,这个函数之前还做了别的事,但是那些东西没了,本来应该把里边现在的东西放回 fixFootnotes里的,为了省屏幕就留外边了)。

设计上是希望顶层的脚注链接为 #fnref1 和 #fn1 的,然后内部的用 #fnref1.1.1.1-1 和 #fn1.1.1.1-1 . 现在 footnote section 是对的,但是正文对它的引用有问题。大概是 fixFootnotes 函数里 node.is("a.footnote-ref") 分支中 if (!scope) 判断失败。

接下来的周末会有点忙碌,如果你能帮忙确认是不是上述这么个情况就太感谢了。

@CoreJa
Copy link
Author

CoreJa commented Jan 18, 2020

刚刚试了下,先反馈下我这边debug的情况,使用的版本是0.4.0,在node.is("a.footnote-ref") 分支中 if (!scope)里,if的判断是走了else的分支,即原先scope为1,经过分支后scope为-1

不确定我是否理解正确,我先梳理一遍:

  • 希望注脚有小节标号,所以引入了改进,改进为:#fnref1-1#fnref1.1-1#fnref1.2-1
  • 其中格式为#fnrefa-b
  • a表示注脚的章节号,比如1/1.1/1.2/等等
  • b表示当前章节号的注脚编号,
  • 比如第三章第二节的第5个注脚的id则是:#fnref3.2-5

如果上述描述无误,那么比较疑惑的地方是上文提到

希望顶层的脚注链接为 #fnref1 和 #fn1

#fn1应当是#fn1-1吧?不然的话会产生重复id,比如第一章的两个注脚为#fn1#fn2,这样第二章还有注脚的话就无法给其编号了。

建立在前面理解无误的情况下,代码在此处逻辑无误,作为第一章的第一个注解,其id的确应该为fnref1-1,需要更改的应该是注脚对应文章底部的注解。

@CoreJa
Copy link
Author

CoreJa commented Jan 18, 2020

我将else if (node.is("li[role=doc-endnote]"))的判断中,scope的取值scope = node.closest("section.footnotes").prev("div.fnScope").attr("scope");改成了和前面一致的写法scope = node.closest("div.fnScope").attr("scope");,现在work了(尽管我对node一无所知hhh),但依旧不是我前面预想的理解,取了一篇有三个章的blog,共7个注脚,得到的注脚分别是#fnref1-1#fnref7-1。也许我对于标号的理解不太正确。但目前注脚和注解的scope能对应了。

修改后的情况可以看latex学习

@Ritsuka314
Copy link
Owner

这个 scope 跟 markdown 里的 heading 没有关系。scope 解决的问题是 hexo 渲染下例时会根据 tag 选择不同的 renderer. 下例中的 blockquote 使用的是 markdown renderer (在我们的情况下 md 被注册为 hexo-renderer-pandoc), 而就算跟正文使用的是同样的 renderer, hexo 也会将 tag 中的内容单独交给 renderer 渲染后插入正文中。而这个插入是发生在正文渲染完毕后。因此 hexo-renderer-pandoc 每次被调用时都只能得到其中一块而并不知道这一块是将要嵌入到哪儿去的,也不知道这一块中是否有嵌入 (后面这个不一定。也许有办法在 pandocFilter.py 里做这个,这样就不用费心在 js 那边用 cheerio 做这个了。这个看一眼 pandoc 的语法树就可以确定了。)

然后现在的问题是,我原本设计是 #fna-b 其中 a 是嵌入层次,如 1, 1.1, 1.1.1 这样,而 b 是当前 scope 中该脚注的序号。然而似乎现在当 a 为空的时候会省略为 #fnb.

我现在想是不是去掉 https:/RichardYan314/hexo-pandoc-tippy/blob/23a44d7914f30c97a0a491481edb98f03500c3ac/fixFootnotes.js#L119 上的 if-else 就可以解决。晚上有时间我试试。

global 1
^[global 1]

{% blockquote %}
1.1^[1.1]

{% blockquote %}
1.1.1^[1.1.1]
{% endblockquote %}

1.2^[1.2]
{% endblockquote %}

{% blockquote %}
2.1^[2.1]
{% endblockquote %}

global 2
^[global 2]

感觉我中文表达能力越来越有问题了。上面哪里不清楚的请务必让我澄清。

@Ritsuka314
Copy link
Owner

姑且算是找个地方先记录一下:因为 pandoc 生成的脚注 id 是 fnref1, 然后我懒,直接把 scope 后缀到原 id 上了,于是应该是 fnref1-1.1.1

@Ritsuka314
Copy link
Owner

Ritsuka314 commented Jan 20, 2020

发现了几个问题:

  1. 麻烦你查看一下自己 pandoc 的版本号。我发现我家里电脑上装的是 2.5,然后这个版本里渲染到 html5 的时候没有给脚注的 <li> 上加 role=doc-endnote. 而当时写这个功能的时候用的是笔电,当时已经装了似乎 2.7 了,于是逻辑判断的时候用了 node.is("li[role=doc-endnote]")) 导致低版本的 pandoc 渲染的结果会完全进不了这个分支。

  2. hexo 处理嵌套 tag 有问题。上边例子里的

{% blockquote %}
1.1^[1.1]

{% blockquote %}
1.1.1^[1.1.1]
{% endblockquote %}

1.2^[1.2]
{% endblockquote %}

hexo 由于使用正则表达式会将第一个嵌入块匹配为

{% blockquote %}
1.1^[1.1]

{% blockquote %}
1.1.1^[1.1.1]
{% endblockquote %}

以上所有部分。这个我这边无能为力。

Ritsuka314 pushed a commit that referenced this issue Jan 21, 2020
@Ritsuka314
Copy link
Owner

修好了,还顺带解决了下排序的问题。你试试更新插件到0.4.3,然后pandoc也更新到2.9试试。

@CoreJa
Copy link
Author

CoreJa commented Mar 2, 2020

抱歉因为疫情的原因,一直不方便回复(人在武汉,笔记本没在使用)。刚刚重新测试了一遍,没有任何问题。感谢大佬更新

@Ritsuka314
Copy link
Owner

Ritsuka314 commented Mar 2, 2020 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants