| #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 |