/**
  * Returns string contains given components as plain text. (without style)
  *
  * @param components components to convert to plain text.
  * @return string contains given components as plain text. (without style)
  */
 public static String toPlainText(final BaseComponent... components) {
   final StringBuilder builder = new StringBuilder();
   for (final BaseComponent msg : components) {
     builder.append(msg.toPlainText());
   }
   return builder.toString();
 }
 void toLegacyText(final StringBuilder builder) {
   if (this.extra != null) {
     for (final BaseComponent e : this.extra) {
       e.toLegacyText(builder);
     }
   }
 }
 /**
  * Add new {@link BaseComponent} to this node.
  *
  * @param component new component to add.
  */
 public void addExtra(final BaseComponent component) {
   if (this.extra == null) {
     this.extra = new ArrayList<>(5);
   }
   component.parent = this;
   this.extra.add(component);
 }
 @Override
 protected int replace_(final String text, final BaseComponent component, int limit) {
   if (this.extra != null) {
     for (final BaseComponent bs : this.extra) {
       limit = bs.replace_(text, component, limit);
       if (limit == 0) {
         return 0;
       }
     }
   }
   if (this.hoverEvent != null) {
     limit = this.hoverEvent.replace_(text, component, limit);
     if (limit == 0) {
       return 0;
     }
   }
   if (this.clickEvent != null) {
     limit = this.clickEvent.replace_(text, component, limit);
     if (limit == 0) {
       return 0;
     }
   }
   return limit;
 }
 /**
  * Construct new BaseComponent as copy of old one.
  *
  * @param old component to copy.
  */
 BaseComponent(final BaseComponent old) {
   this.color = old.getColorRaw();
   this.bold = old.isBoldRaw();
   this.italic = old.isItalicRaw();
   this.underlined = old.isUnderlinedRaw();
   this.strikethrough = old.isStrikethroughRaw();
   this.obfuscated = old.isObfuscatedRaw();
   this.clickEvent = (old.clickEvent == null) ? null : old.clickEvent.duplicate();
   this.hoverEvent = (old.hoverEvent == null) ? null : old.hoverEvent.duplicate();
   if (old.extra != null) {
     this.extra = new ArrayList<>(old.extra.size());
     this.extra.addAll(
         old.extra.stream().map(BaseComponent::duplicate).collect(Collectors.toList()));
   }
 }
 /**
  * Set list of extra/next elements appended after this one.
  *
  * @param components new list of extra/next elements.
  */
 public void setExtra(final List<BaseComponent> components) {
   for (final BaseComponent component : components) {
     component.parent = this;
   }
   this.extra = new ArrayList<>(components);
 }