Skip to content

Commit

Permalink
Init
Browse files Browse the repository at this point in the history
  • Loading branch information
ssiyad committed Apr 2, 2020
1 parent a5d5ca2 commit aeb0a60
Show file tree
Hide file tree
Showing 10 changed files with 495 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@

# Dependency directories (remove the comment below to include it)
# vendor/
#
.vscode/
Binary file added assests/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package main

import "github.com/ssiyad/wikiui/src"

func main() {
src.Init()
}
107 changes: 107 additions & 0 deletions src/api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package src

import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"time"
)

type searchData struct {
Key string
Name []interface{}
Blank []interface{}
Link []interface{}
}

type individualPage struct {
PageID int
Ns int
Title string
Extract string
}

type query struct {
Pages map[string]individualPage
}

type pageData struct {
BatchComplete string
Warnings map[string]interface{}
Query query
}

func (d *searchData) UnmarshalJSON(buf []byte) error {
tmp := []interface{}{&d.Key, &d.Name, &d.Blank, &d.Link}
wantLen := len(tmp)
if err := json.Unmarshal(buf, &tmp); err != nil {
return err
}
if g, e := len(tmp), wantLen; g != e {
return fmt.Errorf("wrong number of fields in Notification: %d != %d", g, e)
}
return nil
}

func searchWiki(keyword string) searchData {
keyword = url.QueryEscape(keyword)
url := "https://en.wikipedia.org//w/api.php?action=opensearch&format=json&search=" + keyword + "&profile=fuzzy&limit=5"

body, err := apiCall(url)
if err != nil {
log.Panicln(err)
}

var resultGot searchData

err = json.Unmarshal(body, &resultGot)
if err != nil {
log.Panicln(err)
}

return resultGot
}

func getWikiPage(keyword string) pageData {
keyword = url.QueryEscape(keyword)
url := "https://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&titles=" + keyword

body, err := apiCall(url)
if err != nil {
log.Panicln(err)
}

var resultGot pageData

err = json.Unmarshal(body, &resultGot)
if err != nil {
log.Panicln(err)
}

return resultGot
}

func apiCall(url string) ([]byte, error) {
wikiClient := http.Client{Timeout: time.Second * 20}

req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}

req.Header.Set("User-Agent", "wikiui-cli")

res, getErr := wikiClient.Do(req)
if getErr != nil {
return nil, getErr
}

body, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}
return body, nil
}
22 changes: 22 additions & 0 deletions src/bindings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package src

import (
"log"

"github.com/jroimartin/gocui"
)

func setBindings(g *gocui.Gui) {
if err := g.SetKeybinding("main", gocui.KeyCtrlQ, gocui.ModNone, quit); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("main", gocui.KeyArrowDown, gocui.ModNone, moveDown); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("main", gocui.KeyArrowUp, gocui.ModNone, moveUp); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("main", gocui.KeyCtrlW, gocui.ModNone, writeArticle); err != nil {
log.Panicln(err)
}
}
44 changes: 44 additions & 0 deletions src/core.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package src

import (
"log"
"os"
"path"

"github.com/jroimartin/gocui"
)

// Init function
func Init() {
g, err := gocui.NewGui(gocui.Output256)
if err != nil {
panic(err)
}
defer g.Close()

setProperties(g)
setLayout(g)
setBindings(g)
setNavigation(g)

var homePath, _ = os.UserHomeDir()
var savePath = path.Join(homePath, saveDir)

_ = os.Mkdir(savePath, 0700)

if err := g.MainLoop(); err != gocui.ErrQuit {
log.Panicln(err)
}
}

const saveDir = `.wikiui`

const helpText = `
CLI for Wikipedia!
Made with <3 by Sabu Siyad
https://github.com/ssiyad/wikiui
C-O Open saved
C-S Search
C-W Save for offline
C-Q Quit`
29 changes: 29 additions & 0 deletions src/layout.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package src

import (
"fmt"
"log"

"github.com/jroimartin/gocui"
)

func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()

if v, err := g.SetView("main", 0, 0, maxX-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
if _, err := g.SetCurrentView("main"); err != nil {
log.Panicln(err)
}
v.Wrap = true
v.Title = "wikiui"
fmt.Fprintln(v, helpText)
}
return nil
}

func setLayout(g *gocui.Gui) {
g.SetManagerFunc(layout)
}
53 changes: 53 additions & 0 deletions src/navigation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package src

import (
"log"

"github.com/jroimartin/gocui"
)

func setNavigation(g *gocui.Gui) {
// Keys on 'main' buffer
if err := g.SetKeybinding("main", gocui.KeyCtrlS, gocui.ModNone, jumpToSearchBox); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("main", gocui.KeyCtrlO, gocui.ModNone, jumpToSaved); err != nil {
log.Panicln(err)
}

// Keys on 'result' buffer
if err := g.SetKeybinding("result", gocui.KeyArrowUp, gocui.ModNone, moveUp); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("result", gocui.KeyArrowDown, gocui.ModNone, moveDown); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("result", gocui.KeyEnter, gocui.ModNone, showPage); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("result", gocui.KeyCtrlQ, gocui.ModNone, jumpToMain); err != nil {
log.Panicln(err)
}

// keys on 'searchbox' buffer
if err := g.SetKeybinding("searchbox", gocui.KeyEnter, gocui.ModNone, showResult); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("searchbox", gocui.KeyCtrlQ, gocui.ModNone, jumpToMain); err != nil {
log.Panicln(err)
}

// Keys on 'saved' buffer
if err := g.SetKeybinding("saved", gocui.KeyArrowUp, gocui.ModNone, moveUp); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("saved", gocui.KeyArrowDown, gocui.ModNone, moveDown); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("saved", gocui.KeyEnter, gocui.ModNone, readSaved); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("saved", gocui.KeyCtrlQ, gocui.ModNone, jumpToMain); err != nil {
log.Panicln(err)
}
}
12 changes: 12 additions & 0 deletions src/props.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package src

import "github.com/jroimartin/gocui"


func setProperties(g *gocui.Gui) {
g.SelFgColor = gocui.ColorBlue
g.Highlight = true
g.Cursor = true
g.Mouse = false
g.ASCII = false
}
Loading

0 comments on commit aeb0a60

Please sign in to comment.