Changeset 121 in code


Ignore:
Timestamp:
Jul 14, 2020, 9:22:08 PM (5 years ago)
Author:
asciimoo
Message:

[enh] use html template for injected html snippets

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/morty.go

    r120 r121  
    1010        "flag"
    1111        "fmt"
     12        "html/template"
    1213        "io"
    1314        "log"
     
    187188}
    188189
    189 var HTML_FORM_EXTENSION string = `<input type="hidden" name="mortyurl" value="%s" /><input type="hidden" name="mortyhash" value="%s" />`
    190 
    191 var HTML_BODY_EXTENSION string = `
    192 <input type="checkbox" id="mortytoggle" autocomplete="off" />
    193 <div id="mortyheader">
    194   <form method="get">
    195     <label for="mortytoggle">hide</label>
    196     <span><a href="/">Morty Proxy</a></span>
    197     <input type="url" value="%s" name="mortyurl" readonly="true" />
    198     This is a <a href="https://github.com/asciimoo/morty">proxified and sanitized</a> view of the page, visit <a href="%s" rel="noreferrer">original site</a>.
    199   </form>
    200 </div>
    201 <style>
    202 body{ position: absolute !important; top: 42px !important; left: 0 !important; right: 0 !important; bottom: 0 !important; }
    203 #mortyheader { position: fixed; margin: 0; box-sizing: border-box; -webkit-box-sizing: border-box; top: 0; left: 0; right: 0; z-index: 2147483647 !important; font-size: 12px; line-height: normal; border-width: 0px 0px 2px 0; border-style: solid; border-color: #AAAAAA; background: #FFF; padding: 4px; color: #444; height: 42px; }
    204 #mortyheader p { padding: 0 0 0.7em 0; display: block; }
    205 #mortyheader a { color: #3498db; font-weight: bold; display: inline; }
    206 #mortyheader label { text-align: right; cursor: pointer; position: fixed; right: 4px; top: 4px; display: block; color: #444; }
    207 #mortyheader > form > span { font-size: 24px; font-weight: bold; margin-right: 20px; margin-left: 20px; }
    208 input[type=checkbox]#mortytoggle { display: none; }
    209 input[type=checkbox]#mortytoggle:checked ~ div { display: none; visibility: hidden; }
    210 #mortyheader input[type=url] { width: 50%%; padding: 4px; font-size: 16px; }
    211 </style>
    212 `
    213 
     190type HTMLBodyExtParam struct {
     191        BaseURL     string
     192        HasMortyKey bool
     193}
     194
     195type HTMLFormExtParam struct {
     196        BaseURL  string
     197        MortyKey string
     198}
     199
     200var HTML_FORM_EXTENSION *template.Template
     201var HTML_BODY_EXTENSION *template.Template
    214202var HTML_HEAD_CONTENT_TYPE string = `<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    215203<meta http-equiv="X-UA-Compatible" content="IE=edge">
     
    256244
    257245        FAVICON_BYTES, _ = base64.StdEncoding.DecodeString(FaviconBase64)
     246        var err error
     247        HTML_FORM_EXTENSION, err = template.New("html_form_extension").Parse(
     248                `<input type="hidden" name="mortyurl" value="{{.BaseURL}}" /><input type="hidden" name="mortyhash" value="{{.MortyKey}}" />`)
     249        if err != nil {
     250                panic(err)
     251        }
     252        HTML_BODY_EXTENSION, err = template.New("html_body_extension").Parse(`
     253<input type="checkbox" id="mortytoggle" autocomplete="off" />
     254<div id="mortyheader">
     255  <form method="get">
     256    <label for="mortytoggle">hide</label>
     257    <span><a href="/">Morty Proxy</a></span>
     258    <input type="url" value="{{.BaseURL}}" name="mortyurl" {{if .HasMortyKey }}readonly="true"{{end}} />
     259    This is a <a href="https://github.com/asciimoo/morty">proxified and sanitized</a> view of the page, visit <a href="{{.BaseURL}}" rel="noreferrer">original site</a>.
     260  </form>
     261</div>
     262<style>
     263body{ position: absolute !important; top: 42px !important; left: 0 !important; right: 0 !important; bottom: 0 !important; }
     264#mortyheader { position: fixed; margin: 0; box-sizing: border-box; -webkit-box-sizing: border-box; top: 0; left: 0; right: 0; z-index: 2147483647 !important; font-size: 12px; line-height: normal; border-width: 0px 0px 2px 0; border-style: solid; border-color: #AAAAAA; background: #FFF; padding: 4px; color: #444; height: 42px; }
     265#mortyheader p { padding: 0 0 0.7em 0; display: block; }
     266#mortyheader a { color: #3498db; font-weight: bold; display: inline; }
     267#mortyheader label { text-align: right; cursor: pointer; position: fixed; right: 4px; top: 4px; display: block; color: #444; }
     268#mortyheader > form > span { font-size: 24px; font-weight: bold; margin-right: 20px; margin-left: 20px; }
     269input[type=checkbox]#mortytoggle { display: none; }
     270input[type=checkbox]#mortytoggle:checked ~ div { display: none; visibility: hidden; }
     271#mortyheader input[type=url] { width: 50%; padding: 4px; font-size: 16px; }
     272</style>
     273`)
     274        if err != nil {
     275                panic(err)
     276        }
    258277}
    259278
     
    491510        if param == nil {
    492511                param = ctx.PostArgs().PeekBytes(paramName)
    493                 if param != nil {
    494                         ctx.PostArgs().DelBytes(paramName)
    495                 }
    496         } else {
    497                 ctx.QueryArgs().DelBytes(paramName)
    498         }
     512                ctx.PostArgs().DelBytes(paramName)
     513        }
     514        ctx.QueryArgs().DelBytes(paramName)
    499515
    500516        return param
     
    640656                                                key = hash(urlStr, rc.Key)
    641657                                        }
    642                                         fmt.Fprintf(out, HTML_FORM_EXTENSION, urlStr, key)
    643 
     658                                        err := HTML_FORM_EXTENSION.Execute(out, HTMLFormExtParam{urlStr, key})
     659                                        if err != nil {
     660                                                if DEBUG {
     661                                                        fmt.Println("failed to inject body extension", err)
     662                                                }
     663                                        }
    644664                                }
    645665
     
    649669                                switch string(tag) {
    650670                                case "body":
    651                                         fmt.Fprintf(out, HTML_BODY_EXTENSION, rc.BaseURL.String(), rc.BaseURL.String())
     671                                        p := HTMLBodyExtParam{rc.BaseURL.String(), false}
     672                                        if len(rc.Key) > 0 {
     673                                                p.HasMortyKey = true
     674                                        }
     675                                        err := HTML_BODY_EXTENSION.Execute(out, p)
     676                                        if err != nil {
     677                                                if DEBUG {
     678                                                        fmt.Println("failed to inject body extension", err)
     679                                                }
     680                                        }
    652681                                case "style":
    653682                                        state = STATE_DEFAULT
Note: See TracChangeset for help on using the changeset viewer.