@@ -89,36 +89,66 @@ const MsgMap readMessagesXml(pugi::xml_document& doc, pugi::xml_parse_result& re
89
89
MsgMap msgs;
90
90
91
91
if (result) {
92
+ // <default>'s:
92
93
for (pugi::xml_node def: doc.child (" errors" ).child (" defaults" ).children (" default" )) {
93
- // std::cerr << "defaults" << std::endl;
94
+ // For all <title>'s and <description>'s, add all their parent <id>/<re>'s:
94
95
for (pugi::xml_node child: def.child (" header" ).children (" title" )) {
95
96
const auto & msg = fromUtf8 (xml_raw_cdata (child));
96
97
const auto & lang = child.attribute (" xml:lang" ).value ();
97
98
for (pugi::xml_node e: def.child (" ids" ).children (" e" )) {
98
99
// e_value assumes we only ever have one PCDATA element here:
99
100
const auto & errtype = fromUtf8 (e.attribute (" id" ).value ());
100
- // std::cerr << toUtf8(errtype) << std::endl;
101
101
if (msgs[lang].first .count (errtype) != 0 ) {
102
102
std::cerr << " divvun-suggest: WARNING: Duplicate titles for " << e.attribute (" id" ).value () << std::endl;
103
103
}
104
- msgs[lang].first [errtype] = msg;
104
+ // Default to <title> as <description>, may be overridden below:
105
+ msgs[lang].first [errtype] = make_pair (msg, msg);
105
106
}
106
107
for (pugi::xml_node re: def.child (" ids" ).children (" re" )) {
107
108
std::basic_regex<char > r (re.attribute (" v" ).value ());
108
- msgs[lang].second .push_back (std::make_pair (r, msg));
109
+ msgs[lang].second .push_back (std::make_pair (r, make_pair ( msg, msg) ));
109
110
}
110
111
}
112
+ for (pugi::xml_node child: def.child (" body" ).children (" description" )) {
113
+ const auto & msg = fromUtf8 (xml_raw_cdata (child));
114
+ const auto & lang = child.attribute (" xml:lang" ).value ();
115
+ for (pugi::xml_node e: def.child (" ids" ).children (" e" )) {
116
+ const auto & errtype = fromUtf8 (e.attribute (" id" ).value ());
117
+ auto &langmsgs = msgs[lang].first ;
118
+ if (langmsgs.find (errtype) != langmsgs.end ()) {
119
+ langmsgs[errtype].second = msg;
120
+ } else {
121
+ // No <title> for this language, fallback to <description>:
122
+ langmsgs[errtype] = std::make_pair (msg, msg);
123
+ }
124
+ }
125
+ }
111
126
}
127
+ // <error>'s
112
128
for (pugi::xml_node error: doc.child (" errors" ).children (" error" )) {
129
+ const auto & errtype = fromUtf8 (error.attribute (" id" ).value ());
130
+ // For all <title>'s and <description>'s, add the <error id> attribute:
113
131
for (pugi::xml_node child: error.child (" header" ).children (" title" )) {
114
132
// child_value assumes we only ever have one PCDATA element here:
115
- const auto & errtype = fromUtf8 (error.attribute (" id" ).value ());
116
133
const auto & msg = fromUtf8 (xml_raw_cdata (child));
117
134
const auto & lang = child.attribute (" xml:lang" ).value ();
118
- if (msgs[lang].first .count (errtype) != 0 ) {
119
- std::cerr << " divvun-suggest: WARNING: Duplicate titles for " << error.attribute (" id" ).value () << std::endl;
135
+ auto & langmsgs = msgs[lang].first ;
136
+ if (langmsgs.count (errtype) != 0 ) {
137
+ std::cerr << " divvun-suggest: WARNING: Duplicate <title>'s for " << error.attribute (" id" ).value () << std::endl;
138
+ }
139
+ langmsgs[errtype] = make_pair (msg, msg);
140
+ }
141
+ for (pugi::xml_node child: error.child (" body" ).children (" description" )) {
142
+ const auto & msg = fromUtf8 (xml_raw_cdata (child));
143
+ const auto & lang = child.attribute (" xml:lang" ).value ();
144
+ auto & langmsgs = msgs[lang].first ;
145
+ if (langmsgs.find (errtype) != langmsgs.end ()) {
146
+ langmsgs[errtype].second = msg;
147
+ }
148
+ else {
149
+ // No <title> for this language, fallback to <description>:
150
+ langmsgs[errtype] = std::make_pair (msg, msg);
120
151
}
121
- msgs[lang].first [errtype] = msg;
122
152
}
123
153
}
124
154
}
@@ -397,10 +427,10 @@ variant<Nothing, Err> Suggest::cohort_errs(const ErrId& err_id,
397
427
if (cohort_empty (c) || c.added || ignores.find (err_id) != ignores.end ()) {
398
428
return Nothing ();
399
429
}
400
- u16string msg;
430
+ Msg msg;
401
431
for (const auto & mlang : sortedmsglangs) {
402
- if (msg.empty () && mlang != locale) {
403
- std::cerr << " divvun-suggest: WARNING: No message for " << json::str (err_id) << " in xml:lang '" << locale << " ', trying '" << mlang << " '" << std::endl;
432
+ if (msg.second . empty () && mlang != locale) {
433
+ std::cerr << " divvun-suggest: WARNING: No <description> for " << json::str (err_id) << " in xml:lang '" << locale << " ', trying '" << mlang << " '" << std::endl;
404
434
}
405
435
const auto & lmsgs = msgs.at (mlang);
406
436
if (lmsgs.first .count (err_id) != 0 ) {
@@ -421,23 +451,28 @@ variant<Nothing, Err> Suggest::cohort_errs(const ErrId& err_id,
421
451
}
422
452
}
423
453
}
424
- if (!msg.empty ()) {
454
+ if (!msg.second . empty ()) {
425
455
break ;
426
456
}
427
457
}
428
- if (msg.empty ()) {
429
- std::cerr << " divvun-suggest: WARNING: No message for " << json::str (err_id) << " in any xml:lang" << std::endl;
430
- msg = err_id;
458
+ if (msg.second .empty ()) {
459
+ std::cerr << " divvun-suggest: WARNING: No <description> for " << json::str (err_id) << " in any xml:lang" << std::endl;
460
+ msg.second = err_id;
461
+ }
462
+ if (msg.first .empty ()) {
463
+ msg.first = err_id;
431
464
}
432
465
// TODO: Make suitable structure on creating MsgMap instead?
433
- replaceAll (msg, u" $1" , c.form );
466
+ replaceAll (msg.first , u" $1" , c.form );
467
+ replaceAll (msg.second , u" $1" , c.form );
434
468
for (const auto & r: c.readings ) {
435
469
if ((!r.errtype .empty ()) && err_id != r.errtype ) {
436
470
continue ;
437
471
}
438
472
rel_on_match (r.rels , MSG_TEMPLATE_REL, sentence,
439
473
[&] (const string& relname, size_t i_t , const Cohort& trg) {
440
- replaceAll (msg, fromUtf8 (relname.c_str ()), trg.form );
474
+ replaceAll (msg.first , fromUtf8 (relname.c_str ()), trg.form );
475
+ replaceAll (msg.second , fromUtf8 (relname.c_str ()), trg.form );
441
476
});
442
477
}
443
478
auto beg = c.pos ;
@@ -770,8 +805,9 @@ RunState Suggest::run_json(std::istream& is, std::ostream& os)
770
805
<< " ," << std::to_string (e.beg )
771
806
<< " ," << std::to_string (e.end )
772
807
<< " ," << json::str (e.err )
773
- << " ," << json::str (e.msg )
808
+ << " ," << json::str (e.msg . second )
774
809
<< " ," << json::str_arr (e.rep )
810
+ << " ," << json::str (e.msg .first )
775
811
<< " ]" ;
776
812
wantsep = true ;
777
813
}
0 commit comments