2018-11-01 09:43:12 +09:00

164 lines
4.1 KiB
Go

package main
import (
"strings"
"github.com/animenotifier/arn"
)
func parseCharacterDescription(input string) (output string, attributes []*arn.CharacterAttribute) {
// Parse attributes like these:
// - Position: Club Manager
// - Height: 162 cm (5' 4")
// - Weight: 48 kg (106 lb)
// - Birthday: November 24
// - Hair color: Brown
// - Eyes: Blue (anime), Green (manga)
paragraphs := strings.Split(input, "\n\n")
finalParagraphs := make([]string, 0, len(paragraphs))
for _, paragraph := range paragraphs {
// Is paragraph full of attributes?
if strings.Contains(paragraph, "\n") {
lines := strings.Split(paragraph, "\n")
var lastAttribute *arn.CharacterAttribute
for _, line := range lines {
// line = strings.Replace(line, " (\n)", "", -1)
// Remove all kinds of starting and ending parantheses.
if strings.HasPrefix(line, "(") {
line = strings.TrimPrefix(line, "(")
line = strings.TrimSuffix(line, ")")
}
if !strings.Contains(line, ":") {
// Remove list indicators
line = strings.TrimPrefix(line, "- ")
line = strings.TrimPrefix(line, "* ")
// Add to previous attribute
if lastAttribute != nil {
if lastAttribute.Value != "" {
lastAttribute.Value += ", "
}
lastAttribute.Value += line
}
continue
}
parts := strings.Split(line, ":")
name := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
lastAttribute = &arn.CharacterAttribute{
Name: name,
Value: value,
}
attributes = append(attributes, lastAttribute)
}
continue
}
// Remove all kinds of starting and ending parantheses.
if strings.HasPrefix(paragraph, "(") {
paragraph = strings.TrimPrefix(paragraph, "(")
paragraph = strings.TrimSuffix(paragraph, ")")
}
// Replace source paragraph with an attribute
if strings.HasPrefix(paragraph, "Source:") || strings.HasPrefix(paragraph, "source:") {
source := paragraph[len("source:"):]
source = strings.TrimSpace(source)
attributes = append(attributes, &arn.CharacterAttribute{
Name: "Source",
Value: source,
})
continue
}
paragraph = strings.TrimSpace(paragraph)
// Skip paragraph if it's too short.
if len(paragraph) < 30 && !strings.HasSuffix(paragraph, ".") || strings.HasSuffix(paragraph, "...") {
continue
}
// Is it an attribute?
if strings.Contains(paragraph, ":") {
parts := strings.Split(paragraph, ":")
name := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
// Remove list indicators
name = strings.TrimPrefix(name, "- ")
name = strings.TrimPrefix(name, "* ")
if strings.HasPrefix(name, "~") && strings.HasSuffix(value, "~") {
name = strings.TrimPrefix(name, "~")
value = strings.TrimSuffix(value, "~")
}
if strings.HasPrefix(name, "[") && strings.HasSuffix(value, "]") {
name = strings.TrimPrefix(name, "[")
value = strings.TrimSuffix(value, "]")
}
if name == "source" || name == "sources" {
name = "Source"
}
if len(name) < 25 && len(value) < 40 && !strings.HasSuffix(value, ".") {
// fmt.Println(color.GreenString(name), color.YellowString(value))
attributes = append(attributes, &arn.CharacterAttribute{
Name: name,
Value: value,
})
continue
}
}
finalParagraphs = append(finalParagraphs, paragraph)
// originalLine := line
// line = strings.TrimSpace(line)
// colonPos := strings.Index(line, ":")
// // If a colon has not been found or the colon is too far,
// // treat it as a normal line.
// if colonPos == -1 || colonPos < 2 || colonPos > 25 {
// finalLines = append(finalLines, originalLine)
// continue
// }
// key := line[:colonPos]
// value := line[colonPos+1:]
// value = strings.TrimSpace(value)
// if key == "source" {
// key = "Source"
// }
// attributes = append(attributes, &arn.CharacterAttribute{
// Name: key,
// Value: value,
// })
// fmt.Println(color.CyanString(key), color.YellowString(value))
}
output = strings.Join(finalParagraphs, "\n\n")
output = strings.TrimSpace(output)
return output, attributes
}