@@ -59,9 +59,8 @@ const Main = (function() {
5959 changeDataset ( this . selectedIndex ) ;
6060 }
6161 }
62- document . getElementById ( 'syntax-toggle' ) . onclick = function ( ) {
63- links . forEach ( l => l . toggle ( ) ) ;
64- rm . resizeAll ( ) ;
62+ document . getElementById ( 'options-toggle' ) . onclick = function ( ) {
63+ document . getElementById ( 'options' ) . classList . toggle ( 'open' ) ;
6564 }
6665 }
6766
@@ -73,6 +72,7 @@ const Main = (function() {
7372 parser . readJson ( `./data/data${ index } .json` , function ( ) {
7473 clear ( ) ;
7574 [ words , links , clusters ] = buildWordsAndLinks ( ) ;
75+ populateOptions ( ) ;
7676 draw ( ) ;
7777 } ) ;
7878 } ;
@@ -193,6 +193,98 @@ const Main = (function() {
193193 return [ words , links , clusters ] ;
194194 }
195195
196+ function populateOptions ( ) {
197+ document . querySelector ( '.reach' ) . onclick = toggleEdgeVisibility ;
198+ document . querySelector ( '.pos' ) . onclick = toggleEdgeVisibility ;
199+
200+ let reachTypes = { } ;
201+ let posTypes = { } ;
202+
203+ function toggleEdgeVisibility ( e ) {
204+ if ( e . target . nodeName === 'INPUT' ) {
205+ let id = e . target . id . split ( '--' ) ;
206+ let checked = e . target . checked ;
207+
208+ function linkMatchesId ( l ) {
209+ if ( l . top && id [ 0 ] === 'reach' ) {
210+ return l . reltype === id [ 1 ] || ( l . trigger instanceof Word && l . trigger . tag . val === id [ 1 ] ) ;
211+ }
212+ else if ( ! l . top && id [ 0 ] === 'pos' ) {
213+ return l . arguments . some ( arg => arg . type === id [ 1 ] ) ;
214+ }
215+ }
216+
217+ if ( checked ) {
218+ if ( id [ 1 ] === 'all' ) {
219+ document . querySelectorAll ( `.${ id [ 0 ] } > ul input` ) . forEach ( i => {
220+ i . disabled = false ;
221+ toggleEdgeVisibility ( { target : i } ) ;
222+ } ) ;
223+ }
224+ else {
225+ links . forEach ( l => linkMatchesId ( l ) && l . show ( ) ) ;
226+ }
227+ }
228+ else {
229+ if ( id [ 1 ] === 'all' ) {
230+ document . querySelectorAll ( `.${ id [ 0 ] } > ul input` ) . forEach ( i => {
231+ links . forEach ( l => {
232+ if ( l . top == ( id [ 0 ] === 'reach' ) ) {
233+ l . hide ( ) ;
234+ }
235+ } ) ;
236+ i . disabled = true ;
237+ } ) ;
238+ }
239+ else {
240+ links . forEach ( l => linkMatchesId ( l ) && l . hide ( ) ) ;
241+ }
242+ }
243+ }
244+ }
245+
246+ // find link types
247+ links . forEach ( link => {
248+ if ( link . top ) {
249+ let type = link . trigger instanceof Word ? link . trigger . tag : link . reltype ;
250+ if ( reachTypes [ type ] ) {
251+ reachTypes [ type ] . push ( link ) ;
252+ }
253+ else {
254+ reachTypes [ type ] = [ link ] ;
255+ }
256+ }
257+ else {
258+ link . arguments . forEach ( arg => {
259+ if ( posTypes [ arg . type ] ) {
260+ posTypes [ arg . type ] . push ( link ) ;
261+ }
262+ else {
263+ posTypes [ arg . type ] = [ link ] ;
264+ }
265+ } ) ;
266+ }
267+ } ) ;
268+
269+ // add to options
270+ function createLi ( types , name ) {
271+ if ( Object . keys ( types ) . length > 0 ) {
272+ let li = Object . keys ( types ) . map ( type =>
273+ `<li><input id="${ name } --${ type } " type="checkbox" checked><label for="${ name } --${ type } ">${ type } </label></li>`
274+ ) ;
275+ let ul = document . querySelector ( `.${ name } > ul` ) || document . createElement ( 'ul' ) ;
276+ ul . innerHTML = li . join ( '' ) ;
277+ document . querySelector ( `.${ name } ` ) . appendChild ( ul ) ;
278+ }
279+ else {
280+ let ul = document . querySelector ( `.${ name } > ul` ) ;
281+ if ( ul ) { ul . parentNode . removeChild ( ul ) ; }
282+ }
283+ }
284+ createLi ( reachTypes , 'reach' ) ;
285+ createLi ( posTypes , 'pos' ) ;
286+ }
287+
196288 // export public functions
197289 return {
198290 init,
0 commit comments