/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.isis.core.runtime.services.i18n.po;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.collect.Lists;
class Block {
private enum State {
CONTEXT("^#: (?<value>.+)$"),
MSGID("^msgid \"(?<value>.+)\"$"),
MSGID_PLURAL("^msgid_plural \"(?<value>.+)\"$"),
MSGSTR("^msgstr \"(?<value>.+)\"$"),
MSGSTR0("^msgstr\\[0\\] \"(?<value>.+)\"$"),
MSGSTR1("^msgstr\\[1\\] \"(?<value>.+)\"$");
private final Pattern pattern;
private State(final String regex) {
pattern = Pattern.compile(regex);
}
}
State state = State.CONTEXT;
List<String> contextList = Lists.newArrayList();
String msgid = null;
String msgid_plural = null;
String msgstr = null; // either from msgstr or msgstr[0] if there is a plural
String msgstr_plural = null; // from msgstr[1]
Block parseLine(final String line, final Map<ContextAndMsgId, String> translationsByKey) {
if (state == State.CONTEXT) {
final Matcher contextMatcher = state.pattern.matcher(line);
if (contextMatcher.matches()) {
final String context = contextMatcher.group("value");
contextList.add(context);
return this;
} else {
state = State.MSGID;
// fallthrough (there may not have been any more context)
}
}
if (state == State.MSGID) {
final Matcher msgidMatcher = state.pattern.matcher(line);
if (msgidMatcher.matches()) {
msgid = msgidMatcher.group("value");
state = State.MSGID_PLURAL; // found, next time look for plurals
} else {
return new Block();
}
return this;
}
if (state == State.MSGID_PLURAL) {
final Matcher msgIdPluralMatcher = state.pattern.matcher(line);
if (msgIdPluralMatcher.matches()) {
msgid_plural = msgIdPluralMatcher.group("value");
state = State.MSGSTR0; // next time look for msgstr[0]
return this;
} else {
state = State.MSGSTR; // fall through (there may not have been any plural form)
}
}
if (state == State.MSGSTR) {
final Matcher msgStrMatcher = state.pattern.matcher(line);
if (msgStrMatcher.matches()) {
msgstr = msgStrMatcher.group("value");
}
append(translationsByKey);
return new Block();
}
if (state == State.MSGSTR0) {
final Matcher msgStr0Matcher = state.pattern.matcher(line);
if (msgStr0Matcher.matches()) {
msgstr = msgStr0Matcher.group("value");
state = State.MSGSTR1; // next time, look for plural
} else {
append(translationsByKey);
return new Block();
}
return this;
}
if (state == State.MSGSTR1) {
final Matcher msgStr1Matcher = state.pattern.matcher(line);
if (msgStr1Matcher.matches()) {
msgstr_plural = msgStr1Matcher.group("value");
}
append(translationsByKey);
return new Block();
}
return this;
}
void append(final Map<ContextAndMsgId, String> translationsByKey) {
for (String context : contextList) {
if(msgid != null && msgstr != null) {
final ContextAndMsgId mc = new ContextAndMsgId(context, msgid, ContextAndMsgId.Type.REGULAR);
translationsByKey.put(mc, msgstr);
}
if(msgid_plural != null && msgstr_plural != null) {
final ContextAndMsgId mc = new ContextAndMsgId(context, msgid_plural, ContextAndMsgId.Type.PLURAL_ONLY);
translationsByKey.put(mc, msgstr_plural);
}
}
}
}