From a5d976cda8048c53a4b4fdeee458eab05959bec5 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Thu, 12 Apr 2018 08:47:24 +0200 Subject: [PATCH] justify: supports bullet lists --- src/be/nikiroo/utils/main/justify.java | 101 ++++++++++++++++++++----- 1 file changed, 82 insertions(+), 19 deletions(-) diff --git a/src/be/nikiroo/utils/main/justify.java b/src/be/nikiroo/utils/main/justify.java index 32cfb10..68f5358 100644 --- a/src/be/nikiroo/utils/main/justify.java +++ b/src/be/nikiroo/utils/main/justify.java @@ -1,7 +1,9 @@ package be.nikiroo.utils.main; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; import java.util.Scanner; import be.nikiroo.utils.StringUtils; @@ -36,52 +38,98 @@ public class justify { } // TODO: move to utils? - List lines = new ArrayList(); + // Content <-> Bullet spacing (null = no spacing) + List> lines = new ArrayList>(); Scanner scan = new Scanner(System.in); scan.useDelimiter("\r\n|[\r\n]"); try { StringBuilder previous = null; StringBuilder tmp = new StringBuilder(); + String previousItemBulletSpacing = null; + String itemBulletSpacing = null; while (scan.hasNext()) { - String current = scan.next(); - tmp.setLength(0); - for (String word : current.split(" ")) { - if (word.isEmpty()) { - continue; + boolean previousLineComplete = true; + + String current = scan.next().replace("\t", " "); + itemBulletSpacing = getItemSpacing(current); + boolean bullet = isItemLine(current); + if ((previousItemBulletSpacing == null || itemBulletSpacing + .length() <= previousItemBulletSpacing.length()) + && !bullet) { + itemBulletSpacing = null; + } + + if (itemBulletSpacing != null) { + current = current.trim(); + if (!current.isEmpty() && bullet) { + current = current.substring(1); } + current = current.trim(); + previousLineComplete = bullet; + } else { + tmp.setLength(0); + for (String word : current.split(" ")) { + if (word.isEmpty()) { + continue; + } - if (tmp.length() > 0) { - tmp.append(' '); + if (tmp.length() > 0) { + tmp.append(' '); + } + tmp.append(word.trim()); } - tmp.append(word.trim()); + current = tmp.toString(); + + previousLineComplete = current.isEmpty() + || previousItemBulletSpacing != null + || (previous != null && isFullLine(previous)); } - current = tmp.toString(); if (previous == null) { previous = new StringBuilder(); } else { - if (current.isEmpty() || isFullLine(previous)) { - lines.add(previous.toString()); + if (previousLineComplete) { + lines.add(new AbstractMap.SimpleEntry( + previous.toString(), previousItemBulletSpacing)); previous.setLength(0); + previousItemBulletSpacing = itemBulletSpacing; } else { previous.append(' '); } } previous.append(current); + } if (previous != null) { - lines.add(previous.toString()); + lines.add(new AbstractMap.SimpleEntry(previous + .toString(), previousItemBulletSpacing)); } } finally { scan.close(); } - // TODO: supports bullet lines "- xxx" and sub levels - for (String line : lines) { - for (String subline : StringUtils.justifyText(line, width, align)) { - System.out.println(subline); + for (Entry line : lines) { + String content = line.getKey(); + String spacing = line.getValue(); + + String bullet = "- "; + if (spacing == null) { + bullet = ""; + spacing = ""; + } + + if (spacing.length() > width + 3) { + spacing = ""; + } + + for (String subline : StringUtils.justifyText(content, width + - (spacing.length() + bullet.length()), align)) { + System.out.println(spacing + bullet + subline); + if (!bullet.isEmpty()) { + bullet = " "; + } } } } @@ -90,7 +138,22 @@ public class justify { return line.length() == 0 // || line.charAt(line.length() - 1) == '.' || line.charAt(line.length() - 1) == '"' - || line.charAt(line.length() - 1) == '»' - ; + || line.charAt(line.length() - 1) == '»'; + } + + static private boolean isItemLine(String line) { + String spacing = getItemSpacing(line); + return spacing != null && line.charAt(spacing.length()) == '-'; + } + + static private String getItemSpacing(String line) { + int i; + for (i = 0; i < line.length(); i++) { + if (line.charAt(i) != ' ') { + return line.substring(0, i); + } + } + + return ""; } } -- 2.27.0