package domain import ( "fmt" "strings" ) type WikiLink struct { target string alias string section string } func NewWikiLink(target string, alias string, section string) (*WikiLink, error) { if target == "" { return nil, fmt.Errorf("wikilink target cannot be empty") } return &WikiLink{ target: target, alias: alias, section: section, }, nil } func (w *WikiLink) Target() string { return w.target } func (w *WikiLink) Alias() string { return w.alias } func (w *WikiLink) Section() string { return w.section } func (w *WikiLink) IsValid() bool { return w.target != "" } func (w *WikiLink) String() string { var parts []string if w.alias != "" { return fmt.Sprintf("[[%s|%s]]", w.target, w.alias) } if w.section != "" { return fmt.Sprintf("[[%s#%s]]", w.target, w.section) } return fmt.Sprintf("[[%s]]", w.target) } func ParseWikiLink(linkText string) (*WikiLink, error) { linkText = strings.Trim(linkText, "[]") if linkText == "" { return nil, fmt.Errorf("empty wikilink") } var target, alias, section string if strings.Contains(linkText, "|") { parts := strings.SplitN(linkText, "|", 2) target = strings.TrimSpace(parts[0]) alias = strings.TrimSpace(parts[1]) } else if strings.Contains(linkText, "#") { parts := strings.SplitN(linkText, "#", 2) target = strings.TrimSpace(parts[0]) section = strings.TrimSpace(parts[1]) } else { target = strings.TrimSpace(linkText) } return NewWikiLink(target, alias, section) }