11'use strict' ;
22
3- const $ = require ( 'jquery' ) ;
43const relatizeDate = require ( './relatize_date.js' ) ;
54const storage = require ( './storage.js' ) ;
65const Mousetrap = require ( 'mousetrap' ) ;
98 createAnchors
109} = require ( './document-ui.mjs' ) ;
1110
11+ const jQuery = require ( 'jquery' ) ;
12+ require ( 'bootstrap/js/dropdown.js' ) ;
13+ require ( 'bootstrap/js/modal.js' ) ;
14+ require ( 'bootstrap/js/tooltip.js' ) ;
15+
1216function setFavTitle ( button ) {
1317 button . setAttribute ( 'title' , button . classList . contains ( 'active' ) ? 'Remove from favorites' : 'Add to favorites' ) ;
1418}
@@ -64,25 +68,25 @@ async function processUserData() {
6468}
6569
6670function set_page_size ( selector , storage_name ) {
67- $ ( selector ) . each ( function ( ) {
68- var url = this . href ;
69- var result = / [ & ; ? ] s i z e = ( \d + ) (?: $ | [ & ; ] ) / . exec ( url ) ;
70- var size ;
71+ for ( const el of document . querySelectorAll ( selector ) ) {
72+ const result = el . href . match ( / [ & ; ? ] s i z e = ( \d + ) (?: $ | [ & ; ] ) / ) ;
7173 if ( result && result [ 1 ] ) {
72- size = result [ 1 ] ;
73- $ ( this ) . click ( function ( ) {
74+ const size = result [ 1 ] ;
75+ el . addEventListener ( ' click' , ( ) => {
7476 storage . setItem ( storage_name , size ) ;
75- return true ;
7677 } ) ;
77- } else if ( size = storage . getItem ( storage_name ) ) {
78- if ( / \? / . exec ( url ) ) {
79- this . href += '&size=' + size ;
80- } else {
81- this . href += '?size=' + size ;
78+ return ;
79+ }
80+ const storage_size = storage . getItem ( storage_name ) ;
81+ if ( storage_size ) {
82+ if ( el . href . match ( / \? / ) ) {
83+ el . href += '&size=' + storage_size ;
84+ }
85+ else {
86+ el . href += '?size=' + storage_size ;
8287 }
8388 }
84- return true ;
85- } ) ;
89+ }
8690}
8791
8892// poor man's RFC-6570 formatter
@@ -99,32 +103,32 @@ function format_string(input_string, replacements) {
99103// User customisations
100104processUserData ( ) ;
101105
102- $ ( ".ttip" ) . tooltip ( ) ;
106+ jQuery ( ".ttip" ) . tooltip ( ) ; // bootstrap
103107
104- $ ( '.keyboard-shortcuts' ) . each ( function ( ) {
105- $ ( this ) . click ( function ( event ) {
106- $ ( '#metacpan_keyboard-shortcuts' ) . modal ( ) ;
107- event . preventDefault ( ) ;
108- } )
109- } ) ;
108+ for ( const el of document . querySelectorAll ( '.keyboard-shortcuts' ) ) {
109+ el . addEventListener ( 'click' , e => {
110+ e . preventDefault ( ) ;
111+ jQuery ( '#metacpan_keyboard-shortcuts' ) . modal ( ) ; // bootstrap
112+ } ) ;
113+ }
110114
111115// Global keyboard shortcuts
112116Mousetrap . bind ( '?' , function ( ) {
113- $ ( '#metacpan_keyboard-shortcuts' ) . modal ( ) ;
117+ jQuery ( '#metacpan_keyboard-shortcuts' ) . modal ( ) ; // bootstrap
114118} ) ;
115119Mousetrap . bind ( 's' , function ( e ) {
116- $ ( '#metacpan_search-input' ) . focus ( ) ;
117120 e . preventDefault ( ) ;
121+ document . querySelector ( '#metacpan_search-input' ) . focus ( ) ;
118122} ) ;
119123
120124// install a default handler for 'g s' for non pod pages
121125Mousetrap . bind ( 'g s' , function ( e ) { } ) ;
122126
123- $ ( 'a[data-keyboard-shortcut]' ) . each ( function ( index , element ) {
124- Mousetrap . bind ( $ ( element ) . data ( 'keyboard-shortcut' ) , function ( ) {
125- window . location = $ ( element ) . attr ( ' href' ) ;
127+ for ( const el of document . querySelectorAll ( 'a[data-keyboard-shortcut]' ) ) {
128+ Mousetrap . bind ( el . dataset . keyboardShortcut , e => {
129+ window . location = el . href ;
126130 } ) ;
127- } ) ;
131+ }
128132
129133for ( const logout of document . querySelectorAll ( '.logout-button' ) ) {
130134 logout . addEventListener ( 'click' , e => {
@@ -139,30 +143,30 @@ for (const logout of document.querySelectorAll('.logout-button')) {
139143
140144relatizeDate ( document . querySelectorAll ( '.relatize' ) ) ;
141145
142- var items = $ ( '.ellipsis' ) ;
143- for ( var i = 0 ; i < items . length ; i ++ ) {
144- var element = items [ i ] ;
145- var text = element . textContent ;
146+ for ( const el of document . querySelectorAll ( '.ellipsis' ) ) {
147+ const text = el . textContent ;
146148
147149 // try to find a reasonable place to cut to allow mid-abbreviation.
148150 // we want to cut "near" the middle, but prefer on a boundary.
149- var cut = Math . floor ( text . length / 5 * 3 ) ;
150- var start_text = text . substr ( 0 , cut ) ;
151- var end_text = text . substr ( cut ) ;
152- var res = start_text . match ( / ^ ( .* [ - : ] ) ( .* ?) $ / ) ;
151+ const initial_cut = Math . floor ( text . length / 5 * 3 ) ;
152+ let start_text = text . substr ( 0 , initial_cut ) ;
153+ let end_text = text . substr ( initial_cut ) ;
154+ const res = start_text . match ( / ^ ( .* [ - : ] ) ( .* ?) $ / ) ;
153155 if ( res && res [ 1 ] . length > text . length / 4 ) {
154156 start_text = res [ 1 ] ;
155157 end_text = res [ 2 ] + end_text ;
156158 }
157159
158- var start = document . createElement ( 'span' ) ;
159- start . appendChild ( document . createTextNode ( start_text ) ) ;
160- var end = document . createElement ( 'span' ) ;
161- end . appendChild ( document . createTextNode ( end_text ) ) ;
162- $ ( element ) . empty ( ) ;
163- element . appendChild ( end ) ;
160+ const start = document . createElement ( 'span' ) ;
161+ start . append ( start_text ) ;
162+ const end = document . createElement ( 'span' ) ;
163+ end . append ( end_text ) ;
164+
165+ el . replaceChildren ( ) ;
166+
167+ el . append ( end ) ;
164168 start . style . maxWidth = 'calc(100% - ' + end . clientWidth + 'px)' ;
165- element . insertBefore ( start , end ) ;
169+ el . prepend ( start ) ;
166170}
167171
168172createAnchors ( document . querySelectorAll ( '.anchors' ) ) ;
@@ -171,23 +175,25 @@ for (const favButton of document.querySelectorAll('.breadcrumbs .favorite')) {
171175 setFavTitle ( favButton ) ;
172176}
173177
174- $ ( '.dropdown-toggle' ) . dropdown ( ) ;
178+ jQuery ( '.dropdown-toggle' ) . dropdown ( ) ; // bootstrap
175179
176180const toc = document . querySelector ( ".content .toc" )
177181if ( toc ) {
178182 formatTOC ( toc ) ;
179183}
180184
181- $ ( 'a[href*="/search?"]' ) . on ( 'click' , function ( ) {
182- var url = $ ( this ) . attr ( 'href' ) ;
183- var result = / s i z e = ( \d + ) / . exec ( url ) ;
184- if ( result && result [ 1 ] ) {
185- storage . setItem ( 'search_size' , result [ 1 ] ) ;
186- }
187- } ) ;
188- var size = storage . getItem ( 'search_size' ) ;
185+ for ( const link of document . querySelectorAll ( 'a[href*="/search?"]' ) ) {
186+ link . addEventListener ( 'click' , e => {
187+ const result = link . href . match ( / s i z e = ( \d + ) / ) ;
188+ if ( result && result [ 1 ] ) {
189+ storage . setItem ( 'search_size' , result [ 1 ] ) ;
190+ }
191+ } ) ;
192+ }
193+
194+ const size = storage . getItem ( 'search_size' ) ;
189195if ( size ) {
190- $ ( '#metacpan_search-size' ) . val ( size ) ;
196+ document . querySelector ( '#metacpan_search-size' ) . value = size ;
191197}
192198
193199// TODO use a more specific locator for /author/PAUSID/release ?
0 commit comments