Skip to content

Commit

Permalink
Fixes #396 - submittor name rendering
Browse files Browse the repository at this point in the history
Because there is no constraint on submittor name structure, change
the rendering to avoid ? and to not do any special surname handling.
  • Loading branch information
dickschoeller committed Jun 24, 2017
1 parent 2f50f93 commit c950a55
Show file tree
Hide file tree
Showing 25 changed files with 785 additions and 51 deletions.
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

0 comments on commit c950a55

Please sign in to comment.