Skip to content

Commit f58b002

Browse files
committed
implement client-accessible js versioning & footer tooltip
2 parents 52693d0 + 01e9a5f commit f58b002

16 files changed

Lines changed: 218 additions & 105 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Thumbs.db
2424

2525
# generated content
2626
public.versions.json
27+
client/versions.json
2728

2829
# NPM packages folder.
2930
node_modules/

assets/fonts/icons/icons.woff

144 Bytes
Binary file not shown.

client/footer/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
var showLinkType = require('./showLinkType');
3+
4+
exports.init = function() {
5+
showLinkType();
6+
};
7+

client/footer/showLinkType.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
var closest = require('client/dom/closest');
2+
3+
module.exports = function() {
4+
5+
var tooltipSpan = null;
6+
var shiftX = 8;
7+
var shiftY = 10;
8+
9+
function updatePosition(event) {
10+
tooltipSpan.style.left = Math.min(event.clientX + shiftX, window.innerWidth - tooltipSpan.offsetWidth) + 'px';
11+
tooltipSpan.style.top = Math.min(event.clientY + shiftY, window.innerHeight - tooltipSpan.offsetHeight) + 'px';
12+
}
13+
14+
document.addEventListener('mouseover', function(event) {
15+
var link = closest(event.target, 'a');
16+
if (!link) return;
17+
18+
tooltipSpan = document.createElement('span');
19+
tooltipSpan.className = 'link__type';
20+
tooltipSpan.setAttribute('data-url', link.getAttribute('href'));
21+
22+
document.body.appendChild(tooltipSpan);
23+
updatePosition(event);
24+
25+
document.addEventListener('mousemove', updatePosition);
26+
});
27+
28+
document.addEventListener('mouseout', function() {
29+
if (!tooltipSpan) return;
30+
31+
document.removeEventListener('mousemove', updatePosition);
32+
tooltipSpan.remove();
33+
tooltipSpan = null;
34+
});
35+
};

client/head/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ exports.login = require('./login');
66
exports.logout = require('./logout');
77
exports.Modal = require('./modal');
88
exports.fontTest = require('./fontTest');
9-
require('./sitetoolbar');
109

10+
require('./sitetoolbar');

client/head/insertNonBlockingScript.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
var versions = require('client/versions');
12

23
// insert <script src="..."> into document
34
// --> does not block rendering
45
// --> keeps execution order
5-
module.exports = function(src) {
6+
module.exports = function(src, options) {
67
var script = document.createElement('script');
8+
if (versions[src]) {
9+
src = src.replace('.js', '.v' + versions[src] + '.js');
10+
}
711
script.src = src;
8-
script.async = false; // maintain the execution order
12+
script.async = options.async || false; // maintain the execution order if async is not set
913
document.head.appendChild(script);
1014
return script; // for onload handlers
1115
};

client/head/modal.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
function Modal() {
22
document.body.insertAdjacentHTML('beforeEnd', '<div class="modal"><div class="modal-dialog"></div></div>');
33

4+
var self = this;
45
this.elem = document.body.lastChild;
56
this.contentElem = this.elem.lastChild;
67

7-
// this.onClick = this.onClick.bind(this);
8+
this.onClick = this.onClick.bind(this);
89
this.onDocumentKeyDown = this.onDocumentKeyDown.bind(this);
910

10-
// this.elem.addEventListener("click", this.onClick);
11+
this.elem.addEventListener('click', this.onClick);
12+
1113
document.addEventListener("keydown", this.onDocumentKeyDown);
1214
}
1315

14-
/*
16+
1517
Modal.prototype.onClick = function(event) {
16-
if (event.target == this.elem) { // click on the outer element, outside of the window
18+
if (event.target.classList.contains('close-button')) {
1719
this.remove();
1820
}
1921
};
20-
*/
22+
23+
2124
Modal.prototype.onDocumentKeyDown = function(event) {
2225
if (event.keyCode == 27) {
2326
event.preventDefault();

gulpfile.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ gulp.task("nodemon", lazyRequireTask('./tasks/nodemon', {
4444
watch: ["hmvc", "modules"]
4545
}));
4646

47-
gulp.task("client:livereload", lazyRequireTask("./tasks/livereload", { watch: "public/{i,img,js,styles}/**/*.*" }));
47+
gulp.task("client:livereload", lazyRequireTask("./tasks/livereload", {
48+
// watch files *.*, not directories, no need to reload for new/removed files,
49+
// we're only interested in changes
50+
watch: "public/{i,img,js,styles}/**/*.*"
51+
}));
4852

4953
gulp.task('link-modules', lazyRequireTask('./tasks/linkModules', { src: ['client', 'modules/*', 'hmvc/*'] }));
5054

@@ -65,6 +69,7 @@ gulp.task('watch', lazyRequireTask('./tasks/watch', {
6569
},
6670
{
6771
watch: ['client/**', 'hmvc/**/client/**'],
72+
ignore: 'client/versions.json',
6873
task: "client:browserify"
6974
},
7075
{
@@ -104,7 +109,9 @@ gulp.task('client:minify', lazyRequireTask('./tasks/minify', {
104109
root: './public'
105110
}));
106111

107-
gulp.task("client:browserify:clean", lazyRequireTask('./tasks/browserifyClean', { dst: './public/js'}));
112+
gulp.task("client:browserify:clean", lazyRequireTask('./tasks/browserifyClean', {
113+
dst: './public/js'
114+
}));
108115

109116
gulp.task("client:browserify", ['client:browserify:clean'], lazyRequireTask('./tasks/browserify'));
110117

@@ -118,7 +125,6 @@ gulp.task('build', function(callback) {
118125
});
119126

120127
gulp.task('dev', function(callback) {
121-
// runSequence('build', ["client:sync-resources", 'client:compile-css', 'client:browserify', 'client:sync-css-images', 'client:build-md5-list', 'nodemon', 'client:livereload'], callback);
122128
runSequence('build', ['nodemon', 'client:livereload', 'watch'], callback);
123129
});
124130

hmvc/markup/templates/pages/article.html

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,13 @@ <h2><a class="main__anchor" id="что-такое-javascript" href="#что-та
77
Программы на этом языке называются <em>скриптами</em>. Они подключаются напрямую к HTML и, как только загружается
88
страничка &mdash; тут же выполняются.</p>
99
<p><a href="http://en.wikipedia.org/wiki/ECMAScript">ECMAScript</a>
10-
<a href="mailto:me@example.com">намылить</a> <a target="_blank" href="habrahabr.ru">новая вкладка</a> <a
11-
href="/play/ECMAScript">песочница</a> <a href="http://plnkr.co/edit/mafDHHQUVJy7jdhlSMTB?p=preview">песочница
12-
plnkr.co</a> <a href="/files/file.doc">документ</a> <a href="/files/file.zip">архив</a> <a href="/files/file.xls">таблица</a>
13-
<a href="/files/file.pdf">pdf-документ</a> <a href="http://developer.mozilla.org/topic">справка в MDN</a> <a
14-
href="http://msdn.microsoft.com/topic">справка microsoft</a> <a href="http://www.w3.org/TR/HTML401">документация
15-
w3c</a> <a href="http://es5.github.com">спецификация ECMA</a></p>
16-
<p><a class="plain" href="http://en.wikipedia.org/wiki/ECMAScript">ECMAScript</a>
17-
<a class="plain" href="mailto:me@example.com">намылить</a> <a class="plain" target="_blank" href="habrahabr.ru">новая
18-
вкладка</a> <a class="plain" href="/play/ECMAScript">песочница</a> <a class="plain"
19-
href="http://plnkr.co/edit/mafDHHQUVJy7jdhlSMTB?p=preview">песочница
20-
plnkr.co</a> <a class="plain" href="/files/file.doc">документ</a> <a class="plain" href="/files/file.zip">архив</a>
21-
<a class="plain" href="/files/file.xls">таблица</a> <a class="plain" href="/files/file.pdf">pdf-документ</a> <a
22-
class="plain" href="http://developer.mozilla.org/topic">справка в MDN</a> <a class="plain"
23-
href="http://msdn.microsoft.com/topic">справка
24-
microsoft</a> <a class="plain" href="http://www.w3.org/TR/HTML401">документация w3c</a> <a class="plain"
25-
href="http://es5.github.com">спецификация
26-
ECMA</a></p>
10+
<a href="mailto:me@example.com">намылить</a> <a target="_blank" href="habrahabr.ru">новая вкладка</a> <a href="/play/ECMAScript">песочница</a> <a href="http://plnkr.co/edit/mafDHHQUVJy7jdhlSMTB?p=preview">песочница plnkr.co</a> <a href="/files/file.doc">документ</a> <a href="/files/file.zip">архив</a> <a href="/files/file.xls">таблица</a> <a href="/files/file.pdf">pdf-документ</a> <a href="http://developer.mozilla.org/topic">справка в MDN</a> <a href="http://msdn.microsoft.com/topic">справка microsoft</a> <a href="http://www.w3.org/TR/HTML401">документация w3c</a> <a href="http://es5.github.com">спецификация ECMA</a>
11+
<!-- Чтобы показать тултип с типом ссылки в конец документа добавляем span с классом link__type,
12+
в атрибут data-url копируем href ссылки. Абсолютное позиционирование у него уже задано,
13+
достаточно указать left и top относительно документа. -->
14+
<span class="link__type " data-url="/doc.doc"></span>
15+
</p>
16+
<p><a class="plain" href="http://en.wikipedia.org/wiki/ECMAScript">ECMAScript</a> <a class="plain" href="mailto:me@example.com">намылить</a> <a class="plain" target="_blank" href="habrahabr.ru">новая вкладка</a> <a class="plain" href="/play/ECMAScript">песочница</a> <a class="plain" href="http://plnkr.co/edit/mafDHHQUVJy7jdhlSMTB?p=preview">песочница plnkr.co</a> <a class="plain" href="/files/file.doc">документ</a> <a class="plain" href="/files/file.zip">архив</a> <a class="plain" href="/files/file.xls">таблица</a> <a class="plain" href="/files/file.pdf">pdf-документ</a> <a class="plain" href="http://developer.mozilla.org/topic">справка в MDN</a> <a class="plain" href="http://msdn.microsoft.com/topic">справка microsoft</a> <a class="plain" href="http://www.w3.org/TR/HTML401">документация w3c</a> <a class="plain" href="http://es5.github.com">спецификация ECMA</a></p>
2717
<p><a class="wiki" href="#01">ECMAScript</a>
2818
<a class="mailto" href="#02">намылить</a> <a class="external" target="_blank" href="#03">новая вкладка</a> <a
2919
class="sandbox" href="#04">песочница</a> <a class="sandbox" href="#999">песочница plnkr.co</a> <a class="doc"

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"browserify-jade": "*",
2222
"bunyan": "*",
2323
"co": "*",
24+
"crc": "^3.0.0",
2425
"escape-html": "*",
2526
"event-stream": "*",
2627
"fs-extra": "*",

0 commit comments

Comments
 (0)