docs: @VisibleForTesting
      protected TextSymbolizer createTextSymbolizer(final PJsonObject styleJson) {
          final TextSymbolizer textSymbolizer = this.styleBuilder.createTextSymbolizer();
  
          // make sure that labels are also rendered if a part of the text would be outside
          // the view context, see http://docs.geoserver.org/stable/en/user/styling/sld-reference/labeling
          // .html#partials
          textSymbolizer.getOptions().put("partials", "true");
  
          if (styleJson.has(JSON_LABEL)) {
              final Expression label =
                      parseExpression(null, styleJson, JSON_LABEL,
                                      (final String labelValue) -> labelValue.replace("${", "")
                                              .replace("}", ""));
  
              textSymbolizer.setLabel(label);
          } else {
              return null;
          }
  
          textSymbolizer.setFont(createFont(textSymbolizer.getFont(), styleJson));
  
          if (styleJson.has(JSON_LABEL_ANCHOR_POINT_X) ||
                  styleJson.has(JSON_LABEL_ANCHOR_POINT_Y) ||
                  styleJson.has(JSON_LABEL_ALIGN) ||
                  styleJson.has(JSON_LABEL_X_OFFSET) ||
                  styleJson.has(JSON_LABEL_Y_OFFSET) ||
                  styleJson.has(JSON_LABEL_ROTATION) ||
                  styleJson.has(JSON_LABEL_PERPENDICULAR_OFFSET)) {
              textSymbolizer.setLabelPlacement(createLabelPlacement(styleJson));
          }
  
          if (!StringUtils.isEmpty(styleJson.optString(JSON_HALO_RADIUS)) ||
                  !StringUtils.isEmpty(styleJson.optString(JSON_HALO_COLOR)) ||
                  !StringUtils.isEmpty(styleJson.optString(JSON_HALO_OPACITY)) ||
                  !StringUtils.isEmpty(styleJson.optString(JSON_LABEL_OUTLINE_WIDTH)) ||
                  !StringUtils.isEmpty(styleJson.optString(JSON_LABEL_OUTLINE_COLOR))) {
              textSymbolizer.setHalo(createHalo(styleJson));
          }
  
          if (!StringUtils.isEmpty(styleJson.optString(JSON_FONT_COLOR)) ||
                  !StringUtils.isEmpty(styleJson.optString(JSON_FONT_OPACITY))) {
              textSymbolizer.setFill(addFill(
                      styleJson.optString(JSON_FONT_COLOR, "black"),
                      styleJson.optString(JSON_FONT_OPACITY, "1.0")));
          }
  
          this.addVendorOptions(JSON_LABEL_ALLOW_OVERRUNS, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_AUTO_WRAP, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_CONFLICT_RESOLUTION, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_FOLLOW_LINE, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_GOODNESS_OF_FIT, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_GROUP, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_MAX_DISPLACEMENT, styleJson, textSymbolizer);
          this.addVendorOptions(JSON_LABEL_SPACE_AROUND, styleJson, textSymbolizer);
  
          return textSymbolizer;
      }