package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.util.StringMan;
import com.plotsquared.general.commands.Command;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GenerateDocs {
public static void main(String[] args) {
new WE_Anywhere();
List<Command> commands = MainCommand.getInstance().getCommands();
GenerateDocs.log("### Want to document some commands?");
GenerateDocs.log(" - This page is automatically generated");
GenerateDocs.log(" - Fork the project and add a javadoc comment to one of the command classes");
GenerateDocs.log(" - Then do a pull request and it will be added to this page");
GenerateDocs.log("");
GenerateDocs.log("# Contents");
for (CommandCategory category : CommandCategory.values()) {
GenerateDocs.log("###### " + category.name());
for (Command command : MainCommand.getInstance().getCommands(category, null)) {
GenerateDocs
.log(" - [/plot " + command.getId() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getId()
+ ") ");
}
GenerateDocs.log("");
}
GenerateDocs.log("# Commands");
for (Command command : commands) {
GenerateDocs.printCommand(command);
}
}
public static void printCommand(Command command) {
try {
String clazz = command.getClass().getSimpleName();
String name = command.getId();
// Header
String source =
"https://github.com/IntellectualSites/PlotSquared/tree/master/Core/src/main/java/com/intellectualcrafters/plot/commands/" + clazz
+ ".java";
GenerateDocs.log("## [" + name.toUpperCase() + "](" + source + ") ");
File file = new File("Core/src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java");
List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
List<String> perms = GenerateDocs.getPerms(name, lines);
List<String> usages = GenerateDocs.getUsage(name, lines);
String comment = GenerateDocs.getComments(lines);
GenerateDocs.log("#### Description");
GenerateDocs.log('`' + command.getDescription() + '`');
if (!comment.isEmpty()) {
GenerateDocs.log("##### Comments");
GenerateDocs.log("``` java");
GenerateDocs.log(comment);
GenerateDocs.log("```");
}
GenerateDocs.log("#### Usage ");
String mainUsage = command.getUsage().replaceAll("\\{label\\}", "plot");
if (!usages.isEmpty() && !usages.get(0).equalsIgnoreCase(mainUsage)) {
GenerateDocs.log("##### Primary ");
GenerateDocs.log(" - `" + mainUsage + "` ");
GenerateDocs.log("");
GenerateDocs.log("##### Other ");
GenerateDocs.log(" - `" + StringMan.join(usages, "`\n - `") + "` ");
GenerateDocs.log("");
} else {
GenerateDocs.log('`' + mainUsage + "` ");
}
if (command.getRequiredType() != RequiredType.NONE) {
GenerateDocs.log("#### Required callers");
GenerateDocs.log('`' + command.getRequiredType().name() + '`');
}
List<String> aliases = command.getAliases();
if (!aliases.isEmpty()) {
GenerateDocs.log("#### Aliases");
GenerateDocs.log('`' + StringMan.getString(command.getAliases()) + '`');
}
GenerateDocs.log("#### Permissions");
if (!perms.isEmpty()) {
GenerateDocs.log("##### Primary");
GenerateDocs.log(" - `" + command.getPermission() + "` ");
GenerateDocs.log("");
GenerateDocs.log("##### Other");
GenerateDocs.log(" - `" + StringMan.join(perms, "`\n - `") + '`');
GenerateDocs.log("");
} else {
GenerateDocs.log('`' + command.getPermission() + "` ");
}
GenerateDocs.log("***");
GenerateDocs.log("");
} catch (IOException e) {
e.printStackTrace();
}
}
public static List<String> getUsage(String cmd, List<String> lines) {
Pattern p = Pattern.compile("\"([^\"]*)\"");
HashSet<String> usages = new HashSet<>();
for (String line : lines) {
if (line.contains("COMMAND_SYNTAX") && !line.contains("getUsage()")) {
Matcher m = p.matcher(line);
String prefix = "";
StringBuilder usage = new StringBuilder();
while (m.find()) {
String match = m.group(1);
usage.append(prefix).append(match);
prefix = " <arg> ";
}
if (usage.length() != 0) {
usages.add(usage.toString().trim().replaceAll(" ", " ").replaceAll("\\{label\\}", "plot"));
}
}
}
return new ArrayList<>(usages);
}
public static List<String> getPerms(String cmd, List<String> lines) {
HashSet<String> perms = new HashSet<>();
Pattern p = Pattern.compile("\"([^\"]*)\"");
Pattern p2 = Pattern.compile("C.PERMISSION_\\s*(\\w+)");
String last = null;
for (String line : lines) {
Matcher m2 = p2.matcher(line);
while (m2.find()) {
perms.add(C.valueOf("PERMISSION_" + m2.group(1)).s());
}
if (line.contains("Permissions.hasPermission(")) {
String[] split = line.split("Permissions.hasPermission");
split = Arrays.copyOfRange(split, 1, split.length);
for (String method : split) {
String perm = method.split("[,|)]")[1].trim();
if (!perm.equalsIgnoreCase(perm)) {
if (perm.startsWith("C.")) {
perm = C.valueOf(perm.split("\\.")[1]).s();
} else {
continue;
}
} else {
perm = perm.substring(1, perm.length() - 1);
}
perms.add(perm);
}
Matcher m = p.matcher(line);
while (m.find()) {
String perm = m.group(1);
if (perm.endsWith(".")) {
perm += "<arg>";
}
if (perm.startsWith(".")) {
perms.remove(last);
perms.add(last + perm);
} else if (perm.contains(".")) {
last = perm;
perms.add(perm);
}
}
} else if (line.contains("Permissions.hasPermissionRange")) {
String[] split = line.split("Permissions.hasPermissionRange");
split = Arrays.copyOfRange(split, 1, split.length);
for (String method : split) {
String perm = method.split("[,|)]")[1].trim();
if (!perm.equalsIgnoreCase(perm)) {
if (perm.startsWith("C.")) {
perm = C.valueOf(perm.split("\\.")[1]).s();
} else {
continue;
}
} else {
perm = perm.substring(1, perm.length() - 1);
}
perms.add(perm + ".<#>");
}
}
}
switch (cmd.toLowerCase()) {
case "auto":
case "claim":
perms.add("plots.plot.<#>");
break;
}
return new ArrayList<>(perms);
}
public static String getComments(List<String> lines) {
StringBuilder result = new StringBuilder();
for (String line : lines) {
line = line.trim();
if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* ")) {
line = line.replaceAll("/[*][*] ", "").replaceAll("[*]/ ", "").replaceAll("[*] ", "").trim();
result.append(line + '\n');
}
}
return result.toString().trim();
}
public static void log(String s) {
System.out.println(s);
}
}