diff --git a/CHANGELOG.md b/CHANGELOG.md
index 16db81b1..edc7e7d7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@
* fixes shell command detection on Windows
* fixes `.htaccess` auth issues
* adds `rust` type and icon
+* adds `autoplay` option to audio and video preview
* removes *Install* section from `README.md`, caused to much trouble
* updates build process to use `node 6.0+`, no need for babel now
* replaces `jquery-qrcode` with `kjua`
diff --git a/ghu.js b/ghu.js
index 2bb93ba9..6e78c76e 100644
--- a/ghu.js
+++ b/ghu.js
@@ -68,7 +68,7 @@ ghu.task('build:scripts', runtime => {
.then(webpack(webpackCfg([SRC]), {showStats: false}))
.then(wrap('\n\n// @include "pre.js"\n\n'))
.then(includeit())
- .then(ife(() => runtime.args.production, uglify()))
+ .then(ife(() => runtime.args.production, uglify({compressor: {warnings: false}})))
.then(wrap(runtime.commentJs))
.then(write(mapper, {overwrite: true}));
});
diff --git a/src/_h5ai/private/conf/options.json b/src/_h5ai/private/conf/options.json
index fa2d4ced..87dedb5c 100644
--- a/src/_h5ai/private/conf/options.json
+++ b/src/_h5ai/private/conf/options.json
@@ -220,6 +220,7 @@
*/
"preview-aud": {
"enabled": true,
+ "autoplay": true,
"types": ["aud"]
},
@@ -283,6 +284,7 @@
*/
"preview-vid": {
"enabled": true,
+ "autoplay": true,
"types": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"]
},
diff --git a/src/_h5ai/public/css/lib/ext/preview-txt.less b/src/_h5ai/public/css/lib/ext/preview-txt.less
index e005db94..508a6103 100644
--- a/src/_h5ai/public/css/lib/ext/preview-txt.less
+++ b/src/_h5ai/public/css/lib/ext/preview-txt.less
@@ -1,6 +1,7 @@
#pv-content-txt {
.raised;
+ box-sizing: border-box;
max-width: 960px;
text-align: left;
background: @col-back-paper;
@@ -17,20 +18,19 @@
color: #68A9FF;
}
}
+}
- &.highlighted {
-
- code {
- line-height: 1.2em;
- }
- }
-
- &.markdown {
- font-size: 1.1em;
- padding: 8px 24px;
-
- code {
- color: #008200;
- }
+pre#pv-content-txt {
+ code {
+ line-height: 1.2em;
+ }
+}
+
+div#pv-content-txt {
+ font-size: 1.1em;
+ padding: 8px 24px;
+
+ code {
+ color: #008200;
}
}
diff --git a/src/_h5ai/public/css/lib/ext/preview.less b/src/_h5ai/public/css/lib/ext/preview.less
index aa4fd1e6..f17b504b 100644
--- a/src/_h5ai/public/css/lib/ext/preview.less
+++ b/src/_h5ai/public/css/lib/ext/preview.less
@@ -16,7 +16,7 @@
background: @col-grey-900;
}
-#pv-content {
+#pv-container {
position: absolute;
}
diff --git a/src/_h5ai/public/js/lib/ext/preview/preview-aud.js b/src/_h5ai/public/js/lib/ext/preview/preview-aud.js
index a91662b6..446ae4c4 100644
--- a/src/_h5ai/public/js/lib/ext/preview/preview-aud.js
+++ b/src/_h5ai/public/js/lib/ext/preview/preview-aud.js
@@ -1,38 +1,27 @@
-const {each, dom} = require('../../util');
-const event = require('../../core/event');
+const {dom} = require('../../util');
const format = require('../../core/format');
const allsettings = require('../../core/settings');
const preview = require('./preview');
-const previewX = require('./preview-x');
const settings = Object.assign({
enabled: false,
+ autoplay: true,
types: []
}, allsettings['preview-aud']);
const tpl = '';
let state;
-const onAdjustSize = () => {
+const updateGui = () => {
const el = dom('#pv-content-aud')[0];
if (!el) {
return;
}
- const elContent = dom('#pv-content')[0];
- const contentW = elContent.offsetWidth;
- const contentH = elContent.offsetHeight;
- const elW = el.offsetWidth;
- const elH = el.offsetHeight;
-
- dom(el).css({
- left: (contentW - elW) * 0.5 + 'px',
- top: (contentH - elH) * 0.5 + 'px'
- });
-
+ preview.centerContent();
preview.setLabels([
state.item.label,
- format.formatDate(dom('#pv-content-aud')[0].duration * 1000, 'm:ss')
+ format.formatDate(el.duration * 1000, 'm:ss')
]);
};
@@ -40,26 +29,25 @@ const loadAudio = item => {
return new Promise(resolve => {
const $el = dom(tpl)
.on('loadedmetadata', () => resolve($el))
- // .attr('autoplay', 'autoplay')
.attr('controls', 'controls')
.attr('src', item.absHref);
+
+ if (settings.autoplay) {
+ $el.attr('autoplay', 'autoplay');
+ }
});
- // .then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)));
};
const onEnter = (items, idx) => {
- state = previewX.pvState(items, idx, loadAudio, onAdjustSize);
+ state = preview.state(items, idx, loadAudio, updateGui);
};
-const initItem = previewX.initItemFn(settings.types, onEnter);
-const onViewChanged = added => each(added, initItem);
-
const init = () => {
if (!settings.enabled) {
return;
}
- event.sub('view.changed', onViewChanged);
+ preview.register(settings.types, onEnter);
};
init();
diff --git a/src/_h5ai/public/js/lib/ext/preview/preview-img.js b/src/_h5ai/public/js/lib/ext/preview/preview-img.js
index 8cbe8356..6202e604 100644
--- a/src/_h5ai/public/js/lib/ext/preview/preview-img.js
+++ b/src/_h5ai/public/js/lib/ext/preview/preview-img.js
@@ -1,9 +1,7 @@
-const {each, dom} = require('../../util');
+const {dom} = require('../../util');
const server = require('../../server');
-const event = require('../../core/event');
const allsettings = require('../../core/settings');
const preview = require('./preview');
-const previewX = require('./preview-x');
const settings = Object.assign({
enabled: false,
@@ -14,22 +12,15 @@ const tpl = '';
let state;
-const onAdjustSize = () => {
+const updateGui = () => {
const el = dom('#pv-content-img')[0];
if (!el) {
return;
}
- const elContent = dom('#pv-content')[0];
- const contentW = elContent.offsetWidth;
- const contentH = elContent.offsetHeight;
- const elW = el.offsetWidth;
- const elH = el.offsetHeight;
+ preview.centerContent();
- dom(el).css({
- left: (contentW - elW) * 0.5 + 'px',
- top: (contentH - elH) * 0.5 + 'px'
- });
+ const elW = el.offsetWidth;
const labels = [state.item.label];
if (!settings.size) {
@@ -61,26 +52,22 @@ const loadImage = item => {
return settings.size ? requestSample(href) : href;
})
.then(href => new Promise(resolve => {
- const $img = dom(tpl)
- .on('load', () => resolve($img))
+ const $el = dom(tpl)
+ .on('load', () => resolve($el))
.attr('src', href);
}));
- // .then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)));
};
const onEnter = (items, idx) => {
- state = previewX.pvState(items, idx, loadImage, onAdjustSize);
+ state = preview.state(items, idx, loadImage, updateGui);
};
-const initItem = previewX.initItemFn(settings.types, onEnter);
-const onViewChanged = added => each(added, initItem);
-
const init = () => {
if (!settings.enabled) {
return;
}
- event.sub('view.changed', onViewChanged);
+ preview.register(settings.types, onEnter);
};
init();
diff --git a/src/_h5ai/public/js/lib/ext/preview/preview-txt.js b/src/_h5ai/public/js/lib/ext/preview/preview-txt.js
index 31442795..37c94eac 100644
--- a/src/_h5ai/public/js/lib/ext/preview/preview-txt.js
+++ b/src/_h5ai/public/js/lib/ext/preview/preview-txt.js
@@ -1,33 +1,28 @@
const lolight = require('lolight');
const marked = require('marked');
-const {each, keys, dom} = require('../../util');
+const {keys, dom} = require('../../util');
const {win} = require('../../globals');
-const event = require('../../core/event');
const allsettings = require('../../core/settings');
const preview = require('./preview');
-const previewX = require('./preview-x');
const XHR = win.XMLHttpRequest;
const settings = Object.assign({
enabled: false,
styles: {}
}, allsettings['preview-txt']);
-const tplText = '
').text(content).appTo($text);
+ const $code = dom('
').text(content);
win.setTimeout(() => {
lolight.el($code[0]);
}, content.length < 20000 ? 0 : 500);
- } else {
- $text = dom(tplMarkdown).text(content);
+ return dom(tplPre).app($code);
}
- return $text;
+ return dom(tplDiv).text(content);
});
- // .then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)));
};
const onEnter = (items, idx) => {
- state = previewX.pvState(items, idx, loadText, onAdjustSize);
+ state = preview.state(items, idx, loadText, updateGui);
};
-const initItem = previewX.initItemFn(keys(settings.styles), onEnter);
-const onViewChanged = added => each(added, initItem);
-
const init = () => {
if (!settings.enabled) {
return;
}
- event.sub('view.changed', onViewChanged);
+ preview.register(keys(settings.styles), onEnter);
};
init();
diff --git a/src/_h5ai/public/js/lib/ext/preview/preview-vid.js b/src/_h5ai/public/js/lib/ext/preview/preview-vid.js
index 74f63b1b..dadea90f 100644
--- a/src/_h5ai/public/js/lib/ext/preview/preview-vid.js
+++ b/src/_h5ai/public/js/lib/ext/preview/preview-vid.js
@@ -1,34 +1,25 @@
-const {each, dom} = require('../../util');
-const event = require('../../core/event');
+const {dom} = require('../../util');
const allsettings = require('../../core/settings');
const preview = require('./preview');
-const previewX = require('./preview-x');
const settings = Object.assign({
enabled: false,
+ autoplay: true,
types: []
}, allsettings['preview-vid']);
const tpl = '';
let state;
-const onAdjustSize = () => {
+const updateGui = () => {
const el = dom('#pv-content-vid')[0];
if (!el) {
return;
}
- const elContent = dom('#pv-content')[0];
- const contentW = elContent.offsetWidth;
- const contentH = elContent.offsetHeight;
+ preview.centerContent();
+
const elW = el.offsetWidth;
- const elH = el.offsetHeight;
-
- dom(el).css({
- left: (contentW - elW) * 0.5 + 'px',
- top: (contentH - elH) * 0.5 + 'px'
- });
-
const elVW = el.videoWidth;
const elVH = el.videoHeight;
@@ -43,26 +34,25 @@ const loadVideo = item => {
return new Promise(resolve => {
const $el = dom(tpl)
.on('loadedmetadata', () => resolve($el))
- // .attr('autoplay', 'autoplay')
.attr('controls', 'controls')
.attr('src', item.absHref);
+
+ if (settings.autoplay) {
+ $el.attr('autoplay', 'autoplay');
+ }
});
- // .then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)));
};
const onEnter = (items, idx) => {
- state = previewX.pvState(items, idx, loadVideo, onAdjustSize);
+ state = preview.state(items, idx, loadVideo, updateGui);
};
-const initItem = previewX.initItemFn(settings.types, onEnter);
-const onViewChanged = added => each(added, initItem);
-
const init = () => {
if (!settings.enabled) {
return;
}
- event.sub('view.changed', onViewChanged);
+ preview.register(settings.types, onEnter);
};
init();
diff --git a/src/_h5ai/public/js/lib/ext/preview/preview-x.js b/src/_h5ai/public/js/lib/ext/preview/preview-x.js
deleted file mode 100644
index 2aea4cac..00000000
--- a/src/_h5ai/public/js/lib/ext/preview/preview-x.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const {includes, compact, dom} = require('../../util');
-const preview = require('./preview');
-
-const initItemFn = (types, onEnter) => {
- return item => {
- if (item.$view && includes(types, item.type)) {
- item.$view.find('a').on('click', ev => {
- ev.preventDefault();
-
- const matchedItems = compact(dom('#items .item').map(el => {
- const matchedItem = el._item;
- return includes(types, matchedItem.type) ? matchedItem : null;
- }));
-
- onEnter(matchedItems, matchedItems.indexOf(item));
- });
- }
- };
-};
-
-const pvState = (items, idx = 0, load, adjust) => {
- const inst = Object.assign(Object.create(pvState.prototype), {items, load, adjust});
- preview.setOnAdjustSize(adjust);
- preview.setOnIndexChange(delta => inst.moveIdx(delta));
- preview.enter();
- inst.setIdx(idx);
- return inst;
-};
-
-pvState.prototype = {
- constructor: pvState,
-
- setIdx(idx) {
- this.idx = (idx + this.items.length) % this.items.length;
- this.item = this.items[this.idx];
- preview.setLabels([this.item.label]);
- preview.setIndex(this.idx + 1, this.items.length);
- preview.setRawLink(this.item.absHref);
- this.loadContent(this.item);
- },
-
- moveIdx(delta) {
- this.setIdx(this.idx + delta);
- },
-
- loadContent(item) {
- Promise.resolve()
- .then(() => {
- dom('#pv-content').hide().clr();
- preview.showSpinner(true, item.thumbSquare || item.icon, 200);
- })
- .then(() => this.load(item))
- .then($content => {
- if (item !== this.item) {
- return;
- }
- preview.showSpinner(false);
-
- dom('#pv-content').clr().app($content).show();
- this.adjust();
- });
- }
-};
-
-module.exports = {
- initItemFn,
- pvState
-};
diff --git a/src/_h5ai/public/js/lib/ext/preview/preview.js b/src/_h5ai/public/js/lib/ext/preview/preview.js
index 3973719d..5146d484 100644
--- a/src/_h5ai/public/js/lib/ext/preview/preview.js
+++ b/src/_h5ai/public/js/lib/ext/preview/preview.js
@@ -1,16 +1,16 @@
-const {each, isFn, isNum, dom} = require('../../util');
+const {each, isFn, isNum, dom, includes, compact} = require('../../util');
const {win} = require('../../globals');
+const event = require('../../core/event');
const resource = require('../../core/resource');
const allsettings = require('../../core/settings');
const store = require('../../core/store');
-
const settings = Object.assign({
enabled: true
}, allsettings.preview);
const tplOverlay =
`