• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pkiraly / metadata-qa-marc / #1456

25 Apr 2025 09:41AM UTC coverage: 90.285% (-0.2%) from 90.499%
#1456

push

pkiraly
Parse 245, and extract contributors #610

95 of 201 new or added lines in 3 files covered. (47.26%)

1 existing line in 1 file now uncovered.

36698 of 40647 relevant lines covered (90.28%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

45.88
/src/main/java/de/gwdg/metadataqa/marc/cli/utils/translation/ContributorNormaliser.java
1
package de.gwdg.metadataqa.marc.cli.utils.translation;
2

3
import de.gwdg.metadataqa.api.model.XmlFieldInstance;
4
import org.apache.commons.io.FileUtils;
5
import org.apache.commons.lang3.StringUtils;
6

7
import java.io.File;
8
import java.io.IOException;
9
import java.nio.charset.StandardCharsets;
10
import java.text.Normalizer;
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.List;
14
import java.util.Map;
15
import java.util.Scanner;
16
import java.util.logging.Logger;
17
import java.util.regex.Matcher;
18
import java.util.regex.Pattern;
19
import java.util.stream.Collectors;
20

21
import static de.gwdg.metadataqa.marc.cli.utils.translation.ContributorNormaliser.TYPE.TRANSLATOR;
22

23
public class ContributorNormaliser {
24
  private static final Logger logger = Logger.getLogger(ContributorNormaliser.class.getCanonicalName());
1✔
25

26
  public static final String UNRESOLVED_CONTRIBUTORS_FILE = "translations-unresolved-contributors.csv";
27
  public static final Pattern LOWER = Pattern.compile("\\p{Lower}");
1✔
28
  public static final List<String> NAME_ELEMENTS = List.of(
1✔
29
    "de", "dos", "és", "von", "írta", "irta", "szerk.", "ill.", "zenéjét", "szerezte",
30
    "by", "du", "et", "al.", "di", "van", "v.", "hrsg.", "szöveg", "le", "vál.", "összeáll.", "rajz.",
31
    "la", "da", "der", "and", "del", "of", "d'"
32
  );
33
  private static final List<String> TRANSLATION_ELEMENTS = List.of(
1✔
34
    "ford.", "fordította"
35
  );
36
  private static final List<String> TRANSLATOR_PREFIXES = List.of(
1✔
37
    "ford.", "írta és ford.", "vál. és ford.", "ford. és magy.", "... ford.", "vál., szerk. és ford.",
38
    "fordította", "magyar szöveg", "ford., az utószót és a jegyzeteket írta", "vál., ford. és az utószót írta",
39
    "ford. és jegyzetekkel ell.", "összeáll. és ford.", "ford., a bevezetőt és a jegyzeteket írta",
40
    "ford. és szerk.", "ford., a bevezetőt és a jegyzeteket írta", "vál., ford.", "ford. és az utószót írta",
41
    "ford., a jegyzeteket és az utószót írta", "válogatta, fordította és az utószót írta",
42
    "vál., ford., a jegyzeteket és az utószót írta", "vál., ford., az utószót és a jegyzeteket írta",
43
    "vál., ford. és szerk.", "válogatta és fordította", "transl. by", "transl.", "a köt. fordítói",
44
    "ford., bev. és jegyz. ellátta", "a m. változatot kész.", "... fordítói", "ford. ...", "vál., ford. és bev.",
45
    "ford. és ... jegyzetekkel ell.", "németből ford.", "ford., bev. és jegyz.", "ford., vál. és az utószót írta",
46
    "ford., sajtó alá rend.", "ford., utószó és jegyz.", "vál., ford. és a jegyzeteket írta",
47
    "vál., ford., a kísérő tanulmányt és a jegyz. írta", "ford., az életrajzokat és a jegyz. írta",
48
    "vál., ford., előszó", "vál., ford., utószóval és életrajzi jegyzetekkel ell.",
49
    "összekötő szövegeket írta és a verseket ford.", "összeáll., az elbeszéléseket ford. és a tanulmányt írta",
50
    "angolból ford.", "ford. és bev.", "franciából ford.", "... magyar szöveg", "... vál. és ford.",
51
    "... összeáll. és ford.", "vál., ford. és utószó", "vál., ford. és utószó", "ford. és bev. ell.",
52
    "ford. és magy. ell.", "ford. és magy. ell.", "bev., vál., ford.", "bev., vál. és ford.",
53
    "vál., ford. és az életrajzi jegyzeteket írta", "a kötet fordítói", "görögből ford. és magyarázta",
54
    "ford. és bev. ellátta", "vál. és németből ford.", "a kötetet vál. és ford.", "a kötetet összeáll. és ford.",
55
    "a verseket vál. és ford.", "a tanulmányokat írta, a szövegeket vál., ford. és jegyzetekkel ell.",
56
    "vál., ford. és az előszót írta", "vál., ford. és jegyz.", "... vál., ford. és a jegyzeteket írta",
57
    "fordította és átdolgozta", "a bevezetőt írta, ford. és jegyzetekkel ell.",
58
    "összeáll., ford., bev. és jegyz.", "összeáll., vál., ford.", "transl., ed. by",
59
    "összeállította, a bevezetést és a jegyzeteket írta, a latin szövegeket fordította",
60
    "ford. és sajtó alá rend.", "ford. és a bevezetést írta", "ford., bev és jegyz. ellátta",
61
    "transl. from the Hungarian by", "vál., ford., bev., jegyz.", "vál., nyersford., utószó és jegyz.",
62
    "transl. and ed. by", "ford., bev. és magy.", "német nyelvre és nyelvterületre adaptálta és ford.",
63
    "német nyelvterületre adaptálta és ford.", "ford., bev. és magy.", "ford. és magyarázta",
64
    "trad. de", "ausgew. und aus dem Ungarischen übers. von", "ausgew. und aus dem Ung. übers. von",
65
    "ford. és átd.", "sel. and transl. by", "ford. és az ifjúság számára összeállították",
66
    "transl. ... by", "fordította, az utószót és a jegyzeteket írta", "ford., jegyz.",
67
    "übers. von", "műfordításai", "ford., bev.", "trad.", "ford., átd.", "vál., ford. és a bevezetőt írta",
68
    "aus dem Ungarischen von", "aus dem Ung. von", "ford. és az előszót írta", "szerk. és ford.",
69
    "francziából ford.", "angolból átd.", "szerk. és ford.", "a meséket ford.",
70
    "válogatta, fordította, az utószót és a jegyzeteket írta", "ford., szerk.",
71
    "... ford., az előszót és a jegyzeteket írta", "bev. és ford.", "vál., ford., utószó",
72
    "introd., transl.", "... übertr. von"
73
  );
74
  private static final List<String> TRANSLATOR_SUFFIXES = List.of(
1✔
75
    "fordításában", "átköltésében", "ford.", "fordításai", "műfordításai", "fordításában és utószavával"
76
  );
77

78
  private static final List<String> EDITOR_PREFIXES = List.of(
1✔
79
    "főszerk.", "vál. és az előszót írta", "vál., az utószót és az életrajzi jegyzeteket írta",
80
    "vál. és az életrajzi jegyzeteket írta", "... vál. és átd.", "vál., szerk. és az utószót írta",
81
    "sajtó alá rend.", "válogatta és szerkesztette", "szerkesztette", "vál. és az utószót írta", "ed. by",
82
    "válogatta", "vál. és a jegyzeteket írta", "ed. by", "közread.", "vál. és jegyz.", "vál., utószó és jegyz.",
83
    "vál., utószó és jegyz.", "vál. és utószó", "bev.", "vál., ford., utószó és jegyz.", "magyarázta",
84
    "... vál. és az előszót írta", "... közread.", "... fel. szerk.", "vál., bev.", "fel. szerk.",
85
    "... vál., az utószót és az életrajzi jegyzeteket írta", "... vál. és az utószót írta", "közread. a",
86
    "ed.-in-chief", "szerk., bev. és magy.", "szerk., bev. és magy. ellátta", "... szerk. és a tanulmányt írta",
87
    "vál., átd.", "összeáll. és átd.", "bev. és magyarázatokkal ellátta", "összeáll., bev., magy. és jegyz.",
88
    "vál., bev. és jegyz.", "sel. and ed. by", "válogatta és a jegyzeteket készítette",
89
    "válogatta és a gyerekeknek átdolgozta", "vál., sajtó alá rend. és az utószót írta",
90
    "válogatta és a jegyzeteket írta", "válogatta és a jegyzeteket összeállította", "ed. by ...",
91
    "főszerk. ...", "sajtó alá rend. ...", "comp. and ed. by", "szerk. és magyarázta", "szerk. és átd.",
92
    "válogatta, szerkesztette és a bevezető tanulmányt írta", "közread. az", "sel. and ed. by",
93
    "bev. és magyarázta", "iskolai használatra magyarázta", "szerk., utószó és jegyz.",
94
    "Válogatta és szerkesztette", "válogatta és az utószót írta", "sajtó alá rend. és bev.",
95
    "bev. és magy", "bev. és magy. ellátta", "ed.", "bev. és magy.", "comp. by", "magy.", "sel. by",
96
    "összegyűjt.", "utószó", "vál., szerk. és az előszót írta", "vál., ford., az előszót és a jegyzeteket írta",
97
    "válogatta és szerkesztette, az előszót és a jegyzeteket írta", "vál., utószó", "hrsg. von",
98
    "kiadta és magyarázta", "összeáll., bev., magyarázatokkal és jegyzetekkel ell.",
99
    "az ifjúság számára összevál.", "vál., bev. és a függ. összeáll.", "compil.",
100
    "sajtó alá rend., vál., bev. és jegyz. ell.", "sel., introd., ed.", "ausgew. von",
101
    "válogatta, az utószót és a jegyzeteket írta", "szerkesztette, az utószót és a jegyzeteket írta",
102
    "sajtó alá rend., az utószót és a jegyzeteket írta", "vál., utószó, jegyz.", "intr.", "vál., szerk.",
103
    "előszó", "vál., szerk., az utószót és az életrajzi jegyzeteket írta",
104
    "vál., szerk., jegyz.", "zsgest. von", "zost.", "ured.", "red.", "összeáll. és magyarázatokkal ellátta",
105
    "with a pref. and ill. by", "vál., életrajzi jegyz.", "... az utószót ... írta",
106
    "intr. by", "a bev. tanulmányt írta", "a cura di"
107
  );
108
  private static final List<String> EDITOR_SUFFIXES = List.of(
1✔
109
    "válogatása", "válogatásában", "összeállítása", "főszerk.", "fel. szerk."
110
  );
111
  private static final List<String> AUTHOR_PREFIXES = List.of(
1✔
112
    "szerző", "szerzők", "átd.", "... átd.", "vál. és átd.", "újrameséli", "írták", "elmeséli az",
113
    "Text und Ill.", "written by", "írta és rajzolta", "text", "az ifjúság számára átd.",
114
    "az ifjúság számára átdolg.", "alapján", "adaptációja", "művei", "eredeti regényét átd.", "meséit átd.",
115
    "ötlete alapján írta", "nyomán írta", "regénye", "ötletéből ... írta", "meséjét átd.", "meséje",
116
    "nacherzählt von", "írásait átd.", "adapted by", "munkája", "tollából", "texte et photos", "par",
117
    "forgatókönyve alapján írta", "sorozata alapján írta", "a meséket átd."
118
  );
119

120
  private static final List<String> ILLUSTRATOR_PREFIXES = List.of(
1✔
121
    "rajz", "... összefirkálta", "fot.", "fotó", "photos by", "phot."
122
  );
123
  private static final List<String> ILLUSTRATOR_SUFFIXES = List.of(
1✔
124
    "illusztrációival", "rajzaival"
125
  );
126

127

128
  public HashMap<TYPE, List<String>> getContributors() {
129
    return contributors;
1✔
130
  }
131

132
  enum TYPE {
1✔
133
    AUTHOR, TRANSLATOR, EDITOR, ILLUSTRATOR;
1✔
134
  }
135

136
  private final String outputDir;
137
  private final Map<String, Integer> unresolvedContributors;
138
  private final Map<String, List<String>> unresolvedContributorsSamples;
139
  private final Pattern compiledPattern;
140
  private Map<String, Pattern> patterns;
141
  private HashMap<TYPE, List<String>> contributors;
142
  private final String translatorPrefixes;
143
  private final String translatorSuffixes;
144
  private final String editorPrefixes;
145
  private final String editorSuffixes;
146
  private final String authorPrefixes;
147
  private final String illustratorPrefixes;
148
  private final String illustratorSuffixes;
149

150
  public ContributorNormaliser(String outputDir, Pattern compiledPattern) {
1✔
151
    this.outputDir = outputDir;
1✔
152
    this.compiledPattern = compiledPattern;
1✔
153
    this.unresolvedContributors = new HashMap<>();
1✔
154
    this.unresolvedContributorsSamples = new HashMap<>();
1✔
155
    this.patterns = new HashMap<>();
1✔
156
    translatorPrefixes = "(?:" + StringUtils.join(TRANSLATOR_PREFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
157
    translatorSuffixes = "(?:" + StringUtils.join(TRANSLATOR_SUFFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
158
    editorPrefixes = "(?:" + StringUtils.join(EDITOR_PREFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
159
    editorSuffixes = "(?:" + StringUtils.join(EDITOR_SUFFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
160
    authorPrefixes = "(?:" + StringUtils.join(AUTHOR_PREFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
161
    illustratorPrefixes = "(?:" + StringUtils.join(ILLUSTRATOR_PREFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
162
    illustratorSuffixes = "(?:" + StringUtils.join(ILLUSTRATOR_SUFFIXES, "|").replaceAll("\\.", "\\\\.") + ")";
1✔
163
  }
1✔
164

165
  public boolean hasLowercase(String contributorString) {
166
    boolean hasLowercase = false;
1✔
167
    Scanner scanner = new Scanner(contributorString.trim().replaceAll("^\\[", ""));
1✔
168
    while (scanner.hasNext()) {
1✔
169
      String token = scanner.next();
1✔
170
      if (Character.isLowerCase(token.charAt(0)) && !NAME_ELEMENTS.contains(token)) {
1✔
171
        hasLowercase = true;
1✔
172
        // System.err.println("lower: " + token);
173
      }
174
    }
1✔
175
    return hasLowercase;
1✔
176
  }
177

178
  public boolean hasContributor(String contributorString) {
179
    Matcher matcher = compiledPattern.matcher(contributorString);
1✔
180
    boolean found = matcher.find();
1✔
181
    if (found) {
1✔
182
      // System.err.println("before: " + contributorString.substring(0, matcher.start()));
183
      // System.err.println("after: " + contributorString.substring(matcher.end()));
184
    }
185
    return found;
1✔
186
  }
187

188
  public void process(List<XmlFieldInstance> list) {
189
    contributors = new HashMap<>();
1✔
190
    for (XmlFieldInstance xmlFieldInstance : list) {
1✔
191
      process(xmlFieldInstance.getValue());
1✔
192
    }
1✔
193
  }
1✔
194

195
  public void process(String text) {
196
    text = Normalizer.normalize(text.trim(), Normalizer.Form.NFKC);
1✔
197
    text = text.replaceAll("(\\[|\\])", "").replaceAll("\\s+", " ");
1✔
198

199
    if (hasContributor(text) || hasLowercase(text)) {
1✔
200
      String translationPattern = extractPattern(text);
1✔
201
      if (!translationPattern.equals("")) {
1✔
202
        // System.err.println(text);
203
        unresolvedContributors.put(
1✔
204
          translationPattern,
205
          unresolvedContributors.getOrDefault(translationPattern, 0) + 1
1✔
206
        );
207
        if (   !translationPattern.equals("TRANSLATOR")
1✔
208
            && !translationPattern.equals("EDITOR")
1✔
209
            && !translationPattern.equals("AUTHOR")
1✔
NEW
210
            && !translationPattern.equals("ILLUSTRATOR")
×
211
        ) {
NEW
212
          if (!unresolvedContributorsSamples.containsKey(translationPattern))
×
NEW
213
            unresolvedContributorsSamples.put(translationPattern, new ArrayList());
×
NEW
214
          if (    unresolvedContributorsSamples.get(translationPattern).size() < 5
×
NEW
215
              && !unresolvedContributorsSamples.get(translationPattern).contains(text))
×
NEW
216
            unresolvedContributorsSamples.get(translationPattern).add(text);
×
217
        }
218
      }
219
    }
220
  }
1✔
221

222
  private boolean matches(String text, TYPE type, String pattern) {
223
    Matcher matcher = getPattern(pattern).matcher(text);
1✔
224
    if (matcher.matches()) {
1✔
225
      addContributor(type, matcher.group(1));
1✔
226
      if (matcher.groupCount() == 8)
1✔
227
        addContributor(type, matcher.group(5));
1✔
228
      return true;
1✔
229
    }
230
    return false;
1✔
231
  }
232

233
  private void addContributor(TYPE type, String contributor) {
234
    if (!contributors.containsKey(type))
1✔
235
      contributors.put(type, new ArrayList<>());
1✔
236

237
    if (getPattern("(, | és | and | u\\. | valamint )").matcher(contributor).find()) {
1✔
238
      for (String localContributor : contributor.split("(, | és | and | u\\. | valamint )")) {
1✔
239
        contributors.get(type).add(localContributor);
1✔
240
      }
241
    } else {
242
      contributors.get(type).add(contributor);
1✔
243
    }
244
  }
1✔
245

246
  private String extractPattern(String text) {
247

248
    if (matches(text, TRANSLATOR, "^" + translatorPrefixes + " ([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)?$")) {
1✔
249
      return "TRANSLATOR";
1✔
250
    }
251

252
    if (matches(text, TRANSLATOR, "^([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)? " + translatorSuffixes + "$")) {
1✔
253
      return "TRANSLATOR";
1✔
254
    }
255

256
    if (matches(text, TYPE.EDITOR, "^" + editorPrefixes + " ([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)?$")) {
1✔
257
      return "EDITOR";
1✔
258
    }
259

260
    if (matches(text, TYPE.EDITOR, "^([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)? " + editorSuffixes + "$")) {
1✔
261
      return "EDITOR";
1✔
262
    }
263

264
    if (matches(text, TYPE.AUTHOR, "^" + authorPrefixes + " ([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)?$")) {
1✔
NEW
265
      return "AUTHOR";
×
266
    }
267

268
    if (matches(text, TYPE.AUTHOR, "^([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)? " + authorPrefixes + "$")) {
1✔
269
      return "AUTHOR";
1✔
270
    }
271

272
    if (matches(text, TYPE.AUTHOR, "^([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)? " + authorPrefixes + " ([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)$")) {
1✔
273
      return "AUTHOR";
1✔
274
    }
275

NEW
276
    if (matches(text, TYPE.ILLUSTRATOR, "^" + illustratorPrefixes + " ([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)?$")) {
×
NEW
277
      return "ILLUSTRATOR";
×
278
    }
279

NEW
280
    if (matches(text, TYPE.ILLUSTRATOR, "^([\\p{javaUpperCase}][\\p{javaLowerCase}\\.]*(( |-|\\. | és |, | and | u\\. | valamint )[\\p{javaUpperCase}]([\\p{javaLowerCase}]+|\\.))+)(?: et al\\.|\\.| \\.\\.\\. et al\\.)? " + illustratorSuffixes + "$")) {
×
NEW
281
      return "ILLUSTRATOR";
×
282
    }
283

NEW
284
    text = text.replace("ford. és magyarázta", "FORD");
×
NEW
285
    text = text.replace("ford., bev. és jegyz. ellátta", "FORD");
×
NEW
286
    text = text.replace("vál., ford. és az utószót írta", "FORD");
×
NEW
287
    text = text.replace("válogatta, fordította és az utószót írta", "FORD");
×
NEW
288
    text = text.replace("ford. és az utószót írta", "FORD");
×
NEW
289
    text = text.replace("fordította és az utószót írta", "FORD");
×
NEW
290
    text = text.replace("vál. és ford.", "FORD");
×
NEW
291
    text = text.replace("ford. és magy.", "FORD");
×
NEW
292
    text = text.replace("vál., szerk. és ford.", "FORD");
×
NEW
293
    text = text.replace("ford. és szerk.", "FORD");
×
NEW
294
    text = text.replace("összeáll. és ford.", "FORD");
×
NEW
295
    text = text.replace("ford., az utószót és a jegyzeteket írta", "FORD");
×
NEW
296
    text = text.replace("ford. és bev.", "FORD");
×
NEW
297
    text = text.replace("németből ford.", "FORD");
×
NEW
298
    text = text.replace("fordítói", "FORD");
×
NEW
299
    text = text.replace("magyar szöveg", "FORD");
×
NEW
300
    text = text.replace("a köt. fordítói", "FORD");
×
NEW
301
    text = text.replace("ford. és ... jegyzetekkel ell.", "FORD");
×
NEW
302
    text = text.replace("ford., a jegyzeteket és az utószót írta", "FORD");
×
NEW
303
    text = text.replace("vál., ford. és bev.", "FORD");
×
NEW
304
    text = text.replace("válogatta és fordította", "FORD");
×
NEW
305
    text = text.replace("vál., ford.", "FORD");
×
NEW
306
    text = text.replace("vál., fordította", "FORD");
×
NEW
307
    text = text.replace("a m. változatot kész.", "FORD");
×
NEW
308
    text = text.replace("angolból ford.", "FORD");
×
NEW
309
    text = text.replace("angolból átd.", "FORD");
×
NEW
310
    text = text.replace("angolból szabadon átd.", "FORD");
×
NEW
311
    text = text.replace("német nyelvre és nyelvterületre adaptálta és ford.", "FORD");
×
NEW
312
    text = text.replace("német nyelvterületre adaptálta és ford.", "FORD");
×
NEW
313
    text = text.replace("franciából ford.", "FORD");
×
NEW
314
    text = text.replace("ford. és jegyzetekkel ell.", "FORD");
×
NEW
315
    text = text.replace("ford., a bevezetőt és a jegyzeteket írta", "FORD");
×
NEW
316
    text = text.replace("ford., bev. és jegyz.", "FORD");
×
NEW
317
    text = text.replace("ford., bev. és magy.", "FORD");
×
NEW
318
    text = text.replace("írta és ford.", "FORD");
×
NEW
319
    text = text.replace("fordításában", "FORD");
×
NEW
320
    text = text.replace("fordította", "FORD");
×
NEW
321
    text = text.replace("transl. by", "transl.");
×
322

NEW
323
    text = text.replace("vál. és az utószót írta", "SZERK");
×
NEW
324
    text = text.replace("vál. és az előszót írta", "SZERK");
×
NEW
325
    text = text.replace("vál., szerk. és az utószót írta", "SZERK");
×
NEW
326
    text = text.replace("vál., utószó és jegyz.", "SZERK");
×
NEW
327
    text = text.replace("vál. és jegyz.", "SZERK");
×
NEW
328
    text = text.replace("vál. és utószó", "SZERK");
×
NEW
329
    text = text.replace("utószó és jegyz.", "SZERK");
×
NEW
330
    text = text.replace("vál., az utószót és az életrajzi jegyzeteket írta", "SZERK");
×
NEW
331
    text = text.replace("sajtó alá rend.", "SZERK");
×
NEW
332
    text = text.replace("vál., átd.", "SZERK");
×
NEW
333
    text = text.replace("vál., bev.", "SZERK");
×
NEW
334
    text = text.replace("... vál. és átd.", "SZERK");
×
NEW
335
    text = text.replace("bev. és magy. ellátta", "SZERK");
×
NEW
336
    text = text.replace("bev. és magy.", "SZERK");
×
NEW
337
    text = text.replace("bev. és magyarázatokkal ellátta", "SZERK");
×
NEW
338
    text = text.replace("összeáll. és átd.", "SZERK");
×
NEW
339
    text = text.replace("kiadta és magyarázta", "SZERK");
×
NEW
340
    text = text.replace("vál. és a jegyzeteket írta", "SZERK");
×
NEW
341
    text = text.replace("főszerk.", "SZERK");
×
NEW
342
    text = text.replace("ed.-in-chief", "SZERK");
×
NEW
343
    text = text.replace("fel. szerk.", "SZERK");
×
NEW
344
    text = text.replace("ed. by", "SZERK");
×
NEW
345
    text = text.replace("sel., introd., ed.", "SZERK");
×
NEW
346
    text = text.replace("válogatta és szerkesztette", "SZERK");
×
NEW
347
    text = text.replace("összeáll., bev., magyarázatokkal és jegyzetekkel ell.", "SZERK");
×
NEW
348
    text = text.replace("vál., bev. és jegyz.", "SZERK");
×
NEW
349
    text = text.replace("vál. és az életrajzi jegyzeteket írta", "SZERK");
×
NEW
350
    text = text.replace("válogatta", "SZERK");
×
NEW
351
    text = text.replace("szerkesztette", "SZERK");
×
NEW
352
    text = text.replace("magyarázta", "SZERK");
×
NEW
353
    text = text.replace("közread.", "SZERK");
×
354

NEW
355
    Scanner scanner = new Scanner(text);
×
NEW
356
    List<String> patterns = new ArrayList<>();
×
NEW
357
    while (scanner.hasNext()) {
×
NEW
358
      String token = scanner.next();
×
NEW
359
      if (token.equals("FORD"))
×
NEW
360
        patterns.add("<FORD>");
×
NEW
361
      else if (token.equals("SZERK"))
×
NEW
362
        patterns.add("<SZERK>");
×
NEW
363
      else if (TRANSLATION_ELEMENTS.contains(token)) {
×
NEW
364
        patterns.add(String.format("<FORD|%s>", token));
×
365
      } else {
NEW
366
        if (Character.isUpperCase(token.charAt(0))) {
×
NEW
367
          patterns.add("X");
×
368
        } else {
NEW
369
          patterns.add(token);
×
370
        }
371
      }
NEW
372
    }
×
NEW
373
    return String.join(" ", patterns);
×
374
  }
375

376
  private Pattern getPattern(String text) {
377
    if (!patterns.containsKey(text))
1✔
378
      patterns.put(text, Pattern.compile(text));
1✔
379
    return patterns.get(text);
1✔
380
  }
381

382
  public void reportUnresolvedContributors() {
383
    logger.info(String.format("reportUnresolvedContributors(): %d - %d", unresolvedContributors.size(), unresolvedContributorsSamples.size()));
1✔
384
    if (unresolvedContributors.isEmpty())
1✔
385
      return;
1✔
386

NEW
387
    String content = unresolvedContributors.entrySet().stream()
×
NEW
388
      .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue()))
×
NEW
389
      .map(e -> String.format("%s: %d (%s)", e.getKey(), e.getValue(), StringUtils.join(unresolvedContributorsSamples.get(e.getKey()), " --- ")))
×
NEW
390
      .collect(Collectors.joining("\n"));
×
391

392
    try {
NEW
393
      FileUtils.writeStringToFile(new File(outputDir, UNRESOLVED_CONTRIBUTORS_FILE), "contributor,count\n", StandardCharsets.UTF_8, false);
×
NEW
394
      FileUtils.writeStringToFile(new File(outputDir, UNRESOLVED_CONTRIBUTORS_FILE), content, StandardCharsets.UTF_8, true);
×
NEW
395
    } catch (IOException e) {
×
NEW
396
      throw new RuntimeException(e);
×
NEW
397
    }
×
NEW
398
  }
×
399
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc