package com.orgzly.android;
import android.content.Context;
import android.net.Uri;
import android.support.v4.provider.DocumentFile;
import com.orgzly.android.repos.Rook;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Given a filename determines book's format based on extension.
* Given a book name and a format - constructs a filename.
*/
public class BookName {
private static final Pattern PATTERN = Pattern.compile("(.*)\\.(org)(\\.txt)?$");
private static final Pattern SKIP_PATTERN = Pattern.compile("^\\.#.*");
private final String mFileName;
private final String mName;
private final Format mFormat;
private BookName(String fileName, String name, Format format) {
mFileName = fileName;
mName = name;
mFormat = format;
}
public static String getFileName(Context context, Uri uri) {
String fileName;
DocumentFile documentFile = DocumentFile.fromSingleUri(context, uri);
if ("content".equals(uri.getScheme()) && documentFile != null) {
// Try using DocumentFile first (KitKat and above)
fileName = documentFile.getName();
} else { // Just get the last path segment
fileName = uri.getLastPathSegment();
}
return fileName;
}
public static BookName getInstance(Context context, Rook rook) {
return fromFileName(getFileName(context, rook.getUri()));
}
public static boolean isSupportedFormatFileName(String fileName) {
return PATTERN.matcher(fileName).matches() && !SKIP_PATTERN.matcher(fileName).matches();
}
public static String fileName(String name, Format format) {
if (format == Format.ORG) {
return name + ".org";
} else {
throw new IllegalArgumentException("Unsupported format " + format);
}
}
public static BookName fromFileName(String fileName) {
if (fileName != null) {
Matcher m = PATTERN.matcher(fileName);
if (m.find()) {
String name = m.group(1);
String extension = m.group(2);
if (extension.equals("org")) {
return new BookName(fileName, name, Format.ORG);
}
}
}
throw new IllegalArgumentException("Unsupported book file name " + fileName);
}
public String getName() {
return mName;
}
public Format getFormat() {
return mFormat;
}
public String getFileName() {
return mFileName;
}
public enum Format {
ORG
}
}