提交 62e98984 编写于 作者: M Matt Bierner

better support nested lists for markdown scroll sync

上级 af7df75f
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
*/ */
function getLineElementsAtPageOffset(offset) { function getLineElementsAtPageOffset(offset) {
const lines = document.getElementsByClassName('code-line'); const lines = document.getElementsByClassName('code-line');
const position = offset - window.scrollY;
let previous = null; let previous = null;
for (const element of lines) { for (const element of lines) {
const line = +element.getAttribute('data-line'); const line = +element.getAttribute('data-line');
...@@ -67,13 +68,14 @@ ...@@ -67,13 +68,14 @@
} }
const bounds = element.getBoundingClientRect(); const bounds = element.getBoundingClientRect();
const entry = { element, line }; const entry = { element, line };
if (offset >= window.scrollY + bounds.top && offset <= window.scrollY + bounds.top + bounds.height) { if (position < bounds.top) {
// add progress through element if (previous && previous.fractional < 1) {
entry.line += (offset - (window.scrollY + bounds.top)) / (bounds.height); previous.line += previous.fractional;
return { previous: entry }; return { previous };
} else if (offset < window.scrollY + bounds.top) { }
return { previous, next: entry }; return { previous, next: entry };
} }
entry.fractional = (position - bounds.top) / (bounds.height);
previous = entry; previous = entry;
} }
return { previous }; return { previous };
...@@ -87,7 +89,7 @@ ...@@ -87,7 +89,7 @@
* Attempt to reveal the element for a source line in the editor. * Attempt to reveal the element for a source line in the editor.
*/ */
function scrollToRevealSourceLine(line) { function scrollToRevealSourceLine(line) {
const {previous, next} = getElementsForSourceLine(line); const { previous, next } = getElementsForSourceLine(line);
marker.update(previous && previous.element); marker.update(previous && previous.element);
if (previous && settings.scrollPreviewWithEditorSelection) { if (previous && settings.scrollPreviewWithEditorSelection) {
let scrollTo = 0; let scrollTo = 0;
...@@ -104,7 +106,7 @@ ...@@ -104,7 +106,7 @@
} }
function getEditorLineNumberForPageOffset(offset) { function getEditorLineNumberForPageOffset(offset) {
const {previous, next} = getLineElementsAtPageOffset(offset); const { previous, next } = getLineElementsAtPageOffset(offset);
if (previous) { if (previous) {
if (next) { if (next) {
const betweenProgress = (offset - window.scrollY - previous.element.getBoundingClientRect().top) / (next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top); const betweenProgress = (offset - window.scrollY - previous.element.getBoundingClientRect().top) / (next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top);
......
...@@ -97,7 +97,7 @@ export class MarkdownEngine { ...@@ -97,7 +97,7 @@ export class MarkdownEngine {
const original = md.renderer.rules[ruleName]; const original = md.renderer.rules[ruleName];
md.renderer.rules[ruleName] = (tokens: any, idx: number, options: any, env: any, self: any) => { md.renderer.rules[ruleName] = (tokens: any, idx: number, options: any, env: any, self: any) => {
const token = tokens[idx]; const token = tokens[idx];
if ((token.level === 0 || token.type === 'list_item_open' && token.level === 1) && token.map && token.map.length) { if (token.map && token.map.length) {
token.attrSet('data-line', this.firstLine + token.map[0]); token.attrSet('data-line', this.firstLine + token.map[0]);
token.attrJoin('class', 'code-line'); token.attrJoin('class', 'code-line');
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册