146 lines
3.5 KiB
Go
146 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/akyoto/color"
|
|
"github.com/animenotifier/notify.moe/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 {
|
|
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
|
|
}
|
|
|
|
name, value := parseAttribute(line)
|
|
|
|
if name != "" && value != "" {
|
|
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?
|
|
name, value := parseAttribute(paragraph)
|
|
|
|
if name != "" && value != "" {
|
|
attributes = append(attributes, &arn.CharacterAttribute{
|
|
Name: name,
|
|
Value: value,
|
|
})
|
|
continue
|
|
}
|
|
|
|
finalParagraphs = append(finalParagraphs, paragraph)
|
|
}
|
|
|
|
output = strings.Join(finalParagraphs, "\n\n")
|
|
output = strings.TrimSpace(output)
|
|
|
|
return output, attributes
|
|
}
|
|
|
|
func parseAttribute(line string) (string, string) {
|
|
if !strings.Contains(line, ":") {
|
|
return "", ""
|
|
}
|
|
|
|
parts := strings.Split(line, ":")
|
|
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 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) > 50 || strings.HasSuffix(value, ".") {
|
|
return "", ""
|
|
}
|
|
|
|
fmt.Println(color.GreenString(name), color.YellowString(value))
|
|
return name, value
|
|
}
|