├── README.md ├── cmd └── erajp │ └── main.go ├── era.go ├── era_test.go ├── go.mod ├── go.sum ├── table.go └── tool └── scrape.go /README.md: -------------------------------------------------------------------------------- 1 | # go-erajp 2 | 3 | Go library for japanese era 4 | 5 | ## Usage 6 | 7 | ```go 8 | fmt.Println(erajp.ToEraFromTime(time.Now())) // 令和 9 | ``` 10 | 11 | ## License 12 | 13 | MIT 14 | 15 | ## Author 16 | 17 | Yasuhiro Matsumoto (a.k.a. mattn) 18 | -------------------------------------------------------------------------------- /cmd/erajp/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "time" 7 | 8 | "github.com/mattn/go-erajp" 9 | ) 10 | 11 | var formats = []struct { 12 | f string 13 | t int 14 | }{ 15 | {"2006", 0}, 16 | {"2006/1", 1}, 17 | {"2006/01", 1}, 18 | {"2006/1/2", 2}, 19 | {"2006/01/02", 2}, 20 | } 21 | 22 | func main() { 23 | if len(os.Args) == 1 { 24 | ymd := time.Now() 25 | if item := erajp.Find(ymd); item != nil { 26 | y := fmt.Sprint(ymd.Year() - item.Year + 1) 27 | if y == "1" { 28 | y = "元" 29 | } 30 | fmt.Printf("%s%s年\n", item.Name, y) 31 | return 32 | } 33 | } else if len(os.Args) == 2 { 34 | for _, format := range formats { 35 | ymd, err := time.ParseInLocation(format.f, os.Args[1], time.Local) 36 | if err == nil { 37 | switch format.t { 38 | case 0: 39 | ymd = time.Date(ymd.Year()+1, 1, 1, 0, 0, 0, 0, time.Local).Add(-1) 40 | case 1: 41 | ymd = time.Date(ymd.Year(), ymd.Month()+1, 1, 0, 0, 0, 0, time.Local).Add(-1) 42 | case 2: 43 | ymd = time.Date(ymd.Year(), ymd.Month(), ymd.Day()+1, 0, 0, 0, 0, time.Local).Add(-1) 44 | } 45 | if item := erajp.Find(ymd); item != nil { 46 | y := fmt.Sprint(ymd.Year() - item.Year + 1) 47 | if y == "1" { 48 | y = "元" 49 | } 50 | fmt.Printf("%s%s年\n", item.Name, y) 51 | return 52 | } 53 | } 54 | } 55 | } 56 | fmt.Fprintf(os.Stderr, "%v [year or year/month or year/month/day]\n", os.Args[0]) 57 | os.Exit(2) 58 | } 59 | -------------------------------------------------------------------------------- /era.go: -------------------------------------------------------------------------------- 1 | // Package erajp is library for japanese era. 2 | package erajp 3 | 4 | import ( 5 | "fmt" 6 | "time" 7 | ) 8 | 9 | //go:generate go run tool/scrape.go 10 | 11 | // Era is type for indicating japanese era. 12 | type Era int 13 | 14 | func (era Era) String() string { 15 | s := ToEra(int(era)) 16 | if s == "" { 17 | s = fmt.Sprint(int(era)) 18 | } 19 | return s 20 | } 21 | 22 | // ToEra return era name from year. 23 | func ToEra(y int) string { 24 | for i := len(eras) - 1; i >= 0; i-- { 25 | if eras[i].Year <= y { 26 | return eras[i].Name 27 | } 28 | } 29 | return "" 30 | } 31 | 32 | // ToEraFromTime return era name from time. 33 | func ToEraFromTime(t time.Time) string { 34 | loc, _ := time.LoadLocation("JST") 35 | if loc == nil { 36 | loc = time.Local 37 | } 38 | for i := len(eras) - 1; i >= 0; i-- { 39 | et := time.Date(eras[i].Year, time.Month(eras[i].Month), eras[i].Day, 0, 0, 0, 0, loc) 40 | if t.After(et) { 41 | return eras[i].Name 42 | } 43 | } 44 | return "" 45 | } 46 | 47 | // FindEra return EraItem. 48 | func Find(t time.Time) *EraItem { 49 | loc, _ := time.LoadLocation("JST") 50 | if loc == nil { 51 | loc = time.Local 52 | } 53 | for i := len(eras) - 1; i >= 0; i-- { 54 | et := time.Date(eras[i].Year, time.Month(eras[i].Month), eras[i].Day, 0, 0, 0, 0, loc) 55 | if t.After(et) { 56 | return &eras[i] 57 | } 58 | } 59 | return nil 60 | } 61 | -------------------------------------------------------------------------------- /era_test.go: -------------------------------------------------------------------------------- 1 | package erajp 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | ) 7 | 8 | var testcases = []struct { 9 | year int 10 | era string 11 | }{ 12 | {1900, `明治`}, 13 | {1911, `明治`}, 14 | {1912, `大正`}, 15 | {1925, `大正`}, 16 | {1926, `昭和`}, 17 | {1988, `昭和`}, 18 | {1989, `平成`}, 19 | {2016, `平成`}, 20 | {2019, `令和`}, 21 | {2039, `令和`}, 22 | } 23 | 24 | func TestEra(t *testing.T) { 25 | year := 2030 26 | got := Era(year).String() 27 | expected := "令和" 28 | if got != expected { 29 | t.Fatalf("Expected %v for year %v, but %v:", expected, year, got) 30 | } 31 | year = 640 32 | got = Era(year).String() 33 | expected = "640" 34 | if got != expected { 35 | t.Fatalf("Expected %v for year %v, but %v:", expected, year, got) 36 | } 37 | } 38 | 39 | func TestToEra(t *testing.T) { 40 | for _, testcase := range testcases { 41 | year := testcase.year 42 | got := ToEra(year) 43 | expected := testcase.era 44 | if got != expected { 45 | t.Fatalf("Expected %v for year %v, but %v:", expected, year, got) 46 | } 47 | } 48 | } 49 | 50 | func TestNow(t *testing.T) { 51 | now := time.Now() 52 | got := ToEraFromTime(now) 53 | expected := "令和" 54 | if got != expected { 55 | t.Fatalf("Expected %v for year %v, but %v:", expected, now, got) 56 | } 57 | } 58 | 59 | func TestFind(t *testing.T) { 60 | now := time.Now() 61 | got := Find(now) 62 | if got == nil { 63 | t.Fatalf("Expected non-nil") 64 | } 65 | expected := "令和" 66 | if got.Name != expected { 67 | t.Fatalf("Expected %s for year %v, but %v:", expected, now, got.Name) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/mattn/go-erajp 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/PuerkitoBio/goquery v1.8.0 // indirect 7 | golang.org/x/text v0.5.0 // indirect 8 | ) 9 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= 2 | github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= 3 | github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= 4 | github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= 5 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 6 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 7 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 8 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 9 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 10 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 11 | golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 h1:/6y1LfuqNuQdHAm0jjtPtgRcxIxjVZgm5OTu8/QhZvk= 12 | golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 13 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= 14 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 15 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 16 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 17 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 18 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 19 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 20 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 21 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 22 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 23 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 24 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 25 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 26 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 27 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 28 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 29 | golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= 30 | golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 31 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 32 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 33 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 34 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 35 | -------------------------------------------------------------------------------- /table.go: -------------------------------------------------------------------------------- 1 | package erajp 2 | 3 | type EraItem struct { 4 | Name string 5 | Ruby string 6 | RubyInitial string 7 | Year int 8 | Month int 9 | Day int 10 | } 11 | 12 | var eras = []EraItem { 13 | {Name: "白雉", Ruby: "はくち", RubyInitial: "H", Year: 650, Month: 2, Day: 15}, 14 | {Name: "朱鳥", Ruby: "しゅちょう(すちょう)", RubyInitial: "S", Year: 686, Month: 7, Day: 20}, 15 | {Name: "大宝", Ruby: "たいほう(だいほう)", RubyInitial: "T", Year: 701, Month: 3, Day: 21}, 16 | {Name: "慶雲", Ruby: "けいうん(きょううん)", RubyInitial: "K", Year: 704, Month: 5, Day: 10}, 17 | {Name: "和銅", Ruby: "わどう", RubyInitial: "W", Year: 708, Month: 1, Day: 11}, 18 | {Name: "養老", Ruby: "ようろう", RubyInitial: "Y", Year: 717, Month: 11, Day: 17}, 19 | {Name: "神亀", Ruby: "じんき", RubyInitial: "J", Year: 724, Month: 2, Day: 4}, 20 | {Name: "天平", Ruby: "てんぴょう(てんびょう)", RubyInitial: "T", Year: 729, Month: 8, Day: 5}, 21 | {Name: "天平感宝", Ruby: "てんぴょうかんぽう", RubyInitial: "T", Year: 749, Month: 4, Day: 14}, 22 | {Name: "天平勝宝", Ruby: "てんぴょうしょうほう", RubyInitial: "T", Year: 749, Month: 7, Day: 2}, 23 | {Name: "天平宝字", Ruby: "てんぴょうほうじ", RubyInitial: "T", Year: 757, Month: 8, Day: 18}, 24 | {Name: "天平神護", Ruby: "てんぴょうしんご", RubyInitial: "T", Year: 765, Month: 1, Day: 7}, 25 | {Name: "神護景雲", Ruby: "しんごけいうん", RubyInitial: "S", Year: 767, Month: 8, Day: 16}, 26 | {Name: "宝亀", Ruby: "ほうき", RubyInitial: "H", Year: 770, Month: 10, Day: 1}, 27 | {Name: "天応", Ruby: "てんおう", RubyInitial: "T", Year: 781, Month: 1, Day: 1}, 28 | {Name: "延暦", Ruby: "えんりゃく", RubyInitial: "E", Year: 782, Month: 8, Day: 19}, 29 | {Name: "弘仁", Ruby: "こうにん", RubyInitial: "K", Year: 810, Month: 9, Day: 19}, 30 | {Name: "天長", Ruby: "てんちょう", RubyInitial: "T", Year: 824, Month: 1, Day: 5}, 31 | {Name: "承和", Ruby: "じょうわ(しょうわ)", RubyInitial: "J", Year: 834, Month: 1, Day: 3}, 32 | {Name: "嘉祥", Ruby: "かしょう(かじょう)", RubyInitial: "K", Year: 848, Month: 6, Day: 13}, 33 | {Name: "仁寿", Ruby: "にんじゅ", RubyInitial: "N", Year: 851, Month: 4, Day: 28}, 34 | {Name: "斎衡", Ruby: "さいこう", RubyInitial: "S", Year: 854, Month: 11, Day: 30}, 35 | {Name: "天安", Ruby: "てんあん(てんなん)", RubyInitial: "T", Year: 857, Month: 2, Day: 21}, 36 | {Name: "貞観", Ruby: "じょうがん", RubyInitial: "J", Year: 859, Month: 4, Day: 15}, 37 | {Name: "元慶", Ruby: "がんぎょう(げんけい)", RubyInitial: "G", Year: 877, Month: 4, Day: 16}, 38 | {Name: "仁和", Ruby: "にんな(じんな)", RubyInitial: "N", Year: 885, Month: 2, Day: 21}, 39 | {Name: "寛平", Ruby: "かんぴょう(かんぺい)", RubyInitial: "K", Year: 889, Month: 4, Day: 27}, 40 | {Name: "昌泰", Ruby: "しょうたい", RubyInitial: "S", Year: 898, Month: 4, Day: 26}, 41 | {Name: "延喜", Ruby: "えんぎ", RubyInitial: "E", Year: 901, Month: 7, Day: 15}, 42 | {Name: "延長", Ruby: "えんちょう", RubyInitial: "E", Year: 923, Month: 4, Day: 11}, 43 | {Name: "承平", Ruby: "じょうへい(しょうへい)", RubyInitial: "J", Year: 931, Month: 4, Day: 26}, 44 | {Name: "天慶", Ruby: "てんぎょう(てんきょう)", RubyInitial: "T", Year: 938, Month: 5, Day: 22}, 45 | {Name: "天暦", Ruby: "てんりゃく(てんれき)", RubyInitial: "T", Year: 947, Month: 4, Day: 22}, 46 | {Name: "天徳", Ruby: "てんとく", RubyInitial: "T", Year: 957, Month: 10, Day: 27}, 47 | {Name: "応和", Ruby: "おうわ", RubyInitial: "O", Year: 961, Month: 2, Day: 16}, 48 | {Name: "康保", Ruby: "こうほう", RubyInitial: "K", Year: 964, Month: 7, Day: 10}, 49 | {Name: "安和", Ruby: "あんな(あんわ)", RubyInitial: "A", Year: 968, Month: 8, Day: 13}, 50 | {Name: "天禄", Ruby: "てんろく", RubyInitial: "T", Year: 970, Month: 3, Day: 25}, 51 | {Name: "天延", Ruby: "てんえん", RubyInitial: "T", Year: 973, Month: 12, Day: 20}, 52 | {Name: "貞元", Ruby: "じょうげん(ていげん)", RubyInitial: "J", Year: 976, Month: 7, Day: 13}, 53 | {Name: "天元", Ruby: "てんげん", RubyInitial: "T", Year: 978, Month: 11, Day: 29}, 54 | {Name: "永観", Ruby: "えいかん", RubyInitial: "E", Year: 983, Month: 4, Day: 15}, 55 | {Name: "寛和", Ruby: "かんな(かんわ)", RubyInitial: "K", Year: 985, Month: 4, Day: 27}, 56 | {Name: "永延", Ruby: "えいえん(ようえん)", RubyInitial: "E", Year: 987, Month: 4, Day: 5}, 57 | {Name: "永祚", Ruby: "えいそ", RubyInitial: "E", Year: 989, Month: 8, Day: 8}, 58 | {Name: "正暦", Ruby: "しょうりゃく(じょうりゃく)", RubyInitial: "S", Year: 990, Month: 11, Day: 7}, 59 | {Name: "長徳", Ruby: "ちょうとく", RubyInitial: "T", Year: 995, Month: 2, Day: 22}, 60 | {Name: "長保", Ruby: "ちょうほう", RubyInitial: "T", Year: 999, Month: 1, Day: 13}, 61 | {Name: "寛弘", Ruby: "かんこう", RubyInitial: "K", Year: 1004, Month: 7, Day: 20}, 62 | {Name: "長和", Ruby: "ちょうわ", RubyInitial: "T", Year: 1012, Month: 12, Day: 25}, 63 | {Name: "寛仁", Ruby: "かんにん", RubyInitial: "K", Year: 1017, Month: 4, Day: 23}, 64 | {Name: "治安", Ruby: "じあん(ちあん)", RubyInitial: "J", Year: 1021, Month: 2, Day: 2}, 65 | {Name: "万寿", Ruby: "まんじゅ", RubyInitial: "M", Year: 1024, Month: 7, Day: 13}, 66 | {Name: "長元", Ruby: "ちょうげん", RubyInitial: "T", Year: 1028, Month: 7, Day: 25}, 67 | {Name: "長暦", Ruby: "ちょうりゃく(ちょうれき)", RubyInitial: "T", Year: 1037, Month: 4, Day: 21}, 68 | {Name: "長久", Ruby: "ちょうきゅう", RubyInitial: "T", Year: 1040, Month: 11, Day: 10}, 69 | {Name: "寛徳", Ruby: "かんとく", RubyInitial: "K", Year: 1044, Month: 11, Day: 24}, 70 | {Name: "永承", Ruby: "えいしょう(えいじょう)", RubyInitial: "E", Year: 1046, Month: 4, Day: 14}, 71 | {Name: "天喜", Ruby: "てんぎ(てんき)", RubyInitial: "T", Year: 1053, Month: 1, Day: 11}, 72 | {Name: "康平", Ruby: "こうへい", RubyInitial: "K", Year: 1058, Month: 8, Day: 29}, 73 | {Name: "治暦", Ruby: "じりゃく(ちりゃく)", RubyInitial: "J", Year: 1065, Month: 8, Day: 2}, 74 | {Name: "延久", Ruby: "えんきゅう", RubyInitial: "E", Year: 1069, Month: 4, Day: 13}, 75 | {Name: "承保", Ruby: "じょうほう(しょうほう)", RubyInitial: "J", Year: 1074, Month: 8, Day: 23}, 76 | {Name: "承暦", Ruby: "じょうりゃく(しょうりゃく)", RubyInitial: "J", Year: 1077, Month: 11, Day: 17}, 77 | {Name: "永保", Ruby: "えいほう", RubyInitial: "E", Year: 1081, Month: 2, Day: 10}, 78 | {Name: "応徳", Ruby: "おうとく", RubyInitial: "O", Year: 1084, Month: 2, Day: 7}, 79 | {Name: "寛治", Ruby: "かんじ", RubyInitial: "K", Year: 1087, Month: 4, Day: 7}, 80 | {Name: "嘉保", Ruby: "かほう", RubyInitial: "K", Year: 1094, Month: 12, Day: 15}, 81 | {Name: "永長", Ruby: "えいちょう(ようちょう)", RubyInitial: "E", Year: 1096, Month: 12, Day: 17}, 82 | {Name: "承徳", Ruby: "じょうとく(しょうとく)", RubyInitial: "J", Year: 1097, Month: 11, Day: 21}, 83 | {Name: "康和", Ruby: "こうわ", RubyInitial: "K", Year: 1099, Month: 8, Day: 28}, 84 | {Name: "長治", Ruby: "ちょうじ", RubyInitial: "T", Year: 1104, Month: 2, Day: 10}, 85 | {Name: "嘉承", Ruby: "かじょう(かしょう)", RubyInitial: "K", Year: 1106, Month: 4, Day: 9}, 86 | {Name: "天仁", Ruby: "てんにん", RubyInitial: "T", Year: 1108, Month: 8, Day: 3}, 87 | {Name: "天永", Ruby: "てんえい", RubyInitial: "T", Year: 1110, Month: 7, Day: 13}, 88 | {Name: "永久", Ruby: "えいきゅう", RubyInitial: "E", Year: 1113, Month: 7, Day: 13}, 89 | {Name: "元永", Ruby: "げんえい", RubyInitial: "G", Year: 1118, Month: 4, Day: 3}, 90 | {Name: "保安", Ruby: "ほうあん", RubyInitial: "H", Year: 1120, Month: 4, Day: 10}, 91 | {Name: "天治", Ruby: "てんじ", RubyInitial: "T", Year: 1124, Month: 4, Day: 3}, 92 | {Name: "大治", Ruby: "だいじ(たいじ)", RubyInitial: "D", Year: 1126, Month: 1, Day: 22}, 93 | {Name: "天承", Ruby: "てんしょう(てんじょう)", RubyInitial: "T", Year: 1131, Month: 1, Day: 29}, 94 | {Name: "長承", Ruby: "ちょうしょう(ちょうじょう)", RubyInitial: "T", Year: 1132, Month: 8, Day: 11}, 95 | {Name: "保延", Ruby: "ほうえん", RubyInitial: "H", Year: 1135, Month: 4, Day: 27}, 96 | {Name: "永治", Ruby: "えいじ", RubyInitial: "E", Year: 1141, Month: 7, Day: 10}, 97 | {Name: "康治", Ruby: "こうじ", RubyInitial: "K", Year: 1142, Month: 4, Day: 28}, 98 | {Name: "天養", Ruby: "てんよう", RubyInitial: "T", Year: 1144, Month: 2, Day: 23}, 99 | {Name: "久安", Ruby: "きゅうあん", RubyInitial: "K", Year: 1145, Month: 7, Day: 22}, 100 | {Name: "仁平", Ruby: "にんぺい(にんびょう)", RubyInitial: "N", Year: 1151, Month: 1, Day: 26}, 101 | {Name: "久寿", Ruby: "きゅうじゅ", RubyInitial: "K", Year: 1154, Month: 10, Day: 28}, 102 | {Name: "保元", Ruby: "ほうげん", RubyInitial: "H", Year: 1156, Month: 4, Day: 27}, 103 | {Name: "平治", Ruby: "へいじ(びょうじ)", RubyInitial: "H", Year: 1159, Month: 4, Day: 20}, 104 | {Name: "永暦", Ruby: "えいりゃく(ようりゃく)", RubyInitial: "E", Year: 1160, Month: 1, Day: 10}, 105 | {Name: "応保", Ruby: "おうほう", RubyInitial: "O", Year: 1161, Month: 9, Day: 4}, 106 | {Name: "長寛", Ruby: "ちょうかん", RubyInitial: "T", Year: 1163, Month: 3, Day: 29}, 107 | {Name: "永万", Ruby: "えいまん(ようまん)", RubyInitial: "E", Year: 1165, Month: 6, Day: 5}, 108 | {Name: "仁安", Ruby: "にんあん(にんなん)", RubyInitial: "N", Year: 1166, Month: 8, Day: 27}, 109 | {Name: "嘉応", Ruby: "かおう", RubyInitial: "K", Year: 1169, Month: 4, Day: 8}, 110 | {Name: "承安", Ruby: "じょうあん(しょうあん)", RubyInitial: "J", Year: 1171, Month: 4, Day: 21}, 111 | {Name: "安元", Ruby: "あんげん", RubyInitial: "A", Year: 1175, Month: 7, Day: 28}, 112 | {Name: "治承", Ruby: "じしょう(じじょう)", RubyInitial: "J", Year: 1177, Month: 8, Day: 4}, 113 | {Name: "養和", Ruby: "ようわ", RubyInitial: "Y", Year: 1181, Month: 7, Day: 14}, 114 | {Name: "寿永", Ruby: "じゅえい", RubyInitial: "J", Year: 1182, Month: 5, Day: 27}, 115 | {Name: "元暦", Ruby: "げんりゃく", RubyInitial: "G", Year: 1184, Month: 4, Day: 16}, 116 | {Name: "文治", Ruby: "ぶんじ(もんじ)", RubyInitial: "B", Year: 1185, Month: 8, Day: 14}, 117 | {Name: "正治", Ruby: "しょうじ", RubyInitial: "S", Year: 1199, Month: 4, Day: 27}, 118 | {Name: "建仁", Ruby: "けんにん", RubyInitial: "K", Year: 1201, Month: 2, Day: 13}, 119 | {Name: "元久", Ruby: "げんきゅう", RubyInitial: "G", Year: 1204, Month: 2, Day: 20}, 120 | {Name: "建永", Ruby: "けんえい", RubyInitial: "K", Year: 1206, Month: 4, Day: 27}, 121 | {Name: "承元", Ruby: "じょうげん(しょうげん)", RubyInitial: "J", Year: 1207, Month: 10, Day: 25}, 122 | {Name: "建暦", Ruby: "けんりゃく", RubyInitial: "K", Year: 1211, Month: 3, Day: 9}, 123 | {Name: "建保", Ruby: "けんぽう(けんほう)", RubyInitial: "K", Year: 1213, Month: 12, Day: 6}, 124 | {Name: "承久", Ruby: "じょうきゅう(しょうきゅう)", RubyInitial: "J", Year: 1219, Month: 4, Day: 12}, 125 | {Name: "貞応", Ruby: "じょうおう(ていおう)", RubyInitial: "J", Year: 1222, Month: 4, Day: 13}, 126 | {Name: "元仁", Ruby: "げんにん", RubyInitial: "G", Year: 1224, Month: 11, Day: 20}, 127 | {Name: "嘉禄", Ruby: "かろく", RubyInitial: "K", Year: 1225, Month: 4, Day: 20}, 128 | {Name: "安貞", Ruby: "あんてい", RubyInitial: "A", Year: 1227, Month: 12, Day: 10}, 129 | {Name: "寛喜", Ruby: "かんき", RubyInitial: "K", Year: 1229, Month: 3, Day: 5}, 130 | {Name: "貞永", Ruby: "じょうえい(ていえい)", RubyInitial: "J", Year: 1232, Month: 4, Day: 2}, 131 | {Name: "天福", Ruby: "てんぷく(てんふく)", RubyInitial: "T", Year: 1233, Month: 4, Day: 15}, 132 | {Name: "文暦", Ruby: "ぶんりゃく(もんりゃく)", RubyInitial: "B", Year: 1234, Month: 11, Day: 5}, 133 | {Name: "嘉禎", Ruby: "かてい", RubyInitial: "K", Year: 1235, Month: 9, Day: 19}, 134 | {Name: "暦仁", Ruby: "りゃくにん(れきにん)", RubyInitial: "R", Year: 1238, Month: 11, Day: 23}, 135 | {Name: "延応", Ruby: "えんおう(えんのう)", RubyInitial: "E", Year: 1239, Month: 2, Day: 7}, 136 | {Name: "仁治", Ruby: "にんじ(にんち)", RubyInitial: "N", Year: 1240, Month: 7, Day: 16}, 137 | {Name: "寛元", Ruby: "かんげん", RubyInitial: "K", Year: 1243, Month: 2, Day: 26}, 138 | {Name: "宝治", Ruby: "ほうじ", RubyInitial: "H", Year: 1247, Month: 2, Day: 28}, 139 | {Name: "建長", Ruby: "けんちょう", RubyInitial: "K", Year: 1249, Month: 3, Day: 18}, 140 | {Name: "康元", Ruby: "こうげん", RubyInitial: "K", Year: 1256, Month: 10, Day: 5}, 141 | {Name: "正嘉", Ruby: "しょうか", RubyInitial: "S", Year: 1257, Month: 3, Day: 14}, 142 | {Name: "正元", Ruby: "しょうげん", RubyInitial: "S", Year: 1259, Month: 3, Day: 26}, 143 | {Name: "文応", Ruby: "ぶんおう", RubyInitial: "B", Year: 1260, Month: 4, Day: 13}, 144 | {Name: "弘長", Ruby: "こうちょう", RubyInitial: "K", Year: 1261, Month: 2, Day: 20}, 145 | {Name: "文永", Ruby: "ぶんえい", RubyInitial: "B", Year: 1264, Month: 2, Day: 28}, 146 | {Name: "建治", Ruby: "けんじ", RubyInitial: "K", Year: 1275, Month: 4, Day: 25}, 147 | {Name: "弘安", Ruby: "こうあん", RubyInitial: "K", Year: 1278, Month: 2, Day: 29}, 148 | {Name: "正応", Ruby: "しょうおう", RubyInitial: "S", Year: 1288, Month: 4, Day: 28}, 149 | {Name: "永仁", Ruby: "えいにん", RubyInitial: "E", Year: 1293, Month: 8, Day: 5}, 150 | {Name: "正安", Ruby: "しょうあん", RubyInitial: "S", Year: 1299, Month: 4, Day: 25}, 151 | {Name: "乾元", Ruby: "けんげん", RubyInitial: "K", Year: 1302, Month: 11, Day: 21}, 152 | {Name: "嘉元", Ruby: "かげん", RubyInitial: "K", Year: 1303, Month: 8, Day: 5}, 153 | {Name: "徳治", Ruby: "とくじ", RubyInitial: "T", Year: 1306, Month: 12, Day: 14}, 154 | {Name: "延慶", Ruby: "えんきょう(えんぎょう)", RubyInitial: "E", Year: 1308, Month: 10, Day: 9}, 155 | {Name: "応長", Ruby: "おうちょう", RubyInitial: "O", Year: 1311, Month: 4, Day: 28}, 156 | {Name: "正和", Ruby: "しょうわ", RubyInitial: "S", Year: 1312, Month: 3, Day: 20}, 157 | {Name: "文保", Ruby: "ぶんぽう(ぶんほう)", RubyInitial: "B", Year: 1317, Month: 2, Day: 3}, 158 | {Name: "元応", Ruby: "げんおう(げんのう)", RubyInitial: "G", Year: 1319, Month: 4, Day: 28}, 159 | {Name: "元亨", Ruby: "げんこう", RubyInitial: "G", Year: 1321, Month: 2, Day: 23}, 160 | {Name: "正中", Ruby: "しょうちゅう", RubyInitial: "S", Year: 1324, Month: 12, Day: 9}, 161 | {Name: "嘉暦", Ruby: "かりゃく", RubyInitial: "K", Year: 1326, Month: 4, Day: 26}, 162 | {Name: "元徳", Ruby: "げんとく", RubyInitial: "G", Year: 1329, Month: 8, Day: 29}, 163 | {Name: "元弘", Ruby: "げんこう", RubyInitial: "G", Year: 1331, Month: 8, Day: 9}, 164 | {Name: "正慶", Ruby: "しょうきょう(しょうけい)", RubyInitial: "S", Year: 1332, Month: 4, Day: 28}, 165 | {Name: "建武", Ruby: "けんむ(けんぶ)", RubyInitial: "K", Year: 1334, Month: 1, Day: 29}, 166 | {Name: "延元", Ruby: "えんげん", RubyInitial: "E", Year: 1336, Month: 2, Day: 29}, 167 | {Name: "暦応", Ruby: "りゃくおう(れきおう)", RubyInitial: "R", Year: 1338, Month: 8, Day: 28}, 168 | {Name: "興国", Ruby: "こうこく", RubyInitial: "K", Year: 1340, Month: 4, Day: 28}, 169 | {Name: "康永", Ruby: "こうえい", RubyInitial: "K", Year: 1342, Month: 4, Day: 27}, 170 | {Name: "貞和", Ruby: "じょうわ(ていわ)", RubyInitial: "J", Year: 1345, Month: 10, Day: 21}, 171 | {Name: "正平", Ruby: "しょうへい", RubyInitial: "S", Year: 1346, Month: 12, Day: 8}, 172 | {Name: "観応", Ruby: "かんおう(かんのう)", RubyInitial: "K", Year: 1350, Month: 2, Day: 27}, 173 | {Name: "文和", Ruby: "ぶんな(ぶんわ)", RubyInitial: "B", Year: 1352, Month: 9, Day: 27}, 174 | {Name: "延文", Ruby: "えんぶん", RubyInitial: "E", Year: 1356, Month: 3, Day: 28}, 175 | {Name: "康安", Ruby: "こうあん", RubyInitial: "K", Year: 1361, Month: 3, Day: 29}, 176 | {Name: "貞治", Ruby: "じょうじ(ていじ)", RubyInitial: "J", Year: 1362, Month: 9, Day: 23}, 177 | {Name: "応安", Ruby: "おうあん", RubyInitial: "O", Year: 1368, Month: 2, Day: 18}, 178 | {Name: "建徳", Ruby: "けんとく", RubyInitial: "K", Year: 1370, Month: 7, Day: 24}, 179 | {Name: "文中", Ruby: "ぶんちゅう", RubyInitial: "B", Year: 1372, Month: 4, Day: 1}, 180 | {Name: "天授", Ruby: "てんじゅ", RubyInitial: "T", Year: 1375, Month: 5, Day: 27}, 181 | {Name: "永和", Ruby: "えいわ", RubyInitial: "E", Year: 1375, Month: 2, Day: 27}, 182 | {Name: "康暦", Ruby: "こうりゃく", RubyInitial: "K", Year: 1379, Month: 3, Day: 22}, 183 | {Name: "弘和", Ruby: "こうわ", RubyInitial: "K", Year: 1381, Month: 2, Day: 10}, 184 | {Name: "永徳", Ruby: "えいとく", RubyInitial: "E", Year: 1381, Month: 2, Day: 24}, 185 | {Name: "元中", Ruby: "げんちゅう", RubyInitial: "G", Year: 1384, Month: 4, Day: 28}, 186 | {Name: "至徳", Ruby: "しとく", RubyInitial: "S", Year: 1384, Month: 2, Day: 27}, 187 | {Name: "嘉慶", Ruby: "かきょう(かけい)", RubyInitial: "K", Year: 1387, Month: 8, Day: 23}, 188 | {Name: "康応", Ruby: "こうおう", RubyInitial: "K", Year: 1389, Month: 2, Day: 9}, 189 | {Name: "明徳", Ruby: "めいとく", RubyInitial: "M", Year: 1390, Month: 3, Day: 26}, 190 | {Name: "応永", Ruby: "おうえい", RubyInitial: "O", Year: 1394, Month: 7, Day: 5}, 191 | {Name: "正長", Ruby: "しょうちょう", RubyInitial: "S", Year: 1428, Month: 4, Day: 27}, 192 | {Name: "永享", Ruby: "えいきょう", RubyInitial: "E", Year: 1429, Month: 9, Day: 5}, 193 | {Name: "嘉吉", Ruby: "かきつ(かきち)", RubyInitial: "K", Year: 1441, Month: 2, Day: 17}, 194 | {Name: "文安", Ruby: "ぶんあん", RubyInitial: "B", Year: 1444, Month: 2, Day: 5}, 195 | {Name: "宝徳", Ruby: "ほうとく", RubyInitial: "H", Year: 1449, Month: 7, Day: 28}, 196 | {Name: "享徳", Ruby: "きょうとく", RubyInitial: "K", Year: 1452, Month: 7, Day: 25}, 197 | {Name: "康正", Ruby: "こうしょう", RubyInitial: "K", Year: 1455, Month: 7, Day: 25}, 198 | {Name: "長禄", Ruby: "ちょうろく", RubyInitial: "T", Year: 1457, Month: 9, Day: 28}, 199 | {Name: "寛正", Ruby: "かんしょう", RubyInitial: "K", Year: 1460, Month: 12, Day: 21}, 200 | {Name: "文正", Ruby: "ぶんしょう(もんしょう)", RubyInitial: "B", Year: 1466, Month: 2, Day: 28}, 201 | {Name: "応仁", Ruby: "おうにん", RubyInitial: "O", Year: 1467, Month: 3, Day: 5}, 202 | {Name: "文明", Ruby: "ぶんめい", RubyInitial: "B", Year: 1469, Month: 4, Day: 28}, 203 | {Name: "長享", Ruby: "ちょうきょう", RubyInitial: "T", Year: 1487, Month: 7, Day: 20}, 204 | {Name: "延徳", Ruby: "えんとく", RubyInitial: "E", Year: 1489, Month: 8, Day: 21}, 205 | {Name: "明応", Ruby: "めいおう", RubyInitial: "M", Year: 1492, Month: 7, Day: 19}, 206 | {Name: "文亀", Ruby: "ぶんき", RubyInitial: "B", Year: 1501, Month: 2, Day: 29}, 207 | {Name: "永正", Ruby: "えいしょう", RubyInitial: "E", Year: 1504, Month: 2, Day: 30}, 208 | {Name: "大永", Ruby: "だいえい", RubyInitial: "D", Year: 1521, Month: 8, Day: 23}, 209 | {Name: "享禄", Ruby: "きょうろく", RubyInitial: "K", Year: 1528, Month: 8, Day: 20}, 210 | {Name: "天文", Ruby: "てんぶん", RubyInitial: "T", Year: 1532, Month: 7, Day: 29}, 211 | {Name: "弘治", Ruby: "こうじ", RubyInitial: "K", Year: 1555, Month: 10, Day: 23}, 212 | {Name: "永禄", Ruby: "えいろく", RubyInitial: "E", Year: 1558, Month: 2, Day: 28}, 213 | {Name: "元亀", Ruby: "げんき", RubyInitial: "G", Year: 1570, Month: 4, Day: 23}, 214 | {Name: "文禄", Ruby: "ぶんろく", RubyInitial: "B", Year: 1592, Month: 12, Day: 8}, 215 | {Name: "慶長", Ruby: "けいちょう(きょうちょう)", RubyInitial: "K", Year: 1596, Month: 10, Day: 27}, 216 | {Name: "寛永", Ruby: "かんえい", RubyInitial: "K", Year: 1624, Month: 2, Day: 30}, 217 | {Name: "正保", Ruby: "しょうほう", RubyInitial: "S", Year: 1644, Month: 12, Day: 16}, 218 | {Name: "慶安", Ruby: "けいあん", RubyInitial: "K", Year: 1648, Month: 2, Day: 15}, 219 | {Name: "承応", Ruby: "じょうおう(しょうおう)", RubyInitial: "J", Year: 1652, Month: 9, Day: 18}, 220 | {Name: "明暦", Ruby: "めいれき(みょうりゃく)", RubyInitial: "M", Year: 1655, Month: 4, Day: 13}, 221 | {Name: "万治", Ruby: "まんじ", RubyInitial: "M", Year: 1658, Month: 7, Day: 23}, 222 | {Name: "寛文", Ruby: "かんぶん", RubyInitial: "K", Year: 1661, Month: 4, Day: 25}, 223 | {Name: "延宝", Ruby: "えんぽう", RubyInitial: "E", Year: 1673, Month: 9, Day: 21}, 224 | {Name: "天和", Ruby: "てんな", RubyInitial: "T", Year: 1681, Month: 9, Day: 29}, 225 | {Name: "貞享", Ruby: "じょうきょう", RubyInitial: "J", Year: 1684, Month: 2, Day: 21}, 226 | {Name: "元禄", Ruby: "げんろく", RubyInitial: "G", Year: 1688, Month: 9, Day: 30}, 227 | {Name: "宝永", Ruby: "ほうえい", RubyInitial: "H", Year: 1704, Month: 3, Day: 13}, 228 | {Name: "正徳", Ruby: "しょうとく", RubyInitial: "S", Year: 1711, Month: 4, Day: 25}, 229 | {Name: "享保", Ruby: "きょうほう(きょうほ)", RubyInitial: "K", Year: 1716, Month: 6, Day: 22}, 230 | {Name: "元文", Ruby: "げんぶん", RubyInitial: "G", Year: 1736, Month: 4, Day: 28}, 231 | {Name: "寛保", Ruby: "かんぽう(かんほう)", RubyInitial: "K", Year: 1741, Month: 2, Day: 27}, 232 | {Name: "延享", Ruby: "えんきょう", RubyInitial: "E", Year: 1744, Month: 2, Day: 21}, 233 | {Name: "寛延", Ruby: "かんえん", RubyInitial: "K", Year: 1748, Month: 7, Day: 12}, 234 | {Name: "宝暦", Ruby: "ほうれき(ほうりゃく)", RubyInitial: "H", Year: 1751, Month: 10, Day: 27}, 235 | {Name: "明和", Ruby: "めいわ", RubyInitial: "M", Year: 1764, Month: 6, Day: 2}, 236 | {Name: "安永", Ruby: "あんえい", RubyInitial: "A", Year: 1772, Month: 11, Day: 16}, 237 | {Name: "天明", Ruby: "てんめい", RubyInitial: "T", Year: 1781, Month: 4, Day: 2}, 238 | {Name: "寛政", Ruby: "かんせい", RubyInitial: "K", Year: 1789, Month: 1, Day: 25}, 239 | {Name: "享和", Ruby: "きょうわ", RubyInitial: "K", Year: 1801, Month: 2, Day: 5}, 240 | {Name: "文化", Ruby: "ぶんか", RubyInitial: "B", Year: 1804, Month: 2, Day: 11}, 241 | {Name: "文政", Ruby: "ぶんせい", RubyInitial: "B", Year: 1818, Month: 4, Day: 22}, 242 | {Name: "天保", Ruby: "てんぽう(てんほう)", RubyInitial: "T", Year: 1830, Month: 12, Day: 10}, 243 | {Name: "弘化", Ruby: "こうか", RubyInitial: "K", Year: 1844, Month: 12, Day: 2}, 244 | {Name: "嘉永", Ruby: "かえい", RubyInitial: "K", Year: 1848, Month: 2, Day: 28}, 245 | {Name: "安政", Ruby: "あんせい", RubyInitial: "A", Year: 1854, Month: 11, Day: 27}, 246 | {Name: "万延", Ruby: "まんえん", RubyInitial: "M", Year: 1860, Month: 3, Day: 18}, 247 | {Name: "文久", Ruby: "ぶんきゅう", RubyInitial: "B", Year: 1861, Month: 2, Day: 19}, 248 | {Name: "元治", Ruby: "げんじ", RubyInitial: "G", Year: 1864, Month: 2, Day: 20}, 249 | {Name: "慶応", Ruby: "けいおう", RubyInitial: "K", Year: 1865, Month: 4, Day: 7}, 250 | {Name: "明治", Ruby: "めいじ", RubyInitial: "M", Year: 1868, Month: 9, Day: 8}, 251 | {Name: "大正", Ruby: "たいしょう", RubyInitial: "T", Year: 1912, Month: 7, Day: 30}, 252 | {Name: "昭和", Ruby: "しょうわ", RubyInitial: "S", Year: 1926, Month: 12, Day: 25}, 253 | {Name: "平成", Ruby: "へいせい", RubyInitial: "H", Year: 1989, Month: 1, Day: 8}, 254 | {Name: "令和", Ruby: "れいわ", RubyInitial: "R", Year: 2019, Month: 5, Day: 1}, 255 | } 256 | -------------------------------------------------------------------------------- /tool/scrape.go: -------------------------------------------------------------------------------- 1 | //go:build tools 2 | // +build tools 3 | 4 | package main 5 | 6 | import ( 7 | "fmt" 8 | "log" 9 | "net/http" 10 | "os" 11 | "strings" 12 | 13 | "golang.org/x/text/encoding/japanese" 14 | "golang.org/x/text/transform" 15 | 16 | "github.com/PuerkitoBio/goquery" 17 | ) 18 | 19 | var initials = map[rune]rune{ 20 | 'あ': 'A', 21 | 'い': 'I', 22 | 'う': 'U', 23 | 'え': 'E', 24 | 'お': 'O', 25 | 'か': 'K', 26 | 'き': 'K', 27 | 'く': 'K', 28 | 'け': 'K', 29 | 'こ': 'K', 30 | 'さ': 'S', 31 | 'し': 'S', 32 | 'す': 'S', 33 | 'せ': 'S', 34 | 'そ': 'S', 35 | 'た': 'T', 36 | 'ち': 'T', 37 | 'つ': 'T', 38 | 'て': 'T', 39 | 'と': 'T', 40 | 'な': 'N', 41 | 'に': 'N', 42 | 'ぬ': 'N', 43 | 'ね': 'N', 44 | 'の': 'N', 45 | 'は': 'H', 46 | 'ひ': 'H', 47 | 'ふ': 'H', 48 | 'へ': 'H', 49 | 'ほ': 'H', 50 | 'ま': 'M', 51 | 'み': 'M', 52 | 'む': 'M', 53 | 'め': 'M', 54 | 'も': 'M', 55 | 'や': 'Y', 56 | 'ゆ': 'Y', 57 | 'よ': 'Y', 58 | 'ら': 'R', 59 | 'り': 'R', 60 | 'る': 'R', 61 | 'れ': 'R', 62 | 'ろ': 'R', 63 | 'わ': 'W', 64 | 'ゐ': 'W', 65 | 'ゑ': 'W', 66 | 'ぶ': 'B', 67 | 'じ': 'J', 68 | 'が': 'G', 69 | 'げ': 'G', 70 | 'だ': 'D', 71 | } 72 | 73 | func rubyInitial(s string) string { 74 | r, ok := initials[[]rune(s)[0]] 75 | if !ok { 76 | panic("not found: " + s) 77 | } 78 | return string(r) 79 | } 80 | 81 | func main() { 82 | out, err := os.Create("table.go") 83 | if err != nil { 84 | log.Fatal(err) 85 | } 86 | defer out.Close() 87 | 88 | resp, err := http.Get("http://www.kumamotokokufu-h.ed.jp/kumamoto/bungaku/nengoui.html") 89 | if err != nil { 90 | log.Fatal(err) 91 | } 92 | defer resp.Body.Close() 93 | 94 | r := transform.NewReader(resp.Body, japanese.EUCJP.NewDecoder()) 95 | doc, err := goquery.NewDocumentFromReader(r) 96 | if err != nil { 97 | log.Fatal(err) 98 | } 99 | fmt.Fprint(out, `package erajp 100 | 101 | type EraItem struct { 102 | Name string 103 | Ruby string 104 | RubyInitial string 105 | Year int 106 | Month int 107 | Day int 108 | } 109 | 110 | var eras = []EraItem { 111 | `) 112 | 113 | hasReiwa := false 114 | 115 | var prevy, prevm, prevd string 116 | doc.Find(`table[border="1"] tr`).Each(func(n int, sel *goquery.Selection) { 117 | cells := sel.Children().Filter("td") 118 | tdnum := cells.Length() 119 | if _, ok := cells.Eq(1).Attr("rowspan"); ok { 120 | return 121 | } 122 | 123 | var name, ruby, fromto, day string 124 | if tdnum == 6 { 125 | name = cells.Eq(1).Text() 126 | ruby = cells.Eq(2).Text() 127 | fromto = cells.Eq(3).Text() 128 | day = cells.Eq(4).Text() 129 | } else if tdnum == 7 { 130 | name = cells.Eq(2).Text() 131 | ruby = cells.Eq(3).Text() 132 | fromto = cells.Eq(4).Text() 133 | day = cells.Eq(5).Text() 134 | } else { 135 | return 136 | } 137 | y := strings.Split(fromto, "~") 138 | day = strings.Replace(day, "閏", "", -1) 139 | md := strings.Split(day, "/") 140 | if md[1] == "?" { 141 | md[1] = "1" 142 | } 143 | 144 | if y[0] == prevy && md[0] == prevm && md[1] == prevd { 145 | return 146 | } 147 | fmt.Fprintf(out, "\t{Name: %q, Ruby: %q, RubyInitial: %q, Year: %v, Month: %v, Day: %v},\n", name, ruby, rubyInitial(ruby), y[0], md[0], md[1]) 148 | prevy = y[0] 149 | prevm = md[0] 150 | prevd = md[1] 151 | 152 | if !hasReiwa && name == "令和" { 153 | hasReiwa = true 154 | } 155 | }) 156 | if !hasReiwa { 157 | fmt.Fprintf(out, "\t{Name: %q, Ruby: %q, RubyInitial: %q, Year: %v, Month: %v, Day: %v},\n", "令和", "れいわ", "R", 2019, 5, 1) 158 | } 159 | fmt.Fprintln(out, "}") 160 | } 161 | --------------------------------------------------------------------------------