Skip to content

Commit

Permalink
Attempt assistance for new scripts. (#1851)
Browse files Browse the repository at this point in the history
* Doesn't matter if we are in lockdown or not for this.
* NOTE: On dev this didn't work except under Linux SeaMonkey 2.53.8.1 but not Chromium and Fx 94.0.1. Could be a jQuery dep issue or even a browser issue that appeared... or perhaps something changed scope wise. Commented where it happens. This is better than nothing imho. Maybe it will work under pro and perhaps Windows. \*shrugs\*
* This feature is very BETA due to the issue encountered in other browsers. Any suggestions are welcome.

Post #1847

Auto-merge BETA
  • Loading branch information
Martii authored Nov 21, 2021
1 parent 46cdd88 commit 288eb20
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 6 deletions.
15 changes: 10 additions & 5 deletions views/includes/scriptAuthorToolsPanel.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,22 @@

{{^script.isLib}}
<h4>UserScript Block</h4>
<div class="form-group">
<div class="input-group col-xs-12">
<span class="input-group-btn">
<button class="btn btn-default btn-group-justified" id="regenerate" title="Click this to regenerate some keys based off the current code changes. Warning: If the source is large it may take a while depending on platform. This feature is BETA."><i class="fa fa-fw fa-history"></i> Regenerate some keys from current source</button>
</span>
</div>
</div>
{{/script.isLib}}

{{^script.isLib}}
{{^newScript}}
<div class="form-group">
<div class="input-group col-xs-12">
<span class="input-group-btn">
<button class="btn btn-{{#lockdown.updateURLCheck}}info{{/lockdown.updateURLCheck}}{{^lockdown.updateURLCheck}}default{{/lockdown.updateURLCheck}}" id="updateurl-raw" data-clipboard-text="// @updateURL {{{script.scriptPermalinkMetaPageUrl}}}" title="Copy key and raw URL to clipboard"><i class="octicon octicon-clippy"></i> // @updateURL</button>
</span>
<input type="text" class="form-control" id="updateurl" value="{{{script.scriptPermalinkMetaPageUrl}}}" readonly="readonly">
<input type="text" class="form-control" id="updateurl" value="{{{script.scriptPermalinkMetaPageUrl}}}" placeholder="empty" readonly="readonly">
<span class="input-group-btn">
<a class="btn btn-{{#lockdown.updateURLCheck}}info{{/lockdown.updateURLCheck}}{{^lockdown.updateURLCheck}}default{{/lockdown.updateURLCheck}}"
title="How do I use this?"
Expand All @@ -38,9 +44,9 @@ <h4>UserScript Block</h4>
<span class="input-group-btn">
<button class="btn btn-default" id="downloadurl-raw" data-clipboard-text="// @downloadURL {{#script.meta.UserScript.downloadURL}}{{{script.meta.UserScript.downloadURL.0.value}}}{{/script.meta.UserScript.downloadURL}}{{^script.meta.UserScript.downloadURL}}{{{script.scriptPermalinkInstallPageUrl}}}{{/script.meta.UserScript.downloadURL}}" title="Copy key and raw URL to clipboard"><i class="octicon octicon-clippy"></i> // @downloadURL</button>
</span>
<input type="text" class="form-control" id="downloadurl" value="{{#script.meta.UserScript.downloadURL}}{{{script.meta.UserScript.downloadURL.0.value}}}{{/script.meta.UserScript.downloadURL}}{{^script.meta.UserScript.downloadURL}}{{{script.scriptPermalinkInstallPageUrl}}}{{/script.meta.UserScript.downloadURL}}" readonly="readonly">
<input type="text" class="form-control" id="downloadurl" value="{{#script.meta.UserScript.downloadURL}}{{{script.meta.UserScript.downloadURL.0.value}}}{{/script.meta.UserScript.downloadURL}}{{^script.meta.UserScript.downloadURL}}{{{script.scriptPermalinkInstallPageUrl}}}{{/script.meta.UserScript.downloadURL}}" placeholder="empty" readonly="readonly">
<span class="input-group-btn dropup">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Alternate download source targets"><span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> </button>
<button type="button" class="btn btn-default dropdown-toggle" id="alt-install-target-btn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Alternate download source targets"{{#newScript}} disabled="disabled"{{/newScript}}><span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> </button>
<ul class="dropdown-menu scrollable-menu dropdown-menu-right" id="install-targets">
{{#script.availableScriptPermalinkInstallPageUrl}}<li {{#default}}class="active"{{/default}}><a href="#" title="{{{url}}">{{label}}</a></li>{{/script.availableScriptPermalinkInstallPageUrl}}
</ul>
Expand All @@ -54,7 +60,6 @@ <h4>UserScript Block</h4>
</span>
</div>
</div>
{{/newScript}}
{{/script.isLib}}

{{#script.isLib}}
Expand Down
125 changes: 124 additions & 1 deletion views/includes/scripts/clipboard.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
<script type="text/javascript" src="/redist/npm/clipboard/dist/clipboard.js"></script>
<script type="text/javascript" charset="UTF-8" src="/redist/npm/clipboard/dist/clipboard.js"></script>
<script type="text/javascript" charset="UTF-8" src="/redist/npm/ace-builds/src/ace.js"></script>
<script type="text/javascript">
(function () {

var clipboard = null;
var rMin = /\.min\.js$/;

var regenerateId = '#regenerate';

var allowedIds = [
'#copyright-raw',
'#downloadurl-raw',
Expand All @@ -26,6 +29,65 @@
});
}

// TODO: Should keep in sync with all peg.js upmixes eventually
function parseMeta(aString) {
aString = aString.toString();
var re = /\/\/ @(\S+)(?:\s+(.*))?/;
var headers = {};
var name = null;
var prefix = null;
var header = null;
var key = null;
var value = null;
var lines = aString.split(/[\r\n]+/).filter(function (aE, aI, aA) {
return (aE.match(re));
});
var line = null;

for (line in lines) {
[, name, value] = lines[line].replace(/\s+$/, "").match(re);
switch (name) {
case "licence":
name = "license";
break;
}
[key, prefix] = name.split(/:/).reverse();
if (key) {
if (prefix) {
if (!headers[prefix])
headers[prefix] = new Object;
header = headers[prefix];
}
else
header = headers;

if (header[key]) {
if (!(header[key] instanceof Array))
header[key] = new Array(header[key]);
header[key].push(value || "");
}
else
header[key] = value || "";
}
}
if (headers["license"])
headers["licence"] = headers["license"];

return (headers.toSource() != "({})") ? headers : undefined;
}

// NOTE: Keep in sync with helpers.js
cleanFilename = function (aFilename, aDefaultName) {
// Blacklist problem characters (slashes, colons, etc.).
var cleanName = (aFilename || '').replace(/[\\\/:*?\'\"<>|#;@=&]/g, '')

// Make whitespace readable.
.replace(/(\s|%20)+/g, '_');

return cleanName || aDefaultName;
};

//
if (ClipboardJS.isSupported()) {
clipboard = new ClipboardJS(allowedIds.join(', '));

Expand All @@ -43,5 +105,66 @@
unsupported();
}

editor = ace.edit("editor");

$(regenerateId).on('click', function () {
var rawSource = editor.getSession().getValue();
var parser = 'UserScript';
var block = null;
var rHeaderContent = new RegExp(
'^(?:\\uFEFF)?\/\/ ==' + parser + '==([\\s\\S]*?)^\/\/ ==\/'+ parser + '==', 'm'
);

var names = null;
var name = null;
var updateURL = null;
var downloadURL = null;

var headerContent = rHeaderContent.exec(rawSource);
if (headerContent) {
block = parseMeta(headerContent);

// WARNING: Lines after this don't work in Fx or Chromium atm on return on dev but does in SM
// Function is exited with debugging however nothing happens afterwards. Also tried moving
// parseMeta into local funcion scope with no difference.

if (block['name']) {
names = block['name'].reverse();
name = cleanFilename(names[0]);
if (name) {
updateURL = window.location.origin +
'/meta/' + '{{authedUser.name}}' + '/' + name + '.meta.js';

downloadURL = window.location.origin +
'/install/' + '{{authedUser.name}}' + '/' + name + '.user.js';

// TODO: Maybe add in alternate install-targets at a later date after browser
// testing on pro

$('#updateurl').val(updateURL);
$('#updateurl-raw').attr('data-clipboard-text', '// @updateURL ' + updateURL);
$('#downloadurl').val(downloadURL);
$('#downloadurl-raw').attr('data-clipboard-text', '// @downloadURL ' + downloadURL);

$('#install-targets').empty();
$('#install-targets').attr('disabled', 'disabled');
$('#alt-install-target-btn').attr('disabled', 'disabled');

return;
}
}
}

// Default
$('#updateurl').val('');
$('#updateurl-raw').attr('data-clipboard-text', '// @updateURL ');
$('#downloadurl').val('');
$('#downloadurl-raw').attr('data-clipboard-text', '// @downloadURL ');

$('#install-targets').empty();
$('#install-targets').attr('disabled', 'disabled');
$('#alt-install-target-btn').attr('disabled', 'disabled');
});

})();
</script>

0 comments on commit 288eb20

Please sign in to comment.