Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F5969442
Literal.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
Literal.php
View Options
<?php
declare
(
strict_types
=
1
);
namespace
MediaWiki\Extension\Math\WikiTexVC\Nodes
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLmappings\BaseMethods
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLmappings\Util\MMLParsingUtil
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLmappings\Util\MMLutil
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLnodes\MMLmi
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLnodes\MMLmn
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLnodes\MMLmo
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLnodes\MMLmpadded
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLnodes\MMLmrow
;
use
MediaWiki\Extension\Math\WikiTexVC\MMLnodes\MMLmstyle
;
use
MediaWiki\Extension\Math\WikiTexVC\TexUtil
;
class
Literal
extends
TexNode
{
/** @var string */
private
$arg
;
/** @var string[] */
private
$literals
;
/** @var string[] */
private
$extendedLiterals
;
public
function
__construct
(
string
$arg
)
{
parent
::
__construct
(
$arg
);
$this
->
arg
=
$arg
;
$this
->
literals
=
array_keys
(
TexUtil
::
getInstance
()->
getBaseElements
()[
'is_literal'
]
);
$this
->
extendedLiterals
=
$this
->
literals
;
array_push
(
$this
->
extendedLiterals
,
'
\\
infty'
,
'
\\
emptyset'
);
}
public
function
changeUnicodeFontInput
(
string
$input
,
array
&
$state
):
string
{
/**
* In some font modifications, it is required to explicitly use Unicode
* characters instead of (only) attributes in MathML to indicate the font.
* This is mostly because of Chrome behaviour. See: https://phabricator.wikimedia.org/T352196
*/
if
(
isset
(
$state
[
"double-struck-literals"
]
)
)
{
return
MMLParsingUtil
::
mapToDoubleStruckUnicode
(
$input
);
}
elseif
(
isset
(
$state
[
"calligraphic"
]
)
)
{
return
MMLParsingUtil
::
mapToCaligraphicUnicode
(
$input
);
}
elseif
(
isset
(
$state
[
"fraktur"
]
)
)
{
return
MMLParsingUtil
::
mapToFrakturUnicode
(
$input
);
}
elseif
(
isset
(
$state
[
"bold"
]
)
)
{
return
MMLParsingUtil
::
mapToBoldUnicode
(
$input
);
}
return
$input
;
}
/** @inheritDoc */
public
function
renderMML
(
$arguments
=
[],
&
$state
=
[]
)
{
if
(
isset
(
$state
[
"intent-params"
]
)
)
{
foreach
(
$state
[
"intent-params"
]
as
$intparam
)
{
if
(
$intparam
==
$this
->
arg
)
{
$arguments
[
"arg"
]
=
$intparam
;
}
}
}
if
(
isset
(
$state
[
"intent-params-expl"
]
)
)
{
$arguments
[
"arg"
]
=
$state
[
"intent-params-expl"
];
}
if
(
$this
->
arg
===
" "
)
{
// Fixes https://gerrit.wikimedia.org/r/c/mediawiki/extensions/Math/+/961711
// And they creation of empty mo elements.
return
""
;
}
if
(
is_numeric
(
$this
->
arg
)
)
{
$mn
=
new
MMLmn
(
""
,
$arguments
);
return
$mn
->
encapsulateRaw
(
$this
->
changeUnicodeFontInput
(
$this
->
arg
,
$state
)
);
}
// is important to split and find chars within curly and differentiate, see tc 459
$foundOperatorContent
=
MMLutil
::
initalParseLiteralExpression
(
$this
->
arg
);
if
(
!
$foundOperatorContent
)
{
$input
=
$this
->
arg
;
$operatorContent
=
null
;
}
else
{
$input
=
$foundOperatorContent
[
1
][
0
];
$operatorContent
=
[
"foundOC"
=>
$foundOperatorContent
[
2
][
0
]
];
}
// This is rather a workaround:
// Sometimes literals from WikiTexVC contain complete \\operatorname {asd} hinted as bug tex-2-mml.json
if
(
str_contains
(
$input
,
"
\\
operatorname"
)
)
{
$mi
=
new
MMLmi
();
return
$mi
->
encapsulateRaw
(
$operatorContent
[
"foundOC"
]
);
}
$inputP
=
$input
;
// Sieve for Operators
$bm
=
new
BaseMethods
();
$noStretchArgs
=
$arguments
;
// Delimiters and operators should not be stretchy by default when used as literals
$noStretchArgs
[
'stretchy'
]
??=
'false'
;
$ret
=
$bm
->
checkAndParseOperator
(
$inputP
,
$this
,
$noStretchArgs
,
$operatorContent
,
$state
,
false
);
if
(
$ret
)
{
return
$ret
;
}
// Sieve for mathchar07 chars
$bm
=
new
BaseMethods
();
$ret
=
$bm
->
checkAndParseMathCharacter
(
$inputP
,
$this
,
$arguments
,
$operatorContent
,
false
);
if
(
$ret
)
{
return
$ret
;
}
// Sieve for Identifiers
$ret
=
$bm
->
checkAndParseIdentifier
(
$inputP
,
$this
,
$arguments
,
$operatorContent
,
false
);
if
(
$ret
)
{
return
$ret
;
}
// Sieve for Delimiters
$ret
=
$bm
->
checkAndParseDelimiter
(
$input
,
$this
,
$noStretchArgs
,
$operatorContent
);
if
(
$ret
)
{
return
$ret
;
}
// Sieve for Makros
$ret
=
BaseMethods
::
checkAndParse
(
$inputP
,
$arguments
,
array_merge
(
$operatorContent
??
[],
$state
??
[]
),
$this
,
false
);
if
(
$ret
||
$ret
===
''
)
{
return
$ret
;
}
// Specific
if
(
!(
empty
(
$state
[
'inMatrix'
]
)
)
&&
trim
(
$this
->
arg
)
===
'
\v
line'
)
{
return
$this
->
createVlineElement
();
}
if
(
!(
empty
(
$state
[
'inHBox'
]
)
)
)
{
// No mi, if literal is from HBox
return
$input
;
}
// If falling through all sieves just create an MI element
$mi
=
new
MMLmi
(
""
,
$arguments
);
return
$mi
->
encapsulateRaw
(
$this
->
changeUnicodeFontInput
(
$input
,
$state
)
);
// $this->arg
}
/**
* @return string
*/
public
function
getArg
():
string
{
return
$this
->
arg
;
}
public
function
setArg
(
string
$arg
)
{
$this
->
arg
=
$arg
;
}
/**
* @return int[]|string[]
*/
public
function
getLiterals
():
array
{
return
$this
->
literals
;
}
/**
* @return int[]|string[]
*/
public
function
getExtendedLiterals
():
array
{
return
$this
->
extendedLiterals
;
}
/** @inheritDoc */
public
function
extractIdentifiers
(
$args
=
null
)
{
return
$this
->
getLiteral
(
$this
->
literals
,
'/^([a-zA-Z
\'
]|
\\\\
int)$/'
);
}
/** @inheritDoc */
public
function
extractSubscripts
()
{
return
$this
->
getLiteral
(
$this
->
extendedLiterals
,
'/^([0-9a-zA-Z+
\'
,-])$/'
);
}
/** @inheritDoc */
public
function
getModIdent
()
{
if
(
$this
->
arg
===
'
\\
'
)
{
return
[
'
\\
'
];
}
return
$this
->
getLiteral
(
$this
->
literals
,
'/^([0-9a-zA-Z
\'
])$/'
);
}
private
function
getLiteral
(
array
$lit
,
string
$regexp
):
array
{
$s
=
trim
(
$this
->
arg
);
if
(
preg_match
(
$regexp
,
$s
)
==
1
)
{
return
[
$s
];
}
elseif
(
in_array
(
$s
,
$lit
,
true
)
)
{
return
[
$s
];
}
else
{
return
[];
}
}
/**
* @return string
*/
public
function
createVlineElement
():
string
{
$mrow
=
new
MMLmrow
();
$mpAdded
=
new
MMLmpadded
(
""
,
[
"depth"
=>
"0"
,
"height"
=>
"0"
]
);
$mStyle
=
new
MMLmstyle
(
""
,
[
"mathsize"
=>
"1.2em"
]
);
$mo
=
new
MMLmo
(
""
,
[
"fence"
=>
"false"
,
"stretchy"
=>
"false"
]
);
return
$mrow
->
encapsulateRaw
(
$mpAdded
->
encapsulateRaw
(
$mStyle
->
encapsulateRaw
(
$mo
->
encapsulateRaw
(
"|"
)
)
)
);
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Oct 3, 13:46 (1 d, 1 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
33/13/6a4b00f09dd71fac49af2c3d5352
Default Alt Text
Literal.php (6 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment