@@ -8,113 +8,91 @@ import (
88 "log"
99 "net/http"
1010
11- "code.rocketnine.space/tslocum/cview"
1211 md "github.com/JohannesKaufmann/html-to-markdown"
1312 "github.com/eliukblau/pixterm/pkg/ansimage"
1413 "github.com/gdamore/tcell/v2"
14+ "github.com/rivo/tview"
1515)
1616
1717type Content struct {
18- * cview.TextView
19-
18+ * tview.TextView
2019 app * App
2120}
2221
2322func NewContentView (app * App ) * Content {
2423 m := & Content {
25- TextView : cview .NewTextView (),
24+ TextView : tview .NewTextView (),
2625 app : app ,
2726 }
28-
2927 m .SetBorder (true )
30- m .SetPadding (1 , 1 , 1 , 1 )
3128 m .SetTitle ("content" )
3229 m .SetBackgroundColor (tcell .ColorDefault )
33-
3430 return m
3531}
3632
3733func (c * Content ) Update () {
3834 current := c .app .state .currentFile
39- path , entry := current .path , current .entry
40- c .Clear ()
41-
42- data , err := c .app .ipfs .ReadFile (path , entry )
43- if err != nil {
44- panic (err )
45- }
46- contentType , err := getFileContentType (data )
47- if err != nil {
48- c .SetText (err .Error ())
49- }
50-
51- c .SetTextAlign (cview .AlignLeft )
52-
53- switch contentType {
54- case "image/png" , "image/jpeg" :
55-
56- c .SetTextAlign (cview .AlignCenter )
57- c .SetDynamicColors (true )
58- _ , _ , w , h := c .GetRect ()
59- r := bytes .NewReader (data )
60- img := translateImage (r , w , h )
61- c .SetText (img )
62- case "text/html; charset=utf-8" :
63- converter := md .NewConverter ("" , true , nil )
64- markdown , err := converter .ConvertBytes (data )
65- if err != nil {
66- log .Fatal (err )
67- }
68- c .SetText (string (markdown ))
69-
70- case "text/plain; charset=utf-8" :
71- c .Write (data )
72-
73- case "audio/wave" , "audio/mp3" , "audio/ogg" :
74- c .SetText (fmt .Sprintf ("contentType: %s\n Press 'o' to play in browser" , contentType ))
75-
76- default :
77- c .SetText (fmt .Sprintf ("ContentType: %s\n Press 'o' to open in browser" , contentType ))
35+ if current .entry == nil {
36+ return
7837 }
38+ c .Clear ()
7939
80- c .ScrollToBeginning ()
81-
40+ go func () {
41+ data , err := c .app .ipfs .ReadFile (current .path , current .entry )
42+ c .app .ui .QueueUpdateDraw (func () {
43+ if err != nil {
44+ c .SetText (fmt .Sprintf ("error: %v" , err ))
45+ return
46+ }
47+ contentType , err := getFileContentType (data )
48+ if err != nil {
49+ c .SetText (err .Error ())
50+ return
51+ }
52+ c .SetTextAlign (tview .AlignLeft )
53+ switch contentType {
54+ case "image/png" , "image/jpeg" :
55+ c .SetTextAlign (tview .AlignCenter )
56+ c .SetDynamicColors (true )
57+ _ , _ , w , h := c .GetRect ()
58+ img := translateImage (bytes .NewReader (data ), w , h )
59+ c .SetText (img )
60+ case "text/html; charset=utf-8" :
61+ converter := md .NewConverter ("" , true , nil )
62+ markdown , err := converter .ConvertBytes (data )
63+ if err != nil {
64+ log .Fatal (err )
65+ }
66+ c .SetText (string (markdown ))
67+ case "text/plain; charset=utf-8" :
68+ c .Write (data )
69+ case "audio/wave" , "audio/mp3" , "audio/ogg" :
70+ c .SetText (fmt .Sprintf ("contentType: %s\n Press 'o' to play in browser" , contentType ))
71+ default :
72+ c .SetText (fmt .Sprintf ("ContentType: %s\n Press 'o' to open in browser" , contentType ))
73+ }
74+ c .ScrollToBeginning ()
75+ })
76+ }()
8277}
8378
8479func translateImage (reader io.Reader , x , y int ) string {
8580 img , err := buildImage (reader , x , y )
8681 if err != nil {
8782 return ""
8883 }
89- ansi := img .Render ()
90- return cview .TranslateANSI (ansi )
91-
84+ return tview .TranslateANSI (img .Render ())
9285}
9386
9487func buildImage (reader io.Reader , x , y int ) (* ansimage.ANSImage , error ) {
95- pix , err := ansimage .NewScaledFromReader (reader , y , x , color .Transparent , ansimage .ScaleModeFit , ansimage .NoDithering )
96- if err != nil {
97- return nil , err
98- }
99- return pix , nil
100-
88+ return ansimage .NewScaledFromReader (reader , y , x , color .Transparent , ansimage .ScaleModeFit , ansimage .NoDithering )
10189}
10290
10391func getFileContentType (data []byte ) (string , error ) {
104-
105- s := bytes .NewBuffer (data )
106-
107- // Only the first 512 bytes are used to sniff the content type.
108- buffer := make ([]byte , 512 )
109-
110- _ , err := s .Read (buffer )
92+ buf := make ([]byte , 512 )
93+ n , err := bytes .NewBuffer (data ).Read (buf )
11194 if err != nil {
11295 return "" , err
11396 }
114-
115- // Use the net/http package's handy DectectContentType function. Always returns a valid
116- // content-type by returning "application/octet-stream" if no others seemed to match.
117- contentType := http .DetectContentType (buffer )
118-
119- return contentType , nil
97+ return http .DetectContentType (buf [:n ]), nil
12098}
0 commit comments