Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F61608432
simple_word.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, May 7, 19:10
Size
5 KB
Mime Type
text/x-python
Expires
Thu, May 9, 19:10 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
17534599
Attached To
rNIETZSCHEPYTHON nietzsche-python
simple_word.py
View Options
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" This super class can be used to represent a simple word.
"""
# Copyright (C) University of Basel 2019 {{{1
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/> 1}}}
__author__
=
"Christian Steiner"
__maintainer__
=
__author__
__copyright__
=
'University of Basel'
__email__
=
"christian.steiner@unibas.ch"
__status__
=
"Development"
__license__
=
"GPL v3"
__version__
=
"0.0.1"
import
abc
from
lxml
import
etree
as
ET
import
sys
from
.line
import
Line
from
.faksimile_position
import
FaksimilePosition
from
.transkription_position
import
TranskriptionPosition
from
.word_position
import
WordPosition
sys
.
path
.
append
(
'py2ttl'
)
from
class_spec
import
SemanticClass
class
SimpleWord
(
SemanticClass
,
metaclass
=
abc
.
ABCMeta
):
"""
This class represents a simple word.
"""
XML_TAG
=
'simple-word'
XML_SUB_TAG
=
'content'
def
__init__
(
self
,
id
=
0
,
line_number
=-
1
,
line
=
None
,
text
=
''
,
deleted
=
False
,
transkription_positions
=
None
,
faksimile_positions
=
None
):
self
.
id
=
id
self
.
text
=
text
self
.
line_number
=
line_number
self
.
lines
=
[]
if
line
is
not
None
:
self
.
lines
.
append
(
line
)
self
.
transkription_positions
=
transkription_positions
if
transkription_positions
is
not
None
else
[]
self
.
faksimile_positions
=
faksimile_positions
if
faksimile_positions
is
not
None
else
[]
def
attach_word_to_tree
(
self
,
target_tree
):
"""Attaches word to tree target_tree.
"""
if
target_tree
.
__class__
.
__name__
==
'_ElementTree'
:
target_tree
=
target_tree
.
getroot
()
if
len
(
target_tree
.
xpath
(
'.//'
+
self
.
XML_TAG
+
'[@id="
%s
"]'
%
self
.
id
))
>
0
:
word_node
=
target_tree
.
xpath
(
'.//'
+
self
.
XML_TAG
+
'[@id="
%s
"]'
%
self
.
id
)[
0
]
word_node
.
getparent
()
.
remove
(
word_node
)
word_node
=
ET
.
SubElement
(
target_tree
,
self
.
XML_TAG
,
attrib
=
{
'id'
:
str
(
self
.
id
)})
word_node
.
set
(
'text'
,
self
.
text
)
if
self
.
line_number
>
-
1
:
word_node
.
set
(
'line-number'
,
str
(
self
.
line_number
))
for
id
,
transkription_position
in
enumerate
(
self
.
transkription_positions
):
transkription_position
.
id
=
id
transkription_position
.
attach_object_to_tree
(
word_node
)
for
faksimile_position
in
self
.
faksimile_positions
:
faksimile_position
.
attach_object_to_tree
(
word_node
)
return
word_node
@classmethod
def
create_cls
(
cls
,
word_node
):
"""Creates a cls from a (lxml.Element) node.
[:return:] cls
"""
if
word_node
is
not
None
:
# init word from xml node
id
=
int
(
word_node
.
get
(
'id'
))
line_number
=
int
(
word_node
.
get
(
'line-number'
))
if
bool
(
word_node
.
get
(
'line-number'
))
else
-
1
text
=
word_node
.
get
(
'text'
)
transkription_positions
=
[
TranskriptionPosition
(
id
=
id
,
node
=
node
)
for
id
,
node
in
enumerate
(
word_node
.
findall
(
'./'
+
WordPosition
.
TRANSKRIPTION
))
]
faksimile_positions
=
[
WordPosition
(
node
=
node
)
for
node
in
word_node
.
findall
(
'./'
+
WordPosition
.
FAKSIMILE
)
]
return
cls
(
id
=
id
,
text
=
text
,
line_number
=
line_number
,
transkription_positions
=
transkription_positions
,
\
faksimile_positions
=
faksimile_positions
)
else
:
error_msg
=
'word_node has not been defined'
raise
Exception
(
'Error: {}'
.
format
(
error_msg
))
@classmethod
def
get_semantic_dictionary
(
cls
):
""" Creates and returns a semantic dictionary as specified by SemanticClass.
"""
dictionary
=
{}
class_dict
=
cls
.
get_class_dictionary
()
properties
=
{
'lines'
:
{
cls
.
CLASS_KEY
:
Line
,
\
cls
.
CARDINALITY
:
1
,
\
cls
.
CARDINALITY_RESTRICTION
:
'minCardinality'
,
\
cls
.
PROPERTY_NAME
:
'wordBelongsToLine'
,
\
cls
.
PROPERTY_LABEL
:
'word belongs to a line'
,
\
cls
.
PROPERTY_COMMENT
:
'Relating a word to a line.'
}}
properties
.
update
(
cls
.
create_semantic_property_dictionary
(
'transkription_positions'
,
TranskriptionPosition
,
\
name
=
'hasTranskriptionPosition'
,
cardinality
=
1
,
cardinality_restriction
=
'minCardinality'
))
properties
.
update
(
cls
.
create_semantic_property_dictionary
(
'faksimile_positions'
,
FaksimilePosition
,
\
name
=
'hasFaksimilePosition'
,
cardinality
=
1
,
cardinality_restriction
=
'minCardinality'
))
properties
.
update
(
cls
.
create_semantic_property_dictionary
(
'text'
,
str
,
cardinality
=
1
,
\
subPropertyOf
=
cls
.
HOMOTYPIC_HAS_TEXT_URL_STRING
))
dictionary
.
update
({
cls
.
CLASS_KEY
:
class_dict
})
dictionary
.
update
({
cls
.
PROPERTIES_KEY
:
properties
})
return
cls
.
return_dictionary_after_updating_super_classes
(
dictionary
)
def
init_word
(
self
,
page
):
"""Initialize word with objects from page.
"""
if
self
.
line_number
>
-
1
:
self
.
lines
+=
[
line
for
line
in
page
.
lines
if
line
.
id
==
self
.
line_number
]
elif
'word_parts'
in
self
.
__dict__
.
keys
()
and
len
(
self
.
word_parts
)
>
0
:
self
.
lines
+=
[
line
for
line
in
page
.
lines
if
line
.
id
in
[
wp
.
line_number
for
wp
in
self
.
word_parts
]
]
Event Timeline
Log In to Comment