Skip to content

Commit 793c8fe

Browse files
committed
#298 impl for subjects and complex lists (with uris, list of values) + apply it to subjects in ISO 19115
1 parent 36a444f commit 793c8fe

7 files changed

+144
-54
lines changed

DESCRIPTION

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ Suggests:
6868
d4storagehub4R,
6969
rmarkdown,
7070
dataverse
71+
Remotes:
72+
eblondel/geometa
7173
License: MIT + file LICENSE
7274
URL: https://github.com/r-geoflow/geoflow
7375
BugReports: https://github.com/r-geoflow/geoflow

R/geoflow_kvp.R

+21-24
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,25 @@
1111
#' @return Object of \code{\link{R6Class}} for modelling an kvp (Key Values pair)
1212
#' @format \code{\link{R6Class}} object.
1313
#'
14-
#' @examples
15-
#' \dontrun{
16-
#' #with setters
17-
#' kvp <- geoflow_kvp$new()
18-
#' kvp$setKey("thekey")
19-
#' kvp$setValue("thevalue")
20-
#' #from string
21-
#' kvp <- geoflow_kvp$new(str = "thekey:thevalue1,thevalue2")
22-
#' }
23-
#'
2414
#' @author Emmanuel Blondel <emmanuel.blondel1@@gmail.com>
2515
#'
2616
geoflow_kvp <- R6Class("geoflow_kvp",
2717
public = list(
2818
#'@field key the KVP key
2919
key = NULL,
30-
#'@field value the KVP value
31-
value = NULL,
20+
#'@field values the KVP values
21+
values = NULL,
22+
#'@field locale a locale definition for the KVP
23+
locale = NULL,
3224

3325
#'@description Initializes a Key-Value pair (KVP)
34-
#'@param str character string to initialize from using key-based syntax
35-
initialize = function(str = NULL){
36-
if(!is.null(str)){
37-
kvp <- unlist(strsplit(str,':\\s*(?=([^"]*"[^"]*")*[^"]*$)', perl = T))
38-
if(length(kvp)!=2) stop("Invalid Key-value pair string")
39-
self$setKey(kvp[1])
40-
self$setValue(kvp[2])
41-
}
26+
#'@param key key
27+
#'@param values values
28+
#'@param locale locale
29+
initialize = function(key = NULL, values = NULL, locale = NULL){
30+
if(!is.null(key)) self$setKey(key)
31+
if(!is.null(values)) self$setValues(values)
32+
if(!is.null(locale)) self$setLocale(locale)
4233
},
4334

4435
#'@description Set KVP key
@@ -47,10 +38,16 @@ geoflow_kvp <- R6Class("geoflow_kvp",
4738
self$key <- key
4839
},
4940

50-
#'@description Set KVP value
51-
#'@param value the value
52-
setValue = function(value){
53-
self$value <- value
41+
#'@description Set KVP values
42+
#'@param values the values
43+
setValues = function(values){
44+
self$values <- values
45+
},
46+
47+
#'@description Set KVP locale
48+
#'@param locale locale
49+
setLocale = function(locale){
50+
self$locale <- locale
5451
}
5552
)
5653
)

R/geoflow_subject.R

+44-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ geoflow_subject <- R6Class("geoflow_subject",
3939

4040
#'@description Initializes an object of class \link{geoflow_subject}
4141
#'@param str a character string to initialize from, using key-based syntax
42-
initialize = function(str = NULL){
42+
#'@param kvp an object of class \link{geoflow_kvp}
43+
initialize = function(str = NULL, kvp = NULL){
4344
if(!is.null(str)){
4445
subject_kvp <- extract_kvp(str)
4546
key <- subject_kvp$key
@@ -51,6 +52,48 @@ geoflow_subject <- R6Class("geoflow_subject",
5152
self$setUri(uri)
5253
self$setName(name)
5354
invisible(lapply(subject_kvp$values, self$addKeyword))
55+
}else if(!is.null(kvp)){
56+
#key
57+
subject_key <- kvp$key
58+
key_attrs <- attributes(subject_key)
59+
attributes(subject_key) <- NULL
60+
self$setKey(subject_key)
61+
#name
62+
name <- key_attrs$description
63+
if(!is.null(name)){
64+
key_desc_attrs <- key_attrs[startsWith(names(key_attrs),"description") & names(key_attrs)!="description"]
65+
for(attr_name in names(key_desc_attrs)){
66+
locale <- unlist(strsplit(attr_name,"description#"))[2]
67+
attr(name, paste0("locale#",locale)) <- key_desc_attrs[[attr_name]]
68+
}
69+
self$setName(name)
70+
}
71+
#uri
72+
uri <- key_attrs$uri
73+
if(!is.null(uri)){
74+
key_uri_attrs <- key_attrs[startsWith(names(key_attrs),"uri") & names(key_attrs)!="uri"]
75+
for(attr_name in names(key_uri_attrs)){
76+
locale <- unlist(strsplit(attr_name, "uri#"))[2]
77+
attr(uri, paste0("locale#",locale)) <- key_uri_attrs[[attr_name]]
78+
}
79+
self$setUri(uri)
80+
}
81+
#keywords
82+
for(i in 1:length(kvp$values)){
83+
kwd = kvp$values[[i]]
84+
kwd_uri <- attr(kwd,"uri")
85+
attributes(kwd) <- NULL
86+
87+
val_locale_attrs <- attributes(kvp$values)
88+
for(attr_name in names(val_locale_attrs)){
89+
locale_value <- val_locale_attrs[[attr_name]][[i]]
90+
if(!is.null(kwd_uri)) attr(kwd_uri, attr_name) <- attr(locale_value, "uri")
91+
attributes(locale_value) <- NULL
92+
attr(kwd, attr_name) <- locale_value
93+
}
94+
self$addKeyword(keyword = kwd, uri = kwd_uri)
95+
}
96+
5497
}
5598
},
5699

R/geoflow_utils.R

+14-3
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,15 @@ extract_kvp <- function(str){
125125

126126
#locale management
127127
locale = NULL
128+
key_attrs <- attributes(key)
128129
key_parts <- unlist(strsplit(key, "#"))
129130
if(length(key_parts)>1){
130131
key <- key_parts[1]
132+
attributes(key) <- key_attrs
131133
locale <- key_parts[2]
132134
}
133135

134-
return(list(key = key, values = values, locale = locale))
136+
return(geoflow_kvp$new(key = key, values = values, locale = locale))
135137
}
136138

137139
#' @name extract_kvp
@@ -159,19 +161,28 @@ extract_kvps <- function(strs, collapse = NULL){
159161
kvps_for_key <- kvps[sapply(kvps, function(kvp){kvp$key == key})]
160162
with_null_locale <- any(sapply(kvps_for_key, function(x){is.null(x$locale)}))
161163
kvp_with_default_locale <- kvps_for_key[sapply(kvps_for_key, function(x){is.null(x$locale)})]
164+
kvp_with_locale <- kvps_for_key[sapply(kvps_for_key, function(x){!is.null(x$locale)})]
162165
if(length(kvp_with_default_locale)>0){
163166
kvp_with_default_locale <- kvp_with_default_locale[[1]]
164167
}else{
165168
#TODO support default language in geoflow
166169
}
170+
#localization
171+
key <- kvp_with_default_locale$key
172+
#locale key descriptions
173+
for(kvp in kvp_with_locale){
174+
if(!is.null(attr(kvp$key, "uri"))) attr(key, paste0("uri#", kvp$locale)) <- attr(kvp$key, "uri")
175+
if(!is.null(attr(kvp$key, "description"))) attr(key, paste0("description#", kvp$locale)) <- attr(kvp$key, "description")
176+
}
177+
#locale key uris
178+
#locale values
167179
locale_values <- kvp_with_default_locale$values
168180
if(length(locale_values)==1) locale_values <- locale_values[[1]]
169-
kvp_with_locale <- kvps_for_key[sapply(kvps_for_key, function(x){!is.null(x$locale)})]
170181
for(item in kvp_with_locale){
171182
attr(locale_values, paste0("locale#", toupper(item$locale))) <- item$values
172183
}
173184

174-
kvp_with_locales <- list(key = key, values = locale_values)
185+
kvp_with_locales <- geoflow_kvp$new(key = key, values = locale_values)
175186
return(kvp_with_locales)
176187
})
177188

inst/actions/geometa_create_iso_19115.R

+25-2
Original file line numberDiff line numberDiff line change
@@ -475,20 +475,43 @@ function(action, entity, config){
475475
kwds <- ISOKeywords$new()
476476
for(kwd in subject$keywords){
477477
iso_kwd <- kwd$name
478+
iso_kwd_locales <- geoflow::get_locales_from(kwd$name)
479+
iso_kwd_locales_codes = names(iso_kwd_locales)
478480
if(!is.null(kwd$uri)){
479481
iso_kwd <- ISOAnchor$new(name = kwd$name, href = kwd$uri)
482+
iso_kwd_locales_uris <- geoflow::get_locales_from(kwd$uri)
483+
if(length(iso_kwd_locales_uris)>0){
484+
iso_kwd_locales <- lapply(iso_kwd_locales_codes, function(locale){
485+
iso_kwd_locale <- iso_kwd_locales[[locale]]
486+
attr(iso_kwd_locale, "uri") <- iso_kwd_locales_uris[[locale]]
487+
return(iso_kwd_locale)
488+
})
489+
names(iso_kwd_locales) <- iso_kwd_locales_codes
490+
}
480491
}
481-
kwds$addKeyword(iso_kwd)
492+
kwds$addKeyword(iso_kwd, locales = iso_kwd_locales)
482493
}
483494
kwds$setKeywordType(subject$key)
484495
#theausurus
485496
if(!is.null(subject$name)){
486497
th <- ISOCitation$new()
487498
title <- subject$name
499+
title_locales <- geoflow::get_locales_from(subject$name)
500+
title_locales_codes <- names(title_locales)
501+
488502
if(!is.null(subject$uri)){
489503
title <- ISOAnchor$new(name = subject$name, href = subject$uri)
504+
title_locales_uris <- geoflow::get_locales_from(subject$uri)
505+
if(length(title_locales_uris)>0){
506+
title_locales <- lapply(title_locales_codes, function(locale){
507+
title_locale <- title_locales[[locale]]
508+
attr(title_locale, "uri") <- title_locales_uris[[locale]]
509+
return(title_locale)
510+
})
511+
names(title_locales) <- title_locales_codes
512+
}
490513
}
491-
th$setTitle(title)
514+
th$setTitle(title, locales = title_locales)
492515

493516
if(length(subject$dates)>0){
494517
for(subj_datetype in names(subject$dates)){

inst/metadata/entity/entity_handler_df.R

+4-3
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,11 @@ handle_entities_df <- function(config, source){
135135
src_subject <- sanitize_str(source_entity[,"Subject"])
136136
subjects <- if(!is.na(src_subject)) extract_cell_components(src_subject) else list()
137137
if(length(subjects)>0){
138-
invisible(lapply(subjects, function(subject){
139-
subject_obj <- geoflow_subject$new(str = subject)
138+
kvps <- extract_kvps(subjects)
139+
for(kvp in kvps){
140+
subject_obj <- geoflow_subject$new(kvp = kvp)
140141
entity$addSubject(subject_obj)
141-
}))
142+
}
142143
}
143144

144145
#formats

man/geoflow_kvp.Rd

+34-21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)