failed experiment.
This commit is contained in:
parent
5776fa7f94
commit
e6694bed23
|
@ -2,64 +2,65 @@ package nl.andrewlalis.blockbookbinder.model;
|
||||||
|
|
||||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
|
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class BookPage {
|
public class BookPage {
|
||||||
private final List<String> lines;
|
public static final int MAX_LINES = ApplicationProperties.getIntProp("book.page_max_lines");
|
||||||
|
private final String[] lines;
|
||||||
|
|
||||||
public BookPage() {
|
public BookPage() {
|
||||||
this.lines = new ArrayList<>(ApplicationProperties.getIntProp("book.page_max_lines"));
|
this.lines = new String[MAX_LINES];
|
||||||
|
Arrays.fill(this.lines, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addLine(String line) {
|
private BookPage(String[] lines) {
|
||||||
if (this.lines.size() >= ApplicationProperties.getIntProp("book.page_max_lines")) {
|
this.lines = lines;
|
||||||
return false;
|
}
|
||||||
|
|
||||||
|
public void setLine(int index, String line) {
|
||||||
|
if (index < 0 || index >= this.lines.length) {
|
||||||
|
throw new IndexOutOfBoundsException(index);
|
||||||
}
|
}
|
||||||
this.lines.add(line);
|
this.lines[index] = line;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLine(int index) {
|
public String getLine(int index) {
|
||||||
if (index < 0 || index >= this.lines.size()) {
|
if (index < 0 || index >= this.lines.length) {
|
||||||
return null;
|
throw new IndexOutOfBoundsException(index);
|
||||||
}
|
}
|
||||||
return this.lines.get(index);
|
return this.lines[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the index of the line at which this offset occurs.
|
||||||
|
* @param offset The offset, from the start of the page.
|
||||||
|
* @return The index of the line in which the given offset is placed.
|
||||||
|
*/
|
||||||
public int getLineIndexAtOffset(int offset) {
|
public int getLineIndexAtOffset(int offset) {
|
||||||
int lineIndex = 0;
|
int lineIndex = 0;
|
||||||
String line = this.getLine(lineIndex);
|
String line = this.getLine(lineIndex);
|
||||||
if (line == null) return -1;
|
|
||||||
while (offset - line.length() > 0) {
|
while (offset - line.length() > 0) {
|
||||||
offset-= line.length();
|
offset -= line.length();
|
||||||
line = this.getLine(++lineIndex);
|
line = this.getLine(lineIndex++);
|
||||||
}
|
}
|
||||||
return lineIndex;
|
return lineIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasContent() {
|
public boolean hasContent() {
|
||||||
return !this.lines.isEmpty();
|
for (String line : this.lines) {
|
||||||
|
if (!line.isBlank()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BookPage copy() {
|
public BookPage copy() {
|
||||||
BookPage c = new BookPage();
|
return new BookPage(Arrays.copyOf(this.lines, MAX_LINES));
|
||||||
for (String line : this.lines) {
|
|
||||||
c.addLine(line);
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.join("\n", this.lines);
|
return String.join("\n", this.lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BookPage fromString(String s) {
|
|
||||||
BookPage p = new BookPage();
|
|
||||||
for (String line : s.split("\n")) {
|
|
||||||
p.addLine(line);
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,8 @@ package nl.andrewlalis.blockbookbinder.model.build;
|
||||||
|
|
||||||
import nl.andrewlalis.blockbookbinder.model.Book;
|
import nl.andrewlalis.blockbookbinder.model.Book;
|
||||||
import nl.andrewlalis.blockbookbinder.model.BookPage;
|
import nl.andrewlalis.blockbookbinder.model.BookPage;
|
||||||
import nl.andrewlalis.blockbookbinder.util.CharWidthMapper;
|
|
||||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
|
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
|
||||||
|
import nl.andrewlalis.blockbookbinder.util.CharWidthMapper;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -15,22 +15,22 @@ public class BookBuilder {
|
||||||
* @return A book containing the source text formatted for a minecraft book.
|
* @return A book containing the source text formatted for a minecraft book.
|
||||||
*/
|
*/
|
||||||
public Book build(String source) {
|
public Book build(String source) {
|
||||||
final int maxLines = ApplicationProperties.getIntProp("book.page_max_lines");
|
|
||||||
List<String> lines = this.convertSourceToLines(this.cleanSource(source));
|
List<String> lines = this.convertSourceToLines(this.cleanSource(source));
|
||||||
Book book = new Book();
|
Book book = new Book();
|
||||||
BookPage page = new BookPage();
|
BookPage page = new BookPage();
|
||||||
int currentPageLineCount = 0;
|
int currentPageLineCount = 0;
|
||||||
|
|
||||||
for (String line : lines) {
|
for (String line : lines) {
|
||||||
page.addLine(line);
|
page.setLine(currentPageLineCount, line);
|
||||||
currentPageLineCount++;
|
currentPageLineCount++;
|
||||||
if (currentPageLineCount == maxLines) {
|
if (currentPageLineCount == BookPage.MAX_LINES) {
|
||||||
book.addPage(page);
|
book.addPage(page);
|
||||||
page = new BookPage();
|
page = new BookPage();
|
||||||
currentPageLineCount = 0;
|
currentPageLineCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the last page, and only add it if it contains content.
|
||||||
if (page.hasContent()) {
|
if (page.hasContent()) {
|
||||||
book.addPage(page);
|
book.addPage(page);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ public class BookBuilder {
|
||||||
return source.trim()
|
return source.trim()
|
||||||
.replaceAll("(?>\\v)+(\\v)", "\n\n") // Replace large chunks of newline with just two.
|
.replaceAll("(?>\\v)+(\\v)", "\n\n") // Replace large chunks of newline with just two.
|
||||||
.replaceAll("\\S\n\\S", " ") // Unwrap previously-imposed single-line wrapping.
|
.replaceAll("\\S\n\\S", " ") // Unwrap previously-imposed single-line wrapping.
|
||||||
.replaceAll("\t", " ") // Replace tabs with single-spaces, due to space constraints.
|
.replaceAll("\t", " ") // Replace tabs with single-spaces, due to space constraints.
|
||||||
.replaceAll(" [ ]+", " "); // Remove any superfluous spaces.
|
.replaceAll(" [ ]+", " "); // Remove any superfluous spaces.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ public class BookPreviewPanel extends JPanel {
|
||||||
private Book book;
|
private Book book;
|
||||||
private int currentPage = 0;
|
private int currentPage = 0;
|
||||||
|
|
||||||
private final JTextArea previewPageTextArea;
|
private final JEditorPane pageEditorPane;
|
||||||
private final BookPageDocumentFilter documentFilter;
|
private final BookPageDocumentFilter documentFilter;
|
||||||
private final JLabel titleLabel;
|
private final JLabel titleLabel;
|
||||||
|
|
||||||
|
@ -35,11 +35,11 @@ public class BookPreviewPanel extends JPanel {
|
||||||
this.add(this.titleLabel, BorderLayout.NORTH);
|
this.add(this.titleLabel, BorderLayout.NORTH);
|
||||||
this.setBorder(new EmptyBorder(5, 5, 5, 5));
|
this.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||||
|
|
||||||
this.previewPageTextArea = new JTextArea();
|
this.pageEditorPane = new JEditorPane();
|
||||||
this.documentFilter = new BookPageDocumentFilter();
|
this.documentFilter = new BookPageDocumentFilter();
|
||||||
AbstractDocument doc = (AbstractDocument) this.previewPageTextArea.getDocument();
|
AbstractDocument doc = (AbstractDocument) this.pageEditorPane.getDocument();
|
||||||
doc.setDocumentFilter(this.documentFilter);
|
doc.setDocumentFilter(this.documentFilter);
|
||||||
this.previewPageTextArea.setEditable(true);
|
this.pageEditorPane.setEditable(true);
|
||||||
try {
|
try {
|
||||||
InputStream is = this.getClass().getClassLoader().getResourceAsStream("fonts/1_Minecraft-Regular.otf");
|
InputStream is = this.getClass().getClassLoader().getResourceAsStream("fonts/1_Minecraft-Regular.otf");
|
||||||
if (is == null) {
|
if (is == null) {
|
||||||
|
@ -47,11 +47,11 @@ public class BookPreviewPanel extends JPanel {
|
||||||
}
|
}
|
||||||
Font mcFont = Font.createFont(Font.TRUETYPE_FONT, is);
|
Font mcFont = Font.createFont(Font.TRUETYPE_FONT, is);
|
||||||
mcFont = mcFont.deriveFont(24.0f);
|
mcFont = mcFont.deriveFont(24.0f);
|
||||||
this.previewPageTextArea.setFont(mcFont);
|
this.pageEditorPane.setFont(mcFont);
|
||||||
} catch (FontFormatException | IOException e) {
|
} catch (FontFormatException | IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
JScrollPane previewPageScrollPane = new JScrollPane(this.previewPageTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
|
JScrollPane previewPageScrollPane = new JScrollPane(this.pageEditorPane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
|
||||||
this.add(previewPageScrollPane, BorderLayout.CENTER);
|
this.add(previewPageScrollPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
JPanel previewButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
|
JPanel previewButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
|
||||||
|
@ -99,7 +99,7 @@ public class BookPreviewPanel extends JPanel {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BookPage currentPage = this.book.getPages().get(this.currentPage);
|
BookPage currentPage = this.book.getPages().get(this.currentPage);
|
||||||
this.previewPageTextArea.setText(currentPage.toString());
|
this.pageEditorPane.setText(currentPage.toString());
|
||||||
this.titleLabel.setText("Book Preview (Page " + (this.currentPage + 1) + " of " + this.book.getPageCount() + ")");
|
this.titleLabel.setText("Book Preview (Page " + (this.currentPage + 1) + " of " + this.book.getPageCount() + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue