-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
495 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,3 +13,5 @@ | |
|
||
# Dependency directories (remove the comment below to include it) | ||
# vendor/ | ||
# | ||
.vscode/ |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
Oops, something went wrong.