Merge branch 'ccd0' into v3
Conflicts: CHANGELOG.md LICENSE builds/4chan-X.user.js builds/crx.crx builds/crx/script.js package.json src/Archive/archives.json src/General/Get.coffee src/General/Navigate.coffee src/Images/Gallery.coffee src/Linkification/Linkify.coffee src/Posting/QR.coffee src/Posting/QR.post.coffee
This commit is contained in:
commit
37a3b05e39
66
CHANGELOG.md
66
CHANGELOG.md
@ -1,7 +1,65 @@
|
|||||||
**MayhemYDG**
|
|
||||||
- Update 4chan namespaces support.
|
### v1.7.33
|
||||||
- Better handling of webm playback errors.
|
*2014-05-10*
|
||||||
- Bugfixes
|
|
||||||
|
**DamonGant**
|
||||||
|
- Add Innovandalism Archive.
|
||||||
|
|
||||||
|
**ccd0**
|
||||||
|
- Update archive list.
|
||||||
|
- Add "disabled" option when Foolz Beta is the only choice.
|
||||||
|
|
||||||
|
### v1.7.32
|
||||||
|
*2014-05-10*
|
||||||
|
|
||||||
|
**Zixaphir, ccd0**
|
||||||
|
- Bug fixes in linkification/embedding.
|
||||||
|
|
||||||
|
**ccd0**
|
||||||
|
- Begin refactoring code to reduce potential for introducing Javascript injection bugs.
|
||||||
|
|
||||||
|
### v1.7.31
|
||||||
|
*2014-05-08*
|
||||||
|
|
||||||
|
**Zixaphir**
|
||||||
|
- Refactoring, bug fixes.
|
||||||
|
|
||||||
|
**ccd0**
|
||||||
|
- Fix some potential Javascript injection issues.
|
||||||
|
- Bug fixes.
|
||||||
|
|
||||||
|
### v1.7.30
|
||||||
|
*2014-05-05*
|
||||||
|
|
||||||
|
**thebladeee**
|
||||||
|
- Update archives.
|
||||||
|
|
||||||
|
### v1.7.29
|
||||||
|
*2014-05-03*
|
||||||
|
|
||||||
|
**ccd0**:
|
||||||
|
- If the original post form not hidden, it is expanded (except on the catalog page).
|
||||||
|
- 4chan's horizontal rules are no longer hidden. If you want to hide them as before, add the old code to your custom CSS:
|
||||||
|
```
|
||||||
|
body > hr,
|
||||||
|
#blotter hr,
|
||||||
|
.desktop > hr,
|
||||||
|
#delform > hr,
|
||||||
|
#content > hr {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
:root.index .board > hr:last-of-type,
|
||||||
|
:root.thread .board > hr {
|
||||||
|
border: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### v1.7.28
|
||||||
|
*2014-05-03*
|
||||||
|
|
||||||
|
**ccd0**:
|
||||||
|
- Copy Mayhem's fix for 4chan post form changes.
|
||||||
|
|
||||||
### v1.7.27
|
### v1.7.27
|
||||||
*2014-05-02*
|
*2014-05-02*
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 4chan X - Version 1.7.27 - 2014-05-03
|
* 4chan X - Version 1.7.33 - 2014-05-11
|
||||||
*
|
*
|
||||||
* Licensed under the MIT license.
|
* Licensed under the MIT license.
|
||||||
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
* https://github.com/ccd0/4chan-x/blob/master/LICENSE
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name 4chan X
|
// @name 4chan X
|
||||||
// @version 1.7.27
|
// @version 1.7.33
|
||||||
// @minGMVer 1.14
|
// @minGMVer 1.14
|
||||||
// @minFFVer 26
|
// @minFFVer 26
|
||||||
// @namespace 4chan-X
|
// @namespace 4chan-X
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "4chan X",
|
"name": "4chan X",
|
||||||
"version": "1.7.27",
|
"version": "1.7.33",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
||||||
"icons": {
|
"icons": {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -1,7 +1,7 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
|
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
|
||||||
<app appid='lacclbnghgdicfifcamcmcnilckjamag'>
|
<app appid='lacclbnghgdicfifcamcmcnilckjamag'>
|
||||||
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/crx.crx' version='1.7.27' />
|
<updatecheck codebase='https://ccd0.github.io/4chan-x/builds/crx.crx' version='1.7.33' />
|
||||||
</app>
|
</app>
|
||||||
</gupdate>
|
</gupdate>
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "4chan-X",
|
"name": "4chan-X",
|
||||||
"version": "1.7.27",
|
"version": "1.7.33",
|
||||||
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
"description": "Cross-browser userscript for maximum lurking on 4chan.",
|
||||||
"meta": {
|
"meta": {
|
||||||
"name": "4chan X",
|
"name": "4chan X",
|
||||||
|
|||||||
@ -7,9 +7,9 @@ Redirect =
|
|||||||
|
|
||||||
archives = {}
|
archives = {}
|
||||||
for data in Redirect.archives
|
for data in Redirect.archives
|
||||||
{name, boards, files, software} = data
|
{name, boards, files, software, withCredentials} = data
|
||||||
archives[name] = data
|
archives[name] = data
|
||||||
for boardID in boards
|
for boardID in boards when !withCredentials
|
||||||
o.thread[boardID] = data unless boardID of o.thread
|
o.thread[boardID] = data unless boardID of o.thread
|
||||||
o.post[boardID] = data unless boardID of o.post or software isnt 'foolfuuka'
|
o.post[boardID] = data unless boardID of o.post or software isnt 'foolfuuka'
|
||||||
o.file[boardID] = data unless boardID of o.file or boardID not in files
|
o.file[boardID] = data unless boardID of o.file or boardID not in files
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
"https": true,
|
"https": true,
|
||||||
"software": "foolfuuka",
|
"software": "foolfuuka",
|
||||||
"boards": ["a", "biz", "co", "diy", "gd", "jp", "m", "sci", "sp", "tg", "tv", "vg", "vp", "vr", "wsg"],
|
"boards": ["a", "biz", "co", "diy", "gd", "jp", "m", "sci", "sp", "tg", "tv", "vg", "vp", "vr", "wsg"],
|
||||||
"files": ["a", "biz", "gd", "diy", "jp", "m", "sci", "tg", "vg", "vp", "vr", "wsg"]
|
"files": ["a", "biz", "diy", "gd", "jp", "m", "sci", "tg", "vg", "vp", "vr", "wsg"]
|
||||||
}, {
|
}, {
|
||||||
"uid": 1,
|
"uid": 1,
|
||||||
"name": "NSFW Foolz",
|
"name": "NSFW Foolz",
|
||||||
@ -55,17 +55,17 @@
|
|||||||
}, {
|
}, {
|
||||||
"uid": 5,
|
"uid": 5,
|
||||||
"name": "Love is Over",
|
"name": "Love is Over",
|
||||||
"domain": "loveisover.me",
|
"domain": "archive.loveisover.me",
|
||||||
"http": true,
|
"http": true,
|
||||||
"https": true,
|
"https": true,
|
||||||
"software": "foolfuuka",
|
"software": "foolfuuka",
|
||||||
"boards": ["d", "i"],
|
"boards": ["d", "i", "lgbt"],
|
||||||
"files": ["d", "i"]
|
"files": ["d", "i", "lgbt"]
|
||||||
}, {
|
}, {
|
||||||
"uid": 8,
|
"uid": 8,
|
||||||
"name": "Rebecca Black Tech",
|
"name": "Rebecca Black Tech",
|
||||||
"domain": "rbt.asia",
|
"domain": "rbt.asia",
|
||||||
"http": true,
|
"http": false,
|
||||||
"https": true,
|
"https": true,
|
||||||
"software": "fuuka",
|
"software": "fuuka",
|
||||||
"boards": ["cgl", "g", "mu", "w"],
|
"boards": ["cgl", "g", "mu", "w"],
|
||||||
@ -78,7 +78,7 @@
|
|||||||
"https": false,
|
"https": false,
|
||||||
"software": "fuuka",
|
"software": "fuuka",
|
||||||
"boards": ["an", "fit", "k", "mlp", "r9k", "toy"],
|
"boards": ["an", "fit", "k", "mlp", "r9k", "toy"],
|
||||||
"files": ["an", "fit", "k", "r9k", "toy"]
|
"files": ["an", "fit", "k", "mlp", "r9k", "toy"]
|
||||||
}, {
|
}, {
|
||||||
"uid": 10,
|
"uid": 10,
|
||||||
"name": "warosu",
|
"name": "warosu",
|
||||||
@ -115,6 +115,15 @@
|
|||||||
"software": "foolfuuka",
|
"software": "foolfuuka",
|
||||||
"boards": ["g", "t"],
|
"boards": ["g", "t"],
|
||||||
"files": ["g", "t"]
|
"files": ["g", "t"]
|
||||||
|
}, {
|
||||||
|
"uid": 19,
|
||||||
|
"name": "Innovandalism Archive",
|
||||||
|
"domain": "boards.innovandalism.eu",
|
||||||
|
"http": true,
|
||||||
|
"https": false,
|
||||||
|
"software": "foolfuuka",
|
||||||
|
"boards": ["v"],
|
||||||
|
"files": []
|
||||||
}, {
|
}, {
|
||||||
"uid": 13,
|
"uid": 13,
|
||||||
"name": "Foolz Beta",
|
"name": "Foolz Beta",
|
||||||
|
|||||||
@ -47,7 +47,7 @@ Build =
|
|||||||
name: data.filename + data.ext
|
name: data.filename + data.ext
|
||||||
timestamp: "#{data.tim}#{data.ext}"
|
timestamp: "#{data.tim}#{data.ext}"
|
||||||
url: if boardID is 'f'
|
url: if boardID is 'f'
|
||||||
"//i.4cdn.org/#{boardID}/#{data.filename}#{data.ext}"
|
"//i.4cdn.org/#{boardID}/#{data.filename}#{data.ext}".replace /'/g, '''
|
||||||
else
|
else
|
||||||
"//i.4cdn.org/#{boardID}/#{data.tim}#{data.ext}"
|
"//i.4cdn.org/#{boardID}/#{data.tim}#{data.ext}"
|
||||||
height: data.h
|
height: data.h
|
||||||
|
|||||||
@ -296,15 +296,21 @@ Settings =
|
|||||||
$.on $.id('apply-css'), 'click', Settings.usercss
|
$.on $.id('apply-css'), 'click', Settings.usercss
|
||||||
|
|
||||||
archBoards = {}
|
archBoards = {}
|
||||||
for {name, boards, files, software} in Redirect.archives
|
for {name, boards, files, software, withCredentials} in Redirect.archives
|
||||||
for boardID in boards
|
for boardID in boards
|
||||||
o = archBoards[boardID] or=
|
o = archBoards[boardID] or=
|
||||||
thread: []
|
thread: [[], []]
|
||||||
post: []
|
post: [[], []]
|
||||||
file: []
|
file: [[], []]
|
||||||
o.thread.push name
|
i = +!!withCredentials
|
||||||
o.post.push name if software is 'foolfuuka'
|
o.thread[i].push name
|
||||||
o.file.push name if boardID in files
|
o.post[i].push name if software is 'foolfuuka'
|
||||||
|
o.file[i].push name if boardID in files
|
||||||
|
for boardID, o of archBoards
|
||||||
|
for item in ['thread', 'post', 'file']
|
||||||
|
if o[item][0].length is 0 and o[item][1].length isnt 0
|
||||||
|
o[item][0].push 'disabled'
|
||||||
|
o[item] = o[item][0].concat(o[item][1])
|
||||||
|
|
||||||
rows = []
|
rows = []
|
||||||
boardOptions = []
|
boardOptions = []
|
||||||
|
|||||||
@ -69,24 +69,9 @@ a {
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 0px 2px;
|
padding: 0px 2px;
|
||||||
}
|
}
|
||||||
body > hr,
|
|
||||||
#blotter hr,
|
|
||||||
.desktop > hr,
|
|
||||||
#delform > hr,
|
|
||||||
#content > hr {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
:root.index .board > hr:last-of-type,
|
|
||||||
:root.thread .board > hr {
|
|
||||||
border: 0px;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
.ad-plea {
|
.ad-plea {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.ad-cnt {
|
|
||||||
margin: 10px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 4chan style fixes */
|
/* 4chan style fixes */
|
||||||
.opContainer, .op {
|
.opContainer, .op {
|
||||||
@ -904,13 +889,16 @@ span.hide-announcement {
|
|||||||
|
|
||||||
/* QR */
|
/* QR */
|
||||||
:root.hide-original-post-form #postForm,
|
:root.hide-original-post-form #postForm,
|
||||||
:root.hide-original-post-form .postingMode,
|
:root.hide-original-post-form #togglePostFormLink,
|
||||||
:root.hide-original-post-form #togglePostForm,
|
:root:not(.catalog) #togglePostFormLink,
|
||||||
#qr.autohide:not(.focus):not(:hover):not(:active) > form,
|
#qr.autohide:not(.focus):not(:hover):not(:active) > form,
|
||||||
.thread #qr select[data-name=thread],
|
.thread #qr select[data-name=thread],
|
||||||
#file-n-submit:not(.has-file) #qr-filerm {
|
#file-n-submit:not(.has-file) #qr-filerm {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
:root:not(.hide-original-post-form):not(.catalog) #postForm {
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
#qr select,
|
#qr select,
|
||||||
#dump-button,
|
#dump-button,
|
||||||
#url-button,
|
#url-button,
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
"javascript:quote(#{postID})"
|
"javascript:quote(#{postID})"
|
||||||
else
|
else
|
||||||
"/#{boardID}/thread/#{threadID}#q#{postID}"
|
"/#{boardID}/thread/#{threadID}#q#{postID}"
|
||||||
}' title='Quote this post'>#{postID}</a>
|
}' title='Reply to this post'>#{postID}</a>
|
||||||
#{pageIcon + sticky + closed + replyLink}
|
#{pageIcon + sticky + closed + replyLink}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -10,14 +10,13 @@ Linkify =
|
|||||||
|
|
||||||
if Conf['Embedding'] or Conf['Link Title']
|
if Conf['Embedding'] or Conf['Link Title']
|
||||||
@embedProcess = Function 'link',
|
@embedProcess = Function 'link',
|
||||||
"var data = this.services(link);
|
"""
|
||||||
if (data) {
|
var data = this.services(link);
|
||||||
#{
|
if (data) {#{
|
||||||
(if Conf['Embedding'] then 'this.embed(data);\n' else '') +
|
(if Conf['Embedding'] then 'this.embed(data); ' else '') +
|
||||||
if Conf['Link Title'] then 'this.title(data);' else ''
|
if Conf['Link Title'] then 'data.push(post); this.title(data);' else ''
|
||||||
}
|
}}
|
||||||
}
|
"""
|
||||||
"
|
|
||||||
|
|
||||||
Post.callbacks.push
|
Post.callbacks.push
|
||||||
name: 'Linkify'
|
name: 'Linkify'
|
||||||
@ -34,7 +33,7 @@ Linkify =
|
|||||||
node: ->
|
node: ->
|
||||||
return (if Conf['Embedding'] then Linkify.events @ else null) if @isClone
|
return (if Conf['Embedding'] then Linkify.events @ else null) if @isClone
|
||||||
return unless Linkify.regString.test @info.comment
|
return unless Linkify.regString.test @info.comment
|
||||||
|
|
||||||
test = /[^\s'"]+/g
|
test = /[^\s'"]+/g
|
||||||
space = /[\s'"]/
|
space = /[\s'"]/
|
||||||
snapshot = $.X './/br|.//text()', @nodes.comment
|
snapshot = $.X './/br|.//text()', @nodes.comment
|
||||||
@ -95,7 +94,7 @@ Linkify =
|
|||||||
)///i
|
)///i
|
||||||
|
|
||||||
makeRange: (startNode, endNode, startOffset, endOffset) ->
|
makeRange: (startNode, endNode, startOffset, endOffset) ->
|
||||||
range = document.createRange();
|
range = document.createRange()
|
||||||
range.setStart startNode, startOffset
|
range.setStart startNode, startOffset
|
||||||
range.setEnd endNode, endOffset
|
range.setEnd endNode, endOffset
|
||||||
range
|
range
|
||||||
@ -156,7 +155,7 @@ Linkify =
|
|||||||
return
|
return
|
||||||
|
|
||||||
embed: (data) ->
|
embed: (data) ->
|
||||||
[key, uid, options, link] = data
|
[key, uid, options, link, post] = data
|
||||||
href = link.href
|
href = link.href
|
||||||
embed = $.el 'a',
|
embed = $.el 'a',
|
||||||
className: 'embedder'
|
className: 'embedder'
|
||||||
@ -164,7 +163,6 @@ Linkify =
|
|||||||
textContent: '(embed)'
|
textContent: '(embed)'
|
||||||
|
|
||||||
embed.dataset[name] = value for name, value of {key, href, uid, options}
|
embed.dataset[name] = value for name, value of {key, href, uid, options}
|
||||||
embed.dataset.nodedata = link.innerHTML
|
|
||||||
|
|
||||||
$.addClass link, "#{embed.dataset.key}"
|
$.addClass link, "#{embed.dataset.key}"
|
||||||
|
|
||||||
@ -173,33 +171,30 @@ Linkify =
|
|||||||
|
|
||||||
Linkify.cb.toggle.call embed if Conf['Auto-embed']
|
Linkify.cb.toggle.call embed if Conf['Auto-embed']
|
||||||
|
|
||||||
data.push embed
|
|
||||||
|
|
||||||
title: (data) ->
|
title: (data) ->
|
||||||
[key, uid, options, link, embed] = data
|
[key, uid, options, link, post] = data
|
||||||
return unless service = Linkify.types[key].title
|
return unless service = Linkify.types[key].title
|
||||||
titles = Conf['CachedTitles']
|
titles = Conf['CachedTitles']
|
||||||
if title = titles[uid]
|
if title = titles[uid]
|
||||||
# Auto-embed may destroy our links.
|
link.textContent = title[0]
|
||||||
if link
|
|
||||||
link.textContent = title[0]
|
|
||||||
if Conf['Embedding']
|
|
||||||
embed.dataset.title = title[0]
|
|
||||||
else
|
else
|
||||||
try
|
try
|
||||||
$.cache service.api(uid), (-> Linkify.cb.title @, data), responseType: 'json'
|
$.cache service.api(uid), (-> Linkify.cb.title @, data), responseType: 'json'
|
||||||
catch err
|
catch err
|
||||||
if link
|
link.innerHTML = '<span class="warning">Title Link Blocked</span> (are you using NoScript?)</a>'
|
||||||
link.innerHTML = "[#{key}] <span class=warning>Title Link Blocked</span> (are you using NoScript?)</a>"
|
$.prepend link, $.tn "[#{key}] "
|
||||||
return
|
return
|
||||||
|
|
||||||
cb:
|
cb:
|
||||||
toggle: ->
|
toggle: ->
|
||||||
[string, @textContent] = if $.hasClass @, "embedded"
|
if $.hasClass @, "embedded"
|
||||||
['unembed', '(embed)']
|
$.rm @previousElementSibling
|
||||||
|
@previousElementSibling.hidden = false
|
||||||
|
@textContent = '(embed)'
|
||||||
else
|
else
|
||||||
['embed', '(unembed)']
|
@previousElementSibling.hidden = true
|
||||||
$.replace @previousElementSibling, Linkify.cb[string] @
|
$.before @, Linkify.cb.embed @
|
||||||
|
@textContent = '(unembed)'
|
||||||
$.toggleClass @, 'embedded'
|
$.toggleClass @, 'embedded'
|
||||||
|
|
||||||
embed: (a) ->
|
embed: (a) ->
|
||||||
@ -214,21 +209,8 @@ Linkify =
|
|||||||
|
|
||||||
return el
|
return el
|
||||||
|
|
||||||
unembed: (a) ->
|
|
||||||
# Recreate the original link.
|
|
||||||
el = $.el 'a',
|
|
||||||
rel: 'nofollow noreferrer'
|
|
||||||
target: 'blank'
|
|
||||||
className: 'linkify'
|
|
||||||
href: a.dataset.href
|
|
||||||
innerHTML: a.dataset.title or a.dataset.nodedata
|
|
||||||
|
|
||||||
$.addClass el, a.dataset.key
|
|
||||||
|
|
||||||
return el
|
|
||||||
|
|
||||||
title: (req, data) ->
|
title: (req, data) ->
|
||||||
[key, uid, options, link, embed] = data
|
[key, uid, options, link, post] = data
|
||||||
{status} = req
|
{status} = req
|
||||||
service = Linkify.types[key].title
|
service = Linkify.types[key].title
|
||||||
|
|
||||||
@ -243,8 +225,11 @@ Linkify =
|
|||||||
"#{status}'d"
|
"#{status}'d"
|
||||||
}"
|
}"
|
||||||
|
|
||||||
embed.dataset.title = text if Conf['Embedding'] and status in [200, 304]
|
link.textContent = text
|
||||||
link.textContent = text if link
|
for post2 in post.clones
|
||||||
|
for link2 in $$ 'a', post2.nodes.comment when link2.href is link.href
|
||||||
|
link2.textContent = text
|
||||||
|
return
|
||||||
|
|
||||||
ordered_types: [
|
ordered_types: [
|
||||||
key: 'audio'
|
key: 'audio'
|
||||||
@ -271,8 +256,10 @@ Linkify =
|
|||||||
regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/
|
regExp: /(http|www).*\.(gif|png|jpg|jpeg|bmp)$/
|
||||||
style: 'border: 0; width: auto; height: auto;'
|
style: 'border: 0; width: auto; height: auto;'
|
||||||
el: (a) ->
|
el: (a) ->
|
||||||
$.el 'div',
|
el = $.el 'div'
|
||||||
innerHTML: "<a target=_blank href='#{a.dataset.href}'><img src='#{a.dataset.href}'></a>"
|
el.innerHTML = '<a target="_blank"><img></a>'
|
||||||
|
el.firstChild.href = el.firstChild.firstChild.src = a.dataset.href
|
||||||
|
el
|
||||||
,
|
,
|
||||||
key: 'InstallGentoo'
|
key: 'InstallGentoo'
|
||||||
regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/
|
regExp: /.*(?:paste.installgentoo.com\/view\/)([0-9a-z_]+)/
|
||||||
@ -298,35 +285,36 @@ Linkify =
|
|||||||
el
|
el
|
||||||
,
|
,
|
||||||
key: 'MediaCrush'
|
key: 'MediaCrush'
|
||||||
regExp: /.*(?:mediacru.sh\/)([0-9a-z_]+)/i
|
regExp: /.*(?:mediacru.sh\/)([0-9a-z_-]+)/i
|
||||||
style: 'border: 0;'
|
style: 'border: 0;'
|
||||||
el: (a) ->
|
el: (a) ->
|
||||||
el = $.el 'div'
|
el = $.el 'div'
|
||||||
$.cache "https://mediacru.sh/#{a.dataset.uid}.json", ->
|
$.cache "https://mediacru.sh/#{a.dataset.uid}.json", ->
|
||||||
{status} = @
|
{status} = @
|
||||||
return div.innerHTML = "ERROR #{status}" unless status in [200, 304]
|
return el.textContent = "ERROR #{status}" unless status in [200, 304]
|
||||||
{files} = @response
|
{files} = @response
|
||||||
for type in ['video/mp4', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'image/svg', 'audio/mpeg']
|
for type in ['video/mp4', 'video/webm', 'video/ogv', 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg', 'audio/mpeg', 'audio/ogg']
|
||||||
for file in files
|
for file in files
|
||||||
if file.type is type
|
if file.type is type
|
||||||
embed = file
|
embed = file
|
||||||
break
|
break
|
||||||
break if embed
|
break if embed
|
||||||
return div.innerHTML = "ERROR: Not a valid filetype" unless embed
|
return div.textContent = "ERROR: Not a valid filetype" unless embed
|
||||||
el.innerHTML = switch embed.type
|
switch embed.type
|
||||||
when 'video/mp4', 'video/ogv' then """
|
when 'video/mp4', 'video/webm', 'video/ogv'
|
||||||
<video autoplay loop>
|
el.innerHTML = '<video autoplay loop><source type="video/mp4"><source type="video/webm"><source type="video/ogg"></video>'
|
||||||
<source src="https://mediacru.sh/#{a.dataset.uid}.mp4" type="video/mp4;">
|
for ext, i in ['mp4', 'webm', 'ogv']
|
||||||
<source src="https://mediacru.sh/#{a.dataset.uid}.ogv" type="video/ogg; codecs='theora, vorbis'">
|
el.firstChild.children[i].src = "https://mediacru.sh/#{a.dataset.uid}.#{ext}"
|
||||||
</video>"""
|
when 'image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'
|
||||||
when 'image/png', 'image/gif', 'image/jpeg'
|
el.innerHTML = '<a target="_blank"><img></a>'
|
||||||
"<a target=_blank href='#{a.dataset.href}'><img src='https://mediacru.sh/#{file.file}'></a>"
|
el.firstChild.href = a.dataset.href
|
||||||
when 'image/svg', 'image/svg+xml'
|
el.firstChild.firstChild.src = "https://mediacru.sh/#{file.file}"
|
||||||
"<embed src='https://mediacru.sh/#{file.file}' type='image/svg+xml' />"
|
when 'audio/mpeg', 'audio/ogg'
|
||||||
when 'audio/mpeg'
|
el.innerHTML = '<audio controls><source type="audio/ogg"><source type="audio/mpeg"></audio>'
|
||||||
"<audio controls><source src='https://mediacru.sh/#{file.file}'></audio>"
|
for ext, i in ['ogg', 'mp3']
|
||||||
|
el.firstChild.children[i].src = "https://mediacru.sh/#{a.dataset.uid}.#{ext}"
|
||||||
else
|
else
|
||||||
"ERROR: No valid filetype."
|
el.textContent = "ERROR: No valid filetype."
|
||||||
el
|
el
|
||||||
,
|
,
|
||||||
key: 'pastebin'
|
key: 'pastebin'
|
||||||
@ -343,19 +331,12 @@ Linkify =
|
|||||||
,
|
,
|
||||||
key: 'SoundCloud'
|
key: 'SoundCloud'
|
||||||
regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/
|
regExp: /.*(?:soundcloud.com\/|snd.sc\/)([^#\&\?]*).*/
|
||||||
style: 'height: auto; width: 500px; display: inline-block;'
|
style: 'border: 0; width: 500px; height: 400px;'
|
||||||
el: (a) ->
|
el: (a) ->
|
||||||
div = $.el 'div',
|
$.el 'iframe',
|
||||||
className: "soundcloud"
|
src: "//w.soundcloud.com/player/?visual=true&show_comments=false&url=https%3A%2F%2Fsoundcloud.com%2F#{encodeURIComponent a.dataset.uid}"
|
||||||
name: "soundcloud"
|
|
||||||
$.ajax(
|
|
||||||
"//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/#{a.dataset.uid}"
|
|
||||||
onloadend: ->
|
|
||||||
div.innerHTML = JSON.parse(@responseText).html
|
|
||||||
false)
|
|
||||||
div
|
|
||||||
title:
|
title:
|
||||||
api: (uid) -> "//soundcloud.com/oembed?show_artwork=false&&maxwidth=500px&show_comments=false&format=json&url=https://www.soundcloud.com/#{uid}"
|
api: (uid) -> "//soundcloud.com/oembed?format=json&url=https%3A%2F%2Fsoundcloud.com%2F#{encodeURIComponent uid}"
|
||||||
text: (_) -> _.title
|
text: (_) -> _.title
|
||||||
,
|
,
|
||||||
key: 'StrawPoll'
|
key: 'StrawPoll'
|
||||||
@ -369,26 +350,21 @@ Linkify =
|
|||||||
regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/
|
regExp: /.*(?:twitch.tv\/)([^#\&\?]*).*/
|
||||||
style: "border: none; width: 640px; height: 360px;"
|
style: "border: none; width: 640px; height: 360px;"
|
||||||
el: (a) ->
|
el: (a) ->
|
||||||
if result = /(\w+)\/(?:[a-z]\/)?(\d+)/i.exec a.dataset.uid
|
if result = /(\w+)\/([bc])\/(\d+)/i.exec a.dataset.uid
|
||||||
[_, channel, chapter] = result
|
[_, channel, type, id] = result
|
||||||
|
idparam = {'b': 'archive_id', 'c': 'chapter_id'}
|
||||||
$.el 'object',
|
obj = $.el 'object',
|
||||||
data: 'http://www.twitch.tv/widgets/archive_embed_player.swf'
|
data: 'http://www.twitch.tv/widgets/archive_embed_player.swf'
|
||||||
innerHTML: """
|
obj.innerHTML = '<param name="allowFullScreen" value="true"><param name="flashvars">'
|
||||||
<param name='allowFullScreen' value='true' />
|
obj.children[1].value = "channel=#{channel}&start_volume=25&auto_play=false&#{idparam[type]}=#{id}"
|
||||||
<param name='flashvars' value='channel=#{channel}&start_volume=25&auto_play=false#{if chapter then "&chapter_id=" + chapter else ""}' />
|
obj
|
||||||
"""
|
|
||||||
|
|
||||||
else
|
else
|
||||||
channel = (/(\w+)/.exec a.dataset.uid)[0]
|
channel = (/(\w+)/.exec a.dataset.uid)[0]
|
||||||
|
obj = $.el 'object',
|
||||||
$.el 'object',
|
|
||||||
data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=#{channel}"
|
data: "http://www.twitch.tv/widgets/live_embed_player.swf?channel=#{channel}"
|
||||||
innerHTML: """
|
obj.innerHTML = '<param name="allowFullScreen" value="true"><param name="flashvars">'
|
||||||
<param name="allowFullScreen" value="true" />
|
obj.children[1].value = "hostname=www.twitch.tv&channel=#{channel}&auto_play=true&start_volume=25"
|
||||||
<param name="movie" value="http://www.twitch.tv/widgets/live_embed_player.swf" />
|
obj
|
||||||
<param name="flashvars" value="hostname=www.twitch.tv&channel=#{channel}&auto_play=true&start_volume=25" />
|
|
||||||
"""
|
|
||||||
,
|
,
|
||||||
key: 'Vocaroo'
|
key: 'Vocaroo'
|
||||||
regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/
|
regExp: /.*(?:vocaroo.com\/)([^#\&\?]*).*/
|
||||||
|
|||||||
@ -51,7 +51,7 @@ QR =
|
|||||||
if Conf['QR Shortcut']
|
if Conf['QR Shortcut']
|
||||||
$.rmClass $('.qr-shortcut'), 'disabled'
|
$.rmClass $('.qr-shortcut'), 'disabled'
|
||||||
|
|
||||||
$.before $.id('togglePostForm') or $.id('postForm'), link
|
$.before $.id('togglePostFormLink'), link
|
||||||
|
|
||||||
$.on d, 'QRGetSelectedPost', ({detail: cb}) ->
|
$.on d, 'QRGetSelectedPost', ({detail: cb}) ->
|
||||||
cb QR.selected
|
cb QR.selected
|
||||||
@ -435,7 +435,6 @@ QR =
|
|||||||
setNode 'addPost', '#add-post'
|
setNode 'addPost', '#add-post'
|
||||||
setNode 'charCount', '#char-count'
|
setNode 'charCount', '#char-count'
|
||||||
setNode 'fileSubmit', '#file-n-submit'
|
setNode 'fileSubmit', '#file-n-submit'
|
||||||
setNode 'filesize', '#qr-filesize'
|
|
||||||
setNode 'filename', '#qr-filename'
|
setNode 'filename', '#qr-filename'
|
||||||
setNode 'fileContainer', '#qr-filename-container'
|
setNode 'fileContainer', '#qr-filename-container'
|
||||||
setNode 'fileRM', '#qr-filerm'
|
setNode 'fileRM', '#qr-filerm'
|
||||||
|
|||||||
@ -156,7 +156,7 @@ QR.post = class
|
|||||||
@save node
|
@save node
|
||||||
return
|
return
|
||||||
|
|
||||||
setFile: (@file) ->
|
setFile: (@file, el) ->
|
||||||
@filename = file.name
|
@filename = file.name
|
||||||
@filesize = $.bytesToString file.size
|
@filesize = $.bytesToString file.size
|
||||||
@nodes.label.hidden = false if QR.spoiler
|
@nodes.label.hidden = false if QR.spoiler
|
||||||
@ -167,10 +167,8 @@ QR.post = class
|
|||||||
@updateFilename()
|
@updateFilename()
|
||||||
unless /^(image|video)\//.test file.type
|
unless /^(image|video)\//.test file.type
|
||||||
@nodes.el.style.backgroundImage = null
|
@nodes.el.style.backgroundImage = null
|
||||||
return
|
|
||||||
@setThumbnail()
|
|
||||||
|
|
||||||
setThumbnail: ->
|
setThumbnail: (el) ->
|
||||||
# Create a redimensioned thumbnail.
|
# Create a redimensioned thumbnail.
|
||||||
isVideo = /^video\//.test @file.type
|
isVideo = /^video\//.test @file.type
|
||||||
el = $.el (if isVideo then 'video' else 'img')
|
el = $.el (if isVideo then 'video' else 'img')
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user