fragment_highlighter-rails 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -3
- data/lib/fragment_highlighter/rails/version.rb +1 -1
- data/vendor/assets/javascripts/fragment-highlighter/fragment-highlighter.js +21 -14
- data/vendor/assets/javascripts/fragment-highlighter/libs/classes/HView.js +12 -15
- data/vendor/assets/javascripts/fragment-highlighter/libs/classes/HWindowCtrls.js +34 -8
- data/vendor/assets/javascripts/fragment-highlighter/libs/classes/I18.js +75 -0
- data/vendor/assets/javascripts/fragment-highlighter/libs/classes/Marker.js +2 -2
- data/vendor/assets/javascripts/fragment-highlighter/libs/classes/UserSettings.js +17 -11
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d9a7be38d90a133feec79f9637fbd148af04fae
|
4
|
+
data.tar.gz: 0fe0f8c6c1230fb857263c777929c65284833b7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05569411be52b5fdcd383d7e96410e77fa6fda458bbf61fff77c3c1a70bca23fadec1ca846b1a1f767ee30cb75839f84ae914e699c1581fb63198bf2d3cecf20
|
7
|
+
data.tar.gz: 6cf45a9727541c1178ad965749bdc27beab221e71bb639363f9f6e74858aa7916287bac5798f276cc27eb9475fda31ee555bf28a6fcbe817abdaa2a2244aeaff
|
data/README.md
CHANGED
@@ -32,10 +32,13 @@ Or install it yourself as:
|
|
32
32
|
//= require fragment-highlighter/fragment-highlighter.js
|
33
33
|
|
34
34
|
$(function() {
|
35
|
-
let
|
36
|
-
new FragmentHighlighter(
|
35
|
+
let options = { allowedPages: ['/articles/'], deniedPages: ['/admin/'] };
|
36
|
+
new FragmentHighlighter(options);
|
37
37
|
});
|
38
|
+
## Video Presentation
|
39
|
+
[![Watch the video](https://img.youtube.com/vi/sHj-CwYDRhU/0.jpg
|
40
|
+
)](https://www.youtube.com/watch?v=sHj-CwYDRhU)
|
38
41
|
|
39
42
|
## Contributing
|
40
43
|
|
41
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
44
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/phlowerteam/fragment_highlighter-rails.
|
@@ -5,31 +5,38 @@
|
|
5
5
|
//= require fragment-highlighter/libs/classes/Marker.js
|
6
6
|
//= require fragment-highlighter/libs/classes/Tools.js
|
7
7
|
//= require fragment-highlighter/libs/classes/UserSettings.js
|
8
|
+
//= require fragment-highlighter/libs/classes/I18.js
|
8
9
|
|
9
10
|
class FragmentHighlighter {
|
10
11
|
|
11
|
-
constructor(
|
12
|
-
FragmentHighlighter.init(
|
12
|
+
constructor(options) {
|
13
|
+
FragmentHighlighter.init(options);
|
13
14
|
}
|
14
15
|
|
15
|
-
static init(
|
16
|
+
static init(options) {
|
16
17
|
$(function(){
|
17
|
-
if (
|
18
|
+
if (FragmentHighlighter.isEnabled(options)) {
|
18
19
|
HView.renderModeButton();
|
19
|
-
}
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
HView.initHighlightWindow();
|
22
|
+
UserSettings.init();
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
if (UserSettings.isHMode()) {
|
25
|
+
$(document.body).on('click', '.remove-text', function(e){
|
26
|
+
Marker.removeMarked(e.target);
|
27
|
+
});
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
$(document.body).bind('mouseup', function(e){
|
30
|
+
Marker.extractFragment();
|
31
|
+
});
|
32
|
+
}
|
32
33
|
}
|
33
34
|
});
|
34
35
|
}
|
36
|
+
|
37
|
+
static isEnabled(options) {
|
38
|
+
let allowedMatcher = new RegExp("(" + options.allowedPages.join('|') + ")", "g");
|
39
|
+
let deniedMatcher = new RegExp("(" + options.deniedPages.join('|') + ")", "g");
|
40
|
+
return (allowedMatcher.test(window.location.href) && !deniedMatcher.test(window.location.href));
|
41
|
+
}
|
35
42
|
}
|
@@ -1,14 +1,5 @@
|
|
1
1
|
class HView {
|
2
2
|
|
3
|
-
static isHModeOn(allowedPages) {
|
4
|
-
return (UserSettings.isHMode() && HView.isSupportedPage(allowedPages));
|
5
|
-
}
|
6
|
-
|
7
|
-
static isSupportedPage(allowedPages) {
|
8
|
-
let matcher = new RegExp("(" + allowedPages.join('|') + ")", "g");
|
9
|
-
return matcher.test(window.location.href)
|
10
|
-
}
|
11
|
-
|
12
3
|
static renderModeButton() {
|
13
4
|
// https://www.w3schools.com/howto/howto_css_sidenav_buttons.asp
|
14
5
|
$('body').prepend(`
|
@@ -26,7 +17,7 @@ class HView {
|
|
26
17
|
<div class="modal-content">
|
27
18
|
<div class="modal-header">
|
28
19
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
29
|
-
<h4 class="modal-title" id="myModalLabel"
|
20
|
+
<h4 class="modal-title" id="myModalLabel">${I18.tr(I18j.highlighted_fragments)}</h4>
|
30
21
|
</div>
|
31
22
|
<div class="modal-body" id="marked-items-list">
|
32
23
|
...
|
@@ -34,12 +25,18 @@ class HView {
|
|
34
25
|
<div class="modal-footer">
|
35
26
|
<row>
|
36
27
|
<div class="col-md-8">
|
37
|
-
<
|
38
|
-
<
|
39
|
-
</
|
28
|
+
<label class="radio-inline">
|
29
|
+
<input id="hmode_off_radio_btn" type="radio" name="optradio" onclick="HWindowCtrls.turnOffHMode()">${I18.tr(I18j.turn_off_hmode)}
|
30
|
+
</label>
|
31
|
+
<label class="radio-inline">
|
32
|
+
<input id="hmode_on_radio_btn" type="radio" name="optradio" onclick="HWindowCtrls.turnOnHMode()">${I18.tr(I18j.turn_on_hmode)}
|
33
|
+
</label>
|
34
|
+
<label class="radio-inline">
|
35
|
+
<input id="hmode_reading_radio_btn" type="radio" name="optradio" onclick="HWindowCtrls.turnOnReadingHMode()">${I18.tr(I18j.turn_on_reading_hmode)}
|
36
|
+
</label>
|
40
37
|
</div>
|
41
38
|
<div class="col-md-4">
|
42
|
-
<button type="button" class="btn btn-primary" onclick='HWindowCtrls.exportJSON()'
|
39
|
+
<button type="button" class="btn btn-primary" onclick='HWindowCtrls.exportJSON()'>${I18.tr(I18j.export_settings)}</button>
|
43
40
|
</div>
|
44
41
|
</row>
|
45
42
|
<br>
|
@@ -52,7 +49,7 @@ class HView {
|
|
52
49
|
<input type="file" id="fileinput" class="custom-file-input" required>
|
53
50
|
<span class="custom-file-control"></span>
|
54
51
|
</label>
|
55
|
-
<input type='button' class="btn btn-success" id='btnLoad' value='
|
52
|
+
<input type='button' class="btn btn-success" id='btnLoad' value='${I18.tr(I18j.import_settings)}' onclick='HWindowCtrls.importJSON();'>
|
56
53
|
</fieldset>
|
57
54
|
</form>
|
58
55
|
</div>
|
@@ -4,9 +4,18 @@ class HWindowCtrls {
|
|
4
4
|
$('#marked-items-list').html('');
|
5
5
|
let userSettings = LS.uSettings();
|
6
6
|
for (let key in userSettings.articles_titles) {
|
7
|
-
$('#marked-items-list').append(`<span><a href='${key}' target='_blank'>${userSettings.articles_titles[key]}</a> <a href="#" onclick="HWindowCtrls.deleteFragments('${key}')">[
|
7
|
+
$('#marked-items-list').append(`<span><a href='${key}' target='_blank'>${userSettings.articles_titles[key]}</a> <a href="#" onclick="HWindowCtrls.deleteFragments('${key}')">[${I18.tr(I18j.remove)}]</a></span><br>`);
|
8
8
|
};
|
9
|
-
|
9
|
+
|
10
|
+
if (userSettings.settings.hmode_is_on) {
|
11
|
+
$('input#hmode_on_radio_btn')[0].checked = true;
|
12
|
+
} else {
|
13
|
+
if (userSettings.settings.hmode_reading_is_on) {
|
14
|
+
$('input#hmode_reading_radio_btn')[0].checked = true;
|
15
|
+
} else {
|
16
|
+
$('input#hmode_off_radio_btn')[0].checked = true;
|
17
|
+
}
|
18
|
+
}
|
10
19
|
$('#highlightModal').modal();
|
11
20
|
}
|
12
21
|
|
@@ -15,7 +24,7 @@ class HWindowCtrls {
|
|
15
24
|
let dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(userSettings));
|
16
25
|
let dlAnchorElem = document.getElementById('downloadAnchorElem');
|
17
26
|
dlAnchorElem.setAttribute("href", dataStr );
|
18
|
-
dlAnchorElem.setAttribute("download", "
|
27
|
+
dlAnchorElem.setAttribute("download", "settings.json");
|
19
28
|
dlAnchorElem.click();
|
20
29
|
}
|
21
30
|
|
@@ -23,19 +32,19 @@ class HWindowCtrls {
|
|
23
32
|
let input, file, fr;
|
24
33
|
|
25
34
|
if (typeof window.FileReader !== 'function') {
|
26
|
-
alert(
|
35
|
+
alert(I18.tr(I18j.import.not_supported_api));
|
27
36
|
return;
|
28
37
|
}
|
29
38
|
|
30
39
|
input = document.getElementById('fileinput');
|
31
40
|
if (!input) {
|
32
|
-
alert(
|
41
|
+
alert(I18.tr(I18j.import.not_find));
|
33
42
|
}
|
34
43
|
else if (!input.files) {
|
35
|
-
alert(
|
44
|
+
alert(I18.tr(I18j.import.not_supported_files));
|
36
45
|
}
|
37
46
|
else if (!input.files[0]) {
|
38
|
-
alert(
|
47
|
+
alert(I18.tr(I18j.import.please_select));
|
39
48
|
}
|
40
49
|
else {
|
41
50
|
file = input.files[0];
|
@@ -52,7 +61,24 @@ class HWindowCtrls {
|
|
52
61
|
|
53
62
|
static turnOnHMode(){
|
54
63
|
let userSettings = LS.uSettings();
|
55
|
-
userSettings.settings.hmode_is_on =
|
64
|
+
userSettings.settings.hmode_is_on = true;
|
65
|
+
userSettings.settings.hmode_reading_is_on = false;
|
66
|
+
LS.saveUSettings(userSettings);
|
67
|
+
Tools.reloadPage();
|
68
|
+
}
|
69
|
+
|
70
|
+
static turnOffHMode(){
|
71
|
+
let userSettings = LS.uSettings();
|
72
|
+
userSettings.settings.hmode_is_on = false;
|
73
|
+
userSettings.settings.hmode_reading_is_on = false;
|
74
|
+
LS.saveUSettings(userSettings);
|
75
|
+
Tools.reloadPage();
|
76
|
+
}
|
77
|
+
|
78
|
+
static turnOnReadingHMode(){
|
79
|
+
let userSettings = LS.uSettings();
|
80
|
+
userSettings.settings.hmode_is_on = false;
|
81
|
+
userSettings.settings.hmode_reading_is_on = true;
|
56
82
|
LS.saveUSettings(userSettings);
|
57
83
|
Tools.reloadPage();
|
58
84
|
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
const I18j = {
|
2
|
+
highlighted_fragments: {
|
3
|
+
uk: 'Нотатки',
|
4
|
+
ru: 'Нотатки',
|
5
|
+
en: 'Notes'
|
6
|
+
},
|
7
|
+
remove: {
|
8
|
+
uk: 'Видалити',
|
9
|
+
ru: 'Удалить',
|
10
|
+
en: 'Remove'
|
11
|
+
},
|
12
|
+
turn_off_hmode: {
|
13
|
+
uk: 'Відключити',
|
14
|
+
ru: 'Отключить',
|
15
|
+
en: 'Turn off'
|
16
|
+
},
|
17
|
+
turn_on_hmode: {
|
18
|
+
uk: '"Нотатки"',
|
19
|
+
ru: '"Нотатки"',
|
20
|
+
en: '"Highlighting"'
|
21
|
+
},
|
22
|
+
turn_on_reading_hmode: {
|
23
|
+
uk: '"Читання"',
|
24
|
+
ru: '"Чтение"',
|
25
|
+
en: '"Reading" mode'
|
26
|
+
},
|
27
|
+
import_settings: {
|
28
|
+
uk: 'Імпортувати',
|
29
|
+
ru: 'Импортировать',
|
30
|
+
en: 'Import settings'
|
31
|
+
},
|
32
|
+
export_settings: {
|
33
|
+
uk: 'Експорт',
|
34
|
+
ru: 'Экспорт',
|
35
|
+
en: 'Export settings'
|
36
|
+
},
|
37
|
+
import: {
|
38
|
+
not_supported_api: {
|
39
|
+
uk: "Підтримка файлів поки що не підтримується в цьому браузері.",
|
40
|
+
ru: "Поддержка файлов пока что не поддерживается в этом браузере.",
|
41
|
+
en: "The file API isn't supported on this browser yet."
|
42
|
+
},
|
43
|
+
not_find: {
|
44
|
+
uk: "Нажаль не знайдено файлового елементу.",
|
45
|
+
ru: "К сожалению не найдено файлового элемента.",
|
46
|
+
en: "Um, couldn't find the fileinput element."
|
47
|
+
},
|
48
|
+
not_supported_files: {
|
49
|
+
uk: "Цей браузер здається не підтримує елементи.",
|
50
|
+
ru: "Этот браузер похоже не поддерживает элементы 'files'.",
|
51
|
+
en: "This browser doesn't seem to support the 'files' property of file inputs."
|
52
|
+
},
|
53
|
+
please_select: {
|
54
|
+
uk: "Будь-ласка оберіть файл перед завантаженням.",
|
55
|
+
ru: "Пожалуйста выберете файл перед загрузкой.",
|
56
|
+
en: "Please select a file before clicking 'Load'."
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
class I18 {
|
62
|
+
|
63
|
+
static tr(translation) {
|
64
|
+
return translation[I18.locale()];
|
65
|
+
}
|
66
|
+
|
67
|
+
static locale() {
|
68
|
+
let currentLocale = window.location.href.split('/')[3];
|
69
|
+
if (currentLocale == 'uk' || currentLocale == 'ru') {
|
70
|
+
return currentLocale;
|
71
|
+
} else {
|
72
|
+
return 'en';
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
@@ -17,13 +17,13 @@ class Marker {
|
|
17
17
|
selection = document.selection.createRange();
|
18
18
|
}
|
19
19
|
|
20
|
-
if (selection.toString()
|
20
|
+
if (selection.toString().length > 2) {
|
21
21
|
Marker.saveFragments(selection.toString());
|
22
22
|
}
|
23
23
|
}
|
24
24
|
|
25
25
|
static saveFragments(text){
|
26
|
-
let fragments = text.trim().split("\n
|
26
|
+
let fragments = text.trim().split("\n");
|
27
27
|
fragments.forEach( fragment => {
|
28
28
|
if (fragment.length > 0) {
|
29
29
|
UserSettings.saveFragment(fragment);
|
@@ -25,24 +25,30 @@ class UserSettings {
|
|
25
25
|
articles: {},
|
26
26
|
articles_titles: {},
|
27
27
|
settings:{
|
28
|
-
hmode_is_on: true
|
28
|
+
hmode_is_on: true,
|
29
|
+
hmode_reading_is_on: false
|
29
30
|
}
|
30
31
|
};
|
31
32
|
LS.saveUSettings(userSettings);
|
32
|
-
}
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
};
|
33
|
+
}
|
34
|
+
|
35
|
+
if(UserSettings.isHMode() || UserSettings.isHModeReading()){
|
36
|
+
let articleFragments = userSettings.articles[Tools.href()] || [];
|
37
|
+
articleFragments.forEach(fragment => {
|
38
|
+
Marker.highlight(fragment.text);
|
39
|
+
});
|
40
|
+
}
|
41
41
|
}
|
42
42
|
|
43
43
|
static isHMode() {
|
44
44
|
let mode;
|
45
|
-
try { mode = LS.uSettings().settings.hmode_is_on } catch(e) {};
|
45
|
+
try { mode = (LS.uSettings().settings.hmode_is_on && !LS.uSettings().settings.hmode_reading_is_on) } catch(e) {};
|
46
|
+
return mode;
|
47
|
+
}
|
48
|
+
|
49
|
+
static isHModeReading() {
|
50
|
+
let mode;
|
51
|
+
try { mode = LS.uSettings().settings.hmode_reading_is_on } catch(e) {};
|
46
52
|
return mode;
|
47
53
|
}
|
48
54
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fragment_highlighter-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- PhlowerTeam
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- vendor/assets/javascripts/fragment-highlighter/fragment-highlighter.js
|
87
87
|
- vendor/assets/javascripts/fragment-highlighter/libs/classes/HView.js
|
88
88
|
- vendor/assets/javascripts/fragment-highlighter/libs/classes/HWindowCtrls.js
|
89
|
+
- vendor/assets/javascripts/fragment-highlighter/libs/classes/I18.js
|
89
90
|
- vendor/assets/javascripts/fragment-highlighter/libs/classes/LS.js
|
90
91
|
- vendor/assets/javascripts/fragment-highlighter/libs/classes/Marker.js
|
91
92
|
- vendor/assets/javascripts/fragment-highlighter/libs/classes/Tools.js
|
@@ -111,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
112
|
version: '0'
|
112
113
|
requirements: []
|
113
114
|
rubyforge_project:
|
114
|
-
rubygems_version: 2.
|
115
|
+
rubygems_version: 2.5.1
|
115
116
|
signing_key:
|
116
117
|
specification_version: 4
|
117
118
|
summary: JavaScript UI library for highlighting text fragments on the page and saving
|