Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #396 - submittor name rendering #444

Merged
merged 3 commits into from
Jun 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.schoellerfamily.gedbrowser.renderer;

import java.util.ArrayList;
import java.util.List;

/**
* Contains a few common methods used in complex renderers.
*
* @author Dick Schoeller
*/
public interface ComplexRenderer {
/**
* Properly escape the string for display in HTML.
*
* @param input the input string
* @return the string prepared for display in HTML
*/
default String escapeString(final String input) {
return GedRenderer.escapeString(input).trim();
}

/**
* Separate the provided strings with spaces, drop empty tokens.
*
* @param args the strings to separate
* @return either a space or an empty string
*/
default String separate(final String... args) {
final List<String> argList = new ArrayList<>();
for (String arg : args) {
if (!arg.isEmpty()) {
argList.add(arg);
}
}
return String.join(" ", argList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ public final class GedRendererFactory {
return new PlaceRenderer((Place) g, f, r);
});
builders.put(Name.class, (g, f, r) -> {
if (g.getParent() != null
&& g.getParent().getClass().equals(Submittor.class)) {
return new SimpleNameRenderer((Name) g, f, r);
}
return new NameRenderer((Name) g, f, r);
});
builders.put(Attribute.class, (g, f, r) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
/**
* @author Dick Schoeller
*/
public final class NameNameIndexRenderer implements NameIndexRenderer {
public final class NameNameIndexRenderer
implements NameIndexRenderer, ComplexRenderer {
/** */
private final transient NameRenderer nameRenderer;

Expand All @@ -30,9 +31,9 @@ public String getIndexName() {

final StringBuilder builder = new StringBuilder(40);

final String prefix = GedRenderer.escapeString(name.getPrefix());
final String surname = GedRenderer.escapeString(name.getSurname());
final String suffix = GedRenderer.escapeString(name.getSuffix());
final String prefix = escapeString(name.getPrefix());
final String surname = escapeString(name.getSurname());
final String suffix = escapeString(name.getSuffix());

builder.append(" <span class=\"surname\">");
builder.append(surname);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/**
* @author Dick Schoeller
*/
public class NamePhraseRenderer implements PhraseRenderer {
public class NamePhraseRenderer implements PhraseRenderer, ComplexRenderer {
/**
* The renderer that we are associated with.
*/
Expand All @@ -26,27 +26,9 @@ public NamePhraseRenderer(final NameRenderer nameRenderer) {
@Override
public final String renderAsPhrase() {
final Name name = nameRenderer.getGedObject();
final String prefix = GedRenderer.escapeString(name.getPrefix());
final String surname = GedRenderer.escapeString(name.getSurname());
final String suffix = GedRenderer.escapeString(name.getSuffix());
final StringBuilder builder = new StringBuilder();
if (prefix.isEmpty() && surname.isEmpty() && suffix.isEmpty()) {
builder.append(name.getString());
} else {
final boolean hasPrefixAndMore = !prefix.isEmpty()
&& (!surname.isEmpty() || !suffix.isEmpty());
final boolean hasSurnameSuffix =
!surname.isEmpty() && !suffix.isEmpty();
builder.append(prefix);
if (hasPrefixAndMore) {
builder.append(' ');
}
builder.append(surname);
if (hasSurnameSuffix) {
builder.append(' ');
}
builder.append(suffix);
}
return builder.toString();
final String prefix = escapeString(name.getPrefix());
final String surname = escapeString(name.getSurname());
final String suffix = escapeString(name.getSuffix());
return separate(prefix, surname, suffix);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.schoellerfamily.gedbrowser.renderer;

/**
* @author Dick Schoeller
*/
public class SimpleNameListItemRenderer implements ListItemRenderer {
/**
* Holder for the SimpleNameRenderer that is using this helper.
*/
private final transient SimpleNameRenderer simpleNameRenderer;

/**
* Constructor.
*
* @param nameRenderer the renderer that this is associated with.
*/
protected SimpleNameListItemRenderer(
final SimpleNameRenderer nameRenderer) {
this.simpleNameRenderer = nameRenderer;
}

/**
* {@inheritDoc}
*/
@Override
public final StringBuilder renderAsListItem(final StringBuilder builder,
final boolean newLine, final int pad) {
if (pad > 0) {
return builder;
}

GedRenderer.renderNewLine(builder, newLine);

builder.append(simpleNameRenderer.renderAsPhrase());
return builder;
}

/**
* @param builder the string builder that we will be appending to.
*/
private void renderListItemContents(final StringBuilder builder) {
builder.append("<span class=\"label\">Name:</span> ");
builder.append(simpleNameRenderer.renderAsPhrase());
}

/**
* {@inheritDoc}
*/
@Override
public final String getListItemContents() {
final StringBuilder builder = new StringBuilder();
renderListItemContents(builder);
return builder.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.schoellerfamily.gedbrowser.renderer;

import org.schoellerfamily.gedbrowser.datamodel.Name;

/**
* A NameHtmlRenderer that is designed to work with a NameRenderer.
*
* @author Dick Schoeller
*/
public class SimpleNameNameHtmlRenderer
implements NameHtmlRenderer, SimpleRenderer {
/**
* Holder for the SimpleNameRenderer that is using this helper.
*/
private final transient SimpleNameRenderer simpleNameRenderer;

/**
* Constructor.
*
* This constructor is public for testing purposes only. Do not try to call
* it outside of the context of the rendering engine.
*
* @param simpleNameRenderer the renderer that this is associated with.
*/
public SimpleNameNameHtmlRenderer(
final SimpleNameRenderer simpleNameRenderer) {
this.simpleNameRenderer = simpleNameRenderer;
}


/**
* {@inheritDoc}
*/
@Override
public final String getNameHtml() {
final Name name = simpleNameRenderer.getGedObject();

final String prefix = escapeString(name.getPrefix());
final String surname = escapeString(name.getSurname());
final String suffix = escapeString(name.getSuffix());

return separate(prefix, surname, suffix);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.schoellerfamily.gedbrowser.renderer;

import java.util.ArrayList;
import java.util.List;

import org.schoellerfamily.gedbrowser.datamodel.Name;

/**
* @author Dick Schoeller
*/
public final class SimpleNameNameIndexRenderer
implements NameIndexRenderer, SimpleRenderer {
/** */
private final transient SimpleNameRenderer nameRenderer;

/**
* Constructor.
*
* @param nameRenderer the NameRenderer that is using this helper.
*/
public SimpleNameNameIndexRenderer(final SimpleNameRenderer nameRenderer) {
this.nameRenderer = nameRenderer;
}

/**
* {@inheritDoc}
*/
@Override
public String getIndexName() {
final Name name = nameRenderer.getGedObject();
if (!name.isSet()) {
return " <span class=\"surname\">?</span>";
}

final String prefix = escapeString(name.getPrefix());
final String surname = escapeString(name.getSurname());
final String suffix = escapeString(name.getSuffix());

return " " + separate(
wrap("<span class=\"surname\">", surname, "</span>"),
prefix, suffix);
}

/**
* {@inheritDoc}
*/
@Override
public String separate(final String... args) {
final List<String> argList = new ArrayList<>();
for (final String arg : args) {
if (!arg.isEmpty()) {
argList.add(arg);
}
}
return String.join(", ", argList);
}

/**
* If the middle string has contents, append the strings.
*
* @param before the before string
* @param string the middle string
* @param after the after string
* @return the combined strings
*/
private String wrap(final String before, final String string,
final String after) {
if (string.isEmpty()) {
return "";
}
return before + string + after;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.schoellerfamily.gedbrowser.renderer;

import org.schoellerfamily.gedbrowser.datamodel.Name;

/**
* @author Dick Schoeller
*/
public class SimpleNamePhraseRenderer
implements PhraseRenderer, SimpleRenderer {
/**
* The renderer that we are associated with.
*/
private final transient SimpleNameRenderer simpleNameRenderer;

/**
* Constructor.
*
* @param simpleNameRenderer the renderer that we are associated with.
*/
public SimpleNamePhraseRenderer(
final SimpleNameRenderer simpleNameRenderer) {
this.simpleNameRenderer = simpleNameRenderer;
}

/**
* {@inheritDoc}
*/
@Override
public final String renderAsPhrase() {
final Name name = simpleNameRenderer.getGedObject();
final String prefix = escapeString(name.getPrefix());
final String surname = escapeString(name.getSurname());
final String suffix = escapeString(name.getSuffix());
return separate(prefix, surname, suffix);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.schoellerfamily.gedbrowser.renderer;

import org.schoellerfamily.gedbrowser.datamodel.Name;

/**
* Render a Name.
*
* @author Dick Schoeller
*/
public final class SimpleNameRenderer extends GedRenderer<Name> {
/**
* @param gedObject the Name that we are going to render
* @param rendererFactory the factory that creates the renderers for the
* attributes
* @param renderingContext the context that we are rendering in
*/
public SimpleNameRenderer(final Name gedObject,
final GedRendererFactory rendererFactory,
final RenderingContext renderingContext) {
super(gedObject, rendererFactory, renderingContext);
setNameHtmlRenderer(new SimpleNameNameHtmlRenderer(this));
setListItemRenderer(new SimpleNameListItemRenderer(this));
setPhraseRenderer(new SimpleNamePhraseRenderer(this));
setNameIndexRenderer(new SimpleNameNameIndexRenderer(this));
}
}
Loading