2022-07-13 12:06:22 +00:00
class ConcordanceQueryBuilder {
2022-09-07 07:06:21 +00:00
constructor ( ) {
2022-08-03 14:21:11 +00:00
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
this . elements = {
counter : 0 ,
yourQueryContent : [ ] ,
queryContent : [ ] ,
concordanceQueryBuilder : document . querySelector ( "#concordance-query-builder" ) ,
concordanceQueryBuilderButton : document . querySelector ( "#concordance-query-builder-button" ) ,
closeQueryBuilder : document . querySelector ( "#close-query-builder" ) ,
queryBuilderTutorialModal : document . querySelector ( '#query-builder-tutorial-modal' ) ,
//#region QueryBuilder Elements
positionalAttrButton : document . querySelector ( '#positional-attr-button' ) ,
positionalAttrArea : document . querySelector ( '#positional-attr' ) ,
positionalAttr : document . querySelector ( "#token-attr" ) ,
structuralAttrButton : document . querySelector ( '#structural-attr-button' ) ,
structuralAttrArea : document . querySelector ( "#structural-attr" ) ,
queryContainer : document . querySelector ( '#query-container' ) ,
buttonPreparer : document . querySelector ( "#button-preparer" ) ,
yourQuery : document . querySelector ( "#your-query" ) ,
insertQueryButton : document . querySelector ( "#insert-query-button" ) ,
queryPreview : document . querySelector ( '#query-preview' ) ,
tokenQuery : document . querySelector ( "#token-query" ) ,
tokenBuilderContent : document . querySelector ( "#token-builder-content" ) ,
tokenSubmitButton : document . querySelector ( "#token-submit" ) ,
extFormQuery : document . querySelector ( '#concordance-extension-form-query' ) ,
dropButton : "" ,
queryBuilderTutorialInfoIcon : document . querySelector ( '#query-builder-tutorial-info-icon' ) ,
tokenTutorialInfoIcon : document . querySelector ( "#token-tutorial-info-icon" ) ,
editTokenTutorialInfoIcon : document . querySelector ( '#edit-options-tutorial-info-icon' ) ,
structuralAttributeTutorialInfoIcon : document . querySelector ( '#add-structural-attribute-tutorial-info-icon' ) ,
generalOptionsQueryBuilderTutorialInfoIcon : document . querySelector ( '#general-options-query-builder-tutorial-info-icon' ) ,
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
//#endregion QueryBuilder Elements
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
//#region Strucutral Attributes
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
sentence : document . querySelector ( "#sentence" ) ,
entity : document . querySelector ( "#entity" ) ,
textAnnotation : document . querySelector ( "#text-annotation" ) ,
entityBuilder : document . querySelector ( "#entity-builder" ) ,
englishEntType : document . querySelector ( "#english-ent-type" ) ,
germanEntType : document . querySelector ( "#german-ent-type" ) ,
emptyEntity : document . querySelector ( "#empty-entity" ) ,
entityAnyType : false ,
textAnnotationBuilder : document . querySelector ( "#text-annotation-builder" ) ,
textAnnotationOptions : document . querySelector ( "#text-annotation-options" ) ,
textAnnotationInput : document . querySelector ( "#text-annotation-input" ) ,
textAnnotationSubmit : document . querySelector ( "#text-annotation-submit" ) ,
noValueMetadataMessage : document . querySelector ( '#no-value-metadata-message' ) ,
//#endregion Structural Attributes
//#region Token Attributes
tokenQueryFilled : false ,
lemma : document . querySelector ( "#lemma" ) ,
emptyToken : document . querySelector ( "#empty-token" ) ,
word : document . querySelector ( "#word" ) ,
lemma : document . querySelector ( "#lemma" ) ,
pos : document . querySelector ( "#pos" ) ,
simplePosButton : document . querySelector ( "#simple-pos-button" ) ,
incidenceModifiers : document . querySelector ( "[data-target='incidence-modifiers']" ) ,
or : document . querySelector ( "#or" ) ,
and : document . querySelector ( "#and" ) ,
//#region Word and Lemma Elements
wordBuilder : document . querySelector ( "#word-builder" ) ,
lemmaBuilder : document . querySelector ( "#lemma-builder" ) ,
inputOptions : document . querySelector ( "#input-options" ) ,
incidenceModifiersButton : document . querySelector ( "#incidence-modifiers-button" ) ,
conditionContainer : document . querySelector ( '#condition-container' ) ,
wordInput : document . querySelector ( "#word-input" ) ,
lemmaInput : document . querySelector ( "#lemma-input" ) ,
ignoreCaseCheckbox : document . querySelector ( "#ignore-case-checkbox" ) ,
ignoreCase : document . querySelector ( "input[type='checkbox']" ) ,
wildcardChar : document . querySelector ( "#wildcard-char" ) ,
optionGroup : document . querySelector ( "#option-group" ) ,
//#endregion Word and Lemma Elements
//#region posBuilder Elements
englishPosBuilder : document . querySelector ( "#english-pos-builder" ) ,
englishPos : document . querySelector ( "#english-pos" ) ,
germanPosBuilder : document . querySelector ( "#german-pos-builder" ) ,
germanPos : document . querySelector ( "#german-pos" ) ,
//#endregion posBuilder Elements
//#region simple_posBuilder Elements
simplePosBuilder : document . querySelector ( "#simplepos-builder" ) ,
simplePos : document . querySelector ( "#simple-pos" ) ,
//#endregion simple_posBuilder Elements
//#region incidence modifiers
oneOrMore : document . querySelector ( "#one-or-more" ) ,
zeroOrMore : document . querySelector ( "#zero-or-more" ) ,
zeroOrOne : document . querySelector ( "#zero-or-one" ) ,
exactlyN : document . querySelector ( "#exactlyN" ) ,
betweenNM : document . querySelector ( "#betweenNM" ) ,
nInput : document . querySelector ( "#n-input" ) ,
nSubmit : document . querySelector ( "#n-submit" ) ,
nmInput : document . querySelector ( "#n-m-input" ) ,
mInput : document . querySelector ( "#m-input" ) ,
nmSubmit : document . querySelector ( "#n-m-submit" ) ,
//#endregion incidence modifiers
cancelBool : false ,
noValueMessage : document . querySelector ( '#no-value-message' ) ,
//#endregion Token Attributes
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
this . elements . closeQueryBuilder . addEventListener ( "click" , ( ) => { this . closeQueryBuilderModal ( this . elements . concordanceQueryBuilder ) ; } ) ;
this . elements . concordanceQueryBuilderButton . addEventListener ( "click" , ( ) => { this . clearAll ( ) ; } ) ;
this . elements . insertQueryButton . addEventListener ( "click" , ( ) => { this . insertQuery ( ) ; } ) ;
this . elements . positionalAttrButton . addEventListener ( "click" , ( ) => { this . showPositionalAttrArea ( ) ; } ) ;
this . elements . structuralAttrButton . addEventListener ( "click" , ( ) => { this . showStructuralAttrArea ( ) ; } ) ;
//#region Structural Attribute Event Listeners
this . elements . sentence . addEventListener ( "click" , ( ) => { this . addSentence ( ) ; } ) ;
this . elements . entity . addEventListener ( "click" , ( ) => { this . addEntity ( ) ; } ) ;
this . elements . textAnnotation . addEventListener ( "click" , ( ) => { this . addTextAnnotation ( ) ; } ) ;
this . elements . englishEntType . addEventListener ( "change" , ( ) => { this . englishEntTypeHandler ( ) ; } ) ;
this . elements . germanEntType . addEventListener ( "change" , ( ) => { this . germanEntTypeHandler ( ) ; } ) ;
this . elements . emptyEntity . addEventListener ( "click" , ( ) => { this . emptyEntityButton ( ) ; } ) ;
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
this . elements . textAnnotationSubmit . addEventListener ( "click" , ( ) => { this . textAnnotationSubmitHandler ( ) ; } ) ;
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
//#endregion
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
//#region Token Attribute Event Listeners
this . elements . queryBuilderTutorialInfoIcon . addEventListener ( "click" , ( ) => { this . tutorialIconHandler ( '#query-builder-tutorial-start' ) ; } ) ;
this . elements . tokenTutorialInfoIcon . addEventListener ( "click" , ( ) => { this . tutorialIconHandler ( '#add-new-token-tutorial' ) ; } ) ;
this . elements . editTokenTutorialInfoIcon . addEventListener ( "click" , ( ) => { this . tutorialIconHandler ( '#edit-options-tutorial' ) ; } ) ;
this . elements . structuralAttributeTutorialInfoIcon . addEventListener ( "click" , ( ) => { this . tutorialIconHandler ( '#add-structural-attribute-tutorial' ) ; } ) ;
this . elements . generalOptionsQueryBuilderTutorialInfoIcon . addEventListener ( "click" , ( ) => { this . tutorialIconHandler ( '#general-options-query-builder' ) ; } ) ;
this . elements . positionalAttr . addEventListener ( "change" , ( ) => { this . tokenTypeSelector ( ) ; } ) ;
this . elements . tokenSubmitButton . addEventListener ( "click" , ( ) => { this . addToken ( ) ; } ) ;
this . elements . ignoreCase . addEventListener ( "change" , ( ) => { this . inputOptionHandler ( this . elements . ignoreCase ) ; } ) ;
this . elements . wildcardChar . addEventListener ( "click" , ( ) => { this . inputOptionHandler ( this . elements . wildcardChar ) ; } ) ;
this . elements . optionGroup . addEventListener ( "click" , ( ) => { this . inputOptionHandler ( this . elements . optionGroup ) ; } ) ;
this . elements . oneOrMore . addEventListener ( "click" , ( ) => { this . incidenceModifiersHandler ( this . elements . oneOrMore ) ; } ) ;
this . elements . zeroOrMore . addEventListener ( "click" , ( ) => { this . incidenceModifiersHandler ( this . elements . zeroOrMore ) ; } ) ;
this . elements . zeroOrOne . addEventListener ( "click" , ( ) => { this . incidenceModifiersHandler ( this . elements . zeroOrOne ) ; } ) ;
this . elements . nSubmit . addEventListener ( "click" , ( ) => { this . nSubmitHandler ( ) ; } ) ;
this . elements . nmSubmit . addEventListener ( "click" , ( ) => { this . nmSubmitHandler ( ) ; } ) ;
this . elements . or . addEventListener ( "click" , ( ) => { this . orHandler ( ) ; } ) ;
this . elements . and . addEventListener ( "click" , ( ) => { this . andHandler ( ) ; } ) ;
//#endregion Token Attribute Event Listeners
}
//#region General Functions
closeQueryBuilderModal ( closeInstance ) {
let instance = M . Modal . getInstance ( closeInstance ) ;
instance . close ( ) ;
}
showPositionalAttrArea ( ) {
this . elements . positionalAttrArea . classList . remove ( 'hide' ) ;
this . elements . wordBuilder . classList . remove ( "hide" ) ;
this . elements . inputOptions . classList . remove ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
this . elements . conditionContainer . classList . remove ( "hide" ) ;
this . elements . ignoreCaseCheckbox . classList . remove ( "hide" ) ;
this . elements . structuralAttrArea . classList . add ( 'hide' ) ;
this . elements . lemmaBuilder . classList . add ( 'hide' ) ;
this . elements . englishPosBuilder . classList . add ( 'hide' ) ;
this . elements . germanPosBuilder . classList . add ( 'hide' ) ;
this . elements . simplePosBuilder . classList . add ( 'hide' ) ;
this . elements . tokenQueryFilled = false ;
window . location . href = "#token-builder-content" ;
// Resets materialize select field to default value
let SelectInstance = M . FormSelect . getInstance ( this . elements . positionalAttr ) ;
SelectInstance . input . value = "word" ;
this . elements . positionalAttr . value = "word" ;
}
showStructuralAttrArea ( ) {
this . elements . positionalAttrArea . classList . add ( 'hide' ) ;
this . elements . structuralAttrArea . classList . remove ( 'hide' ) ;
}
buttonfactory ( dataType , prettyText , queryText ) {
window . location . href = "#query-container" ;
this . elements . counter += 1 ;
queryText = encodeURI ( queryText ) ;
let chipColor = 'style="background-color:#' ;
// Sets chip color, depending on the type of element
if ( dataType === 'start-sentence' || dataType === 'end-sentence' ) {
chipColor += 'FD9720' ;
} else if ( dataType === "start-empty-entity" || dataType === "start-entity" || dataType === "end-entity" ) {
chipColor += 'A6E22D' ;
} else if ( dataType === "text-annotation" ) {
chipColor += '2FBBAB' ;
} else if ( dataType === "token" ) {
chipColor += '28B3D1' ;
} else {
chipColor = '' ;
}
// Creates a chip with the previously selected element. Is first created in the "BuilderElement" and populated with an EventListener, then moved to "yourQuery".
let builderElement = document . createElement ( 'div' ) ;
builderElement . innerHTML += `
< div class = "chip" $ { chipColor } " data-type=" $ { dataType } " data-query=" $ { queryText } " draggable=" true " style=" cursor : pointer ; " ondragstart=" concordanceQueryBuilder . dragStartHandler ( event ) " ondragend=" concordanceQueryBuilder . dragEndHandler ( event ) " >
$ { prettyText }
< i class = "material-icons close" > close < / i >
< / d i v >
` .trim();
let buttonElement = builderElement . firstElementChild ;
buttonElement . addEventListener ( "click" , ( ) => { this . deleteAttr ( buttonElement ) ; } ) ;
// Ensures that metadata is always at the end of the query:
if ( this . elements . yourQuery . lastChild === null || this . elements . yourQuery . lastChild . dataset . type !== "text-annotation" ) {
this . elements . yourQuery . appendChild ( buttonElement ) ;
} else if ( this . elements . yourQuery . lastChild . dataset . type === "text-annotation" ) {
this . elements . yourQuery . insertBefore ( buttonElement , this . elements . yourQuery . lastChild ) ;
}
this . elements . queryContainer . classList . remove ( "hide" ) ;
this . queryPreviewBuilder ( ) ;
// Opens a hint about the possible functions for editing the query when the first chip is added. It is displayed for 5 seconds and then deleted.
if ( this . elements . yourQuery . classList . contains ( "tooltipped" ) ) {
let tooltipInstance = M . Tooltip . getInstance ( this . elements . yourQuery ) ;
tooltipInstance . tooltipEl . style . background = "#98ACD2" ;
tooltipInstance . tooltipEl . style . borderTop = "solid 4px #0064A3"
tooltipInstance . tooltipEl . style . padding = "10px" ;
tooltipInstance . tooltipEl . style . color = "black" ;
if ( tooltipInstance !== undefined ) {
setTimeout ( ( ) => {
tooltipInstance . open ( ) ;
setTimeout ( ( ) => {
tooltipInstance . destroy ( ) ;
} , 5000 ) ;
} , 500 ) ;
}
this . elements . yourQuery . classList . remove ( "tooltipped" ) ;
}
}
//#region Drag&Drop Events
dragStartHandler ( event ) {
this . elements . dropButton = event . target ;
let targetChip = `
< div class = "chip target" ondragover = "concordanceQueryBuilder.dragOverHandler(event)" ondragenter = "concordanceQueryBuilder.dragEnterHandler(event)" ondragleave = "concordanceQueryBuilder.dragLeaveHandler(event)" ondrop = "concordanceQueryBuilder.dropHandler(event)" >
Drop here
< / d i v >
` .trim();
let childNodes = this . elements . yourQuery . querySelectorAll ( "div:not(.target)" ) ;
setTimeout ( ( ) => {
for ( let element of childNodes ) {
if ( element === event . target ) {
continue ;
} else if ( element === event . target . nextSibling ) {
continue ;
} else {
element . insertAdjacentHTML ( "beforebegin" , targetChip )
2022-07-13 12:06:22 +00:00
}
2022-09-07 07:06:21 +00:00
}
childNodes [ childNodes . length - 1 ] . insertAdjacentHTML ( "afterend" , targetChip ) ;
} , 0 ) ;
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
dragOverHandler ( event ) {
event . preventDefault ( ) ;
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
dragEnterHandler ( event ) {
event . preventDefault ( ) ;
event . target . style . borderStyle = "solid dotted" ;
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
dragLeaveHandler ( event ) {
event . preventDefault ( ) ;
event . target . style . borderStyle = "hidden" ;
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
dragEndHandler ( event ) {
let targets = document . querySelectorAll ( '.target' ) ;
for ( let target of targets ) {
target . remove ( ) ;
2022-07-13 12:06:22 +00:00
}
2022-09-07 07:06:21 +00:00
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
dropHandler ( event ) {
let dropzone = event . target ;
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
for ( let i = 0 ; i < dropzone . parentElement . childNodes . length ; i ++ ) {
if ( dropzone === dropzone . parentElement . childNodes [ i ] ) {
nodeIndex = i ;
}
2022-07-13 12:06:22 +00:00
}
2022-09-07 07:06:21 +00:00
for ( let i = 0 ; i < dropzone . parentElement . childNodes . length ; i ++ ) {
if ( this . elements . dropButton === dropzone . parentElement . childNodes [ i ] ) {
draggedElementIndex = i ;
}
2022-08-01 08:00:12 +00:00
}
2022-09-07 07:06:21 +00:00
dropzone . parentElement . replaceChild ( this . elements . dropButton , dropzone ) ;
this . queryPreviewBuilder ( ) ;
}
//#endregion Drag&Drop Events
2022-08-01 08:00:12 +00:00
2022-09-07 07:06:21 +00:00
queryPreviewBuilder ( ) {
this . elements . yourQueryContent = [ ] ;
2022-08-01 08:00:12 +00:00
2022-09-07 07:06:21 +00:00
for ( let element of this . elements . yourQuery . childNodes ) {
let queryElement = decodeURI ( element . dataset . query ) ;
if ( queryElement . includes ( "<" ) ) {
queryElement = queryElement . replace ( "<" , "<" ) ;
}
if ( queryElement . includes ( ">" ) ) {
queryElement = queryElement . replace ( ">" , ">" ) ;
}
if ( queryElement !== "undefined" ) {
this . elements . yourQueryContent . push ( queryElement ) ;
}
2022-08-01 08:00:12 +00:00
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
let queryString = this . elements . yourQueryContent . join ( ' ' ) ;
queryString += ";" ;
this . elements . queryPreview . innerHTML = queryString ;
}
2022-07-13 12:06:22 +00:00
2022-08-01 08:00:12 +00:00
2022-09-07 07:06:21 +00:00
deleteAttr ( attr ) {
this . elements . yourQuery . removeChild ( attr ) ;
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
this . elements . counter -= 1 ;
if ( this . elements . counter === 0 ) {
this . elements . queryContainer . classList . add ( "hide" ) ;
2022-07-13 12:06:22 +00:00
}
2022-09-07 07:06:21 +00:00
this . queryPreviewBuilder ( ) ;
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
insertQuery ( ) {
this . elements . yourQueryContent = [ ] ;
2022-08-01 08:00:12 +00:00
2022-09-07 07:06:21 +00:00
for ( let element of this . elements . yourQuery . childNodes ) {
let queryElement = decodeURI ( element . dataset . query ) ;
if ( queryElement !== "undefined" ) {
this . elements . yourQueryContent . push ( queryElement ) ;
2022-07-13 12:06:22 +00:00
}
}
2022-09-07 07:06:21 +00:00
let queryString = this . elements . yourQueryContent . join ( ' ' ) ;
queryString += ";" ;
2022-08-01 08:00:12 +00:00
2022-09-07 07:06:21 +00:00
this . elements . concordanceQueryBuilder . classList . add ( 'modal-close' ) ;
this . elements . extFormQuery . value = queryString ;
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
clearAll ( ) {
// Everything is reset. After 5 seconds for 5 seconds (with "instance"), a message is displayed indicating that further information can be obtained via the question mark icon
let instance = M . Tooltip . getInstance ( this . elements . queryBuilderTutorialInfoIcon ) ;
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
this . hideEverything ( ) ;
this . elements . counter = 0 ;
this . elements . concordanceQueryBuilder . classList . remove ( 'modal-close' ) ;
this . elements . positionalAttrArea . classList . add ( 'hide' ) ;
this . elements . structuralAttrArea . classList . add ( 'hide' ) ;
this . elements . yourQuery . innerHTML = '' ;
this . elements . queryContainer . classList . add ( 'hide' ) ;
instance . tooltipEl . style . background = '#98ACD2' ;
instance . tooltipEl . style . borderTop = 'solid 4px #0064A3' ;
instance . tooltipEl . style . padding = '10px' ;
instance . tooltipEl . style . color = 'black' ;
setTimeout ( ( ) => {
instance . open ( ) ;
setTimeout ( ( ) => {
2022-08-03 14:21:11 +00:00
instance . close ( ) ;
2022-09-07 07:06:21 +00:00
} , 5000 ) ;
} , 5000 ) ;
}
tutorialIconHandler ( id ) {
setTimeout ( ( ) => {
window . location . href = id ;
} , 0 ) ;
}
//#endregion General Functions
//#region Token Attribute Builder Functions
//#region General functions of the Token Builder
tokenTypeSelector ( ) {
this . hideEverything ( ) ;
switch ( this . elements . positionalAttr . value ) {
case "word" :
this . wordBuilder ( ) ;
break ;
case "lemma" :
this . lemmaBuilder ( ) ;
break ;
case "english-pos" :
this . englishPosHandler ( ) ;
break ;
case "german-pos" :
this . germanPosHandler ( ) ;
break ;
case "simple-pos-button" :
this . simplePosBuilder ( ) ;
break ;
case "empty-token" :
this . emptyTokenHandler ( ) ;
break ;
default :
this . wordBuilder ( ) ;
break ;
}
}
hideEverything ( ) {
this . elements . wordBuilder . classList . add ( "hide" ) ;
this . elements . lemmaBuilder . classList . add ( "hide" ) ;
this . elements . ignoreCaseCheckbox . classList . add ( "hide" ) ;
this . elements . inputOptions . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
this . elements . conditionContainer . classList . add ( "hide" ) ;
this . elements . englishPosBuilder . classList . add ( "hide" ) ;
this . elements . germanPosBuilder . classList . add ( "hide" ) ;
this . elements . simplePosBuilder . classList . add ( "hide" ) ;
this . elements . entityBuilder . classList . add ( "hide" ) ;
this . elements . textAnnotationBuilder . classList . add ( "hide" ) ;
}
tokenButtonfactory ( prettyText , tokenText ) {
tokenText = encodeURI ( tokenText ) ;
let builderElement ;
let buttonElement ;
builderElement = document . createElement ( 'div' ) ;
builderElement . innerHTML = `
< div class = "chip col s2 l2" style = "margin-top:20px;" data - tokentext = "${tokenText}" >
$ { prettyText }
< i class = "material-icons close" > close < / i >
< / d i v > ` ;
buttonElement = builderElement . firstElementChild ;
buttonElement . addEventListener ( "click" , ( ) => { this . deleteTokenAttr ( buttonElement ) ; } ) ;
this . elements . tokenQuery . appendChild ( buttonElement ) ;
}
deleteTokenAttr ( attr ) {
// let tokenQuery = this.elements.tokenQuery.childNodes;
// console.log(tokenQuery);
// console.log(this.elements.tokenQuery);
console . log ( this . elements . tokenQuery . childNodes . length ) ;
if ( this . elements . tokenQuery . childNodes . length < 2 ) {
this . elements . tokenQuery . removeChild ( attr ) ;
this . wordBuilder ( ) ;
} else {
this . elements . tokenQuery . removeChild ( attr ) ;
}
}
addToken ( ) {
let c ;
let tokenQueryContent = "" ; //for ButtonFactory(prettyText)
let tokenQueryText = "" ; //for ButtonFactory(queryText)
this . elements . cancelBool = false ;
let emptyTokenCheck = false ;
if ( this . elements . ignoreCase . checked ) {
c = ' %c' ;
} else {
c = '' ;
}
for ( let element of this . elements . tokenQuery . childNodes ) {
tokenQueryContent += ' ' + element . firstChild . data + ' ' ;
tokenQueryText += decodeURI ( element . dataset . tokentext ) ;
if ( element . innerText . indexOf ( "empty token" ) !== - 1 ) {
emptyTokenCheck = true ;
}
2022-08-03 14:21:11 +00:00
}
2022-09-07 07:06:21 +00:00
if ( this . elements . tokenQueryFilled === false ) {
switch ( this . elements . positionalAttr . value ) {
case "word" :
if ( this . elements . wordInput . value === "" ) {
this . disableTokenSubmit ( ) ;
} else {
tokenQueryContent += ` word= ${ this . elements . wordInput . value } ${ c } ` ;
tokenQueryText += ` word=" ${ this . elements . wordInput . value } " ${ c } ` ;
this . elements . wordInput . value = '' ;
}
break ;
case "lemma" :
if ( this . elements . lemmaInput . value === "" ) {
this . disableTokenSubmit ( ) ;
} else {
tokenQueryContent += ` lemma= ${ this . elements . lemmaInput . value } ${ c } ` ;
tokenQueryText += ` lemma=" ${ this . elements . lemmaInput . value } " ${ c } ` ;
this . elements . lemmaInput . value = '' ;
}
break ;
case "english-pos" :
if ( this . elements . englishPos . value === "default" ) {
this . disableTokenSubmit ( ) ;
} else {
tokenQueryContent += ` pos= ${ this . elements . englishPos . value } ` ;
tokenQueryText += ` pos=" ${ this . elements . englishPos . value } " ` ;
this . elements . englishPos . value = '' ;
}
break ;
case "german-pos" :
if ( this . elements . germanPos . value === "default" ) {
this . disableTokenSubmit ( ) ;
} else {
tokenQueryContent += ` pos= ${ this . elements . germanPos . value } ` ;
tokenQueryText += ` pos=" ${ this . elements . germanPos . value } " ` ;
this . elements . germanPos . value = '' ;
}
break ;
case "simple-pos-button" :
if ( this . elements . simplePos . value === "default" ) {
this . disableTokenSubmit ( ) ;
} else {
tokenQueryContent += ` simple_pos= ${ this . elements . simplePos . value } ` ;
tokenQueryText += ` simple_pos=" ${ this . elements . simplePos . value } " ` ;
this . elements . simplePos . value = '' ;
}
break ;
default :
this . wordBuilder ( ) ;
break ;
}
2022-07-13 12:06:22 +00:00
}
2022-09-07 07:06:21 +00:00
// cancelBool looks in disableTokenSubmit() whether a value is passed. If the input fields/dropdowns are empty (cancelBool === true), no token is added.
if ( this . elements . cancelBool === false ) {
// Square brackets are added only if it is not an empty token (where they are already present).
if ( emptyTokenCheck === false ) {
tokenQueryText = '[' + tokenQueryText + ']' ;
}
this . buttonfactory ( 'token' , tokenQueryContent , tokenQueryText ) ;
this . hideEverything ( ) ;
this . elements . positionalAttrArea . classList . add ( 'hide' ) ;
this . elements . tokenQuery . innerHTML = "" ;
}
}
disableTokenSubmit ( ) {
this . elements . cancelBool = true ;
this . elements . tokenSubmitButton . classList . add ( "red" ) ;
this . elements . noValueMessage . classList . remove ( 'hide' ) ;
setTimeout ( ( ) => {
this . elements . tokenSubmitButton . classList . remove ( "red" ) ;
} , 500 ) ;
setTimeout ( ( ) => {
this . elements . noValueMessage . classList . add ( 'hide' ) ;
} , 3000 ) ;
}
//#endregion General functions of the Token Builder
//#region Dropdown Select Handler
wordBuilder ( ) {
this . hideEverything ( ) ;
this . elements . wordInput . value = "" ;
this . elements . wordBuilder . classList . remove ( "hide" ) ;
this . elements . inputOptions . classList . remove ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
this . elements . conditionContainer . classList . remove ( "hide" ) ;
this . elements . ignoreCaseCheckbox . classList . remove ( "hide" ) ;
// Resets materialize select field to default value
let SelectInstance = M . FormSelect . getInstance ( this . elements . positionalAttr ) ;
SelectInstance . input . value = "word" ;
this . elements . positionalAttr . value = "word" ;
}
lemmaBuilder ( ) {
this . hideEverything ( ) ;
this . elements . lemmaBuilder . classList . remove ( "hide" ) ;
this . elements . inputOptions . classList . remove ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
this . elements . conditionContainer . classList . remove ( "hide" ) ;
this . elements . ignoreCaseCheckbox . classList . remove ( "hide" ) ;
}
englishPosHandler ( ) {
this . hideEverything ( ) ;
this . elements . englishPosBuilder . classList . remove ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
this . elements . conditionContainer . classList . remove ( "hide" ) ;
// Resets materialize select dropdown
let selectInstance = M . FormSelect . getInstance ( this . elements . englishPos ) ;
selectInstance . input . value = "English pos tagset" ;
this . elements . englishPos . value = "default" ;
}
germanPosHandler ( ) {
this . hideEverything ( ) ;
this . elements . germanPosBuilder . classList . remove ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
this . elements . conditionContainer . classList . remove ( "hide" ) ;
// Resets materialize select dropdown
let selectInstance = M . FormSelect . getInstance ( this . elements . germanPos ) ;
selectInstance . input . value = "German pos tagset" ;
this . elements . germanPos . value = "default" ;
}
simplePosBuilder ( ) {
this . hideEverything ( ) ;
this . elements . simplePosBuilder . classList . remove ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
this . elements . conditionContainer . classList . remove ( "hide" ) ;
this . elements . simplePos . selectedIndex = 0 ;
// Resets materialize select dropdown
let selectInstance = M . FormSelect . getInstance ( this . elements . simplePos ) ;
selectInstance . input . value = "simple_pos tagset" ;
this . elements . simplePos . value = "default" ;
}
emptyTokenHandler ( ) {
this . tokenButtonfactory ( "empty token" , "[]" ) ;
this . elements . tokenQueryFilled = true ;
this . hideEverything ( ) ;
this . elements . incidenceModifiersButton . classList . remove ( 'hide' ) ;
}
//#endregion Dropdown Select Handler
//#region Options to edit your token - Wildcard Charakter, Option Group, Incidence Modifiers, Ignore Case, "and", "or"
inputOptionHandler ( elem ) {
let input ;
if ( this . elements . wordBuilder . classList . contains ( 'hide' ) === false ) {
input = this . elements . wordInput ;
} else {
input = this . elements . lemmaInput ;
}
if ( elem === this . elements . optionGroup ) {
input . value += '( option1 | option2 )' ;
let firstIndex = input . value . indexOf ( 'option1' ) ;
let lastIndex = firstIndex + 'option1' . length ;
input . focus ( ) ;
input . setSelectionRange ( firstIndex , lastIndex ) ;
} else if ( elem === this . elements . wildcardChar ) {
input . value += '.' ;
}
}
nSubmitHandler ( ) {
let instance = M . Modal . getInstance ( this . elements . exactlyN ) ;
instance . close ( ) ;
switch ( this . elements . positionalAttr . value ) {
case "word" :
this . elements . wordInput . value += " {" + this . elements . nInput . value + "}" ;
break ;
case "lemma" :
this . elements . lemmaInput . value += " {" + this . elements . nInput . value + "}" ;
break ;
case "english-pos" :
this . elements . tokenQueryFilled = true ;
this . tokenButtonfactory ( ` pos= ${ this . elements . englishPos . value } ` , ` pos=" ${ this . elements . englishPos . value } " ` ) ;
this . tokenButtonfactory ( "{" + this . elements . nInput . value + "}" , "{" + this . elements . nInput . value + "}" ) ;
this . elements . englishPosBuilder . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
break ;
case "german-pos" :
this . elements . tokenQueryFilled = true ;
this . tokenButtonfactory ( ` pos= ${ this . elements . germanPos . value } ` , ` pos=" ${ this . elements . germanPos . value } " ` ) ;
this . tokenButtonfactory ( "{" + this . elements . nInput . value + "}" , "{" + this . elements . nInput . value + "}" ) ;
this . elements . germanPosBuilder . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
break ;
case "simple-pos-button" :
this . elements . tokenQueryFilled = true ;
this . tokenButtonfactory ( ` simple_pos= ${ this . elements . simplePos . value } ` , ` simple_pos=" ${ this . elements . simplePos . value } " ` ) ;
this . tokenButtonfactory ( "{" + this . elements . nInput . value + "}" , "{" + this . elements . nInput . value + "}" ) ;
this . elements . simplePosBuilder . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
break ;
case "empty-token" :
this . tokenButtonfactory ( "{" + this . elements . nInput . value + "}" , "{" + this . elements . nInput . value + "}" ) ;
break ;
default :
break ;
}
}
nmSubmitHandler ( ) {
let instance = M . Modal . getInstance ( this . elements . betweenNM ) ;
instance . close ( ) ;
}
incidenceModifiersHandler ( elem ) {
// For word and lemma, the incidence modifiers are inserted in the input field. For the others, one or two chips are created which contain the respective value of the token and the incidence modifier.
if ( this . elements . positionalAttr . value === "empty-token" ) {
this . tokenButtonfactory ( elem . innerText , elem . dataset . token ) ;
} else if ( this . elements . positionalAttr . value === "english-pos" ) {
this . tokenButtonfactory ( ` pos= ${ this . elements . englishPos . value } ` , ` pos=" ${ this . elements . englishPos . value } " ` ) ;
this . tokenButtonfactory ( elem . innerText , elem . dataset . token ) ;
this . elements . englishPosBuilder . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
this . elements . tokenQueryFilled = true ;
} else if ( this . elements . positionalAttr . value === "german-pos" ) {
this . tokenButtonfactory ( ` pos= ${ this . elements . germanPos . value } ` , ` pos=" ${ this . elements . germanPos . value } " ` ) ;
this . tokenButtonfactory ( elem . innerText , elem . dataset . token ) ;
this . elements . germanPosBuilder . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
this . elements . tokenQueryFilled = true ;
} else if ( this . elements . positionalAttr . value === "simple-pos-button" ) {
this . tokenButtonfactory ( ` simple_pos= ${ this . elements . simplePos . value } ` , ` simple_pos=" ${ this . elements . simplePos . value } " ` ) ;
this . tokenButtonfactory ( elem . innerText , elem . dataset . token ) ;
this . elements . simplePosBuilder . classList . add ( "hide" ) ;
this . elements . incidenceModifiersButton . classList . add ( "hide" ) ;
this . elements . tokenQueryFilled = true ;
} else {
let input ;
if ( this . elements . wordBuilder . classList . contains ( 'hide' ) === false ) {
input = this . elements . wordInput ;
} else {
input = this . elements . lemmaInput ;
}
2022-07-13 12:06:22 +00:00
2022-09-07 07:06:21 +00:00
input . value += ' ' + elem . dataset . token ;
}
}
orHandler ( ) {
this . conditionHandler ( "or" , " | " ) ;
}
andHandler ( ) {
this . conditionHandler ( "and" , " & " ) ;
}
conditionHandler ( conditionText , conditionQueryContent ) {
this . hideEverything ( ) ;
let tokenQueryContent ;
let tokenQueryText ;
let c ;
if ( this . elements . ignoreCase . checked ) {
c = ' %c' ;
} else {
c = '' ;
}
switch ( this . elements . positionalAttr . value ) {
case "word" :
tokenQueryContent = ` word= ${ this . elements . wordInput . value } ${ c } ` ;
tokenQueryText = ` word=" ${ this . elements . wordInput . value } " ${ c } ` ;
this . elements . wordInput . value = '' ;
break ;
case "lemma" :
tokenQueryContent = ` lemma= ${ this . elements . lemmaInput . value } ${ c } ` ;
tokenQueryText = ` word=" ${ this . elements . lemmaInput . value } " ${ c } ` ;
this . elements . lemmaInput . value = '' ;
break ;
case "english-pos" :
tokenQueryContent = ` pos= ${ this . elements . englishPos . value } ` ;
tokenQueryText = ` pos=" ${ this . elements . englishPos . value } " ` ;
this . elements . englishPos . value = '' ;
break ;
case "german-pos" :
tokenQueryContent = ` pos= ${ this . elements . germanPos . value } ` ;
tokenQueryText = ` pos=" ${ this . elements . germanPos . value } " ` ;
this . elements . germanPos . value = '' ;
break ;
case "simple-pos-button" :
tokenQueryContent = ` simple_pos= ${ this . elements . simplePos . value } ` ;
tokenQueryText = ` simple_pos=" ${ this . elements . simplePos . value } " ` ;
this . elements . simplePos . value = '' ;
break ;
default :
this . wordBuilder ( ) ;
break ;
}
this . tokenButtonfactory ( tokenQueryContent , tokenQueryText ) ;
this . tokenButtonfactory ( conditionText , conditionQueryContent ) ;
this . wordBuilder ( ) ;
}
//#endregion Options to edit your token - Wildcard Charakter, Option Group, Incidence Modifiers, Ignore Case, "and", "or"
//#endregion Token Attribute Builder Functions
//#region Structural Attribute Builder Functions
addSentence ( ) {
this . hideEverything ( ) ;
if ( this . elements . sentence . text === 'End Sentence' ) {
this . buttonfactory ( 'end-sentence' , 'Sentence End' , '</s>' ) ;
this . elements . sentence . innerHTML = 'Sentence' ;
} else {
this . buttonfactory ( 'start-sentence' , 'Sentence Start' , '<s>' ) ;
this . elements . queryContent . push ( 'sentence' ) ;
this . elements . sentence . innerHTML = 'End Sentence' ;
}
}
addEntity ( ) {
if ( this . elements . entity . text === 'End Entity' ) {
let queryText ;
if ( this . elements . entityAnyType === false ) {
queryText = '</ent_type>' ;
} else {
queryText = '</ent>' ;
}
this . buttonfactory ( 'end-entity' , 'Entity End' , queryText ) ;
this . elements . entity . innerHTML = 'Entity' ;
} else {
this . hideEverything ( ) ;
this . elements . entityBuilder . classList . remove ( "hide" ) ;
window . location . href = "#entity-builder" ;
}
}
englishEntTypeHandler ( ) {
this . buttonfactory ( 'start-entity' , 'Entity Type=' + this . elements . englishEntType . value , '<ent_type="' + this . elements . englishEntType . value + '">' ) ;
this . elements . entity . innerHTML = 'End Entity' ;
this . hideEverything ( ) ;
this . elements . entityAnyType = false ;
// Resets materialize select dropdown
let SelectInstance = M . FormSelect . getInstance ( this . elements . englishEntType ) ;
SelectInstance . input . value = "English ent_type" ;
this . elements . englishEntType . value = "default" ;
}
germanEntTypeHandler ( ) {
this . buttonfactory ( 'start-entity' , 'Entity Type=' + this . elements . germanEntType . value , '<ent_type="' + this . elements . germanEntType . value + '">' ) ;
this . elements . entity . innerHTML = 'End Entity' ;
this . hideEverything ( ) ;
this . elements . entityAnyType = false ;
// Resets materialize select dropdown
let SelectInstance = M . FormSelect . getInstance ( this . elements . germanEntType ) ;
SelectInstance . input . value = "German ent_type" ;
this . elements . germanEntType . value = "default" ;
}
emptyEntityButton ( ) {
this . buttonfactory ( 'start-empty-entity' , 'Entity Start' , '<ent>' ) ;
this . elements . entity . innerHTML = 'End Entity' ;
this . hideEverything ( ) ;
this . elements . entityAnyType = true ;
}
addTextAnnotation ( ) {
this . hideEverything ( ) ;
this . elements . textAnnotationBuilder . classList . remove ( "hide" ) ;
window . location . href = "#text-annotation-builder" ;
// Resets materialize select dropdown
let SelectInstance = M . FormSelect . getInstance ( this . elements . textAnnotationOptions ) ;
SelectInstance . input . value = "address" ;
this . elements . textAnnotationOptions . value = "address" ;
this . elements . textAnnotationInput . value = "" ;
}
textAnnotationSubmitHandler ( ) {
if ( this . elements . textAnnotationInput . value === '' ) {
this . elements . textAnnotationSubmit . classList . add ( 'red' ) ;
this . elements . noValueMetadataMessage . classList . remove ( 'hide' ) ;
setTimeout ( ( ) => {
this . elements . textAnnotationSubmit . classList . remove ( 'red' ) ;
} , 500 ) ;
setTimeout ( ( ) => {
this . elements . noValueMetadataMessage . classList . add ( 'hide' ) ;
} , 3000 ) ;
} else {
let queryText = ` :: match.text_ ${ this . elements . textAnnotationOptions . value } =" ${ this . elements . textAnnotationInput . value } " ` ;
this . buttonfactory ( 'text-annotation' , ` ${ this . elements . textAnnotationOptions . value } = ${ this . elements . textAnnotationInput . value } ` , queryText ) ;
this . hideEverything ( ) ;
}
}
//#endregion Structural Attribute Builder Functions
2022-08-01 08:00:12 +00:00
2022-07-13 12:06:22 +00:00
}