# -*- mode: Perl -*-
# /=====================================================================\ #
# |  accents                                                            | #
# | Implementation for LaTeXML                                          | #
# |=====================================================================| #
# | Part of LaTeXML:                                                    | #
# |  Public domain software, produced as part of work done by the       | #
# |  United States Government & not subject to copyright in the US.     | #
# |---------------------------------------------------------------------| #
# | Bruce Miller <bruce.miller@nist.gov>                        #_#     | #
# | http://dlmf.nist.gov/LaTeXML/                              (o o)    | #
# \=========================================================ooo==U==ooo=/ #
package LaTeXML::Package::Pool;
use strict;
use warnings;
use LaTeXML::Package;

#======================================================================
DefMath('\ring{}', "\x{030A}", operator_role => 'OVERACCENT');

DefMacro('\lx@acc@size', '\scriptstyle');    # should be \scriptscriptstyle??

DefMacro('\accentset{}{}', '\lx@overaccentset{#1}{#2}');
DefConstructor('\lx@overaccentset ScriptStyle {}',
  "<ltx:XMApp><ltx:XMWrap role='OVERACCENT'>#1</ltx:XMWrap><ltx:XMArg>#2</ltx:XMArg></ltx:XMApp>",
  sizer => '#1',                             # Close enough?
  alias => '\accentset');

DefMath('\dddot{}', "\x{02D9}\x{02D9}\x{02D9}",
  operator_role => 'OVERACCENT');            # DOT ABOVE
DefMath('\ddddot{}', "\x{02D9}\x{02D9}\x{02D9}\x{02D9}",
  operator_role => 'OVERACCENT');            # DOT ABOV

# \underaccent{acc}{base}
# Needs to apply the accent as an under, instead of over!!!!
# But acc can be either an accenting command (like \hat)
# or an arbitrary item to place as an accent!!!  How to detect that?
# We'll ASS.U.ME that accent commands take a single arg.
DefMacro('\lx@if@isaccent{}{}{}', sub {
    my ($gullet, $thing, $true, $false) = @_;
    my ($defn,   $params);
    my ($token,  @rest) = $thing->unlist;
    return ((!@rest)
        && ($defn   = LookupDefinition($token))
        && ($params = $defn->getParameters)
        && ($params->getNumArgs == 1)
      ? $true : $false); });

DefMacro('\underaccent{}{}',
  '\lx@if@isaccent{#1}{\lx@converttounder{#1}{#2}{#1{#2}}}{\lx@underaccentset{#1}{#2}}');
DefConstructor('\lx@underaccentset ScriptStyle {}',
  "<ltx:XMApp><ltx:XMWrap role='UNDERACCENT'>#1</ltx:XMWrap><ltx:XMArg>#2</ltx:XMArg></ltx:XMApp>",
  sizer => '#1',              # Close enough?
  alias => '\underaccent');
DefConstructor('\lx@converttounder Undigested Undigested {}', sub {
    my ($document, $ignore1, $ignore2, $thing) = @_;
    $document->absorb($thing);
    # replace role=OVERACCENT with UNDERACCENT
    my $node = $document->getNode->lastChild;
    if (my $acc = $document->findnode("ltx:XMTok[\@role='OVERACCENT']", $node)) {
      $acc->setAttribute(role => 'UNDERACCENT'); } },
  reversion => '\underaccent{#1}{#2}');

# \undertilde{base}
DefMath('\undertilde {}', UTF(0x7E),
  operator_role => 'UNDERACCENT');    # TILDE [plain? also amsfonts]

#======================================================================
1;