On 09/13/2016 10:50 AM, sebb wrote: > On 13 September 2016 at 09:01, Daniel Gruno <[email protected]> wrote: >> On 09/12/2016 12:48 PM, sebb wrote: >>> On 8 September 2016 at 07:03, <[email protected]> wrote: >>>> Repository: incubator-ponymail >>>> Updated Branches: >>>> refs/heads/coffee-and-cake d15294548 -> ae791c1a6 >>>> >>>> >>>> add URL shortening >>>> >>>> this is a bit longer than the old format, and only shortens >>>> if the generator is medium or full, to avoid duplicates. >>>> >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/incubator-ponymail/repo >>>> Commit: >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/commit/ae791c1a >>>> Tree: >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/tree/ae791c1a >>>> Diff: >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/diff/ae791c1a >>>> >>>> Branch: refs/heads/coffee-and-cake >>>> Commit: ae791c1a619fc965cca72f1f62edb87b07a088b9 >>>> Parents: d152945 >>>> Author: Daniel Gruno <[email protected]> >>>> Authored: Thu Sep 8 08:02:50 2016 +0200 >>>> Committer: Daniel Gruno <[email protected]> >>>> Committed: Thu Sep 8 08:02:50 2016 +0200 >>>> >>>> ---------------------------------------------------------------------- >>>> site/api/thread.lua | 6 +++++ >>>> site/js/coffee/email_display_basic.coffee | 3 ++- >>>> site/js/coffee/listview_basic.coffee | 3 ++- >>>> site/js/coffee/listview_single_email.coffee | 4 ++- >>>> site/js/coffee/misc.coffee | 31 ++++++++++++++++++++++++ >>>> site/js/coffee/scaffolding.coffee | 2 +- >>>> 6 files changed, 45 insertions(+), 4 deletions(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/ae791c1a/site/api/thread.lua >>>> ---------------------------------------------------------------------- >>>> diff --git a/site/api/thread.lua b/site/api/thread.lua >>>> index aaaa9da..46e93c1 100644 >>>> --- a/site/api/thread.lua >>>> +++ b/site/api/thread.lua >>>> @@ -126,6 +126,12 @@ function handle(r) >>>> if #docs == 1 then >>>> doc = docs[1] >>>> end >>>> + -- New shortening for medium/full generators >>>> + if #docs == 0 and #eid == 24 then >>>> + docs = elastic.find("mid:" .. r:escape(eid) .. "*", 1, "mbox") >>>> + >>>> + end >>>> + -- old shortening format, bleh >>>> if #docs == 0 and #eid == 18 then >>>> docs = elastic.find("mid:" .. r:escape(eid) .. "*", 1, "mbox") >>>> end >>>> >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/ae791c1a/site/js/coffee/email_display_basic.coffee >>>> ---------------------------------------------------------------------- >>>> diff --git a/site/js/coffee/email_display_basic.coffee >>>> b/site/js/coffee/email_display_basic.coffee >>>> index 708c373..73a60f6 100644 >>>> --- a/site/js/coffee/email_display_basic.coffee >>>> +++ b/site/js/coffee/email_display_basic.coffee >>>> @@ -149,7 +149,8 @@ class BasicEmailDisplay >>>> ### Action buttons ### >>>> >>>> ### Permalink ### >>>> - pbutton = new HTML('a', { class: "label_yellow", href: >>>> "thread.html/#{json.mid}"}, "Permalink") >>>> + shortID = shortenURL(json.mid) >>>> + pbutton = new HTML('a', { class: "label_yellow", href: >>>> "thread.html/#{shortID}"}, "Permalink") >>>> >>>> ### Source ### >>>> sbutton = new HTML('a', { class: "label_red", href: >>>> "api/source.lua/#{json.mid}"}, "View source") >>>> >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/ae791c1a/site/js/coffee/listview_basic.coffee >>>> ---------------------------------------------------------------------- >>>> diff --git a/site/js/coffee/listview_basic.coffee >>>> b/site/js/coffee/listview_basic.coffee >>>> index f9bfe47..bd97dbf 100644 >>>> --- a/site/js/coffee/listview_basic.coffee >>>> +++ b/site/js/coffee/listview_basic.coffee >>>> @@ -234,8 +234,9 @@ class BasicListView >>>> >>>> >>>> ### Subject, PLUS a bit of the body with a break before ### >>>> + sid = shortenURL(thread.tid) >>>> subject = new HTML('div', {}, [ >>>> - new HTML('a', { style: {fontWeight: readStyle}, href: >>>> "thread.html/#{thread.tid}", onclick: >>>> "readEmail(this.parentNode.parentNode.parentNode); this.style.fontWeight = >>>> 'normal'; return false;"}, original.subject), >>>> + new HTML('a', { style: {fontWeight: readStyle}, href: >>>> "thread.html/#sid}", onclick: >>>> "readEmail(this.parentNode.parentNode.parentNode); this.style.fontWeight = >>>> 'normal'; return false;"}, original.subject), >>>> new HTML('br'), >>>> new HTML('span', {class: "listview_item_body"}, >>>> thread.body) >>>> ]) >>>> >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/ae791c1a/site/js/coffee/listview_single_email.coffee >>>> ---------------------------------------------------------------------- >>>> diff --git a/site/js/coffee/listview_single_email.coffee >>>> b/site/js/coffee/listview_single_email.coffee >>>> index 5aa3e07..b3baff8 100644 >>>> --- a/site/js/coffee/listview_single_email.coffee >>>> +++ b/site/js/coffee/listview_single_email.coffee >>>> @@ -102,9 +102,11 @@ class SingleListView extends BasicListView >>>> if hasRead(original.id) >>>> readStyle = "normal" >>>> >>>> + >>>> ### Subject, PLUS a bit of the body with a break before ### >>>> + sid = shortenURL(original.id) >>>> subject = new HTML('div', {}, [ >>>> - new HTML('a', { style: {fontWeight: readStyle}, href: >>>> "thread.html/#{original.id}", onclick: >>>> "readEmail(this.parentNode.parentNode.parentNode); this.style.fontWeight = >>>> 'normal'; return false;"}, original.subject), >>>> + new HTML('a', { style: {fontWeight: readStyle}, href: >>>> "thread.html/#{sid}", onclick: >>>> "readEmail(this.parentNode.parentNode.parentNode); this.style.fontWeight = >>>> 'normal'; return false;"}, original.subject), >>>> ]) >>>> >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/ae791c1a/site/js/coffee/misc.coffee >>>> ---------------------------------------------------------------------- >>>> diff --git a/site/js/coffee/misc.coffee b/site/js/coffee/misc.coffee >>>> index 131748a..2ac684c 100644 >>>> --- a/site/js/coffee/misc.coffee >>>> +++ b/site/js/coffee/misc.coffee >>>> @@ -93,3 +93,34 @@ ponymail_url_regex = new RegExp( >>>> ponymail_quote_regex = new RegExp( >>>> "((?:\r?\n)((on .+ wrote:[\r\n]+)|(sent from my .+)|(>+[ >>>> \t]*[^\r\n]*\r?\n[^\n]*\n*)+)+)+", "mi" >>>> ) >>>> + >>>> +shortBits = 3 >>>> + >>>> +shortenURL = (mid) -> >>>> + arr = mid.split("@") >>> >>> This function throws away the list id. >>> >>> However AFAIK the list id is essential to disambiguate messages which >>> are sent to multiple lists. >> >> When there are only 2 arr bits (iow one @), then the List ID is already >> hashed inside the initial first arr bit, and thus one does not need the >> list ID. This is a compromise and a change from the old shortening >> procedure where IDs were shortened regardless of which generator was >> used. The new shortener only shortens IF it can get away with it >> relatively painlessly, IOW if the list ID is part of the initial sha224 >> blob. This merely needs some documentation, which I will get around to >> now that I'm not on vacation :) > > In which case it's only necessary to drop the '@list' part. > > There is no need to encode/decode as base36. > The net effect of using shortenURL and unshortenURL does just that. > > The relevant change is the change to thread.lua which allows for > wild-card search if the mid length is 24.
It's not an impressive compression, no, but it's still slightly shorter :) > >> With regards, >> Daniel. >> >>> >>>> + if arr.length == 2 and (pm_config and pm_config.shortenLinks) >>>> + out = "" >>>> + for i in [0..shortBits-1] >>>> + a = arr[0].substr(i*8,8) >>>> + num = parseInt(a, 16) >>>> + res = num.toString(36) >>>> + while res.length < 7 >>>> + res = '0' + res >>>> + out += res >>>> + return "PZ" + out >>>> + >>>> + return mid >>>> + >>>> +unshortenURL = (mid) -> >>>> + if mid.substr(0,2) == 'PZ' >>>> + out = "" >>>> + for i in [0..shortBits-1] >>>> + num = parseInt(mid.substr(2+(i*7), 7), 36) >>>> + res = num.toString(16) >>>> + while res.length < 8 >>>> + res = '0' + res >>>> + out += res >>>> + return out >>>> + else >>>> + return mid >>>> + >>> >>> The functions need some documentation. >>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/ae791c1a/site/js/coffee/scaffolding.coffee >>>> ---------------------------------------------------------------------- >>>> diff --git a/site/js/coffee/scaffolding.coffee >>>> b/site/js/coffee/scaffolding.coffee >>>> index ec58fee..379b463 100644 >>>> --- a/site/js/coffee/scaffolding.coffee >>>> +++ b/site/js/coffee/scaffolding.coffee >>>> @@ -118,7 +118,7 @@ threadScaffolding = () -> >>>> >>>> ### Make an API call to the preferences script, have it call back to >>>> listView once done ### >>>> mid = location.href.match(/thread\.html\/(.+)/)[1] >>>> - r = new HTTPRequest("api/thread.lua?id=" + mid, { >>>> + r = new HTTPRequest("api/thread.lua?id=" + unshortenURL(mid), { >>>> callback: scaffoldingEmailCallback >>>> >>>> }) >>>> >>
