         let index = adjustedIndex(index)
         var identifiers = [FormattingIdentifier]()
 
-        if formattingAtIndexContainsBold(index) {
-            identifiers.append(.bold)
-        }
-
-        if formattingAtIndexContainsItalic(index) {
-            identifiers.append(.italic)
-        }
-
-        if formattingAtIndexContainsUnderline(index) {
-            identifiers.append(.underline)
-        }
-
-        if formattingAtIndexContainsStrikethrough(index) {
-            identifiers.append(.strikethrough)
-        }
-
-        if formattingAtIndexContainsBlockquote(index) {
-            identifiers.append(.blockquote)
-        }
-
-        if formattingAtIndexContainsLink(index) {
-            identifiers.append(.link)
-        }
-
-        if formattingAtIndexContainsOrderedList(index) {
-            identifiers.append(.orderedlist)
-        }
-
-        if formattingAtIndexContainsUnorderedList(index) {
-            identifiers.append(.unorderedlist)
+        for (key, formatter) in formatterIdentifiersMap {
+            if formatter.present(in: storage, at: index) {
+                identifiers.append(key)
+            }
         }
 
         return identifiers

    open func formatIdentifiersForTypingAttributes() -> [FormattingIdentifier] {
        var identifiers = [FormattingIdentifier]()

        if typingAttributesContainsBold() {
            identifiers.append(.bold)
        }

        if typingAttributesContainsItalic() {
            identifiers.append(.italic)
        }

        if typingAttributesContainsUnderline() {
            identifiers.append(.underline)
        }

        if typingAttributesContainsStrikethrough() {
            identifiers.append(.strikethrough)
        }

        if typingAttributesContainsBlockquote() {
            identifiers.append(.blockquote)
        }

        if typingAttributesContainsOrderedList() {
            identifiers.append(.orderedlist)
        }

        if typingAttributesContainsUnorderedList() {
            identifiers.append(.unorderedlist)
        }

        if typingAttributesContainsLink() {
            identifiers.append(.link)
        }

        return identifiers

        return index
    }

    /// In most instances, the value of NSRange.location is off by one when compared to a character index.
    /// Call this method to get an adjusted character index from an NSRange.location.
    ///
