Added New Feature that was really nessesary.

-Added: #ignore which allows the template process to ignore segments.
		They can be used with #if but in a ignored segment you are not allowed
to use #if/#else/#else if/#endif since it is outside of the context of
the template process. But this allows to address issues with marking
areas.
This commit is contained in:
Speiger 2022-05-21 14:32:02 +02:00
parent d3d1cb48b6
commit d4e3da23fa
16 changed files with 241 additions and 33 deletions

View File

@ -15,7 +15,7 @@ repositories {
} }
} }
dependencies { dependencies {
compile 'de.speiger:Simple-Code-Generator:1.0.5' compile 'de.speiger:Simple-Code-Generator:1.1.0'
} }
``` ```

View File

@ -5,7 +5,7 @@ repositories {
} }
archivesBaseName = 'Simple Code Generator' archivesBaseName = 'Simple Code Generator'
version = '1.0.5' version = '1.1.0'
apply plugin: 'maven' apply plugin: 'maven'
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {
@ -47,7 +47,6 @@ uploadArchives {
developer { developer {
id = 'speiger' id = 'speiger'
name = 'Speiger' name = 'Speiger'
email = 'speiger@gmx.net'
} }
} }
} }

1
example/cache.bin Normal file
View File

@ -0,0 +1 @@
test=e949777578333aa849d74d6a2c651236

View File

@ -0,0 +1,23 @@
Hello this is my test
#ignore
TESTING should not be overriden
#endignore
TESTING should be overriden
#if TEST0
#ignore
TESTING should not be overriden too
#endignore
TESTING should be overriden too
#endif
#if TEST1
#ignore
TESTING should not be overriden
#endignore
TESTING should not be overriden
#endif

8
example/output/test.txt Normal file
View File

@ -0,0 +1,8 @@
Hello this is my test
TESTING should not be overriden
Test2 should be overriden
TESTING should not be overriden too
Test2 should be overriden too

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.StringJoiner; import java.util.StringJoiner;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import speiger.src.builder.conditions.ICondition; import speiger.src.builder.conditions.ICondition;
@ -37,12 +38,17 @@ public class ConditionedSegment
return builder.length() - length; return builder.length() - length;
} }
public static int parse(String fileName, String currentLine, List<String> lines, int currentIndex, int startIndex, List<ConditionedSegment> segments) throws IllegalStateException public static int parse(String fileName, String currentLine, List<String> lines, int currentIndex, int startIndex, AtomicInteger ignoreCounter, List<ConditionedSegment> segments, List<PostSegment> postSegments) throws IllegalStateException
{ {
int ignoreSegmentId = ignoreCounter.get();
ConditionedSegment segment = new ConditionedSegment(startIndex); ConditionedSegment segment = new ConditionedSegment(startIndex);
ICondition condition = ICondition.parse(currentLine); ICondition condition = currentLine == null ? null : ICondition.parse(currentLine);
List<ConditionedSegment> childSegments = new ArrayList<>(); List<ConditionedSegment> childSegments = new ArrayList<>();
StringJoiner segmentText = new StringJoiner("\n", (currentIndex <= 0 || includeStartNewLine(lines.get(currentIndex-1).trim())) ? "\n" : "", ""); StringJoiner segmentText = new StringJoiner("\n", (currentIndex <= 0 || includeStartNewLine(lines.get(currentIndex-1).trim())) ? "\n" : "", "");
if(currentLine == null) {
lines.set(currentIndex, "#ignoreLine"+ignoreSegmentId);
}
for(int i = currentIndex+1;i<lines.size();i++) for(int i = currentIndex+1;i<lines.size();i++)
{ {
String s = lines.get(i); String s = lines.get(i);
@ -51,6 +57,7 @@ public class ConditionedSegment
{ {
if(trimmed.startsWith("#else if")) if(trimmed.startsWith("#else if"))
{ {
if(currentLine == null) throw new IllegalStateException("#else if isn't working while in a ignore segment");
segment.addSegment(new Segment(segmentText.toString(), condition, childSegments)); segment.addSegment(new Segment(segmentText.toString(), condition, childSegments));
condition = ICondition.parse(trimmed.substring(8).trim()); condition = ICondition.parse(trimmed.substring(8).trim());
childSegments = new ArrayList<>(); childSegments = new ArrayList<>();
@ -58,6 +65,7 @@ public class ConditionedSegment
} }
else if(trimmed.startsWith("#else")) else if(trimmed.startsWith("#else"))
{ {
if(currentLine == null) throw new IllegalStateException("#else isn't working while in a ignore segment");
segment.addSegment(new Segment(segmentText.toString(), condition, childSegments)); segment.addSegment(new Segment(segmentText.toString(), condition, childSegments));
condition = ICondition.ALWAYS_TRUE; condition = ICondition.ALWAYS_TRUE;
childSegments = new ArrayList<>(); childSegments = new ArrayList<>();
@ -65,13 +73,29 @@ public class ConditionedSegment
} }
else if(trimmed.startsWith("#endif")) else if(trimmed.startsWith("#endif"))
{ {
if(currentLine == null) throw new IllegalStateException("#endif isn't working while in a ignore segment");
segment.addSegment(new Segment(segmentText.toString(), condition, childSegments)); segment.addSegment(new Segment(segmentText.toString(), condition, childSegments));
segments.add(segment); segments.add(segment);
return i - currentIndex; return i - currentIndex;
} }
else if(trimmed.startsWith("#endignore"))
{
postSegments.add(new PostSegment(segmentText.toString(), "#ignoreLine"+ignoreSegmentId));
segments.add(segment);
return i - currentIndex;
}
else if(trimmed.startsWith("#if")) else if(trimmed.startsWith("#if"))
{ {
i += parse(fileName, trimmed.substring(3).trim(), lines, i, segmentText.length(), childSegments); if(currentLine == null) throw new IllegalStateException("#if isn't working while in a ignore segment");
i += parse(fileName, trimmed.substring(3).trim(), lines, i, segmentText.length(), ignoreCounter, childSegments, postSegments);
}
else if(trimmed.startsWith("#ignore"))
{
if(currentLine == null) throw new IllegalStateException("#ignore lines can't be applied Recursively");
ignoreCounter.incrementAndGet();
int prev = i;
i += parse(fileName, null, lines, i, segmentText.length(), ignoreCounter, childSegments, postSegments);
segmentText.add(lines.get(prev));
} }
continue; continue;
} }
@ -82,6 +106,6 @@ public class ConditionedSegment
static boolean includeStartNewLine(String s) static boolean includeStartNewLine(String s)
{ {
return !s.startsWith("#") || s.equalsIgnoreCase("#endif"); return !s.startsWith("#") || s.equalsIgnoreCase("#endif") || s.equalsIgnoreCase("#endignore");
} }
} }

View File

@ -0,0 +1,18 @@
package speiger.src.builder.base;
public class PostSegment
{
String text;
String identifier;
public PostSegment(String text, String identifier)
{
this.text = text;
this.identifier = identifier;
}
public String build(String input)
{
return input.replaceAll("\n"+identifier, text);
}
}

View File

@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.StringJoiner; import java.util.StringJoiner;
import java.util.concurrent.atomic.AtomicInteger;
import speiger.src.builder.mappers.IMapper; import speiger.src.builder.mappers.IMapper;
import speiger.src.builder.misc.FileUtils; import speiger.src.builder.misc.FileUtils;
@ -16,12 +17,14 @@ public class Template
String fileName; String fileName;
String textFile; String textFile;
List<ConditionedSegment> segments; List<ConditionedSegment> segments;
List<PostSegment> postSegments;
public Template(String fileName, String textFile, List<ConditionedSegment> segments) public Template(String fileName, String textFile, List<ConditionedSegment> segments, List<PostSegment> postSegments)
{ {
this.fileName = fileName; this.fileName = fileName;
this.textFile = textFile; this.textFile = textFile;
this.segments = segments; this.segments = segments;
this.postSegments = postSegments;
} }
public String getFileName() public String getFileName()
@ -53,13 +56,19 @@ public class Template
result = mappers.get(i).apply(result); result = mappers.get(i).apply(result);
} }
} }
for(int i = 0,m=postSegments.size();i<m;i++)
{
result = postSegments.get(i).build(result);
}
return result; return result;
} }
public static Template parse(Path file) throws IOException public static Template parse(Path file) throws IOException
{ {
String fileName = FileUtils.getFileName(file.getFileName()); String fileName = FileUtils.getFileName(file.getFileName());
List<ConditionedSegment> segments = new ArrayList<ConditionedSegment>(); AtomicInteger segmentIds = new AtomicInteger();
List<ConditionedSegment> segments = new ArrayList<>();
List<PostSegment> postSegments = new ArrayList<>();
StringJoiner joiner = new StringJoiner("\n"); StringJoiner joiner = new StringJoiner("\n");
List<String> lines = Files.readAllLines(file); List<String> lines = Files.readAllLines(file);
for(int i = 0;i<lines.size();i++) for(int i = 0;i<lines.size();i++)
@ -70,7 +79,15 @@ public class Template
{ {
if(trimmed.startsWith("#if")) if(trimmed.startsWith("#if"))
{ {
i += ConditionedSegment.parse(fileName, s.trim().substring(3).trim(), lines, i, joiner.length(), segments); i += ConditionedSegment.parse(fileName, s.trim().substring(3).trim(), lines, i, joiner.length(), segmentIds, segments, postSegments);
continue;
}
else if(trimmed.startsWith("#ignore"))
{
segmentIds.getAndIncrement();
int prev = i;
i += ConditionedSegment.parse(fileName, null, lines, i, joiner.length(), segmentIds, segments, postSegments);
joiner.add(lines.get(prev));
continue; continue;
} }
else if(trimmed.startsWith("#symlink")) else if(trimmed.startsWith("#symlink"))
@ -80,6 +97,6 @@ public class Template
} }
joiner.add(s); joiner.add(s);
} }
return new Template(fileName, joiner.toString(), segments); return new Template(fileName, joiner.toString(), segments, postSegments);
} }
} }

View File

@ -73,6 +73,11 @@ public class ArgumentMapper implements IMapper
{ {
e.printStackTrace(); e.printStackTrace();
} }
catch(Error error)
{
System.out.println("Error with ["+pattern.pattern()+"] pattern");
throw error;
}
return t; return t;
} }

View File

@ -70,6 +70,11 @@ public class InjectMapper implements IMapper
{ {
e.printStackTrace(); e.printStackTrace();
} }
catch(Error error)
{
System.out.println("Error with ["+pattern.pattern()+"] pattern");
throw error;
}
return t; return t;
} }

View File

@ -31,22 +31,34 @@ public class LineMapper implements IMapper
public String apply(String t) public String apply(String t)
{ {
RegexMatcher matcher = new RegexMatcher(pattern, t); RegexMatcher matcher = new RegexMatcher(pattern, t);
if(matcher.find()) try
{ {
StringBuffer buffer = new StringBuffer(); if(matcher.find())
do
{ {
int start = matcher.end() - 1; StringBuffer buffer = new StringBuffer();
int[] result = RegexUtil.findFullLine(t, start); do
if(result != null)
{ {
matcher.appendReplacement(buffer, pattern.pattern()); int start = matcher.end() - 1;
buffer.setLength(buffer.length() - (start - result[0])); int[] result = RegexUtil.findFullLine(t, start);
matcher.skip(result[1] - start); if(result != null)
} {
} while (matcher.find()); matcher.appendReplacement(buffer, pattern.pattern());
matcher.appendTail(buffer); buffer.setLength(buffer.length() - (start - result[0]));
return apply(buffer.toString()); matcher.skip(result[1] - start);
}
} while (matcher.find());
matcher.appendTail(buffer);
return apply(buffer.toString());
}
}
catch(Exception e)
{
e.printStackTrace();
}
catch(Error error)
{
System.out.println("Error with ["+pattern.pattern()+"] pattern");
throw error;
} }
return t; return t;
} }

View File

@ -29,6 +29,19 @@ public class SimpleMapper implements IMapper
@Override @Override
public String apply(String t) public String apply(String t)
{ {
return pattern.matcher(t).replaceAll(replacement); try
{
return pattern.matcher(t).replaceAll(replacement);
}
catch(Exception e)
{
e.printStackTrace();
}
catch(Error error)
{
System.out.println("Error with ["+pattern.pattern()+"] pattern");
throw error;
}
return t;
} }
} }

View File

@ -14,12 +14,14 @@ public class BuildTask implements Runnable
Template template; Template template;
TemplateProcess process; TemplateProcess process;
Set<IMapper>[] mappers; Set<IMapper>[] mappers;
boolean silencedSuccess;
public BuildTask(Path basePath, Template template, TemplateProcess process, Set<IMapper>[] mappers) public BuildTask(Path basePath, Template template, TemplateProcess process, boolean silencedSuccess, Set<IMapper>[] mappers)
{ {
this.basePath = basePath; this.basePath = basePath;
this.template = template; this.template = template;
this.process = process; this.process = process;
this.silencedSuccess = silencedSuccess;
this.mappers = mappers; this.mappers = mappers;
} }
@ -44,7 +46,7 @@ public class BuildTask implements Runnable
{ {
writer.write(s); writer.write(s);
writer.flush(); writer.flush();
System.out.println("Created: "+process.fileName); if(!silencedSuccess) System.out.println("Created: "+process.fileName);
} }
catch(Exception e) catch(Exception e)
{ {

View File

@ -23,28 +23,33 @@ public class TemplateProcess
this.fileName = fileName; this.fileName = fileName;
} }
public void setPathBuilder(UnaryOperator<Path> pathBuilder) public TemplateProcess setPathBuilder(UnaryOperator<Path> pathBuilder)
{ {
this.pathBuilder = pathBuilder; this.pathBuilder = pathBuilder;
return this;
} }
public void addFlags(String...flags) public TemplateProcess addFlags(String...flags)
{ {
parsePool.addAll(Arrays.asList(flags)); parsePool.addAll(Arrays.asList(flags));
return this;
} }
public void addFlags(Collection<String> flags) public TemplateProcess addFlags(Collection<String> flags)
{ {
parsePool.addAll(flags); parsePool.addAll(flags);
return this;
} }
public void addMapper(IMapper mapper) public TemplateProcess addMapper(IMapper mapper)
{ {
mappers.add(mapper); mappers.add(mapper);
return this;
} }
public void addMappers(Collection<IMapper> mappers) public TemplateProcess addMappers(Collection<IMapper> mappers)
{ {
this.mappers.addAll(mappers); this.mappers.addAll(mappers);
return this;
} }
} }

View File

@ -24,10 +24,17 @@ public abstract class TemplateProcessor
Path sourceFolder; Path sourceFolder;
Path outputFolder; Path outputFolder;
Path dataFolder; Path dataFolder;
boolean silencedSuccess;
boolean init = false; boolean init = false;
public TemplateProcessor(Path sourceFolder, Path outputFolder, Path dataFolder) public TemplateProcessor(Path sourceFolder, Path outputFolder, Path dataFolder)
{ {
this(false, sourceFolder, outputFolder, dataFolder);
}
public TemplateProcessor(boolean silencedSuccess, Path sourceFolder, Path outputFolder, Path dataFolder)
{
this.silencedSuccess = silencedSuccess;
this.sourceFolder = sourceFolder; this.sourceFolder = sourceFolder;
this.outputFolder = outputFolder; this.outputFolder = outputFolder;
this.dataFolder = dataFolder; this.dataFolder = dataFolder;
@ -87,6 +94,7 @@ public abstract class TemplateProcessor
protected Path getSourceFolder() { return sourceFolder; } protected Path getSourceFolder() { return sourceFolder; }
protected Path getOutputFolder() { return outputFolder; } protected Path getOutputFolder() { return outputFolder; }
protected Path getDataFolder() { return dataFolder; } protected Path getDataFolder() { return dataFolder; }
protected boolean isSilencedSuccess() { return silencedSuccess; }
public final boolean process(boolean force) throws IOException, InterruptedException public final boolean process(boolean force) throws IOException, InterruptedException
{ {
@ -119,7 +127,7 @@ public abstract class TemplateProcessor
Template template = Template.parse(path); Template template = Template.parse(path);
counters[2].addAndGet(System.currentTimeMillis() - startTime); counters[2].addAndGet(System.currentTimeMillis() - startTime);
counters[1].addAndGet(1); counters[1].addAndGet(1);
createProcesses(FileUtils.getFileName(path), T -> {service.execute(new BuildTask(relative ? outputFolder.resolve(sourceFolder.relativize(path).getParent()) : outputFolder, template, T, mappers));counters[0].addAndGet(1);}); createProcesses(FileUtils.getFileName(path), T -> {service.execute(new BuildTask(relative ? outputFolder.resolve(sourceFolder.relativize(path).getParent()) : outputFolder, template, T, silencedSuccess, mappers));counters[0].addAndGet(1);});
} }
catch(Exception e) catch(Exception e)
{ {

View File

@ -0,0 +1,68 @@
package example;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Consumer;
import speiger.src.builder.mappers.SimpleMapper;
import speiger.src.builder.processor.TemplateProcess;
import speiger.src.builder.processor.TemplateProcessor;
public class ExampleBuilder extends TemplateProcessor
{
public static void main(String...args)
{
try
{
new ExampleBuilder().process(true);
}
catch(IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ExampleBuilder()
{
super(Paths.get("example/input"), Paths.get("example/output"), Paths.get("example"));
}
@Override
protected void init()
{
}
@Override
protected boolean isFileValid(Path fileName)
{
return true;
}
@Override
public void createProcesses(String fileName, Consumer<TemplateProcess> process)
{
process.accept(new TemplateProcess(fileName+".txt").addFlags("TEST0").addMapper(new SimpleMapper("TESTING", "Test2")));
}
@Override
protected boolean relativePackages()
{
return false;
}
@Override
protected boolean debugUnusedMappers()
{
return false;
}
}