implement new folder strategies

This commit is contained in:
marhali 2022-02-01 11:37:13 +01:00
parent 4d11319217
commit 8b752480db
5 changed files with 206 additions and 0 deletions

View File

@ -0,0 +1,41 @@
package de.marhali.easyi18n.ionext.folder;
import com.intellij.openapi.vfs.VirtualFile;
import de.marhali.easyi18n.model.SettingsState;
import de.marhali.easyi18n.model.TranslationFile;
import org.apache.commons.io.FilenameUtils;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* Represents a specific translation file directory structure.
* @author marhali
*/
public abstract class FolderStrategy {
protected final @NotNull SettingsState settings;
public FolderStrategy(@NotNull SettingsState settings) {
this.settings = settings;
}
/**
* Searches the translation folder for matching files based on the implementing strategy.
* The provided directory is already checked as a directory and can be used to query child items.
* @param localesDirectory Configured translation file directory
* @return translation files which matches the strategy
*/
public abstract List<TranslationFile> findFiles(@NotNull VirtualFile localesDirectory);
/**
* Checks if the provided file is not a directory and matches the configured file pattern
* @param file File to check
* @return true if file matches and should be processed
*/
protected boolean isFileRelevant(@NotNull VirtualFile file) {
return !file.isDirectory() && FilenameUtils.wildcardMatch(file.getName(), this.settings.getFilePattern());
}
}

View File

@ -0,0 +1,42 @@
package de.marhali.easyi18n.ionext.folder;
import com.intellij.openapi.vfs.VirtualFile;
import de.marhali.easyi18n.model.SettingsState;
import de.marhali.easyi18n.model.TranslationFile;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* Modularized translation folder strategy by locale.
* Directory => en dir => user.file / account.file
* @author marhali
*/
public class ModularLocaleFolderStrategy extends FolderStrategy {
public ModularLocaleFolderStrategy(@NotNull SettingsState settings) {
super(settings);
}
@Override
public List<TranslationFile> findFiles(@NotNull VirtualFile localesDirectory) {
List<TranslationFile> files = new ArrayList<>();
for(VirtualFile localeModuleDir : localesDirectory.getChildren()) {
if(localeModuleDir.isDirectory()) {
String locale = localeModuleDir.getNameWithoutExtension();
for(VirtualFile namespaceFile : localeModuleDir.getChildren()) {
if(super.isFileRelevant(namespaceFile)) {
files.add(new TranslationFile(namespaceFile, locale, namespaceFile.getNameWithoutExtension()));
}
}
}
}
return files;
}
}

View File

@ -0,0 +1,42 @@
package de.marhali.easyi18n.ionext.folder;
import com.intellij.openapi.vfs.VirtualFile;
import de.marhali.easyi18n.model.SettingsState;
import de.marhali.easyi18n.model.TranslationFile;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* Modular translation folder strategy by namespace.
* Directory => user dir => en.file / de.file
* @author marhali
*/
public class ModularNamespaceFolderStrategy extends FolderStrategy {
public ModularNamespaceFolderStrategy(@NotNull SettingsState settings) {
super(settings);
}
@Override
public List<TranslationFile> findFiles(@NotNull VirtualFile localesDirectory) {
List<TranslationFile> files = new ArrayList<>();
for(VirtualFile namespaceModuleDir : localesDirectory.getChildren()) {
if(namespaceModuleDir.isDirectory()) {
String namespace = namespaceModuleDir.getNameWithoutExtension();
for(VirtualFile localeFile : namespaceModuleDir.getChildren()) {
if(super.isFileRelevant(localeFile)) {
files.add(new TranslationFile(localeFile, localeFile.getNameWithoutExtension(), namespace));
}
}
}
}
return files;
}
}

View File

@ -0,0 +1,37 @@
package de.marhali.easyi18n.ionext.folder;
import com.intellij.openapi.vfs.VirtualFile;
import de.marhali.easyi18n.model.SettingsState;
import de.marhali.easyi18n.model.TranslationFile;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* Single directory translation folder strategy.
* Every child is recognized as a file for a specific language.
* Directory => en.file, de.file, fr.file
* @author marhali
*/
public class SingleFolderStrategy extends FolderStrategy {
public SingleFolderStrategy(@NotNull SettingsState settings) {
super(settings);
}
@Override
public List<TranslationFile> findFiles(@NotNull VirtualFile localesDirectory) {
List<TranslationFile> files = new ArrayList<>();
for(VirtualFile file : localesDirectory.getChildren()) {
if(super.isFileRelevant(file)) {
files.add(new TranslationFile(file, file.getNameWithoutExtension(), null));
}
}
return files;
}
}

View File

@ -0,0 +1,44 @@
package de.marhali.easyi18n.model;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents an existing translation file in a context a specific folder strategy.
* @author marhali
*/
public class TranslationFile {
private final @NotNull VirtualFile virtualFile;
private final @NotNull String locale;
private final @Nullable String namespace;
public TranslationFile(@NotNull VirtualFile virtualFile, @NotNull String locale, @Nullable String namespace) {
this.virtualFile = virtualFile;
this.locale = locale;
this.namespace = namespace;
}
public @NotNull VirtualFile getVirtualFile() {
return virtualFile;
}
public @NotNull String getLocale() {
return locale;
}
public @Nullable String getNamespace() {
return namespace;
}
@Override
public String toString() {
return "TranslationFile{" +
"virtualFile=" + virtualFile +
", locale='" + locale + '\'' +
", namespace='" + namespace + '\'' +
'}';
}
}