package main import ( "strconv" "unicode" "unicode/utf8" "github.com/leo-liu/zhmakeindex/CJK" ) // 汉å—按笔画排åºï¼Œæ±‰å—按笔画分组排在英文å—æ¯ç»„åŽé¢ type StrokeIndexCollator struct{} func (_ StrokeIndexCollator) InitGroups(style *OutputStyle) []IndexGroup { // 分组:符å·ã€æ•°å—ã€å—æ¯ A..Zã€ç¬”划 1..MAX_STROKE groups := make([]IndexGroup, 2+26+CJK.MAX_STROKE) if style.headings_flag > 0 { groups[0].name = style.symhead_positive groups[1].name = style.numhead_positive for alph, i := 'A', 2; alph <= 'Z'; alph++ { groups[i].name = string(alph) i++ } } else if style.headings_flag < 0 { groups[0].name = style.symhead_negative groups[1].name = style.numhead_negative for alph, i := 'a', 2; alph <= 'z'; alph++ { groups[i].name = string(alph) i++ } } for stroke, i := 1, 2+26; stroke <= CJK.MAX_STROKE; stroke++ { groups[i].name = style.stroke_prefix + strconv.Itoa(stroke) + style.stroke_suffix i++ } return groups } // å–得分组 func (_ StrokeIndexCollator) Group(entry *IndexEntry) int { first, _ := utf8.DecodeRuneInString(entry.level[0].key) first = unicode.ToLower(first) switch { case IsNumString(entry.level[0].key): return 1 case 'a' <= first && first <= 'z': return 2 + int(first) - 'a' case len(CJK.Strokes[first]) > 0: return 2 + 26 + (len(CJK.Strokes[first]) - 1) default: // 符å·ç»„ return 0 } } // 按汉å—笔画ã€ç¬”顺åºæ¯”较两个å—ç¬¦å¤§å° // 笔画数ä¸åŒçš„,çŸçš„在å‰ï¼›ç¬”画数相åŒçš„,笔顺å—å…¸åºï¼›ç¬”顺相åŒçš„,内ç åº func (_ StrokeIndexCollator) RuneCmp(a, b rune) int { a_strokes, b_strokes := len(CJK.Strokes[a]), len(CJK.Strokes[b]) switch { case a_strokes == 0 && b_strokes == 0: return RuneCmpIgnoreCases(a, b) case a_strokes == 0 && b_strokes != 0: return -1 case a_strokes != 0 && b_strokes == 0: return 1 case a_strokes != b_strokes: return a_strokes - b_strokes case CJK.Strokes[a] < CJK.Strokes[b]: return -1 case CJK.Strokes[a] > CJK.Strokes[b]: return 1 default: return int(a - b) } } // 判æ–是å¦å—æ¯æˆ–æ±‰å— func (_ StrokeIndexCollator) IsLetter(r rune) bool { r = unicode.ToLower(r) switch { case 'a' <= r && r <= 'z': return true case CJK.Strokes[r] != "": return true default: return false } }