From 3273d489a252a498b820069d6e87d4d263027fb7 Mon Sep 17 00:00:00 2001 From: atye Date: Sat, 2 May 2026 12:51:57 -0400 Subject: [PATCH] refactor --- pkg/client/client.go | 133 +++++++++++++++++++++++++++++++++++++++++-- pkg/client/format.go | 133 ------------------------------------------- 2 files changed, 127 insertions(+), 139 deletions(-) delete mode 100644 pkg/client/format.go diff --git a/pkg/client/client.go b/pkg/client/client.go index d1297fd..1aee527 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -28,6 +28,8 @@ var ( apiURL = "https://%s.wikipedia.org/api/rest_v1/page/html/%s" getApiURLFn = getApiURL + + errNotEnoughRows = errors.New("table needs at least two rows") ) type Client struct { @@ -88,6 +90,24 @@ func NewClient(userAgent string, options ...ClientOption) *Client { return c } +type Verbose struct { + Text string `json:"text,omitempty"` + Links []Link `json:"links,omitempty"` +} + +type Link struct { + Href string `json:"href,omitempty"` + Text string `json:"text,omitempty"` +} + +type cell struct { + set bool + text string + links []Link +} + +type parsed map[int]map[int]cell + func (c *Client) GetMatrix(ctx context.Context, page string, lang string, options ...TableOption) ([][][]string, error) { to := new(tableOptions) for _, o := range options { @@ -490,12 +510,6 @@ func formatParsedTable(data parsed, verbose bool, keyRows int, tableIndex int) ( return tmp, nil } -type cell struct { - set bool - text string - links []Link -} - func parseTable(tableSelection *goquery.Selection, tableIndex int, brIsNewLine bool) (parsed, error) { td := make(parsed) @@ -674,3 +688,110 @@ func handleErr(err error) status.Status { func getApiURL(lang, page string) string { return fmt.Sprintf(apiURL, lang, page) } + +func formatMatrix(data parsed) [][]string { + matrix := make([][]string, len(data)) + + for i := 0; i < len(data); i++ { + row := data[i] + matrix[i] = make([]string, len(row)) + for j := 0; j < len(row); j++ { + matrix[i][j] = row[j].text + } + } + + return matrix +} + +func formatMatrixVerbose(data parsed) [][]Verbose { + matrix := make([][]Verbose, len(data)) + + for i := 0; i < len(data); i++ { + row := data[i] + matrix[i] = make([]Verbose, len(row)) + for j := 0; j < len(row); j++ { + matrix[i][j].Text = row[j].text + matrix[i][j].Links = row[j].links + } + } + + return matrix +} + +func formatKeyValue(data parsed, keyrows int, tableIndex int) ([]map[string]string, error) { + if len(data) > 1 && keyrows >= 1 { + keys, err := generateKeys(data, keyrows) + if err != nil { + return nil, err + } + + var kv []map[string]string + for i := keyrows; i < len(data); i++ { + pairs := make(map[string]string) + for j := 0; j < len(data[i]); j++ { + key := fmt.Sprintf("null%d", j) + if j < len(keys) { + key = keys[j] + } + pairs[key] = data[i][j].text + } + kv = append(kv, pairs) + } + return kv, nil + } + return nil, status.NewStatus(errNotEnoughRows.Error(), http.StatusBadRequest, status.WithDetails(status.Details{ + status.TableIndex: tableIndex, + })) +} + +func formatKeyValueVerbose(data parsed, keyrows int, tableIndex int) ([]map[string]Verbose, error) { + if len(data) > 1 && keyrows >= 1 { + keys, err := generateKeys(data, keyrows) + if err != nil { + return nil, err + } + + var kv []map[string]Verbose + for i := keyrows; i < len(data); i++ { + pairs := make(map[string]Verbose) + for j := 0; j < len(data[i]); j++ { + key := fmt.Sprintf("null%d", j) + if j < len(keys) { + key = keys[j] + } + pairs[key] = Verbose{ + Text: data[i][j].text, + Links: data[i][j].links, + } + } + kv = append(kv, pairs) + } + return kv, nil + } + return nil, status.NewStatus(errNotEnoughRows.Error(), http.StatusBadRequest, status.WithDetails(status.Details{ + status.TableIndex: tableIndex, + })) +} + +func generateKeys(data parsed, keyrows int) ([]string, error) { + var keys []string + for colNum := 0; colNum < len(data[0]); colNum++ { + var b strings.Builder + _, err := b.WriteString(data[0][colNum].text) + if err != nil { + return nil, err + } + + for k := 1; k < keyrows; k++ { + v := data[k][colNum].text + if v != data[k-1][colNum].text && v != "" { + _, err := b.WriteString(fmt.Sprintf(" %s", v)) + if err != nil { + return nil, err + } + } + } + keys = append(keys, b.String()) + } + return keys, nil +} diff --git a/pkg/client/format.go b/pkg/client/format.go deleted file mode 100644 index db8bb3e..0000000 --- a/pkg/client/format.go +++ /dev/null @@ -1,133 +0,0 @@ -package client - -import ( - "errors" - "fmt" - "net/http" - "strings" - - "github.com/atye/wikitable2json/pkg/client/status" -) - -type parsed map[int]map[int]cell - -type Verbose struct { - Text string `json:"text,omitempty"` - Links []Link `json:"links,omitempty"` -} - -type Link struct { - Href string `json:"href,omitempty"` - Text string `json:"text,omitempty"` -} - -var ( - errNotEnoughRows = errors.New("table needs at least two rows") -) - -func formatMatrix(data parsed) [][]string { - matrix := make([][]string, len(data)) - - for i := 0; i < len(data); i++ { - row := data[i] - matrix[i] = make([]string, len(row)) - for j := 0; j < len(row); j++ { - matrix[i][j] = row[j].text - } - } - - return matrix -} - -func formatMatrixVerbose(data parsed) [][]Verbose { - matrix := make([][]Verbose, len(data)) - - for i := 0; i < len(data); i++ { - row := data[i] - matrix[i] = make([]Verbose, len(row)) - for j := 0; j < len(row); j++ { - matrix[i][j].Text = row[j].text - matrix[i][j].Links = row[j].links - } - } - - return matrix -} - -func formatKeyValue(data parsed, keyrows int, tableIndex int) ([]map[string]string, error) { - if len(data) > 1 && keyrows >= 1 { - keys, err := generateKeys(data, keyrows) - if err != nil { - return nil, err - } - - var kv []map[string]string - for i := keyrows; i < len(data); i++ { - pairs := make(map[string]string) - for j := 0; j < len(data[i]); j++ { - key := fmt.Sprintf("null%d", j) - if j < len(keys) { - key = keys[j] - } - pairs[key] = data[i][j].text - } - kv = append(kv, pairs) - } - return kv, nil - } - return nil, status.NewStatus(errNotEnoughRows.Error(), http.StatusBadRequest, status.WithDetails(status.Details{ - status.TableIndex: tableIndex, - })) -} - -func formatKeyValueVerbose(data parsed, keyrows int, tableIndex int) ([]map[string]Verbose, error) { - if len(data) > 1 && keyrows >= 1 { - keys, err := generateKeys(data, keyrows) - if err != nil { - return nil, err - } - - var kv []map[string]Verbose - for i := keyrows; i < len(data); i++ { - pairs := make(map[string]Verbose) - for j := 0; j < len(data[i]); j++ { - key := fmt.Sprintf("null%d", j) - if j < len(keys) { - key = keys[j] - } - pairs[key] = Verbose{ - Text: data[i][j].text, - Links: data[i][j].links, - } - } - kv = append(kv, pairs) - } - return kv, nil - } - return nil, status.NewStatus(errNotEnoughRows.Error(), http.StatusBadRequest, status.WithDetails(status.Details{ - status.TableIndex: tableIndex, - })) -} - -func generateKeys(data parsed, keyrows int) ([]string, error) { - var keys []string - for colNum := 0; colNum < len(data[0]); colNum++ { - var b strings.Builder - _, err := b.WriteString(data[0][colNum].text) - if err != nil { - return nil, err - } - - for k := 1; k < keyrows; k++ { - v := data[k][colNum].text - if v != data[k-1][colNum].text && v != "" { - _, err := b.WriteString(fmt.Sprintf(" %s", v)) - if err != nil { - return nil, err - } - } - } - keys = append(keys, b.String()) - } - return keys, nil -}