From 62e989849b94efc795465ceeaf15279606e7e84e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 7 Mar 2017 17:07:22 -0800 Subject: [PATCH] better support nested lists for markdown scroll sync --- extensions/markdown/media/main.js | 16 +++++++++------- extensions/markdown/src/markdownEngine.ts | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/extensions/markdown/media/main.js b/extensions/markdown/media/main.js index f927c0fa90f..8eeedcdf57c 100644 --- a/extensions/markdown/media/main.js +++ b/extensions/markdown/media/main.js @@ -59,6 +59,7 @@ */ function getLineElementsAtPageOffset(offset) { const lines = document.getElementsByClassName('code-line'); + const position = offset - window.scrollY; let previous = null; for (const element of lines) { const line = +element.getAttribute('data-line'); @@ -67,13 +68,14 @@ } const bounds = element.getBoundingClientRect(); const entry = { element, line }; - if (offset >= window.scrollY + bounds.top && offset <= window.scrollY + bounds.top + bounds.height) { - // add progress through element - entry.line += (offset - (window.scrollY + bounds.top)) / (bounds.height); - return { previous: entry }; - } else if (offset < window.scrollY + bounds.top) { + if (position < bounds.top) { + if (previous && previous.fractional < 1) { + previous.line += previous.fractional; + return { previous }; + } return { previous, next: entry }; } + entry.fractional = (position - bounds.top) / (bounds.height); previous = entry; } return { previous }; @@ -87,7 +89,7 @@ * Attempt to reveal the element for a source line in the editor. */ function scrollToRevealSourceLine(line) { - const {previous, next} = getElementsForSourceLine(line); + const { previous, next } = getElementsForSourceLine(line); marker.update(previous && previous.element); if (previous && settings.scrollPreviewWithEditorSelection) { let scrollTo = 0; @@ -104,7 +106,7 @@ } function getEditorLineNumberForPageOffset(offset) { - const {previous, next} = getLineElementsAtPageOffset(offset); + const { previous, next } = getLineElementsAtPageOffset(offset); if (previous) { if (next) { const betweenProgress = (offset - window.scrollY - previous.element.getBoundingClientRect().top) / (next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top); diff --git a/extensions/markdown/src/markdownEngine.ts b/extensions/markdown/src/markdownEngine.ts index 602aea8ea23..43625bd01e6 100644 --- a/extensions/markdown/src/markdownEngine.ts +++ b/extensions/markdown/src/markdownEngine.ts @@ -97,7 +97,7 @@ export class MarkdownEngine { const original = md.renderer.rules[ruleName]; md.renderer.rules[ruleName] = (tokens: any, idx: number, options: any, env: any, self: any) => { 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.attrJoin('class', 'code-line'); } -- GitLab