/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include #include #include #include #include #include #include namespace facebook { namespace react { class AttributedString; using SharedAttributedString = std::shared_ptr; /* * Simple, cross-platfrom, React-specific implementation of attributed string * (aka spanned string). * `AttributedString` is basically a list of `Fragments` which have `string` and * `textAttributes` + `shadowNode` associated with the `string`. */ class AttributedString : public Sealable, public DebugStringConvertible { public: class Fragment { public: std::string string; TextAttributes textAttributes; SharedShadowNode shadowNode; SharedShadowNode parentShadowNode; bool operator==(const Fragment &rhs) const; bool operator!=(const Fragment &rhs) const; }; using Fragments = std::vector; /* * Appends and prepends a `fragment` to the string. */ void appendFragment(const Fragment &fragment); void prependFragment(const Fragment &fragment); /* * Appends and prepends an `attributedString` (all its fragments) to * the string. */ void appendAttributedString(const AttributedString &attributedString); void prependAttributedString(const AttributedString &attributedString); /* * Returns read-only reference to a list of fragments. */ const Fragments &getFragments() const; /* * Returns a string constructed from all strings in all fragments. */ std::string getString() const; bool operator==(const AttributedString &rhs) const; bool operator!=(const AttributedString &rhs) const; #pragma mark - DebugStringConvertible #if RN_DEBUG_STRING_CONVERTIBLE SharedDebugStringConvertibleList getDebugChildren() const override; #endif private: Fragments fragments_; }; } // namespace react } // namespace facebook namespace std { template <> struct hash { size_t operator()( const facebook::react::AttributedString::Fragment &fragment) const { return std::hash{}(fragment.string) + std::hash{}( fragment.textAttributes) + std::hash{}(fragment.shadowNode) + std::hash{}( fragment.parentShadowNode); } }; template <> struct hash { size_t operator()( const facebook::react::AttributedString &attributedString) const { auto result = size_t{0}; for (const auto &fragment : attributedString.getFragments()) { result += std::hash{}(fragment); } return result; } }; } // namespace std