Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
humanities
gargantext
Commits
a1c63c74
Commit
a1c63c74
authored
Feb 02, 2015
by
Mathieu Rodic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[BUGFIXES] Corrected some minor bugs.
parent
bc2b0fd4
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
6 additions
and
4 deletions
+6
-4
TurboTagger.py
parsing/Taggers/TurboTagger.py
+4
-1
nlpserver
parsing/Taggers/nlpserver/nlpserver
+0
-1
gargantext.angular.js
static/js/gargantext.angular.js
+1
-1
ng-tags-input.min.js
static/js/ng-tags-input.min.js
+1
-1
No files found.
parsing/Taggers/TurboTagger.py
View file @
a1c63c74
...
@@ -8,9 +8,12 @@ class TurboTagger:
...
@@ -8,9 +8,12 @@ class TurboTagger:
self
.
_nlpclient
=
NLPClient
()
self
.
_nlpclient
=
NLPClient
()
def
stop
(
self
):
def
stop
(
self
):
del
self
.
_nlpclient
if
hasattr
(
self
,
'_nlpclient'
):
del
self
.
_nlpclient
def
tag_text
(
self
,
text
):
def
tag_text
(
self
,
text
):
if
not
hasattr
(
self
,
'_nlpclient'
):
self
.
_nlpclient
=
NLPClient
()
tokens_tags
=
[]
tokens_tags
=
[]
for
sentence
in
self
.
_nlpclient
.
tag
(
text
):
for
sentence
in
self
.
_nlpclient
.
tag
(
text
):
for
token
,
tag
in
sentence
:
for
token
,
tag
in
sentence
:
...
...
parsing/Taggers/nlpserver/nlpserver
View file @
a1c63c74
...
@@ -6,7 +6,6 @@ DAEMON_DIR=$( cd "$(dirname "$BASH_SOURCE[0]")" && pwd)
...
@@ -6,7 +6,6 @@ DAEMON_DIR=$( cd "$(dirname "$BASH_SOURCE[0]")" && pwd)
DAEMON_SCRIPT
=
$DAEMON_DIR
/server.py
DAEMON_SCRIPT
=
$DAEMON_DIR
/server.py
DAEMON_NAME
=
nlpserver
DAEMON_NAME
=
nlpserver
DAEMON_ARGS
=
DAEMON_ARGS
=
echo
$DAEMON_SCRIPT
# DAEMON_USER=root
# DAEMON_USER=root
# The process ID of the script when it runs is stored here:
# The process ID of the script when it runs is stored here:
...
...
static/js/gargantext.angular.js
View file @
a1c63c74
...
@@ -296,8 +296,8 @@ gargantext.controller("DatasetController", function($scope, $http) {
...
@@ -296,8 +296,8 @@ gargantext.controller("DatasetController", function($scope, $http) {
return
defaults
.
concat
(
transform
);
return
defaults
.
concat
(
transform
);
}
}
return
$http
.
get
(
url
,
{
return
$http
.
get
(
url
,
{
cache
:
true
,
transformResponse
:
appendTransform
(
$http
.
defaults
.
transformResponse
,
function
(
value
)
{
transformResponse
:
appendTransform
(
$http
.
defaults
.
transformResponse
,
function
(
value
)
{
console
.
log
(
value
.
data
)
return
value
.
data
;
return
value
.
data
;
})
})
});
});
...
...
static/js/ng-tags-input.min.js
View file @
a1c63c74
/*! ngTagsInput v2.0.1 License: MIT */
!
function
(){
"use strict"
;
function
a
(){
var
a
=
{};
return
{
on
:
function
(
b
,
c
){
return
b
.
split
(
" "
).
forEach
(
function
(
b
){
a
[
b
]
||
(
a
[
b
]
=
[]),
a
[
b
].
push
(
c
)}),
this
},
trigger
:
function
(
b
,
c
){
return
angular
.
forEach
(
a
[
b
],
function
(
a
){
a
.
call
(
null
,
c
)}),
this
}}}
function
b
(
a
,
b
){
return
a
=
a
||
[],
a
.
length
>
0
&&!
angular
.
isObject
(
a
[
0
])
&&
a
.
forEach
(
function
(
c
,
d
){
a
[
d
]
=
{},
a
[
d
][
b
]
=
c
}),
a
}
function
c
(
a
,
b
,
c
){
for
(
var
d
=
null
,
e
=
0
;
e
<
a
.
length
;
e
++
)
if
(
a
[
e
][
c
].
toLowerCase
()
===
b
[
c
].
toLowerCase
()){
d
=
a
[
e
];
break
}
return
d
}
function
d
(
a
,
b
,
c
){
var
d
=
b
.
replace
(
/
([
.?*+^$[
\]\\
(){}|-
])
/g
,
"
\\
$1"
);
return
a
.
replace
(
new
RegExp
(
d
,
"gi"
),
c
)}
var
e
=
{
backspace
:
8
,
tab
:
9
,
enter
:
13
,
escape
:
27
,
space
:
32
,
up
:
38
,
down
:
40
,
comma
:
188
},
f
=
angular
.
module
(
"ngTagsInput"
,[]);
f
.
directive
(
"tagsInput"
,[
"$timeout"
,
"$document"
,
"tagsInputConfig"
,
function
(
d
,
f
,
g
){
function
h
(
a
,
b
){
var
d
,
e
,
f
,
g
=
{};
return
d
=
function
(
b
){
return
b
[
a
.
displayProperty
]},
e
=
function
(
b
,
c
){
b
[
a
.
displayProperty
]
=
c
},
f
=
function
(
b
){
var
e
=
d
(
b
);
return
e
.
length
>=
a
.
minLength
&&
e
.
length
<=
(
a
.
maxLength
||
e
.
length
)
&&
a
.
allowedTagsPattern
.
test
(
e
)
&&!
c
(
g
.
items
,
b
,
a
.
displayProperty
)},
g
.
items
=
[],
g
.
addText
=
function
(
a
){
var
b
=
{};
return
e
(
b
,
a
),
g
.
add
(
b
)},
g
.
add
=
function
(
c
){
var
h
=
d
(
c
).
trim
();
return
a
.
replaceSpacesWithDashes
&&
(
h
=
h
.
replace
(
/
\s
/g
,
"-"
)),
e
(
c
,
h
),
f
(
c
)?(
g
.
items
.
push
(
c
),
b
.
trigger
(
"tag-added"
,{
$tag
:
c
})):
b
.
trigger
(
"invalid-tag"
,{
$tag
:
c
}),
c
},
g
.
remove
=
function
(
a
){
var
c
=
g
.
items
.
splice
(
a
,
1
)[
0
];
return
b
.
trigger
(
"tag-removed"
,{
$tag
:
c
}),
c
},
g
.
removeLast
=
function
(){
var
b
,
c
=
g
.
items
.
length
-
1
;
return
a
.
enableEditingLastTag
||
g
.
selected
?(
g
.
selected
=
null
,
b
=
g
.
remove
(
c
)):
g
.
selected
||
(
g
.
selected
=
g
.
items
[
c
]),
b
},
g
}
return
{
restrict
:
"E"
,
require
:
"ngModel"
,
scope
:{
tags
:
"=ngModel"
,
onTagAdded
:
"&"
,
onTagRemoved
:
"&"
},
replace
:
!
1
,
transclude
:
!
0
,
templateUrl
:
"ngTagsInput/tags-input.html"
,
controller
:[
"$scope"
,
"$attrs"
,
"$element"
,
function
(
b
,
c
,
d
){
g
.
load
(
"tagsInput"
,
b
,
c
,{
placeholder
:[
String
,
"Add a tag"
],
tabindex
:[
Number
],
removeTagSymbol
:[
String
,
String
.
fromCharCode
(
215
)],
replaceSpacesWithDashes
:[
Boolean
,
!
0
],
minLength
:[
Number
,
3
],
maxLength
:[
Number
],
addOnEnter
:[
Boolean
,
!
0
],
addOnSpace
:[
Boolean
,
!
1
],
addOnComma
:[
Boolean
,
!
0
],
addOnBlur
:[
Boolean
,
!
0
],
allowedTagsPattern
:[
RegExp
,
/.+/
],
enableEditingLastTag
:[
Boolean
,
!
1
],
minTags
:[
Number
],
maxTags
:[
Number
],
displayProperty
:[
String
,
"text"
],
allowLeftoverText
:[
Boolean
,
!
1
],
addFromAutocompleteOnly
:[
Boolean
,
!
1
]}),
b
.
events
=
new
a
,
b
.
tagList
=
new
h
(
b
.
options
,
b
.
events
),
this
.
registerAutocomplete
=
function
(){
var
a
=
d
.
find
(
"input"
);
return
a
.
on
(
"keydown"
,
function
(
a
){
b
.
events
.
trigger
(
"input-keydown"
,
a
)}),{
addTag
:
function
(
a
){
return
b
.
tagList
.
add
(
a
)},
focusInput
:
function
(){
a
[
0
].
focus
()},
getTags
:
function
(){
return
b
.
tags
},
getOptions
:
function
(){
return
b
.
options
},
on
:
function
(
a
,
c
){
return
b
.
events
.
on
(
a
,
c
),
this
}}}}],
link
:
function
(
a
,
c
,
g
,
h
){
var
i
=
[
e
.
enter
,
e
.
comma
,
e
.
space
,
e
.
backspace
],
j
=
a
.
tagList
,
k
=
a
.
events
,
l
=
a
.
options
,
m
=
c
.
find
(
"input"
);
k
.
on
(
"tag-added"
,
a
.
onTagAdded
).
on
(
"tag-removed"
,
a
.
onTagRemoved
).
on
(
"tag-added"
,
function
(){
a
.
newTag
.
text
=
""
}).
on
(
"tag-added tag-removed"
,
function
(){
h
.
$setViewValue
(
a
.
tags
)}).
on
(
"invalid-tag"
,
function
(){
a
.
newTag
.
invalid
=!
0
}).
on
(
"input-change"
,
function
(){
j
.
selected
=
null
,
a
.
newTag
.
invalid
=
null
}).
on
(
"input-focus"
,
function
(){
h
.
$setValidity
(
"leftoverText"
,
!
0
)}).
on
(
"input-blur"
,
function
(){
l
.
addFromAutocompleteOnly
||
(
l
.
addOnBlur
&&
j
.
addText
(
a
.
newTag
.
text
),
h
.
$setValidity
(
"leftoverText"
,
l
.
allowLeftoverText
?
!
0
:
!
a
.
newTag
.
text
))}),
a
.
newTag
=
{
text
:
""
,
invalid
:
null
},
a
.
getDisplayText
=
function
(
a
){
return
a
[
l
.
displayProperty
].
trim
()},
a
.
track
=
function
(
a
){
return
a
[
l
.
displayProperty
]},
a
.
newTagChange
=
function
(){
k
.
trigger
(
"input-change"
,
a
.
newTag
.
text
)},
a
.
$watch
(
"tags"
,
function
(
c
){
a
.
tags
=
b
(
c
,
l
.
displayProperty
),
j
.
items
=
a
.
tags
}),
a
.
$watch
(
"tags.length"
,
function
(
a
){
h
.
$setValidity
(
"maxTags"
,
angular
.
isUndefined
(
l
.
maxTags
)
||
a
<=
l
.
maxTags
),
h
.
$setValidity
(
"minTags"
,
angular
.
isUndefined
(
l
.
minTags
)
||
a
>=
l
.
minTags
)}),
m
.
on
(
"keydown"
,
function
(
b
){
if
(
!
b
.
isImmediatePropagationStopped
||!
b
.
isImmediatePropagationStopped
()){
var
c
,
d
,
f
=
b
.
keyCode
,
g
=
b
.
shiftKey
||
b
.
altKey
||
b
.
ctrlKey
||
b
.
metaKey
,
h
=
{};
if
(
!
g
&&-
1
!==
i
.
indexOf
(
f
))
if
(
h
[
e
.
enter
]
=
l
.
addOnEnter
,
h
[
e
.
comma
]
=
l
.
addOnComma
,
h
[
e
.
space
]
=
l
.
addOnSpace
,
c
=!
l
.
addFromAutocompleteOnly
&&
h
[
f
],
d
=!
c
&&
f
===
e
.
backspace
&&
0
===
a
.
newTag
.
text
.
length
,
c
)
j
.
addText
(
a
.
newTag
.
text
),
a
.
$apply
(),
b
.
preventDefault
();
else
if
(
d
){
var
k
=
j
.
removeLast
();
k
&&
l
.
enableEditingLastTag
&&
(
a
.
newTag
.
text
=
k
[
l
.
displayProperty
]),
a
.
$apply
(),
b
.
preventDefault
()}}}).
on
(
"focus"
,
function
(){
a
.
hasFocus
||
(
a
.
hasFocus
=!
0
,
k
.
trigger
(
"input-focus"
),
a
.
$apply
())}).
on
(
"blur"
,
function
(){
d
(
function
(){
var
b
=
f
.
prop
(
"activeElement"
),
d
=
b
===
m
[
0
],
e
=
c
[
0
].
contains
(
b
);(
d
||!
e
)
&&
(
a
.
hasFocus
=!
1
,
k
.
trigger
(
"input-blur"
))})}),
c
.
find
(
"div"
).
on
(
"click"
,
function
(){
m
[
0
].
focus
()})}}}]),
f
.
directive
(
"autoComplete"
,[
"$document"
,
"$timeout"
,
"$sce"
,
"tagsInputConfig"
,
function
(
a
,
f
,
g
,
h
){
function
i
(
a
,
d
){
var
e
,
g
,
h
,
i
=
{};
return
g
=
function
(
a
,
b
){
return
a
.
filter
(
function
(
a
){
return
!
c
(
b
,
a
,
d
.
tagsInput
.
displayProperty
)})},
i
.
reset
=
function
(){
h
=
null
,
i
.
items
=
[],
i
.
visible
=!
1
,
i
.
index
=-
1
,
i
.
selected
=
null
,
i
.
query
=
null
,
f
.
cancel
(
e
)},
i
.
show
=
function
(){
i
.
selected
=
null
,
i
.
visible
=!
0
},
i
.
load
=
function
(
c
,
j
){
return
c
.
length
<
d
.
minLength
?
void
i
.
reset
():(
f
.
cancel
(
e
),
void
(
e
=
f
(
function
(){
i
.
query
=
c
;
var
e
=
a
({
$query
:
c
});
h
=
e
,
e
.
then
(
function
(
a
){
e
===
h
&&
(
a
=
b
(
a
.
data
||
a
,
d
.
tagsInput
.
displayProperty
),
a
=
g
(
a
,
j
),
i
.
items
=
a
.
slice
(
0
,
d
.
maxResultsToShow
),
i
.
items
.
length
>
0
?
i
.
show
():
i
.
reset
())})},
d
.
debounceDelay
,
!
1
)))},
i
.
selectNext
=
function
(){
i
.
select
(
++
i
.
index
)},
i
.
selectPrior
=
function
(){
i
.
select
(
--
i
.
index
)},
i
.
select
=
function
(
a
){
0
>
a
?
a
=
i
.
items
.
length
-
1
:
a
>=
i
.
items
.
length
&&
(
a
=
0
),
i
.
index
=
a
,
i
.
selected
=
i
.
items
[
a
]},
i
.
reset
(),
i
}
function
j
(
a
){
return
a
.
replace
(
/&/g
,
"&"
).
replace
(
/</g
,
"<"
).
replace
(
/>/g
,
">"
)}
return
{
restrict
:
"E"
,
require
:
"^tagsInput"
,
scope
:{
source
:
"&"
},
templateUrl
:
"ngTagsInput/auto-complete.html"
,
link
:
function
(
b
,
c
,
f
,
k
){
var
l
,
m
,
n
,
o
,
p
,
q
=
[
e
.
enter
,
e
.
tab
,
e
.
escape
,
e
.
up
,
e
.
down
];
h
.
load
(
"autoComplete"
,
b
,
f
,{
debounceDelay
:[
Number
,
100
],
minLength
:[
Number
,
3
],
highlightMatchedText
:[
Boolean
,
!
0
],
maxResultsToShow
:[
Number
,
10
]}),
n
=
b
.
options
,
m
=
k
.
registerAutocomplete
(),
n
.
tagsInput
=
m
.
getOptions
(),
l
=
new
i
(
b
.
source
,
n
),
o
=
function
(
a
){
return
a
[
n
.
tagsInput
.
displayProperty
]},
b
.
suggestionList
=
l
,
b
.
addSuggestion
=
function
(){
var
a
=!
1
;
return
l
.
selected
&&
(
m
.
addTag
(
l
.
selected
),
l
.
reset
(),
m
.
focusInput
(),
a
=!
0
),
a
},
b
.
highlight
=
function
(
a
){
var
b
=
o
(
a
);
return
b
=
j
(
b
),
n
.
highlightMatchedText
&&
(
b
=
d
(
b
,
j
(
l
.
query
),
"<em>$&</em>"
)),
g
.
trustAsHtml
(
b
)},
b
.
track
=
function
(
a
){
return
o
(
a
)},
m
.
on
(
"tag-added invalid-tag"
,
function
(){
l
.
reset
()}).
on
(
"input-change"
,
function
(
a
){
a
?
l
.
load
(
a
,
m
.
getTags
()):
l
.
reset
()}).
on
(
"input-keydown"
,
function
(
a
){
var
c
,
d
;
if
(
-
1
!==
q
.
indexOf
(
a
.
keyCode
)){
var
f
=!
1
;
a
.
stopImmediatePropagation
=
function
(){
f
=!
0
,
a
.
stopPropagation
()},
a
.
isImmediatePropagationStopped
=
function
(){
return
f
},
l
.
visible
&&
(
c
=
a
.
keyCode
,
d
=!
1
,
c
===
e
.
down
?(
l
.
selectNext
(),
d
=!
0
):
c
===
e
.
up
?(
l
.
selectPrior
(),
d
=!
0
):
c
===
e
.
escape
?(
l
.
reset
(),
d
=!
0
):(
c
===
e
.
enter
||
c
===
e
.
tab
)
&&
(
d
=
b
.
addSuggestion
()),
d
&&
(
a
.
preventDefault
(),
a
.
stopImmediatePropagation
(),
b
.
$apply
()))}}).
on
(
"input-blur"
,
function
(){
l
.
reset
()}),
p
=
function
(){
l
.
visible
&&
(
l
.
reset
(),
b
.
$apply
())},
a
.
on
(
"click"
,
p
),
b
.
$on
(
"$destroy"
,
function
(){
a
.
off
(
"click"
,
p
)})}}}]),
f
.
directive
(
"tiTranscludeAppend"
,
function
(){
return
function
(
a
,
b
,
c
,
d
,
e
){
e
(
function
(
a
){
b
.
append
(
a
)})}}),
f
.
directive
(
"tiAutosize"
,
function
(){
return
{
restrict
:
"A"
,
require
:
"ngModel"
,
link
:
function
(
a
,
b
,
c
,
d
){
var
e
,
f
,
g
=
3
;
e
=
angular
.
element
(
'<span class="input"></span>'
),
e
.
css
(
"display"
,
"none"
).
css
(
"visibility"
,
"hidden"
).
css
(
"width"
,
"auto"
).
css
(
"white-space"
,
"pre"
),
b
.
parent
().
append
(
e
),
f
=
function
(
a
){
var
d
,
f
=
a
;
return
angular
.
isString
(
f
)
&&
0
===
f
.
length
&&
(
f
=
c
.
placeholder
),
f
&&
(
e
.
text
(
f
),
e
.
css
(
"display"
,
""
),
d
=
e
.
prop
(
"offsetWidth"
),
e
.
css
(
"display"
,
"none"
)),
b
.
css
(
"width"
,
d
?
d
+
g
+
"px"
:
""
),
a
},
d
.
$parsers
.
unshift
(
f
),
d
.
$formatters
.
unshift
(
f
),
c
.
$observe
(
"placeholder"
,
function
(
a
){
d
.
$modelValue
||
f
(
a
)})}}}),
f
.
provider
(
"tagsInputConfig"
,
function
(){
var
a
=
{},
b
=
{};
this
.
setDefaults
=
function
(
b
,
c
){
return
a
[
b
]
=
c
,
this
},
this
.
setActiveInterpolation
=
function
(
a
,
c
){
return
b
[
a
]
=
c
,
this
},
this
.
$get
=
[
"$interpolate"
,
function
(
c
){
var
d
=
{};
return
d
[
String
]
=
function
(
a
){
return
a
},
d
[
Number
]
=
function
(
a
){
return
parseInt
(
a
,
10
)},
d
[
Boolean
]
=
function
(
a
){
return
"true"
===
a
.
toLowerCase
()},
d
[
RegExp
]
=
function
(
a
){
return
new
RegExp
(
a
)},{
load
:
function
(
e
,
f
,
g
,
h
){
f
.
options
=
{},
angular
.
forEach
(
h
,
function
(
h
,
i
){
var
j
,
k
,
l
,
m
,
n
;
j
=
h
[
0
],
k
=
h
[
1
],
l
=
d
[
j
],
m
=
function
(){
var
b
=
a
[
e
]
&&
a
[
e
][
i
];
return
angular
.
isDefined
(
b
)?
b
:
k
},
n
=
function
(
a
){
f
.
options
[
i
]
=
a
?
l
(
a
):
m
()},
b
[
e
]
&&
b
[
e
][
i
]?
g
.
$observe
(
i
,
function
(
a
){
n
(
a
)}):
n
(
g
[
i
]
&&
c
(
g
[
i
])(
f
.
$parent
))})}}}]}),
f
.
run
([
"$templateCache"
,
function
(
a
){
a
.
put
(
"ngTagsInput/tags-input.html"
,
'<div class="host" tabindex="-1" ti-transclude-append=""><div class="tags" ng-class="{focused: hasFocus}"><ul class="tag-list"><li class="tag-item" ng-repeat="tag in tagList.items track by track(tag)" ng-class="{ selected: tag == tagList.selected }"><span>{{getDisplayText(tag)}}</span> <a class="remove-button" ng-click="tagList.remove($index)">{{options.removeTagSymbol}}</a></li></ul><input class="input" placeholder="{{options.placeholder}}" tabindex="{{options.tabindex}}" ng-model="newTag.text" ng-change="newTagChange()" ng-trim="false" ng-class="{
\'
invalid-tag
\'
: newTag.invalid}" ti-autosize=""></div></div>'
),
a
.
put
(
"ngTagsInput/auto-complete.html"
,
'<div class="autocomplete" ng-show="suggestionList.visible"><ul class="suggestion-list"><li class="suggestion-item" ng-repeat="item in suggestionList.items track by track(item)" ng-class="{selected: item == suggestionList.selected}" ng-click="addSuggestion()" ng-mouseenter="suggestionList.select($index)" ng-bind-html="highlight(item)"></li></ul></div>'
)}])}();
/*! ngTagsInput v2.0.1 License: MIT */
!
function
(){
"use strict"
;
function
a
(){
var
a
=
{};
return
{
on
:
function
(
b
,
c
){
return
b
.
split
(
" "
).
forEach
(
function
(
b
){
a
[
b
]
||
(
a
[
b
]
=
[]),
a
[
b
].
push
(
c
)}),
this
},
trigger
:
function
(
b
,
c
){
return
angular
.
forEach
(
a
[
b
],
function
(
a
){
a
.
call
(
null
,
c
)}),
this
}}}
function
b
(
a
,
b
){
return
a
=
a
||
[],
a
.
length
>
0
&&!
angular
.
isObject
(
a
[
0
])
&&
a
.
forEach
(
function
(
c
,
d
){
a
[
d
]
=
{},
a
[
d
][
b
]
=
c
}),
a
}
function
c
(
a
,
b
,
c
){
for
(
var
d
=
null
,
e
=
0
;
e
<
a
.
length
;
e
++
)
if
(
a
[
e
][
c
].
toLowerCase
()
===
b
[
c
].
toLowerCase
()){
d
=
a
[
e
];
break
}
return
d
}
function
d
(
a
,
b
,
c
){
var
d
=
b
.
replace
(
/
([
.?*+^$[
\]\\
(){}|-
])
/g
,
"
\\
$1"
);
return
a
.
replace
(
new
RegExp
(
d
,
"gi"
),
c
)}
var
e
=
{
backspace
:
8
,
tab
:
9
,
enter
:
13
,
escape
:
27
,
space
:
32
,
up
:
38
,
down
:
40
,
comma
:
188
},
f
=
angular
.
module
(
"ngTagsInput"
,[]);
f
.
directive
(
"tagsInput"
,[
"$timeout"
,
"$document"
,
"tagsInputConfig"
,
function
(
d
,
f
,
g
){
function
h
(
a
,
b
){
var
d
,
e
,
f
,
g
=
{};
return
d
=
function
(
b
){
return
b
[
a
.
displayProperty
]},
e
=
function
(
b
,
c
){
b
[
a
.
displayProperty
]
=
c
},
f
=
function
(
b
){
var
e
=
d
(
b
);
return
e
.
length
>=
a
.
minLength
&&
e
.
length
<=
(
a
.
maxLength
||
e
.
length
)
&&
a
.
allowedTagsPattern
.
test
(
e
)
&&!
c
(
g
.
items
,
b
,
a
.
displayProperty
)},
g
.
items
=
[],
g
.
addText
=
function
(
a
){
var
b
=
{};
return
e
(
b
,
a
),
g
.
add
(
b
)},
g
.
add
=
function
(
c
){
var
h
=
d
(
c
).
trim
();
return
a
.
replaceSpacesWithDashes
,
e
(
c
,
h
),
f
(
c
)?(
g
.
items
.
push
(
c
),
b
.
trigger
(
"tag-added"
,{
$tag
:
c
})):
b
.
trigger
(
"invalid-tag"
,{
$tag
:
c
}),
c
},
g
.
remove
=
function
(
a
){
var
c
=
g
.
items
.
splice
(
a
,
1
)[
0
];
return
b
.
trigger
(
"tag-removed"
,{
$tag
:
c
}),
c
},
g
.
removeLast
=
function
(){
var
b
,
c
=
g
.
items
.
length
-
1
;
return
a
.
enableEditingLastTag
||
g
.
selected
?(
g
.
selected
=
null
,
b
=
g
.
remove
(
c
)):
g
.
selected
||
(
g
.
selected
=
g
.
items
[
c
]),
b
},
g
}
return
{
restrict
:
"E"
,
require
:
"ngModel"
,
scope
:{
tags
:
"=ngModel"
,
onTagAdded
:
"&"
,
onTagRemoved
:
"&"
},
replace
:
!
1
,
transclude
:
!
0
,
templateUrl
:
"ngTagsInput/tags-input.html"
,
controller
:[
"$scope"
,
"$attrs"
,
"$element"
,
function
(
b
,
c
,
d
){
g
.
load
(
"tagsInput"
,
b
,
c
,{
placeholder
:[
String
,
"Add a tag"
],
tabindex
:[
Number
],
removeTagSymbol
:[
String
,
String
.
fromCharCode
(
215
)],
replaceSpacesWithDashes
:[
Boolean
,
!
0
],
minLength
:[
Number
,
3
],
maxLength
:[
Number
],
addOnEnter
:[
Boolean
,
!
0
],
addOnSpace
:[
Boolean
,
!
1
],
addOnComma
:[
Boolean
,
!
0
],
addOnBlur
:[
Boolean
,
!
0
],
allowedTagsPattern
:[
RegExp
,
/.+/
],
enableEditingLastTag
:[
Boolean
,
!
1
],
minTags
:[
Number
],
maxTags
:[
Number
],
displayProperty
:[
String
,
"text"
],
allowLeftoverText
:[
Boolean
,
!
1
],
addFromAutocompleteOnly
:[
Boolean
,
!
1
]}),
b
.
events
=
new
a
,
b
.
tagList
=
new
h
(
b
.
options
,
b
.
events
),
this
.
registerAutocomplete
=
function
(){
var
a
=
d
.
find
(
"input"
);
return
a
.
on
(
"keydown"
,
function
(
a
){
b
.
events
.
trigger
(
"input-keydown"
,
a
)}),{
addTag
:
function
(
a
){
return
b
.
tagList
.
add
(
a
)},
focusInput
:
function
(){
a
[
0
].
focus
()},
getTags
:
function
(){
return
b
.
tags
},
getOptions
:
function
(){
return
b
.
options
},
on
:
function
(
a
,
c
){
return
b
.
events
.
on
(
a
,
c
),
this
}}}}],
link
:
function
(
a
,
c
,
g
,
h
){
var
i
=
[
e
.
enter
,
e
.
comma
,
e
.
space
,
e
.
backspace
],
j
=
a
.
tagList
,
k
=
a
.
events
,
l
=
a
.
options
,
m
=
c
.
find
(
"input"
);
k
.
on
(
"tag-added"
,
a
.
onTagAdded
).
on
(
"tag-removed"
,
a
.
onTagRemoved
).
on
(
"tag-added"
,
function
(){
a
.
newTag
.
text
=
""
}).
on
(
"tag-added tag-removed"
,
function
(){
h
.
$setViewValue
(
a
.
tags
)}).
on
(
"invalid-tag"
,
function
(){
a
.
newTag
.
invalid
=!
0
}).
on
(
"input-change"
,
function
(){
j
.
selected
=
null
,
a
.
newTag
.
invalid
=
null
}).
on
(
"input-focus"
,
function
(){
h
.
$setValidity
(
"leftoverText"
,
!
0
)}).
on
(
"input-blur"
,
function
(){
l
.
addFromAutocompleteOnly
||
(
l
.
addOnBlur
&&
j
.
addText
(
a
.
newTag
.
text
),
h
.
$setValidity
(
"leftoverText"
,
l
.
allowLeftoverText
?
!
0
:
!
a
.
newTag
.
text
))}),
a
.
newTag
=
{
text
:
""
,
invalid
:
null
},
a
.
getDisplayText
=
function
(
a
){
return
a
[
l
.
displayProperty
].
trim
()},
a
.
track
=
function
(
a
){
return
a
[
l
.
displayProperty
]},
a
.
newTagChange
=
function
(){
k
.
trigger
(
"input-change"
,
a
.
newTag
.
text
)},
a
.
$watch
(
"tags"
,
function
(
c
){
a
.
tags
=
b
(
c
,
l
.
displayProperty
),
j
.
items
=
a
.
tags
}),
a
.
$watch
(
"tags.length"
,
function
(
a
){
h
.
$setValidity
(
"maxTags"
,
angular
.
isUndefined
(
l
.
maxTags
)
||
a
<=
l
.
maxTags
),
h
.
$setValidity
(
"minTags"
,
angular
.
isUndefined
(
l
.
minTags
)
||
a
>=
l
.
minTags
)}),
m
.
on
(
"keydown"
,
function
(
b
){
if
(
!
b
.
isImmediatePropagationStopped
||!
b
.
isImmediatePropagationStopped
()){
var
c
,
d
,
f
=
b
.
keyCode
,
g
=
b
.
shiftKey
||
b
.
altKey
||
b
.
ctrlKey
||
b
.
metaKey
,
h
=
{};
if
(
!
g
&&-
1
!==
i
.
indexOf
(
f
))
if
(
h
[
e
.
enter
]
=
l
.
addOnEnter
,
h
[
e
.
comma
]
=
l
.
addOnComma
,
h
[
e
.
space
]
=
l
.
addOnSpace
,
c
=!
l
.
addFromAutocompleteOnly
&&
h
[
f
],
d
=!
c
&&
f
===
e
.
backspace
&&
0
===
a
.
newTag
.
text
.
length
,
c
)
j
.
addText
(
a
.
newTag
.
text
),
a
.
$apply
(),
b
.
preventDefault
();
else
if
(
d
){
var
k
=
j
.
removeLast
();
k
&&
l
.
enableEditingLastTag
&&
(
a
.
newTag
.
text
=
k
[
l
.
displayProperty
]),
a
.
$apply
(),
b
.
preventDefault
()}}}).
on
(
"focus"
,
function
(){
a
.
hasFocus
||
(
a
.
hasFocus
=!
0
,
k
.
trigger
(
"input-focus"
),
a
.
$apply
())}).
on
(
"blur"
,
function
(){
d
(
function
(){
var
b
=
f
.
prop
(
"activeElement"
),
d
=
b
===
m
[
0
],
e
=
c
[
0
].
contains
(
b
);(
d
||!
e
)
&&
(
a
.
hasFocus
=!
1
,
k
.
trigger
(
"input-blur"
))})}),
c
.
find
(
"div"
).
on
(
"click"
,
function
(){
m
[
0
].
focus
()})}}}]),
f
.
directive
(
"autoComplete"
,[
"$document"
,
"$timeout"
,
"$sce"
,
"tagsInputConfig"
,
function
(
a
,
f
,
g
,
h
){
function
i
(
a
,
d
){
var
e
,
g
,
h
,
i
=
{};
return
g
=
function
(
a
,
b
){
return
a
.
filter
(
function
(
a
){
return
!
c
(
b
,
a
,
d
.
tagsInput
.
displayProperty
)})},
i
.
reset
=
function
(){
h
=
null
,
i
.
items
=
[],
i
.
visible
=!
1
,
i
.
index
=-
1
,
i
.
selected
=
null
,
i
.
query
=
null
,
f
.
cancel
(
e
)},
i
.
show
=
function
(){
i
.
selected
=
null
,
i
.
visible
=!
0
},
i
.
load
=
function
(
c
,
j
){
return
c
.
length
<
d
.
minLength
?
void
i
.
reset
():(
f
.
cancel
(
e
),
void
(
e
=
f
(
function
(){
i
.
query
=
c
;
var
e
=
a
({
$query
:
c
});
h
=
e
,
e
.
then
(
function
(
a
){
e
===
h
&&
(
a
=
b
(
a
.
data
||
a
,
d
.
tagsInput
.
displayProperty
),
a
=
g
(
a
,
j
),
i
.
items
=
a
.
slice
(
0
,
d
.
maxResultsToShow
),
i
.
items
.
length
>
0
?
i
.
show
():
i
.
reset
())})},
d
.
debounceDelay
,
!
1
)))},
i
.
selectNext
=
function
(){
i
.
select
(
++
i
.
index
)},
i
.
selectPrior
=
function
(){
i
.
select
(
--
i
.
index
)},
i
.
select
=
function
(
a
){
0
>
a
?
a
=
i
.
items
.
length
-
1
:
a
>=
i
.
items
.
length
&&
(
a
=
0
),
i
.
index
=
a
,
i
.
selected
=
i
.
items
[
a
]},
i
.
reset
(),
i
}
function
j
(
a
){
return
a
.
replace
(
/&/g
,
"&"
).
replace
(
/</g
,
"<"
).
replace
(
/>/g
,
">"
)}
return
{
restrict
:
"E"
,
require
:
"^tagsInput"
,
scope
:{
source
:
"&"
},
templateUrl
:
"ngTagsInput/auto-complete.html"
,
link
:
function
(
b
,
c
,
f
,
k
){
var
l
,
m
,
n
,
o
,
p
,
q
=
[
e
.
enter
,
e
.
tab
,
e
.
escape
,
e
.
up
,
e
.
down
];
h
.
load
(
"autoComplete"
,
b
,
f
,{
debounceDelay
:[
Number
,
100
],
minLength
:[
Number
,
3
],
highlightMatchedText
:[
Boolean
,
!
0
],
maxResultsToShow
:[
Number
,
10
]}),
n
=
b
.
options
,
m
=
k
.
registerAutocomplete
(),
n
.
tagsInput
=
m
.
getOptions
(),
l
=
new
i
(
b
.
source
,
n
),
o
=
function
(
a
){
return
a
[
n
.
tagsInput
.
displayProperty
]},
b
.
suggestionList
=
l
,
b
.
addSuggestion
=
function
(){
var
a
=!
1
;
return
l
.
selected
&&
(
m
.
addTag
(
l
.
selected
),
l
.
reset
(),
m
.
focusInput
(),
a
=!
0
),
a
},
b
.
highlight
=
function
(
a
){
var
b
=
o
(
a
);
return
b
=
j
(
b
),
n
.
highlightMatchedText
&&
(
b
=
d
(
b
,
j
(
l
.
query
),
"<em>$&</em>"
)),
g
.
trustAsHtml
(
b
)},
b
.
track
=
function
(
a
){
return
o
(
a
)},
m
.
on
(
"tag-added invalid-tag"
,
function
(){
l
.
reset
()}).
on
(
"input-change"
,
function
(
a
){
a
?
l
.
load
(
a
,
m
.
getTags
()):
l
.
reset
()}).
on
(
"input-keydown"
,
function
(
a
){
var
c
,
d
;
if
(
-
1
!==
q
.
indexOf
(
a
.
keyCode
)){
var
f
=!
1
;
a
.
stopImmediatePropagation
=
function
(){
f
=!
0
,
a
.
stopPropagation
()},
a
.
isImmediatePropagationStopped
=
function
(){
return
f
},
l
.
visible
&&
(
c
=
a
.
keyCode
,
d
=!
1
,
c
===
e
.
down
?(
l
.
selectNext
(),
d
=!
0
):
c
===
e
.
up
?(
l
.
selectPrior
(),
d
=!
0
):
c
===
e
.
escape
?(
l
.
reset
(),
d
=!
0
):(
c
===
e
.
enter
||
c
===
e
.
tab
)
&&
(
d
=
b
.
addSuggestion
()),
d
&&
(
a
.
preventDefault
(),
a
.
stopImmediatePropagation
(),
b
.
$apply
()))}}).
on
(
"input-blur"
,
function
(){
l
.
reset
()}),
p
=
function
(){
l
.
visible
&&
(
l
.
reset
(),
b
.
$apply
())},
a
.
on
(
"click"
,
p
),
b
.
$on
(
"$destroy"
,
function
(){
a
.
off
(
"click"
,
p
)})}}}]),
f
.
directive
(
"tiTranscludeAppend"
,
function
(){
return
function
(
a
,
b
,
c
,
d
,
e
){
e
(
function
(
a
){
b
.
append
(
a
)})}}),
f
.
directive
(
"tiAutosize"
,
function
(){
return
{
restrict
:
"A"
,
require
:
"ngModel"
,
link
:
function
(
a
,
b
,
c
,
d
){
var
e
,
f
,
g
=
3
;
e
=
angular
.
element
(
'<span class="input"></span>'
),
e
.
css
(
"display"
,
"none"
).
css
(
"visibility"
,
"hidden"
).
css
(
"width"
,
"auto"
).
css
(
"white-space"
,
"pre"
),
b
.
parent
().
append
(
e
),
f
=
function
(
a
){
var
d
,
f
=
a
;
return
angular
.
isString
(
f
)
&&
0
===
f
.
length
&&
(
f
=
c
.
placeholder
),
f
&&
(
e
.
text
(
f
),
e
.
css
(
"display"
,
""
),
d
=
e
.
prop
(
"offsetWidth"
),
e
.
css
(
"display"
,
"none"
)),
b
.
css
(
"width"
,
d
?
d
+
g
+
"px"
:
""
),
a
},
d
.
$parsers
.
unshift
(
f
),
d
.
$formatters
.
unshift
(
f
),
c
.
$observe
(
"placeholder"
,
function
(
a
){
d
.
$modelValue
||
f
(
a
)})}}}),
f
.
provider
(
"tagsInputConfig"
,
function
(){
var
a
=
{},
b
=
{};
this
.
setDefaults
=
function
(
b
,
c
){
return
a
[
b
]
=
c
,
this
},
this
.
setActiveInterpolation
=
function
(
a
,
c
){
return
b
[
a
]
=
c
,
this
},
this
.
$get
=
[
"$interpolate"
,
function
(
c
){
var
d
=
{};
return
d
[
String
]
=
function
(
a
){
return
a
},
d
[
Number
]
=
function
(
a
){
return
parseInt
(
a
,
10
)},
d
[
Boolean
]
=
function
(
a
){
return
"true"
===
a
.
toLowerCase
()},
d
[
RegExp
]
=
function
(
a
){
return
new
RegExp
(
a
)},{
load
:
function
(
e
,
f
,
g
,
h
){
f
.
options
=
{},
angular
.
forEach
(
h
,
function
(
h
,
i
){
var
j
,
k
,
l
,
m
,
n
;
j
=
h
[
0
],
k
=
h
[
1
],
l
=
d
[
j
],
m
=
function
(){
var
b
=
a
[
e
]
&&
a
[
e
][
i
];
return
angular
.
isDefined
(
b
)?
b
:
k
},
n
=
function
(
a
){
f
.
options
[
i
]
=
a
?
l
(
a
):
m
()},
b
[
e
]
&&
b
[
e
][
i
]?
g
.
$observe
(
i
,
function
(
a
){
n
(
a
)}):
n
(
g
[
i
]
&&
c
(
g
[
i
])(
f
.
$parent
))})}}}]}),
f
.
run
([
"$templateCache"
,
function
(
a
){
a
.
put
(
"ngTagsInput/tags-input.html"
,
'<div class="host" tabindex="-1" ti-transclude-append=""><div class="tags" ng-class="{focused: hasFocus}"><ul class="tag-list"><li class="tag-item" ng-repeat="tag in tagList.items track by track(tag)" ng-class="{ selected: tag == tagList.selected }"><span>{{getDisplayText(tag)}}</span> <a class="remove-button" ng-click="tagList.remove($index)">{{options.removeTagSymbol}}</a></li></ul><input class="input" placeholder="{{options.placeholder}}" tabindex="{{options.tabindex}}" ng-model="newTag.text" ng-change="newTagChange()" ng-trim="false" ng-class="{
\'
invalid-tag
\'
: newTag.invalid}" ti-autosize=""></div></div>'
),
a
.
put
(
"ngTagsInput/auto-complete.html"
,
'<div class="autocomplete" ng-show="suggestionList.visible"><ul class="suggestion-list"><li class="suggestion-item" ng-repeat="item in suggestionList.items track by track(item)" ng-class="{selected: item == suggestionList.selected}" ng-click="addSuggestion()" ng-mouseenter="suggestionList.select($index)" ng-bind-html="highlight(item)"></li></ul></div>'
)}])}();
\ No newline at end of file
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment