mirror of
https://github.com/octoleo/plantuml.git
synced 2024-11-29 08:13:53 +00:00
This commit is contained in:
parent
8cc6471ad3
commit
5fce218b08
@ -45,6 +45,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||||
import net.sourceforge.plantuml.core.Diagram;
|
import net.sourceforge.plantuml.core.Diagram;
|
||||||
|
import net.sourceforge.plantuml.creole.Neutron;
|
||||||
import net.sourceforge.plantuml.creole.atom.Atom;
|
import net.sourceforge.plantuml.creole.atom.Atom;
|
||||||
import net.sourceforge.plantuml.graphic.AbstractTextBlock;
|
import net.sourceforge.plantuml.graphic.AbstractTextBlock;
|
||||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||||
@ -146,10 +147,6 @@ public class EmbeddedDiagram extends AbstractTextBlock implements Line, Atom {
|
|||||||
return new EmbeddedDiagram(skinParam, BlockUml.convert(strings));
|
return new EmbeddedDiagram(skinParam, BlockUml.convert(strings));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
|
||||||
return Arrays.asList((Atom) this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getStartingAltitude(StringBounder stringBounder) {
|
public double getStartingAltitude(StringBounder stringBounder) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -219,4 +216,9 @@ public class EmbeddedDiagram extends AbstractTextBlock implements Line, Atom {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Neutron> getNeutrons() {
|
||||||
|
return Arrays.asList(Neutron.create(this));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -35,9 +35,11 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.creole;
|
package net.sourceforge.plantuml.creole;
|
||||||
|
|
||||||
|
import java.util.ArrayDeque;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Deque;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@ -59,41 +61,43 @@ public class Fission {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<Stripe> getSplitted(StringBounder stringBounder) {
|
public List<Stripe> getSplitted(StringBounder stringBounder) {
|
||||||
final double valueMaxWidth = maxWidth.getMaxWidth();
|
final double valueMaxWidth = Math.abs(maxWidth.getMaxWidth());
|
||||||
if (valueMaxWidth == 0)
|
if (valueMaxWidth == 0)
|
||||||
return Arrays.asList(stripe);
|
return Arrays.asList(stripe);
|
||||||
|
|
||||||
final List<Stripe> result = new ArrayList<>();
|
final List<Stripe> result = new ArrayList<>();
|
||||||
StripeSimpleInternal current = new StripeSimpleInternal(stripe.getLHeader());
|
StripeSimpleInternal line = new StripeSimpleInternal(false, stringBounder, stripe.getLHeader());
|
||||||
double remainingSpace = valueMaxWidth;
|
result.add(line);
|
||||||
|
|
||||||
|
final Deque<Neutron> all = new ArrayDeque<>();
|
||||||
for (Atom atom : noHeader())
|
for (Atom atom : noHeader())
|
||||||
while (true) {
|
for (Neutron n : atom.getNeutrons())
|
||||||
final List<Atom> splitInTwo = atom.splitInTwo(stringBounder, remainingSpace);
|
all.addLast(n);
|
||||||
final Atom part1 = splitInTwo.get(0);
|
if (all.peekLast().getType() != NeutronType.ZWSP_SEPARATOR)
|
||||||
final double widthPart1 = part1.calculateDimension(stringBounder).getWidth();
|
all.addLast(Neutron.zwspSeparator());
|
||||||
current.addAtom(part1);
|
|
||||||
remainingSpace -= widthPart1;
|
while (all.size() > 0) {
|
||||||
if (remainingSpace <= 0) {
|
final Neutron current = all.removeFirst();
|
||||||
result.add(current);
|
if (current.getType() == NeutronType.ZWSP_SEPARATOR && line.getWidth() > valueMaxWidth) {
|
||||||
current = new StripeSimpleInternal(blank(stripe.getLHeader()));
|
all.addFirst(current);
|
||||||
remainingSpace = valueMaxWidth;
|
final List<Neutron> removed = line.slightyShorten();
|
||||||
}
|
for (int i = removed.size() - 1; i >= 0; i--)
|
||||||
if (splitInTwo.size() == 1) {
|
all.addFirst(removed.get(i));
|
||||||
break;
|
|
||||||
}
|
line = new StripeSimpleInternal(true, stringBounder, blank(stripe.getLHeader()));
|
||||||
atom = splitInTwo.get(1);
|
result.add(line);
|
||||||
if (remainingSpace < valueMaxWidth
|
} else
|
||||||
&& atom.calculateDimension(stringBounder).getWidth() > remainingSpace) {
|
line.addNeutron(current);
|
||||||
result.add(current);
|
|
||||||
current = new StripeSimpleInternal(blank(stripe.getLHeader()));
|
|
||||||
remainingSpace = valueMaxWidth;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remainingSpace < valueMaxWidth)
|
for (Stripe l : result)
|
||||||
result.add(current);
|
((StripeSimpleInternal) l).removeFinalSpaces();
|
||||||
|
|
||||||
|
while (result.size() > 1 && ((StripeSimpleInternal) result.get(result.size() - 1)).isWhite())
|
||||||
|
result.remove(result.size() - 1);
|
||||||
|
|
||||||
return Collections.unmodifiableList(result);
|
return Collections.unmodifiableList(result);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Atom> noHeader() {
|
private List<Atom> noHeader() {
|
||||||
@ -104,6 +108,121 @@ public class Fission {
|
|||||||
return atoms.subList(1, atoms.size());
|
return atoms.subList(1, atoms.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class StripeSimpleInternal implements Stripe {
|
||||||
|
|
||||||
|
private final boolean removeInitialSpaces;
|
||||||
|
private final Atom header;
|
||||||
|
private final List<Neutron> neutrons = new ArrayList<>();
|
||||||
|
private final StringBounder stringBounder;
|
||||||
|
private double width;
|
||||||
|
|
||||||
|
private StripeSimpleInternal(boolean removeInitialSpaces, StringBounder stringBounder, Atom header) {
|
||||||
|
this.removeInitialSpaces = removeInitialSpaces;
|
||||||
|
this.stringBounder = stringBounder;
|
||||||
|
this.header = header;
|
||||||
|
if (header != null)
|
||||||
|
width += header.calculateDimension(stringBounder).getWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getWidth() {
|
||||||
|
if (width == -1)
|
||||||
|
throw new IllegalStateException();
|
||||||
|
// double width = 0;
|
||||||
|
// if (header != null)
|
||||||
|
// width += header.calculateDimension(stringBounder).getWidth();
|
||||||
|
// for (Neutron n : neutrons)
|
||||||
|
// width += n.getWidth(stringBounder);
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (header != null)
|
||||||
|
return header.toString() + " " + neutrons;
|
||||||
|
return neutrons.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Neutron> slightyShorten() {
|
||||||
|
if (neutrons.size() == 0)
|
||||||
|
throw new IllegalStateException();
|
||||||
|
|
||||||
|
final int lastZwsp = lastZwsp();
|
||||||
|
if (lastZwsp == -1)
|
||||||
|
return Collections.emptyList();
|
||||||
|
|
||||||
|
this.width = -1;
|
||||||
|
final List<Neutron> removed = new ArrayList<Neutron>(neutrons.subList(lastZwsp, neutrons.size()));
|
||||||
|
while (neutrons.size() > lastZwsp)
|
||||||
|
neutrons.remove(neutrons.size() - 1);
|
||||||
|
|
||||||
|
return removed;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isWhite() {
|
||||||
|
for (Neutron n : neutrons)
|
||||||
|
if (n.getType() != NeutronType.ZWSP_SEPARATOR && n.getType() != NeutronType.SPACE)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeFinalSpaces() {
|
||||||
|
while (neutrons.size() > 0 && neutrons.get(0).getType() == NeutronType.ZWSP_SEPARATOR)
|
||||||
|
neutrons.remove(0);
|
||||||
|
while (neutrons.size() > 1
|
||||||
|
&& (last().getType() == NeutronType.SPACE || last().getType() == NeutronType.ZWSP_SEPARATOR))
|
||||||
|
neutrons.remove(neutrons.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Neutron last() {
|
||||||
|
return neutrons.get(neutrons.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int lastZwsp() {
|
||||||
|
for (int i = neutrons.size() - 1; i >= 0; i--)
|
||||||
|
if (neutrons.get(i).getType() == NeutronType.ZWSP_SEPARATOR)
|
||||||
|
return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Atom> getAtoms() {
|
||||||
|
final List<Atom> result = new ArrayList<>();
|
||||||
|
if (header != null)
|
||||||
|
result.add(header);
|
||||||
|
|
||||||
|
for (Neutron n : neutrons)
|
||||||
|
if (n.getType() != NeutronType.ZWSP_SEPARATOR) {
|
||||||
|
if (removeInitialSpaces && result.size() == 0 && n.getType() == NeutronType.SPACE)
|
||||||
|
continue;
|
||||||
|
result.add(n.asAtom());
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableList(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addNeutron(Neutron neutron) {
|
||||||
|
if (width == -1)
|
||||||
|
throw new IllegalStateException();
|
||||||
|
|
||||||
|
if (neutron.getType() == NeutronType.ZWSP_SEPARATOR && this.neutrons.size() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (neutron.getType() == NeutronType.ZWSP_SEPARATOR && this.neutrons.size() > 0
|
||||||
|
&& last().getType() == NeutronType.ZWSP_SEPARATOR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (removeInitialSpaces && this.neutrons.size() == 0 && neutron.getType() == NeutronType.SPACE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.neutrons.add(neutron);
|
||||||
|
this.width += neutron.getWidth(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Atom getLHeader() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static Atom blank(final Atom header) {
|
private static Atom blank(final Atom header) {
|
||||||
if (header == null)
|
if (header == null)
|
||||||
return null;
|
return null;
|
||||||
@ -124,28 +243,4 @@ public class Fission {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static class StripeSimpleInternal implements Stripe {
|
|
||||||
|
|
||||||
private final List<Atom> atoms = new ArrayList<>();
|
|
||||||
|
|
||||||
private StripeSimpleInternal(Atom header) {
|
|
||||||
if (header != null)
|
|
||||||
this.atoms.add(header);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Atom> getAtoms() {
|
|
||||||
return Collections.unmodifiableList(atoms);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addAtom(Atom atom) {
|
|
||||||
this.atoms.add(atom);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Atom getLHeader() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
114
src/net/sourceforge/plantuml/creole/Neutron.java
Normal file
114
src/net/sourceforge/plantuml/creole/Neutron.java
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2023, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* This file is part of PlantUML.
|
||||||
|
*
|
||||||
|
* PlantUML is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PlantUML distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.creole;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.creole.atom.Atom;
|
||||||
|
import net.sourceforge.plantuml.creole.legacy.AtomText;
|
||||||
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
|
|
||||||
|
public class Neutron {
|
||||||
|
|
||||||
|
private final String data;
|
||||||
|
private final NeutronType type;
|
||||||
|
private final Atom asAtom;
|
||||||
|
|
||||||
|
private Neutron(String data, NeutronType type, Atom asAtom) {
|
||||||
|
this.data = data;
|
||||||
|
this.type = type;
|
||||||
|
this.asAtom = asAtom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Neutron create(Atom atom) {
|
||||||
|
if (atom instanceof AtomText) {
|
||||||
|
final String text = ((AtomText) atom).getText();
|
||||||
|
return new Neutron(text, getNeutronTypeFromChar(text.charAt(0)), atom);
|
||||||
|
}
|
||||||
|
return new Neutron(null, NeutronType.OTHER, atom);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Neutron zwspSeparator() {
|
||||||
|
return new Neutron(null, NeutronType.ZWSP_SEPARATOR, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (type == NeutronType.ZWSP_SEPARATOR)
|
||||||
|
return "ZWSP";
|
||||||
|
return type + "(" + data + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
public Atom asAtom() {
|
||||||
|
return asAtom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NeutronType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSeparator(char ch) {
|
||||||
|
return Character.isWhitespace(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isSentenceBoundaryUnused(char ch) {
|
||||||
|
return ch == '.' || ch == ',';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isChineseSentenceBoundary(char ch) {
|
||||||
|
return ch == '\uFF01' // U+FF01 FULLWIDTH EXCLAMATION MARK (!)
|
||||||
|
// || ch == '\uFF08' // U+FF08 FULLWIDTH LEFT PARENTHESIS
|
||||||
|
// || ch == '\uFF09' // U+FF09 FULLWIDTH RIGHT PARENTHESIS
|
||||||
|
|| ch == '\uFF0C' // U+FF0C FULLWIDTH COMMA
|
||||||
|
|| ch == '\uFF1A' // U+FF1A FULLWIDTH COLON (:)
|
||||||
|
|| ch == '\uFF1B' // U+FF1B FULLWIDTH SEMICOLON (;)
|
||||||
|
|| ch == '\uFF1F' // U+FF1F FULLWIDTH QUESTION MARK (?)
|
||||||
|
|| ch == '\u3002'; // U+3002 IDEOGRAPHIC FULL STOP (.)
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getWidth(StringBounder stringBounder) {
|
||||||
|
if (type == NeutronType.ZWSP_SEPARATOR)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return asAtom.calculateDimension(stringBounder).getWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NeutronType getNeutronTypeFromChar(char ch) {
|
||||||
|
if (isSeparator(ch))
|
||||||
|
return NeutronType.SPACE;
|
||||||
|
return NeutronType.TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
41
src/net/sourceforge/plantuml/creole/NeutronType.java
Normal file
41
src/net/sourceforge/plantuml/creole/NeutronType.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2023, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: http://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* http://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* http://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* This file is part of PlantUML.
|
||||||
|
*
|
||||||
|
* PlantUML is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PlantUML distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.creole;
|
||||||
|
|
||||||
|
public enum NeutronType {
|
||||||
|
TEXT, SPACE, ZWSP_SEPARATOR, OTHER;
|
||||||
|
|
||||||
|
}
|
@ -38,11 +38,6 @@ package net.sourceforge.plantuml.creole;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.ISkinSimple;
|
|
||||||
import net.sourceforge.plantuml.creole.legacy.CreoleParser;
|
|
||||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
|
||||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
|
||||||
|
|
||||||
public class Parser {
|
public class Parser {
|
||||||
|
|
||||||
public static final String MONOSPACED = "monospaced";
|
public static final String MONOSPACED = "monospaced";
|
||||||
|
@ -61,10 +61,6 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|||||||
|
|
||||||
public class SheetBlock1 extends AbstractTextBlock implements TextBlock, Atom, Stencil {
|
public class SheetBlock1 extends AbstractTextBlock implements TextBlock, Atom, Stencil {
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
|
||||||
throw new UnsupportedOperationException(getClass().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Sheet sheet;
|
private final Sheet sheet;
|
||||||
private List<Stripe> stripes;
|
private List<Stripe> stripes;
|
||||||
private Map<Stripe, Double> heights;
|
private Map<Stripe, Double> heights;
|
||||||
@ -222,4 +218,9 @@ public class SheetBlock1 extends AbstractTextBlock implements TextBlock, Atom, S
|
|||||||
return minimumWidth;
|
return minimumWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Neutron> getNeutrons() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,10 +55,6 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|||||||
|
|
||||||
final public class SheetBlock2 extends AbstractTextBlock implements TextBlock, Atom, WithPorts {
|
final public class SheetBlock2 extends AbstractTextBlock implements TextBlock, Atom, WithPorts {
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
|
||||||
throw new UnsupportedOperationException(getClass().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private final SheetBlock1 block;
|
private final SheetBlock1 block;
|
||||||
private final UStroke defaultStroke;
|
private final UStroke defaultStroke;
|
||||||
private final Stencil stencil;
|
private final Stencil stencil;
|
||||||
@ -122,4 +118,9 @@ final public class SheetBlock2 extends AbstractTextBlock implements TextBlock, A
|
|||||||
return new Ports();
|
return new Ports();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Neutron> getNeutrons() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,12 +38,12 @@ package net.sourceforge.plantuml.creole.atom;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.creole.Neutron;
|
||||||
|
|
||||||
public abstract class AbstractAtom implements Atom {
|
public abstract class AbstractAtom implements Atom {
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
public List<Neutron> getNeutrons() {
|
||||||
return Arrays.asList((Atom) this);
|
return Arrays.asList(Neutron.create(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ package net.sourceforge.plantuml.creole.atom;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||||
|
import net.sourceforge.plantuml.creole.Neutron;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
import net.sourceforge.plantuml.ugraphic.UShape;
|
import net.sourceforge.plantuml.ugraphic.UShape;
|
||||||
@ -50,6 +51,6 @@ public interface Atom extends UShape {
|
|||||||
|
|
||||||
public void drawU(UGraphic ug);
|
public void drawU(UGraphic ug);
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width);
|
public List<Neutron> getNeutrons();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -35,10 +35,6 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.creole.atom;
|
package net.sourceforge.plantuml.creole.atom;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
@ -56,24 +52,6 @@ public class AtomWithMargin extends AbstractAtom implements Atom {
|
|||||||
this.marginY2 = marginY2;
|
this.marginY2 = marginY2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
|
||||||
final List<Atom> result = new ArrayList<>();
|
|
||||||
final List<Atom> list = atom.splitInTwo(stringBounder, width);
|
|
||||||
for (Atom a : list) {
|
|
||||||
double y1 = marginY1;
|
|
||||||
double y2 = marginY2;
|
|
||||||
if (list.size() == 2 && result.size() == 0) {
|
|
||||||
y2 = 0;
|
|
||||||
}
|
|
||||||
if (list.size() == 2 && result.size() == 1) {
|
|
||||||
y1 = 0;
|
|
||||||
}
|
|
||||||
result.add(new AtomWithMargin(a, y1, y2));
|
|
||||||
}
|
|
||||||
return Collections.unmodifiableList(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public XDimension2D calculateDimension(StringBounder stringBounder) {
|
public XDimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
return atom.calculateDimension(stringBounder).delta(0, marginY1 + marginY2);
|
return atom.calculateDimension(stringBounder).delta(0, marginY1 + marginY2);
|
||||||
}
|
}
|
||||||
|
@ -36,23 +36,20 @@
|
|||||||
package net.sourceforge.plantuml.creole.legacy;
|
package net.sourceforge.plantuml.creole.legacy;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.BackSlash;
|
import net.sourceforge.plantuml.BackSlash;
|
||||||
import net.sourceforge.plantuml.LineBreakStrategy;
|
|
||||||
import net.sourceforge.plantuml.Log;
|
import net.sourceforge.plantuml.Log;
|
||||||
import net.sourceforge.plantuml.StringUtils;
|
import net.sourceforge.plantuml.StringUtils;
|
||||||
import net.sourceforge.plantuml.Url;
|
import net.sourceforge.plantuml.Url;
|
||||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||||
|
import net.sourceforge.plantuml.creole.Neutron;
|
||||||
|
import net.sourceforge.plantuml.creole.NeutronType;
|
||||||
import net.sourceforge.plantuml.creole.atom.AbstractAtom;
|
import net.sourceforge.plantuml.creole.atom.AbstractAtom;
|
||||||
import net.sourceforge.plantuml.creole.atom.Atom;
|
import net.sourceforge.plantuml.creole.atom.Atom;
|
||||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
import net.sourceforge.plantuml.ugraphic.UText;
|
import net.sourceforge.plantuml.ugraphic.UText;
|
||||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
@ -71,23 +68,12 @@ public final class AtomText extends AbstractAtom implements Atom {
|
|||||||
private final DelayedDouble marginRight;
|
private final DelayedDouble marginRight;
|
||||||
private final Url url;
|
private final Url url;
|
||||||
private final boolean manageSpecialChars;
|
private final boolean manageSpecialChars;
|
||||||
private TextBlock visibility;
|
|
||||||
|
|
||||||
protected AtomText(String text, FontConfiguration style, Url url, DelayedDouble marginLeft,
|
protected AtomText(String text, FontConfiguration style, Url url, DelayedDouble marginLeft,
|
||||||
DelayedDouble marginRight, boolean manageSpecialChars) {
|
DelayedDouble marginRight, boolean manageSpecialChars) {
|
||||||
if (text.contains("" + BackSlash.hiddenNewLine()))
|
if (text.contains("" + BackSlash.hiddenNewLine()))
|
||||||
throw new IllegalArgumentException(text);
|
throw new IllegalArgumentException(text);
|
||||||
|
|
||||||
// if (text.length() > 0) {
|
|
||||||
// final VisibilityModifier visibilityModifier = VisibilityModifier.getByUnicode(text.charAt(0));
|
|
||||||
// if (visibilityModifier != null) {
|
|
||||||
// final HColor back = HColorUtils.GREEN;
|
|
||||||
// final HColor fore = HColorUtils.RED;
|
|
||||||
// visibility = visibilityModifier.getUBlock(11, fore, back, url != null);
|
|
||||||
// text = text.substring(1);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
this.marginLeft = marginLeft;
|
this.marginLeft = marginLeft;
|
||||||
this.marginRight = marginRight;
|
this.marginRight = marginRight;
|
||||||
String s = CharHidder.unhide(text);
|
String s = CharHidder.unhide(text);
|
||||||
@ -119,9 +105,6 @@ public final class AtomText extends AbstractAtom implements Atom {
|
|||||||
double width = text.indexOf("\t") == -1 ? rect.getWidth() : getWidth(stringBounder, text);
|
double width = text.indexOf("\t") == -1 ? rect.getWidth() : getWidth(stringBounder, text);
|
||||||
final double left = marginLeft.getDouble(stringBounder);
|
final double left = marginLeft.getDouble(stringBounder);
|
||||||
final double right = marginRight.getDouble(stringBounder);
|
final double right = marginRight.getDouble(stringBounder);
|
||||||
if (visibility != null)
|
|
||||||
width += visibility.calculateDimension(stringBounder).getWidth();
|
|
||||||
|
|
||||||
return new XDimension2D(width + left + right, h);
|
return new XDimension2D(width + left + right, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,11 +115,6 @@ public final class AtomText extends AbstractAtom implements Atom {
|
|||||||
if (ug.matchesProperty("SPECIALTXT")) {
|
if (ug.matchesProperty("SPECIALTXT")) {
|
||||||
ug.draw(this);
|
ug.draw(this);
|
||||||
} else {
|
} else {
|
||||||
if (visibility != null) {
|
|
||||||
visibility.drawU(ug.apply(UTranslate.dy(2)));
|
|
||||||
final double width = visibility.calculateDimension(ug.getStringBounder()).getWidth();
|
|
||||||
ug = ug.apply(UTranslate.dx(width));
|
|
||||||
}
|
|
||||||
HColor textColor = fontConfiguration.getColor();
|
HColor textColor = fontConfiguration.getColor();
|
||||||
FontConfiguration useFontConfiguration = fontConfiguration;
|
FontConfiguration useFontConfiguration = fontConfiguration;
|
||||||
|
|
||||||
@ -213,106 +191,44 @@ public final class AtomText extends AbstractAtom implements Atom {
|
|||||||
return stringBounder.calculateDimension(fontConfiguration.getFont(), tabString()).getWidth();
|
return stringBounder.calculateDimension(fontConfiguration.getFont(), tabString()).getWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Collection<String> splitted() {
|
@Override
|
||||||
final List<String> result = new ArrayList<>();
|
public final List<Neutron> getNeutrons() {
|
||||||
|
final List<Neutron> result = new ArrayList<>();
|
||||||
final StringBuilder pending = new StringBuilder();
|
final StringBuilder pending = new StringBuilder();
|
||||||
for (int i = 0; i < text.length(); i++) {
|
for (int i = 0; i < text.length(); i++) {
|
||||||
final char ch = text.charAt(i);
|
final char ch = text.charAt(i);
|
||||||
if (isSeparator(ch)) {
|
if (pending.length() == 0) {
|
||||||
if (pending.length() > 0)
|
|
||||||
result.add(pending.toString());
|
|
||||||
result.add("" + ch);
|
|
||||||
pending.setLength(0);
|
|
||||||
} else if (isChineseSentenceBoundary(ch)) {
|
|
||||||
pending.append(ch);
|
pending.append(ch);
|
||||||
result.add(pending.toString());
|
continue;
|
||||||
|
}
|
||||||
|
final NeutronType pendingType = Neutron.getNeutronTypeFromChar(pending.charAt(0));
|
||||||
|
final NeutronType currentType = Neutron.getNeutronTypeFromChar(ch);
|
||||||
|
if (pendingType != currentType) {
|
||||||
|
addPending(result, pending.toString());
|
||||||
pending.setLength(0);
|
pending.setLength(0);
|
||||||
} else {
|
}
|
||||||
pending.append(ch);
|
pending.append(ch);
|
||||||
}
|
// if (Neutron.isSentenceBoundary(ch) || Neutron.isChineseSentenceBoundary(ch))
|
||||||
}
|
if (Neutron.isChineseSentenceBoundary(ch)) {
|
||||||
if (pending.length() > 0)
|
addPending(result, pending.toString());
|
||||||
result.add(pending.toString());
|
pending.setLength(0);
|
||||||
return result;
|
result.add(Neutron.zwspSeparator());
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Collection<String> splittedOld() {
|
|
||||||
final List<String> result = new ArrayList<>();
|
|
||||||
for (int i = 0; i < text.length(); i++) {
|
|
||||||
final char ch = text.charAt(i);
|
|
||||||
if (isSeparator(ch)) {
|
|
||||||
result.add("" + text.charAt(i));
|
|
||||||
} else {
|
|
||||||
final StringBuilder tmp = new StringBuilder();
|
|
||||||
tmp.append(ch);
|
|
||||||
while (i + 1 < text.length() && isSeparator(text.charAt(i + 1)) == false) {
|
|
||||||
i++;
|
|
||||||
tmp.append(text.charAt(i));
|
|
||||||
}
|
|
||||||
result.add(tmp.toString());
|
|
||||||
}
|
}
|
||||||
|
if (pending.length() > 0) {
|
||||||
|
addPending(result, pending.toString());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Atom> getSplitted(StringBounder stringBounder, LineBreakStrategy maxWidthAsString) {
|
private void addPending(List<Neutron> result, String pending) {
|
||||||
final double maxWidth = maxWidthAsString.getMaxWidth();
|
final Neutron tmp = Neutron.create(withText(pending));
|
||||||
if (maxWidth == 0)
|
if (tmp.getType() == NeutronType.SPACE)
|
||||||
throw new IllegalStateException();
|
result.add(Neutron.zwspSeparator());
|
||||||
|
result.add(tmp);
|
||||||
final List<Atom> result = new ArrayList<>();
|
if (tmp.getType() == NeutronType.SPACE)
|
||||||
final StringTokenizer st = new StringTokenizer(text, " ", true);
|
result.add(Neutron.zwspSeparator());
|
||||||
final StringBuilder currentLine = new StringBuilder();
|
|
||||||
while (st.hasMoreTokens()) {
|
|
||||||
final String token1 = st.nextToken();
|
|
||||||
for (String tmp : Arrays.asList(token1)) {
|
|
||||||
final double w = getWidth(stringBounder, currentLine + tmp);
|
|
||||||
if (w > maxWidth) {
|
|
||||||
result.add(withText(currentLine.toString()));
|
|
||||||
currentLine.setLength(0);
|
|
||||||
if (tmp.startsWith(" ") == false)
|
|
||||||
currentLine.append(tmp);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
currentLine.append(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.add(withText(currentLine.toString()));
|
|
||||||
return Collections.unmodifiableList(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
|
||||||
final StringBuilder tmp = new StringBuilder();
|
|
||||||
for (String token : splitted()) {
|
|
||||||
if (tmp.length() > 0 && getWidth(stringBounder, tmp.toString() + token) > width) {
|
|
||||||
final Atom part1 = withText(tmp.toString());
|
|
||||||
String remain = text.substring(tmp.length());
|
|
||||||
while (remain.startsWith(" "))
|
|
||||||
remain = remain.substring(1);
|
|
||||||
|
|
||||||
final Atom part2 = withText(remain);
|
|
||||||
return Arrays.asList(part1, part2);
|
|
||||||
}
|
|
||||||
tmp.append(token);
|
|
||||||
}
|
|
||||||
return Collections.singletonList((Atom) this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isSeparator(char ch) {
|
|
||||||
return Character.isWhitespace(ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isChineseSentenceBoundary(char ch) {
|
|
||||||
return ch == '\uFF01' // U+FF01 FULLWIDTH EXCLAMATION MARK (!)
|
|
||||||
// || ch == '\uFF08' // U+FF08 FULLWIDTH LEFT PARENTHESIS
|
|
||||||
// || ch == '\uFF09' // U+FF09 FULLWIDTH RIGHT PARENTHESIS
|
|
||||||
|| ch == '\uFF0C' // U+FF0C FULLWIDTH COMMA
|
|
||||||
|| ch == '\uFF1A' // U+FF1A FULLWIDTH COLON (:)
|
|
||||||
|| ch == '\uFF1B' // U+FF1B FULLWIDTH SEMICOLON (;)
|
|
||||||
|| ch == '\uFF1F' // U+FF1F FULLWIDTH QUESTION MARK (?)
|
|
||||||
|| ch == '\u3002'; // U+3002 IDEOGRAPHIC FULL STOP (.)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String getText() {
|
public final String getText() {
|
||||||
|
@ -36,11 +36,11 @@
|
|||||||
package net.sourceforge.plantuml.creole.legacy;
|
package net.sourceforge.plantuml.creole.legacy;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||||
|
import net.sourceforge.plantuml.creole.Neutron;
|
||||||
import net.sourceforge.plantuml.creole.Parser;
|
import net.sourceforge.plantuml.creole.Parser;
|
||||||
import net.sourceforge.plantuml.creole.atom.Atom;
|
import net.sourceforge.plantuml.creole.atom.Atom;
|
||||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||||
@ -109,8 +109,9 @@ public class StripeCode implements StripeRaw {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
@Override
|
||||||
return Arrays.asList((Atom) this);
|
public List<Neutron> getNeutrons() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -35,11 +35,11 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.creole.legacy;
|
package net.sourceforge.plantuml.creole.legacy;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||||
|
import net.sourceforge.plantuml.creole.Neutron;
|
||||||
import net.sourceforge.plantuml.creole.Parser;
|
import net.sourceforge.plantuml.creole.Parser;
|
||||||
import net.sourceforge.plantuml.creole.atom.Atom;
|
import net.sourceforge.plantuml.creole.atom.Atom;
|
||||||
import net.sourceforge.plantuml.creole.atom.AtomMath;
|
import net.sourceforge.plantuml.creole.atom.AtomMath;
|
||||||
@ -103,8 +103,9 @@ public class StripeLatex implements StripeRaw {
|
|||||||
getAtom().drawU(ug);
|
getAtom().drawU(ug);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
|
@Override
|
||||||
return Arrays.asList((Atom) this);
|
public List<Neutron> getNeutrons() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ public class Version {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int beta() {
|
public static int beta() {
|
||||||
final int beta = 0;
|
final int beta = 1;
|
||||||
return beta;
|
return beta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user