local common  = fonts.goodies.load("common-math.lfg")
local presets = common.mathematics.tweaks.presets

local integral_variants = {  bottomright = -0.4 }
----- integral_top      = {  topright    =  0.05 }
local integral_bottom   = {  bottomright = -0.35 }

return {
    name = "stix-two-math",
    version = "1.00",
    comment = "Goodies that complement stix two opentype.",
    author = "Hans Hagen & Mikael Sundqvist",
    copyright = "ConTeXt development team",
    mathematics = {
        alternates = {
            lambdabar    = { feature = 'cv01', value = 1, comment = "Mathematical Alternative Lambda Bar" },
            ramshorn     = { feature = 'cv02', value = 1, comment = "Mathematical Alternative Rams Horn" },
            emptyset     = { feature = 'cv03', value = 1, comment = "Mathematical Alternative Empty Set" },
            setminus     = { feature = 'cv04', value = 1, comment = "Mathematical Alternative Setminus" },
            calligraphic = { feature = 'ss01', value = 1, comment = "Mathematical Alternative Calligraphic Characters" }, -- We do this differently
            italic       = { feature = 'ss02', value = 1, comment = "Mathematical Alternative Lowercase Italic" },
            barred       = { feature = 'ss03', value = 1, comment = "Mathematical Alternative Barred Characters" }, -- hbar, lambdabar etc
            primes       = { feature = 'ss04', value = 1, comment = "Mathematical Alternative Primes" },            -- larger/lower primes, minute etc
            arrow        = { feature = 'ss05', value = 1, comment = "Mathematical Alternative Smaller Arrows" },
            narrower     = { feature = 'ss06', value = 1, comment = "Mathematical Alternative Narrower Elements" }, -- narrower/shorter element etc
            small        = { feature = 'ss07', value = 1, comment = "Mathematical Alternative Smaller Operators" },
            upright      = { feature = 'ss08', value = 1, comment = "Mathematical Alternative Upright Symbols" },   -- upright integrals etc.
            negated      = { feature = 'ss09', value = 1, comment = "Mathematical Alternative Negated Symbols" },
            relation     = { feature = 'ss10', value = 1, comment = "Mathematical Alternative Relations" },
            negatedset   = { feature = 'ss11', value = 1, comment = "Mathematical Alternative Negated Set Symbols" },
            propfrown    = { feature = 'ss12', value = 1, comment = "Mathematical Alternative Proportional and Frown" },
            negsine      = { feature = 'ss13', value = 1, comment = "Mathematical Alternative Negated Sine Wave" },
            intprod      = { feature = 'ss14', value = 1, comment = "Mathematical Alternative Interior Products" },
            capcup       = { feature = 'ss15', value = 1, comment = "Mathematical Alternative Intersection and Union with serif" },
            circled      = { feature = 'ss16', value = 1, comment = "Mathematical Alternative Circled Operators" },
            simvar       = { feature = 'ss20', value = 1, comment = "Mathematical Alternative Similar and some more unrelated" },
            -- demo features:
            negated8774      = {
                feature = 'ss09',
                value   = 1,
                comment = "Mathematical Alternative Negated 8774",
                list    = { [8774] = true },
            },
            negated8775   = {
                feature = 'ss09',
                value   = 1,
                comment = "Mathematical Alternative Negated 8775",
                list    = { [8775] = true },
            },
        },
        parameters = {
            AccentBaseDepth                =   30,
            FlattenedAccentTopShiftUp      =    0,
            RadicalKernAfterDegree         = -500,
            DelimiterPercent               =   85,
            DelimiterShortfall             =  400,
            DelimiterDisplayPercent        =   90,
            DelimiterDisplayShortfall      =  400,
            DisplayOperatorMinHeight       = 1800, -- 1800 in font
            PrimeShiftUp                   = "1.3*SuperscriptShiftUp",
            PrimeShiftUpCramped            = "1.3*SuperscriptShiftUp",
            RadicalDisplayStyleVerticalGap = "RadicalVerticalGap", --170, 85
         -- SuperscriptSnap                = 1000,
         -- SubscriptSnap                  =  500,
        },
        tweaks = {
            aftercopying = {
                {
                    tweak    = "fontname",
                    expected = "STIXTwoMath-Regular",
                    abort    = true,
                },
                {
                    tweak    = "version",
                    expected = "Version 2.12 b168",
                },
                {
                    tweak   = "fixprimes",
                    factor  = 0.84,
                },
                {
                    tweak = "addmirrors",
                },
                {
                    tweak = "addcomposites",
                },
                -- MS: we need to check this, I moved it up
                {
                    tweak   = "replacealphabets",
                    list    = {
                        {
                            source  = "uppercasescript",
                            target  = "uppercasecalligraphic",
                            unicode = "uppercasescript",
                        },
                        {
                            source  = "uppercasescript",
                            target  = "uppercasescript",
                            feature = "ss01",
                        },
                        {
                            source  = "uppercaseboldscript",
                            target  = "uppercaseboldcalligraphic",
                            unicode = "uppercasescriptbold",
                        },
                        {
                            source  = "uppercaseboldscript",
                            target  = "uppercaseboldscript",
                            feature = "ss01",
                        },
                        {
                            source  = { first = 0xE17D, last = 0xE195 },
                            target  = "uppercasesansgreek",
                            unicode = "uppercasegreeknormal",
                        },
                        {
                            source  = { first = 0xE196, last = 0xE1AE }, -- maybe last = E1B3
                            target  = "lowercasesansgreek",
                            unicode = "lowercasegreeknormal",
                        },
                        {
                            source  = { first = 0xE1BF, last = 0xE1D7 },
                            target  = "uppercaseitalicsansgreek",
                            unicode = "uppercasegreekitalic",
                        },
                        {
                            source  = { first = 0xE1D8, last = 0xE1F0 }, -- maybe last = E1F5
                            target  = "lowercaseitalicsansgreek",
                            unicode = "lowercasegreekitalic",
                        },
                    },
                },
                {
                    tweak    = "replacealphabets",
                    filename = "TeXGyrePagellaMath.otf",
                    list     = {
                        { unicodes = { 0x007C, 0x2223, 0x2016, 0x2980, 0x007C } }, -- single single double triple
                    }
                },
                presets.scripttocalligraphic  { },
                presets.rsfstoscript          { },
                presets.rsfsuprighttoscript   { },
                presets.moderntocalligraphic  { },
                presets.eulertocalligraphic   { },
                presets.xitsarabic            { rscale  = 0.95 },
                presets.fallbacks             { },
                presets.moveitalics           { correct = true },
                presets.moveitalics           { correct = true, letters = true },
                presets.moveintegrals         { },
                presets.wipeitalics           { },
                {
                    tweak   = "checkaccents",
                    ignore  = {
--                         0x20D6 = true,
--                         0x20D7 = true,
                    },
                },
                {
                    tweak = "wipecues",
                },
                -- Extensibles use .s1 (variant 1), so we cannot wipe all
                {
                    tweak = "wipevariants",
                    list = {
                        [0x20D6] = 3,
                        [0x20D7] = 3,
                        [0x20EE] = 3,
                        [0x20EF] = 3,
                    },
                },
                {
                    tweak = "simplifykerns",
                },
                {
                    tweak = "kerns",
                    list  = {
                        [0x002F]                = { topleft  = -0.2,  bottomright = -0.2  },
                        ["0x7D.parts.top"]      = { topright = -0.15,                     }, -- right brace top
                        ["0x7D.parts.bottom"]   = {                   bottomright = -0.15 }, -- right brace bottom
                        ["0x29.parts.top"]      = { topright = -0.1,                      }, -- right parenthesis top
                        ["0x29.parts.bottom"]   = {                   bottomright = -0.1  }, -- right parenthesis bottom
                        ["0x29.variants.*"]     = { topright = -0.2,  bottomright = -0.2  }, -- right parenthesis variants
                        ["0x221A.parts.top"]    = { topright =  0.2,                      }, -- right radical top
                        ["0x221A.parts.bottom"] = {                   bottomright =  0.2  }, -- right radical bottom
                        ["0x221A.variants.*"]   = { topright =  0.2,  bottomright =  0.2  }, -- right radical variants
                        [0x27E9]                = { topright = -0.1,  bottomright = -0.1  }, -- angle
                        ["0x27E9.variants.*"]   = { topright = -0.2,  bottomright = -0.2  },
                        [0x27EB]                = { topright = -0.1,  bottomright = -0.1  },
                        ["0x27EB.variants.*"]   = { topright = -0.2,  bottomright = -0.2  },
                        --
                        [0x1D45F]               = { bottomright = -.20 },  -- italic r
                        ["0x222B.parts.bottom"] = { bottomright = -0.30 }, -- int
                    },
                },
                -- Accents are a mess. We migrate the extensibles from the combiners to the base accent
                -- and then need to tweak the width (which is auto set because it was zero with a large
                -- accent anchor offset). First we copy and fix.
                {
                    tweak = "extendaccents",
                },
                {
                    tweak   = "radicaldegreeanchors",
                    list = {
                        [0x221A]                = { location = "left", hfactor = 0.00, vfactor = 0.7 },
                        ["0x221A.variants.*"]   = { location = "left", hfactor  = 0.00, vfactor = 0.55 },
                        ["0x221A.variants.3"]   = { location = "left", hfactor  = 0.00, vfactor  = .525 },
                        ["0x221A.parts.bottom"] = { location = "left", hfactor  = 0.05, vfactor  = 1.00 },
                    }
                },
                {
                    tweak = "flattenaccents",
                },
                {
                    tweak = "fixaccents",
                },
                -- First we set the dimensions of the initial accent which started out as zero but we want
                -- a proper width.
                -- {
                --     tweak = "dimensions",
                --     list  = {
                --         [0x00302] = { width = 1.2, anchor = 1.10, xoffset = .05 }, -- widehat
                --         [0x00303] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widetilde
                --         [0x00306] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widebreve
                --         [0x0030C] = { width = 1.4, anchor = 1.20, xoffset = .10 }, -- widecheck
                --     },
                -- },
                -- Then we deal with all offsets and heights in one go. So we treat the initial accent
                -- as well as the variants here.
                {
                    tweak = "dimensions",
                    list  = {
                     -- here we want to apply to all
                        [0x020DB] = { yoffset =  0.025, height = .95, all = true }, -- widedddot : 0x20DB (self)
                    },
                },
                -- We now copy these to the not wide slots so that we can set these to stretch as well,
                -- if only because it is less confusing and more consistent.
                {
                    tweak = "copyaccents",
                },
                -- So far for the accents.
                {
                    tweak = "checkspacing",
                },
                {
                    tweak = "addscripts",
                },
                {
                    tweak = "accentdimensions",
                },
                {
                    tweak = "addrules",
                },
                {
                    tweak = "addarrows",
                },
                {
                    tweak = "fixslashes",
                },
                {
                    tweak    = "replacerules",
                    minus    = {
                        height      = .233,
                        yoffset     = .768,
                        leftoffset  = .08,
                        rightoffset = .08,
                    },
                    fraction = {
                        height  = .233,
                        yoffset = .768,
                    },
                    radical  = {
                        height      = .233,
                        yoffset     = .768,
                        leftoffset  = .08,
                        rightoffset = .08,
                    },
                    stacker  = {
                        height  = .233,
                        yoffset = .768,
                    },
                },
                {
                    tweak = "addactuarian",
                },
                {
                    tweak = "addfourier",
                    variant = 1,
                },
                {
                    tweak = "addprimed",
                },
                {
                    tweak = "addparts",
                    list  = {
                        [0x21F4] = {
                            horizontal = true,
                            template   = 0x2192,
                            sequence   = {
                                { glyph = "first", factor = 2 },
                                { glyph = 0x2218 },
                                { glyph = "first", factor = 2 },
                                { glyph = "last"  },
                            }
                        }
                    }
                },
{
    tweak   = "addbars",
    advance = 0.3,
    check   = true, -- only add triples
},
                -- this is the mkiv section
                {
                    tweak   = "emulatelmtx",
                    feature = "emulatelmtx",
                    comment = "this is for mkiv",
                },
            },
        },
        bigslots = {
            1, 3, 5, 7
        },
    },
}
