Skip to content

Commit cbf59b8

Browse files
committed
fix(import): keep Gemini Takeout line breaks in message blocks
1 parent 2dbc869 commit cbf59b8

2 files changed

Lines changed: 25 additions & 6 deletions

File tree

internal/parser/gemini_apps_takeout.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,6 @@ func splitGeminiAppsBlocks(tokens []html.Token) []string {
546546
if !isGeminiAppsVoidElement(token.Data) {
547547
blockDepth++
548548
}
549-
if isGeminiAppsVoidElement(token.Data) {
550-
flush()
551-
}
552549
}
553550
continue
554551
}
@@ -565,9 +562,6 @@ func splitGeminiAppsBlocks(tokens []html.Token) []string {
565562
if blockDepth > 0 {
566563
block = append(block, token)
567564
}
568-
if token.Type == html.SelfClosingTagToken && strings.EqualFold(token.Data, "br") {
569-
flush()
570-
}
571565
}
572566
flush()
573567
return blocks

internal/parser/gemini_apps_takeout_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,31 @@ func TestParseGeminiAppsPreservesOrdinaryResponseAndAnswerText(t *testing.T) {
118118
assert.Equal(t, "ordinary Response: and Answer: text", results[0].Messages[0].Content)
119119
}
120120

121+
func TestParseGeminiAppsBrStaysInsidePromptBlock(t *testing.T) {
122+
fixture := strings.Replace(
123+
sanitizedGeminiAppsHTML,
124+
`<div class="content-cell mdl-cell"><p>first prompt<br></p><p><strong>first</strong> answer &amp; detail</p><script>secret script</script><style>secret style</style><template>secret template</template><noscript>secret noscript</noscript></div>`,
125+
`<div class="content-cell mdl-cell"><p>line one<br>line two</p><p>answer</p></div>`,
126+
1,
127+
)
128+
path := filepath.Join(t.TempDir(), "br-inline.html")
129+
require.NoError(t, os.WriteFile(path, []byte(fixture), 0o644))
130+
131+
provider, ok := NewProvider(AgentGeminiApps, ProviderConfig{})
132+
require.True(t, ok)
133+
exporter := provider.(GeminiAppsExportParser)
134+
var results []ParseResult
135+
_, err := exporter.ParseGeminiAppsExport(path, func(result ParseResult) error {
136+
results = append(results, result)
137+
return nil
138+
})
139+
require.NoError(t, err)
140+
require.Len(t, results, 2)
141+
require.Len(t, results[0].Messages, 2)
142+
assert.Equal(t, "line one\nline two", results[0].Messages[0].Content)
143+
assert.Equal(t, "answer", results[0].Messages[1].Content)
144+
}
145+
121146
func TestParseGeminiAppsTimestampMustBeInHeader(t *testing.T) {
122147
fixture := strings.Replace(
123148
sanitizedGeminiAppsHTML,

0 commit comments

Comments
 (0)