docs: public static TextStyleContainer findIcons(Spanned spannable, HashMap<String, ITypeface> fonts) {
          LinkedList<StyleContainer> styleContainers = new LinkedList<>();
          LinkedList<StyleContainer> existingSpans = new LinkedList<>();
  
          // remember the previous style spans
          for (ParcelableSpan span : spannable.getSpans(0, spannable.length(), ParcelableSpan.class)) {
              existingSpans.add(new StyleContainer(spannable.getSpanStart(span), spannable.getSpanEnd(span), span, spannable.getSpanFlags(span)));
          }
          for (CharacterStyle span : spannable.getSpans(0, spannable.length(), CharacterStyle.class)) {
              existingSpans.add(new StyleContainer(spannable.getSpanStart(span), spannable.getSpanEnd(span), span, spannable.getSpanFlags(span)));
          }
  
          //the new string built with the replaced icons
          SpannableStringBuilder spannedString = new SpannableStringBuilder();
          SpannableStringBuilder tempIconString = new SpannableStringBuilder();
  
          int removedChars = 0;
          for (int i = 0; i < spannable.length(); i++) {
              Character c = spannable.charAt(i);
              if (c == ICON_START) {
                  //if something started with { but was no icon replacement
                  spannedString.append(tempIconString);
                  //start to remember the tempIconString again
                  tempIconString = new SpannableStringBuilder();
                  tempIconString.append(c);
              } else if (c == ICON_END) {
                  tempIconString.append(c);
                  //make sure there was a { before and enough chars for the font key
                  if (tempIconString.length() > 5) {
                      StyleContainer styleContainer = placeFontIcon(spannedString, tempIconString, fonts);
                      if (styleContainer != null) {
                          styleContainers.add(styleContainer);
  
                          //adjust existing spans to new position
                          for (StyleContainer existingStyleContainer : existingSpans) {
                              if (existingStyleContainer.startIndex > i - removedChars) {
                                  existingStyleContainer.startIndex = existingStyleContainer.startIndex - tempIconString.length() + 1;
                              }
                              if (existingStyleContainer.endIndex > i - removedChars) {
                                  existingStyleContainer.endIndex = existingStyleContainer.endIndex - tempIconString.length() + 1;
                              }
                          }
                          removedChars += tempIconString.length() - 1;
                      }
                  } else {
                      spannedString.append(tempIconString);
                  }
                  tempIconString = new SpannableStringBuilder();
              } else {
                  if (tempIconString.length() == 0) {
                      spannedString.append(c);
                  } else {
                      tempIconString.append(c);
                  }
              }
          }
  
          //make sure to add the last characters which create no complete icon
          spannedString.append(tempIconString);
  
          //add the existing spans
          styleContainers.addAll(existingSpans);
  
          return new TextStyleContainer(spannedString, styleContainers);
      }