measure method

  1. @override
NodeLayout measure({
  1. required LatexNode node,
  2. required RenderContext context,
  3. required NodeLayout measureNode(
    1. LatexNode,
    2. RenderContext
    ),
  4. required NodeLayout measureGroup(
    1. List<LatexNode>,
    2. RenderContext
    ),
})
override

Measures a node and returns its layout.

Implementation

@override
NodeLayout measure({
  required LatexNode node,
  required RenderContext context,
  required NodeLayout Function(LatexNode, RenderContext) measureNode,
  required NodeLayout Function(List<LatexNode>, RenderContext) measureGroup,
}) {
  final isSuper = node is SuperscriptNode;
  final LatexNode baseNode;
  final LatexNode scriptNode;

  if (isSuper) {
    final superNode = node;
    baseNode = superNode.base;
    scriptNode = superNode.exponent;
  } else {
    final subNode = node as SubscriptNode;
    baseNode = subNode.base;
    scriptNode = subNode.index;
  }

  // Special handling: \underbrace{...}_{text} and \overbrace{...}^{text}.
  // Text annotations should be placed below/above the brace, center-aligned.
  final braceAnnotation = _detectBraceAnnotation(isSuper, baseNode);
  if (braceAnnotation != null) {
    return _measureBraceAnnotation(
      braceAnnotation,
      scriptNode,
      context,
      measureNode,
    );
  }

  final hasBothScripts =
      (isSuper && baseNode is SubscriptNode) ||
      (!isSuper && baseNode is SuperscriptNode);

  if (hasBothScripts) {
    return _measureBothScripts(
      isSuper,
      baseNode,
      scriptNode,
      context,
      measureNode,
    );
  } else {
    return _measureSingleScript(
      isSuper,
      baseNode,
      scriptNode,
      context,
      measureNode,
    );
  }
}