Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F5985333
MappingsGenerator.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
MappingsGenerator.php
View Options
<?php
/**
* Copyright 2022 Wikimedia Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @file
* @license Apache-2.0
* @license MIT
* @license GPL-2.0-or-later
* @license LGPL-2.1-or-later
*/
namespace
Wikimedia\Minify
;
/**
* Utility class to generate the "mappings" string of a source map.
*
* @internal
*/
class
MappingsGenerator
{
/** @var string */
private
$source
=
''
;
/** @var int The current source file offset in bytes */
private
$curSourceOffset
=
0
;
/** @var int The current source file index */
private
$curSourceFile
=
-
1
;
/** @var int The current source file line number */
private
$curSourceLine
=
0
;
/** @var int The current source file column in UTF-16 code units */
private
$curSourceColumn
=
0
;
/** @var int The current output file line number */
private
$curOutLine
=
0
;
/** @var int The current output file column in UTF-16 code units */
private
$curOutColumn
=
0
;
/** @var int The base of the delta encoding for source file index */
private
$prevSourceFile
=
0
;
/** @var int The base of the delta encoding for source file line number */
private
$prevSourceLine
=
0
;
/** @var int The base of the delta encoding for source file line column */
private
$prevSourceColumn
=
0
;
/** @var int The base of the delta encoding for output file line number */
private
$prevOutLine
=
0
;
/** @var int The base of the delta encoding for output file column */
private
$prevOutColumn
=
0
;
/** @var bool Whether to omit a leading separator when generating a segment */
private
$isFirstSegment
=
true
;
/** @var string The accumulated mapping string */
private
$mappings
=
''
;
/** @var string The base-64 encoding table */
private
const
BASE64_TABLE
=
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
;
/**
* Advance to the next source file.
*
* @param string $source The contents of the new file
*/
public
function
nextSourceFile
(
$source
)
{
$this
->
source
=
$source
;
$this
->
curSourceFile
++;
$this
->
curSourceOffset
=
0
;
$this
->
curSourceLine
=
0
;
$this
->
curSourceColumn
=
0
;
}
/**
* Advance the source position by the specified number of bytes.
*
* @param int $length
*/
public
function
consumeSource
(
$length
)
{
$newOffset
=
$this
->
curSourceOffset
+
$length
;
$lineCount
=
substr_count
(
$this
->
source
,
"
\n
"
,
$this
->
curSourceOffset
,
$length
);
if
(
$lineCount
)
{
$lineStartPos
=
strrpos
(
substr
(
$this
->
source
,
$this
->
curSourceOffset
,
$length
),
"
\n
"
)
+
$this
->
curSourceOffset
+
1
;
$this
->
curSourceLine
+=
$lineCount
;
$this
->
curSourceColumn
=
Utils
::
getJsLength
(
substr
(
$this
->
source
,
$lineStartPos
,
$newOffset
-
$lineStartPos
)
);
}
else
{
$this
->
curSourceColumn
+=
Utils
::
getJsLength
(
substr
(
$this
->
source
,
$this
->
curSourceOffset
,
$length
)
);
}
$this
->
curSourceOffset
=
$newOffset
;
}
/**
* Notify the source map generator of the generated text output, which
* should not generate a mapping segment.
*
* @param string $out
*/
public
function
outputSpace
(
$out
)
{
$lineCount
=
substr_count
(
$out
,
"
\n
"
);
if
(
$lineCount
)
{
$lineStartPos
=
strrpos
(
$out
,
"
\n
"
)
+
1
;
$this
->
curOutLine
+=
$lineCount
;
$this
->
curOutColumn
=
Utils
::
getJsLength
(
substr
(
$out
,
$lineStartPos
,
strlen
(
$out
)
-
$lineStartPos
)
);
}
else
{
$this
->
curOutColumn
+=
Utils
::
getJsLength
(
$out
);
}
}
/**
* Notify the source map generator of the generated text output, which
* should generate a mapping segment. Append the mapping segment to the
* internal buffer.
*
* @param string $out
*/
public
function
outputToken
(
$out
)
{
$outLineDelta
=
$this
->
curOutLine
-
$this
->
prevOutLine
;
if
(
$outLineDelta
>
0
)
{
$this
->
mappings
.=
str_repeat
(
';'
,
$outLineDelta
);
$this
->
prevOutColumn
=
0
;
$this
->
isFirstSegment
=
false
;
}
elseif
(
$this
->
isFirstSegment
)
{
$this
->
isFirstSegment
=
false
;
}
else
{
$this
->
mappings
.=
','
;
}
$this
->
appendNumber
(
$this
->
curOutColumn
-
$this
->
prevOutColumn
);
$this
->
appendNumber
(
$this
->
curSourceFile
-
$this
->
prevSourceFile
);
$this
->
appendNumber
(
$this
->
curSourceLine
-
$this
->
prevSourceLine
);
$this
->
appendNumber
(
$this
->
curSourceColumn
-
$this
->
prevSourceColumn
);
$this
->
prevSourceFile
=
$this
->
curSourceFile
;
$this
->
prevOutLine
=
$this
->
curOutLine
;
$this
->
prevOutColumn
=
$this
->
curOutColumn
;
$this
->
prevSourceLine
=
$this
->
curSourceLine
;
$this
->
prevSourceColumn
=
$this
->
curSourceColumn
;
$this
->
outputSpace
(
$out
);
}
/**
* Append a VLQ encoded number to the buffer.
*
* @param int $n
*/
private
function
appendNumber
(
$n
)
{
$encoded
=
''
;
// The sign bit goes in the LSB for some reason
$vlq
=
$n
<
0
?
(
-
$n
<<
1
)
|
1
:
$n
<<
1
;
do
{
$digit
=
$vlq
&
0x1f
;
$vlq
>>=
5
;
if
(
$vlq
>
0
)
{
$digit
|=
0x20
;
}
$encoded
.=
self
::
BASE64_TABLE
[
$digit
];
}
while
(
$vlq
>
0
);
$this
->
mappings
.=
$encoded
;
}
/**
* Get the generated mappings string.
*
* @return string
*/
public
function
getMap
()
{
return
$this
->
mappings
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Oct 3, 23:45 (2 w, 3 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
2c/1d/33f10144f20f1746f53206381734
Default Alt Text
MappingsGenerator.php (5 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment