summaryrefslogtreecommitdiff
path: root/actions.go
diff options
context:
space:
mode:
Diffstat (limited to 'actions.go')
-rw-r--r--actions.go38
1 files changed, 37 insertions, 1 deletions
diff --git a/actions.go b/actions.go
index 55ec352..28713ee 100644
--- a/actions.go
+++ b/actions.go
@@ -15,6 +15,7 @@ import (
"tildegit.org/tjp/sliderule"
"tildegit.org/tjp/sliderule/gemini"
+ "tildegit.org/tjp/sliderule/gemini/gemtext"
"tildegit.org/tjp/sliderule/gopher"
)
@@ -31,6 +32,7 @@ var (
ErrSaveNeedsFilename = errors.New("save requires a filename argument")
ErrInvalidMarkArgs = errors.New("mark what?")
ErrInvalidTourArgs = errors.New("tour what?")
+ ErrOnlyTextGemini = errors.New("that is only supported for text/gemini pages")
)
func About(_ *BrowserState) error {
@@ -111,7 +113,7 @@ func Reload(state *BrowserState, conf *Config) error {
urlStr, _ = gopherURL(state.Url)
}
- var client = sliderule.NewClient(tlsConfig(state))
+ client := sliderule.NewClient(tlsConfig(state))
var response *sliderule.Response
var err error
@@ -468,6 +470,40 @@ func Print(state *BrowserState) error {
return print(state)
}
+func Outline(state *BrowserState, conf *Config) error {
+ if state.Body == nil {
+ return ErrMustBeOnAPage
+ }
+
+ if state.DocType != "text/gemini" {
+ return ErrOnlyTextGemini
+ }
+
+ gemdoc, err := gemtext.Parse(bytes.NewBuffer(state.Body))
+ if err != nil {
+ return err
+ }
+
+ b := &bytes.Buffer{}
+ for _, line := range gemdoc {
+ switch line.Type() {
+ case gemtext.LineTypeHeading3, gemtext.LineTypeHeading2, gemtext.LineTypeHeading1:
+ if _, err := b.Write(line.Raw()); err != nil {
+ return err
+ }
+ }
+ }
+
+ formatted, _, err := parseGemtextDoc(b.Bytes(), conf.SoftWrap)
+ if err != nil {
+ return err
+ }
+
+ state.Modal = []byte(formatted)
+
+ return Print(state)
+}
+
func Links(state *BrowserState, conf *Config) error {
if state.Links == nil {
return ErrMustBeOnAPage