Add .java files
This commit is contained in:
parent
1a8d5f5d38
commit
b8f42e2f99
379
blog.java
Normal file
379
blog.java
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
package evanniederwerfer.blogapp.blogappv2;
|
||||||
|
|
||||||
|
import javafx.application.Application;
|
||||||
|
import javafx.geometry.Pos;
|
||||||
|
import javafx.scene.Scene;
|
||||||
|
import javafx.scene.control.*;
|
||||||
|
import javafx.scene.layout.GridPane;
|
||||||
|
import javafx.scene.text.Font;
|
||||||
|
import javafx.stage.FileChooser;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.SocketException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.apache.commons.net.ftp.FTP;
|
||||||
|
import org.apache.commons.net.ftp.FTPClient;
|
||||||
|
|
||||||
|
public class blog extends Application implements values {
|
||||||
|
|
||||||
|
// Post Creation Values
|
||||||
|
|
||||||
|
|
||||||
|
// Create HTML from TXT syntax
|
||||||
|
public void createHtml(Stage stage, boolean setValuesOnly, Path path) {
|
||||||
|
File file = new File(path.toString());
|
||||||
|
File newHtmlFile = null;
|
||||||
|
try (Stream<String> lines = Files.lines(new File(file.toString()).toPath())) {
|
||||||
|
List<String> lineList = lines.toList(); // Store the individual lines of files in a list
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
FileChooser save = new FileChooser();
|
||||||
|
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("HTML files (*.html)", "*.html");
|
||||||
|
save.getExtensionFilters().add(extFilter);
|
||||||
|
File selectedFile = save.showSaveDialog(stage);
|
||||||
|
newHtmlFile = new File(selectedFile.toString());
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "<a class=\"backbtn\" href=\"https://www.blog.evanniederwerfer.com\"><- Back to home</a>\n", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (setValuesOnly) {
|
||||||
|
System.out.println(lineList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Traverse through lineList and write to newly created HTML file
|
||||||
|
for (int i=0; i<lineList.toArray().length; i++) {
|
||||||
|
|
||||||
|
|
||||||
|
if (lineList.get(i).startsWith("#")) {
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "<h1 class=\"title\">" + lineList.get(i).replace("#", "") + "</h1>" + "\n", true);
|
||||||
|
}
|
||||||
|
TITLE.set(lineList.get(i).replace("#", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (lineList.get(i).startsWith("^") && lineList.get(i).endsWith("^")) {
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "<h3 class='author'>" + lineList.get(i).replace("^", "") + " | " + dtf.format(now) + "</h3>" + "<div class=\"content\">", true);
|
||||||
|
}
|
||||||
|
AUTHOR.set(lineList.get(i).replace("^", ""));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (lineList.get(i).startsWith("|")) {
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "<h3 class='subheading'>" + lineList.get(i).replace("|", "") + "</h3>" + "\n", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (lineList.get(i).startsWith(">") && lineList.get(i).endsWith("<") ) {
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "<p>" + lineList.get(i).replace("<", "").replace(">", "") + "</p>" + "\n", true);
|
||||||
|
}
|
||||||
|
POST_CONTENT.set(POST_CONTENT.get() + " " + lineList.get(i).replace("<", "").replace(">", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (lineList.get(i).startsWith("{") && lineList.get(i).endsWith("}")) {
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "<img src=\"" + lineList.get(i).replace("{", "").replace("}", "") + "\">" + "\n", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!setValuesOnly) {
|
||||||
|
FileUtils.writeStringToFile(newHtmlFile, "\n </div> \n <head>\n" +
|
||||||
|
" <link rel=\"stylesheet\" href=\"./stylesheets/blog.css\">\n" +
|
||||||
|
"</head>", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
catch (IOException er) {
|
||||||
|
try {
|
||||||
|
throw new IOException(er);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void start(Stage stage) {
|
||||||
|
|
||||||
|
// Java FX control styling
|
||||||
|
GridPane grid = new GridPane();
|
||||||
|
grid.setHgap(5);
|
||||||
|
grid.setAlignment(Pos.CENTER);
|
||||||
|
FileChooser md = new FileChooser();
|
||||||
|
Label filepath = new Label();
|
||||||
|
grid.add(filepath, 2, 1);
|
||||||
|
Label heading = new Label(headingLabel);
|
||||||
|
heading.setFont(new Font(30));
|
||||||
|
heading.setAlignment(Pos.CENTER);
|
||||||
|
Label fileLabel = new Label(fileLabelTxt);
|
||||||
|
Button button = new Button(selectFileBtn);
|
||||||
|
|
||||||
|
AtomicReference<File> selectedTxtFile = new AtomicReference<>();
|
||||||
|
|
||||||
|
|
||||||
|
// Store user selected txt file path
|
||||||
|
button.setOnAction(e -> {
|
||||||
|
selectedTxtFile.set(md.showOpenDialog(stage));
|
||||||
|
filepath.setText(selectedTxtFile.toString());
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Create new HTML file based on users selection
|
||||||
|
Button confirm = new Button("Confirm");
|
||||||
|
confirm.setOnAction(e -> {
|
||||||
|
Path fileTxtPath = selectedTxtFile.get().toPath();
|
||||||
|
createHtml(stage, false, fileTxtPath);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Java FX control styling
|
||||||
|
Label heading2 = new Label("Publish Blog");
|
||||||
|
heading2.setFont(new Font(30));
|
||||||
|
heading2.setAlignment(Pos.CENTER);
|
||||||
|
Label blogNameLabel = new Label("Blog name for URL (evanniederwerfer.com/text-here):");
|
||||||
|
TextArea blogName = new TextArea();
|
||||||
|
blogName.setMaxHeight(20);
|
||||||
|
Label blogImageLabel = new Label("Blog image:");
|
||||||
|
Button blogImgBtn = new Button("Select Image");
|
||||||
|
|
||||||
|
blogImgBtn.setOnAction(e -> {
|
||||||
|
File selectedFile = md.showOpenDialog(stage);
|
||||||
|
imageFile.set(selectedFile.toPath());
|
||||||
|
blogImageLabel.setText(selectedFile.toPath().toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
Label blogTagsLabel = new Label("Select Tags:");
|
||||||
|
RadioButton Tags1 = new RadioButton("How-To");
|
||||||
|
RadioButton Tags2 = new RadioButton("Politics");
|
||||||
|
RadioButton Tags3 = new RadioButton("Tech");
|
||||||
|
RadioButton Tags4 = new RadioButton("Ethics");
|
||||||
|
RadioButton Tags5 = new RadioButton("VPA/SEG");
|
||||||
|
RadioButton Tags6 = new RadioButton("Personal");
|
||||||
|
RadioButton Tags7 = new RadioButton("Other");
|
||||||
|
Label blogFileLabel = new Label("Blog HTML File:");
|
||||||
|
Button blogFileBtn = new Button("Select HTML File");
|
||||||
|
Label selectedFilePath = new Label();
|
||||||
|
|
||||||
|
// User selected .HTML file to publish
|
||||||
|
blogFileBtn.setOnAction(e -> {
|
||||||
|
File selectedFile = md.showOpenDialog(stage);
|
||||||
|
publishFile.set(selectedFile.toPath());
|
||||||
|
selectedFilePath.setText(publishFile.toString());
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
Button publishBtn = new Button("Publish");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Connect to the FTP server & publish the new page and write changes
|
||||||
|
publishBtn.setOnAction(e -> {
|
||||||
|
|
||||||
|
if (AUTHOR.toString().isEmpty() || TITLE.toString().isEmpty() || POST_CONTENT.toString().isEmpty()) { // check to see if first step was skipped, ask user to select txt
|
||||||
|
Alert emptyVars = new Alert(Alert.AlertType.CONFIRMATION, "Warning - no values set for post. Select the txt file associated with the generated HTML file to proceed");
|
||||||
|
Optional<ButtonType> result = emptyVars.showAndWait();
|
||||||
|
|
||||||
|
if (blogName.getText().isEmpty()) {
|
||||||
|
Alert emptyName = new Alert(Alert.AlertType.ERROR, "No blog name was specified");
|
||||||
|
emptyName.show();
|
||||||
|
try {
|
||||||
|
throw new Exception("blog name empty");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (publishFile.toString().isEmpty()) {
|
||||||
|
Alert emptyFile = new Alert(Alert.AlertType.ERROR, "No publish HTML file was selected");
|
||||||
|
emptyFile.show();
|
||||||
|
try {
|
||||||
|
throw new Exception("publish file empty");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(result.get() == ButtonType.OK) {
|
||||||
|
File selectedFile = md.showOpenDialog(stage);
|
||||||
|
Path filep = selectedFile.toPath();
|
||||||
|
filepath.setText(file.toString());
|
||||||
|
createHtml(stage, true, filep);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(result.get() == ButtonType.CANCEL) {
|
||||||
|
emptyVars.close();
|
||||||
|
}
|
||||||
|
// cancel button is pressed
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FTPClient ftpClient = new FTPClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ftpClient.connect(host, port);
|
||||||
|
ftpClient.login(user, password);
|
||||||
|
ftpClient.enterLocalPassiveMode();
|
||||||
|
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
|
||||||
|
InputStream inputStream = new FileInputStream(publishFile.toString());
|
||||||
|
boolean stored = ftpClient.storeFile("./blogs/" + blogName.getText().replace(" ", "-") + ".html", inputStream);
|
||||||
|
if (stored) {
|
||||||
|
|
||||||
|
|
||||||
|
if(Tags1.isSelected()){
|
||||||
|
Tag1Var.set(Tag1String);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Tags2.isSelected()){
|
||||||
|
Tag2Var.set(Tag2String);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Tags3.isSelected()){
|
||||||
|
|
||||||
|
Tag3Var.set(Tag3String);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Tags4.isSelected()){
|
||||||
|
Tag4Var.set(Tag4String);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Tags5.isSelected()){
|
||||||
|
Tag5Var.set(Tag5String);
|
||||||
|
}
|
||||||
|
if(Tags6.isSelected()){
|
||||||
|
Tag6Var.set(Tag6String);
|
||||||
|
}
|
||||||
|
if(Tags7.isSelected()){
|
||||||
|
Tag7Var.set(Tag7String);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try (FileOutputStream fos = new FileOutputStream(tempFile)) {
|
||||||
|
ftpClient.retrieveFile("blogPosts.php", fos);
|
||||||
|
}
|
||||||
|
|
||||||
|
InputStream inputStream2 = new FileInputStream(imageFile.toString());
|
||||||
|
boolean image_stored = ftpClient.storeFile("./images/" + blogName.getText().replace(" ", "-"), inputStream2);
|
||||||
|
|
||||||
|
if (!image_stored) {
|
||||||
|
Alert imgStoreEx = new Alert(Alert.AlertType.ERROR, "Image was unable to be stored");
|
||||||
|
imgStoreEx.show();
|
||||||
|
throw new Exception("Image not transmitted");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
String genText = // Generate the post div and content to write to the replacement blogPosts.php
|
||||||
|
"\n<div class=\"posts-container\">\n" +
|
||||||
|
" <div class=\"post\">\n" +
|
||||||
|
" <img src=\"./images/" + blogName.getText().replace(" ", "-") + "\">" +
|
||||||
|
" <div>\n" +
|
||||||
|
" <h1 class=\"post-heading\">" + TITLE.toString() + "</h1>\n" +
|
||||||
|
" <div class=\"post-info\">\n" +
|
||||||
|
" <p class=\"post-read-time\">" + RT + " minute read</p>\n" +
|
||||||
|
" <p class=\"post-author\">" + AUTHOR.toString() + "</p>\n" +
|
||||||
|
" <br>\n" +
|
||||||
|
Tag1Var + "\n" + Tag2Var + "\n" + Tag3Var + "\n" + Tag4Var + "\n" + Tag5Var + "\n" + Tag6Var + "\n" + Tag7Var +
|
||||||
|
" <br>\n" +
|
||||||
|
" <p class=\"post-content\">" + POST_CONTENT.toString() + "</p>\n" +
|
||||||
|
" <a class=\"post-more\" href=\"https://www.blog.evanniederwerfer.com/blogs/" + blogName.getText().replace(" ", "-") + "\">" + "... See more</a>\n" +
|
||||||
|
" </div>\n" +
|
||||||
|
" </div>\n" +
|
||||||
|
" </div>";
|
||||||
|
|
||||||
|
String existingContent = FileUtils.readFileToString(tempFile, "UTF-8");
|
||||||
|
String updatedContent = genText + existingContent;
|
||||||
|
FileUtils.writeStringToFile(tempFile, updatedContent, "UTF-8");
|
||||||
|
|
||||||
|
|
||||||
|
try (FileInputStream fis = new FileInputStream(tempFile)) {
|
||||||
|
ftpClient.storeFile("blogPosts.php", fis);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isDeleted = tempFile.delete();
|
||||||
|
if (!isDeleted) {
|
||||||
|
System.out.println("Warning: temp PHP file cannot be deleted, check the directory permissions and try again");
|
||||||
|
}
|
||||||
|
} catch (SocketException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
Alert nullImg = new Alert(Alert.AlertType.ERROR, "Image not specified");
|
||||||
|
nullImg.show();
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set all values to empty or 0
|
||||||
|
|
||||||
|
|
||||||
|
AUTHOR.set("");
|
||||||
|
TITLE.set("");
|
||||||
|
POST_CONTENT.set("");
|
||||||
|
RT.set(0);
|
||||||
|
|
||||||
|
Alert success = new Alert(Alert.AlertType.INFORMATION, "Your blog was published! https://www.blog.evanniederwerfer.com/" + blogName.getText().replace(" ", "-"));
|
||||||
|
success.show();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// JavaFX add items and show window
|
||||||
|
grid.add(heading, 0,0);
|
||||||
|
grid.add(fileLabel, 0, 1);
|
||||||
|
grid.add(button, 1, 1);
|
||||||
|
grid.add(confirm, 0, 2);
|
||||||
|
grid.add(heading2, 0, 3);
|
||||||
|
grid.add(blogNameLabel, 0, 4);
|
||||||
|
grid.add(blogName, 1, 4);
|
||||||
|
grid.add(blogImageLabel, 0, 5);
|
||||||
|
grid.add(blogImgBtn, 1, 5);
|
||||||
|
grid.add(blogTagsLabel, 0, 6);
|
||||||
|
grid.add(Tags1, 0, 7);
|
||||||
|
grid.add(Tags2, 0, 8);
|
||||||
|
grid.add(Tags3, 0, 9);
|
||||||
|
grid.add(Tags4, 0, 10);
|
||||||
|
grid.add(Tags5, 0, 11);
|
||||||
|
grid.add(Tags6, 0, 12);
|
||||||
|
grid.add(Tags7, 0, 13);
|
||||||
|
grid.add(blogFileLabel, 0, 14);
|
||||||
|
grid.add(blogFileBtn, 1, 14);
|
||||||
|
grid.add(selectedFilePath, 2, 14);
|
||||||
|
grid.add(publishBtn, 0, 15);
|
||||||
|
Scene scene = new Scene(grid, 800, 400);
|
||||||
|
stage.setScene(scene);
|
||||||
|
stage.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
values.java
Normal file
52
values.java
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package evanniederwerfer.blogapp.blogappv2;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
public interface values {
|
||||||
|
AtomicReference<String> AUTHOR = new AtomicReference<>(""); // The author for the post in blogPosts.php
|
||||||
|
AtomicReference<String> TITLE = new AtomicReference<>(""); // The post title in blogPosts.php
|
||||||
|
AtomicReference<String> POST_CONTENT = new AtomicReference<>(""); // The post content for blogPosts.php
|
||||||
|
AtomicInteger RT = new AtomicInteger(); // Read time (approx time it takes to read article) for blogPosts.php
|
||||||
|
|
||||||
|
// Files
|
||||||
|
AtomicReference<Path> file = new AtomicReference<>(); // Select the blog txt file
|
||||||
|
AtomicReference<Path> publishFile = new AtomicReference<>(); // The .HTML file to be published to the site
|
||||||
|
AtomicReference<Path> imageFile = new AtomicReference<>(); // The image to be displayed on published div
|
||||||
|
File tempFile = new File("tempFile.php"); // Temp .PHP file downloaded to update blogPosts.php
|
||||||
|
|
||||||
|
// HTML Strings
|
||||||
|
|
||||||
|
AtomicReference<String> Tag1Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
AtomicReference<String> Tag2Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
AtomicReference<String> Tag3Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
AtomicReference<String> Tag4Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
AtomicReference<String> Tag5Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
AtomicReference<String> Tag6Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
AtomicReference<String> Tag7Var = new AtomicReference<>(""); // Remains empty if user doesn't select
|
||||||
|
String Tag1String = "<a class=\"i1\">How-To</a>"; // The first blog post tag
|
||||||
|
String Tag2String = "<a class=\"i2\">Politics</a>"; // The second blog post tag
|
||||||
|
String Tag3String = "<a class=\"i3\">Tech</a>"; // The third blog post tag
|
||||||
|
String Tag4String = "<a class=\"i4\">Ethics</a>"; // The fourth blog post tag
|
||||||
|
String Tag5String = "<a class=\"i5\">VPA/SEG</a>"; // The fourth blog post tag
|
||||||
|
String Tag6String = "<a class=\"i6\">Personal</a>"; // The fourth blog post tag
|
||||||
|
String Tag7String = "<a class=\"i7\">Other</a>"; // The fourth blog post tag
|
||||||
|
|
||||||
|
|
||||||
|
// FTP Credentials
|
||||||
|
String host = "";
|
||||||
|
String user = "";
|
||||||
|
String password = "";
|
||||||
|
int port = 21;
|
||||||
|
|
||||||
|
// JavaFX Node Text
|
||||||
|
|
||||||
|
String headingLabel = "Create Blog"; // First heading label
|
||||||
|
String fileLabelTxt = "Blog File:"; // The blog file label text located by "Select File" button
|
||||||
|
String selectFileBtn = "Select File"; // The button to select a txt file with syntax to create blog
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user