Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 127 additions & 6 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
}
133 changes: 0 additions & 133 deletions pkg/client/format.go

This file was deleted.

Loading