Conversation
Preview:
|
|
Submitted 1 actionable inline finding. |
|
Submitted 1 actionable inline finding. |
06465ca to
dd52b13
Compare
|
Submitted 2 actionable inline findings. |
dd52b13 to
c56ddca
Compare
|
Submitted 2 actionable inline findings. |
c56ddca to
7418c94
Compare
|
Submitted 2 actionable inline findings. |
|
Submitted 3 actionable inline findings. |
a3644c8 to
3b5cd7c
Compare
|
Submitted 1 actionable inline finding. |
3b5cd7c to
cc29952
Compare
|
Submitted 1 actionable inline finding. |
bdd0303 to
cc16b87
Compare
|
Submitted 2 actionable inline findings. |
cc16b87 to
c2f4176
Compare
|
Submitted 2 actionable inline findings. |
c2f4176 to
be09ef1
Compare
This comment was marked as outdated.
This comment was marked as outdated.
be09ef1 to
f4f838e
Compare
|
f4f838e to
f0c7d6c
Compare
| let level = lists[bullet.listId]?.listProperties.nestingLevels[nestingLevel]; | ||
| return { | ||
| listId: bullet.listId, | ||
| listType: level?.glyphType !== undefined ? "numbered" : "bullet", |
There was a problem hiding this comment.
Medium: The documented glyphType: "NONE" renders an empty glyph, but this classifies every present glyph type as a numbered list. A valid cell whose paragraph has bullet: { listId: "L" } and whose lists.L.listProperties.nestingLevels[0] is { glyphType: "NONE", glyphFormat: "%0" } is displayed by Docs with no marker; this renderer emits <ol><li>Text</li></ol>, inventing 1. (and the body path likewise invents 1. ). Handle NONE as a markerless level rather than ordered.
| ): boolean { | ||
| return startsMarkdownEscape(markdown, index - 1) || | ||
| links.some(link => index > link.mdStart && index < link.mdEnd) || | ||
| index > 0 && index < markdown.length && markdown[index - 1] === markdown[index] && |
There was a problem hiding this comment.
Medium: This boundary check protects only positions inside a delimiter run, not inside the inline style span that the delimiters form. For a provider paragraph containing plain malformed-but-supported text *x, replaceText("*x", "*x*") previews a complete italic span, and parsing the whole replacement would insert x with italic: true. Here the shared *x is retained, however, so materialization passes only the final * to markdownToDocRequests; the generated batch merely inserts that literal character with an empty text style, leaving all three characters plain. The same occurs when completing ~~x to ~~x~~. Expand trim bounds to the complete resulting inline formatting span (as is already done for links), and cover completion of an unmatched delimiter.
|
f0c7d6c to
168740c
Compare
|
Submitted 1 actionable inline finding. |
168740c to
c53d095
Compare
|
c53d095 to
8b79dd6
Compare
| bounds = markdownReplacementBounds(oldMarkdown, newMarkdown); | ||
| } | ||
| let { prefixLen, suffixLen } = bounds; | ||
| let changed = newMarkdown.slice(prefixLen, newMarkdown.length - suffixLen); |
There was a problem hiding this comment.
Medium: Canonicalizing only the trimmed fragment misses a newly created plain-paragraph boundary. For an existing A\n\nB, replaceText("A\n\nB", "A\nX\nB") trims the change to just X, so simulation remains A\nX\nB. Materialization recognizes the insertion point as following a paragraph and inserts \nX, creating three provider paragraphs; the next read renders them as A\n\nX\n\nB. Any dependent queued edit against the approved preview is then invalidated. Please canonicalize/rebuild with the adjacent block boundaries and add an action-level replay case.
|
Submitted 1 actionable inline finding. |
Previously in Google Docs
docTabToMarkdown()previously processed only paragraph structural elements. This updates it to include tables as wellGoogle documentation
The Google Docs API explicitly exposes table cells through documents.get():
i.e.