| #include "semantic_inference_registry.hpp" | |
| #include "rive/component.hpp" | |
| #include "rive/generated/text/text_base.hpp" | |
| #include "rive/semantic/semantic_role.hpp" | |
| #include "rive/text/text.hpp" | |
| namespace rive | |
| { | |
| #ifdef WITH_RIVE_TEXT | |
| namespace | |
| { | |
| using InferSemanticFn = bool (*)(Component*, ResolvedSemanticData&); | |
| struct InferenceRule | |
| { | |
| uint16_t typeKey; | |
| InferSemanticFn infer; | |
| }; | |
| static std::string inferredTextLabel(Text* text) | |
| { | |
| std::string label; | |
| for (auto run : text->runs()) | |
| { | |
| if (run != nullptr) | |
| { | |
| label += run->text(); | |
| } | |
| } | |
| return label; | |
| } | |
| static bool inferTextSemantics(Component* component, ResolvedSemanticData& out) | |
| { | |
| const auto label = inferredTextLabel(component->as<Text>()); | |
| if (label.empty()) | |
| { | |
| return false; | |
| } | |
| out.hasSemantics = true; | |
| out.role = static_cast<uint32_t>(SemanticRole::text); | |
| out.label = label; | |
| return true; | |
| } | |
| static constexpr InferenceRule kInferenceRules[] = { | |
| {TextBase::typeKey, inferTextSemantics}, | |
| }; | |
| } // namespace | |
| bool supportsInferredSemantics(Component* component) | |
| { | |
| if (component == nullptr) | |
| { | |
| return false; | |
| } | |
| for (const auto& rule : kInferenceRules) | |
| { | |
| if (component->isTypeOf(rule.typeKey)) | |
| { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| bool resolveInferredSemantics(Component* component, ResolvedSemanticData& out) | |
| { | |
| if (component == nullptr) | |
| { | |
| return false; | |
| } | |
| for (const auto& rule : kInferenceRules) | |
| { | |
| if (component->isTypeOf(rule.typeKey) && rule.infer(component, out)) | |
| { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| #else | |
| // No inference rules are active when the text engine is compiled out — | |
| // Text is the only current rule and it needs Text::runs(). | |
| bool supportsInferredSemantics(Component*) { return false; } | |
| bool resolveInferredSemantics(Component*, ResolvedSemanticData&) | |
| { | |
| return false; | |
| } | |
| #endif | |
| } // namespace rive |