diff options
Diffstat (limited to 'actions.go')
| -rw-r--r-- | actions.go | 38 |
1 files changed, 37 insertions, 1 deletions
@@ -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 |
