docs: public static String generateFixedURLForNode(final SpecNode specNode, final Set<String> existingFixedUrls,
              final Integer fixedUrlPropertyTagId) {
          String value;
          if (specNode instanceof ITopicNode) {
              final ITopicNode topicNode = (ITopicNode) specNode;
              final BaseTopicWrapper<?> topic = topicNode.getTopic();
  
              if (STATIC_FIXED_URL_TOPIC_TYPES.contains(topicNode.getTopicType())) {
                  // Ignore certain topics as those are unique per book and should have a static name
                  value = getStaticFixedURLForTopicNode(topicNode);
              } else if (topic != null) {
                  // See if a fixed url property exists for the topic and it's valid
                  final PropertyTagInTopicWrapper fixedUrl = topic.getProperty(fixedUrlPropertyTagId);
                  if (fixedUrl != null && !existingFixedUrls.contains(fixedUrl.getValue())) {
                      value = fixedUrl.getValue();
                  } else {
                      // Get the topic title with conditional content removed
                      final String topicTitle;
                      if (topic instanceof TranslatedTopicWrapper) {
                          topicTitle = ContentSpecUtilities.getTopicTitleWithConditions(topicNode, ((TranslatedTopicWrapper) topic).getTopic());
                      } else {
                          topicTitle = ContentSpecUtilities.getTopicTitleWithConditions(topicNode, topic);
                      }
                      value = createURLTitle(topicTitle);
                  }
              } else {
                  value = createURLTitle(specNode.getTitle());
              }
          } else if (specNode instanceof Level) {
              final String levelPrefix = ContentSpecUtilities.getLevelPrefix((Level) specNode);
              value = levelPrefix + createURLTitle(specNode.getTitle());
          } else {
              value = createURLTitle(specNode.getTitle());
          }
  
          // If the basic url already exists or couldn't be generated then fix it up
          if (isNullOrEmpty(value) || existingFixedUrls.contains(value)) {
              // If the title has no characters that can be used in a url, then just use a generic one
              String baseUrlName = value;
              if (isNullOrEmpty(baseUrlName) || baseUrlName.matches("^\\d+$")) {
                  if (specNode instanceof Level) {
                      final Level level = (Level) specNode;
                      final String levelPrefix = ContentSpecUtilities.getLevelPrefix(level);
                      baseUrlName = levelPrefix + level.getLevelType().getTitle().replace(" ", "_") + "ID" + specNode.getUniqueId();
                  } else if (specNode instanceof ITopicNode) {
                      baseUrlName = "TopicID" + ((ITopicNode) specNode).getDBId();
                  } else {
                      throw new RuntimeException("Cannot generate a fixed url for an Unknown SpecNode type");
                  }
              }
  
              // Add a numerical prefix until we have something unique
              String postFix = "";
              for (int uniqueCount = 1; ; ++uniqueCount) {
                  if (!existingFixedUrls.contains(baseUrlName + postFix)) {
                      value = baseUrlName + postFix;
                      break;
                  } else {
                      postFix = uniqueCount + "";
                  }
              }
          }
  
          return value;
      }