66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
|
|
package threadspost
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// LineCount returns non-empty lines after normalizing newlines.
|
|||
|
|
func LineCount(text string) int {
|
|||
|
|
text = strings.ReplaceAll(text, "\r\n", "\n")
|
|||
|
|
text = strings.ReplaceAll(text, "\r", "\n")
|
|||
|
|
n := 0
|
|||
|
|
for _, line := range strings.Split(text, "\n") {
|
|||
|
|
if strings.TrimSpace(line) != "" {
|
|||
|
|
n++
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return n
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MimicLengthRange returns a suggested min/max rune count when imitating referenceText.
|
|||
|
|
func MimicLengthRange(referenceText string) (min, max int) {
|
|||
|
|
ref := RuneLen(referenceText)
|
|||
|
|
if ref <= 0 {
|
|||
|
|
return ViralSweetMin, ViralSweetMax
|
|||
|
|
}
|
|||
|
|
min = int(float64(ref) * 0.75)
|
|||
|
|
max = int(float64(ref) * 1.25)
|
|||
|
|
if min < 20 {
|
|||
|
|
min = 20
|
|||
|
|
}
|
|||
|
|
if max < min+10 {
|
|||
|
|
max = min + 10
|
|||
|
|
}
|
|||
|
|
if max > MaxPublishRunes {
|
|||
|
|
max = MaxPublishRunes
|
|||
|
|
}
|
|||
|
|
if min > max {
|
|||
|
|
min = max
|
|||
|
|
}
|
|||
|
|
return min, max
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MimicLengthGuidance builds prompt text for rewrite/mimic flows.
|
|||
|
|
func MimicLengthGuidance(referenceText string) string {
|
|||
|
|
referenceText = strings.TrimSpace(referenceText)
|
|||
|
|
if referenceText == "" {
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
refRunes := RuneLen(referenceText)
|
|||
|
|
refLines := LineCount(referenceText)
|
|||
|
|
min, max := MimicLengthRange(referenceText)
|
|||
|
|
lineMin, lineMax := refLines, refLines
|
|||
|
|
if refLines > 1 {
|
|||
|
|
lineMin = refLines - 1
|
|||
|
|
if lineMin < 1 {
|
|||
|
|
lineMin = 1
|
|||
|
|
}
|
|||
|
|
lineMax = refLines + 1
|
|||
|
|
}
|
|||
|
|
return fmt.Sprintf(
|
|||
|
|
"【篇幅(仿寫)】參考原文約 %d 字、%d 行。產出正文請控制在 %d~%d 字、約 %d~%d 行,不要明顯比參考長很多或短很多。精簡優先:刪掉重複鋪陳、無關細節、雞湯總結與多餘轉折;每一句都要推進故事或情緒,不然就砍掉。",
|
|||
|
|
refRunes, refLines, min, max, lineMin, lineMax,
|
|||
|
|
)
|
|||
|
|
}
|