MediaWiki REL1_31
DifferenceEngine Class Reference
Inheritance diagram for DifferenceEngine:
Collaboration diagram for DifferenceEngine:

Public Member Functions

 __construct ( $context=null, $old=0, $new=0, $rcid=0, $refreshCache=false, $unhide=false)
 #-
 
 addHeader ( $diff, $otitle, $ntitle, $multi='', $notice='')
 Add the header to a diff body.
 
 deletedIdMarker ( $id)
 Build a wikitext link toward a deleted revision, if viewable.
 
 deletedLink ( $id)
 Look up a special:Undelete link to the given deleted revision id, as a workaround for being unable to load deleted diffs in currently.
 
 generateContentDiffBody (Content $old, Content $new)
 Generate a diff, no caching.
 
 generateTextDiffBody ( $otext, $ntext)
 Generate a diff, no caching.
 
 getDiff ( $otitle, $ntitle, $notice='')
 Get complete diff table, including header.
 
 getDiffBody ()
 Get the diff table body, without header.
 
 getDiffLang ()
 
 getMultiNotice ()
 If there are revisions between the ones being compared, return a note saying so.
 
 getNewid ()
 
 getOldid ()
 
 getRevisionHeader (Revision $rev, $complete='')
 Get a header for a specified revision.
 
 loadNewText ()
 Load the text of the new revision, not the old one.
 
 loadRevisionData ()
 Load revision metadata for the specified articles.
 
 loadText ()
 Load the text of the revisions, as well as revision data.
 
 localiseLineNumbers ( $text)
 Replace line numbers with the text in the user's language.
 
 localiseLineNumbersCb ( $matches)
 
 mapDiffPrevNext ( $old, $new)
 Maps a revision pair definition as accepted by DifferenceEngine constructor to a pair of actual integers representing revision ids.
 
 markPatrolledLink ()
 Build a link to mark a change as patrolled.
 
 renderNewRevision ()
 Show the new revision of the page.
 
 setContent (Content $oldContent, Content $newContent)
 Use specified text instead of loading from the database.
 
 setReducedLineNumbers ( $value=true)
 
 setTextLanguage ( $lang)
 Set the language in which the diff text is written (Defaults to page content language).
 
 showDiff ( $otitle, $ntitle, $notice='')
 Get the diff text, send it to the OutputPage object Returns false if the diff could not be generated, otherwise returns true.
 
 showDiffPage ( $diffOnly=false)
 
 showDiffStyle ()
 Add style sheets for diff display.
 
 wasCacheHit ()
 
- Public Member Functions inherited from ContextSource
 canUseWikiPage ()
 Check whether a WikiPage object can be get with getWikiPage().
 
 exportSession ()
 Export the resolved user IP, HTTP headers, user ID, and session ID.
 
 getConfig ()
 
 getContext ()
 Get the base IContextSource object.
 
 getLanguage ()
 
 getOutput ()
 
 getRequest ()
 
 getSkin ()
 
 getStats ()
 
 getTiming ()
 
 getTitle ()
 
 getUser ()
 
 getWikiPage ()
 Get the WikiPage object.
 
 msg ( $key)
 Get a Message object with context set Parameters are the same as wfMessage()
 
 setContext (IContextSource $context)
 

Static Public Member Functions

static intermediateEditsMsg ( $numEdits, $numUsers, $limit)
 Get a notice about how many intermediate edits and users there are.
 

Public Attributes

 $enableDebugComment = false
 Set this to true to add debug info to the HTML output.
 
bool $mCacheHit = false
 Was the diff fetched from cache?
 
Content $mNewContent
 
int $mNewid
 
Title $mNewPage
 
Revision $mNewRev
 
Content $mOldContent
 
int $mOldid
 
Title $mOldPage
 
Revision $mOldRev
 
bool $mRevisionsLoaded = false
 Have the revisions been loaded.
 
int $mTextLoaded = 0
 How many text blobs have been loaded, 0, 1 or 2?
 
const DIFF_VERSION = '1.12'
 Constant to indicate diff cache compatibility.
 

Protected Member Functions

 debug ( $generator="internal")
 Generate a debug comment indicating diff generating time, server node, and generator backend.
 
 getDiffBodyCacheKey ()
 Returns the cache key for diff body text or content.
 
 getDiffBodyCacheKeyParams ()
 Get the cache key parameters.
 
 getMarkPatrolledLinkInfo ()
 Returns an array of meta data needed to build a "mark as patrolled" link and adds the mediawiki.page.patrol.ajax to the output.
 
 getParserOutput (WikiPage $page, Revision $rev)
 
 revisionDeleteLink ( $rev)
 
 textDiff ( $otext, $ntext)
 Generates diff, to be wrapped internally in a logging/instrumentation.
 

Protected Attributes

Language $mDiffLang
 
string $mMarkPatrolledLink = null
 Link to action=markpatrolled.
 
bool $mReducedLineNumbers = false
 If true, line X is not displayed when X is 1, for example to increase readability and conserve space with many small diffs.
 
bool $mRefreshCache = false
 Refresh the diff cache.
 
bool $unhide = false
 Show rev_deleted content if allowed.
 

Private Member Functions

 addLocalisedTitleTooltips ( $text)
 Add title attributes for tooltips on moved paragraph indicators.
 
 addLocalisedTitleTooltipsCb (array $matches)
 
 getEngine ()
 Process $wgExternalDiffEngine and get a sane, usable engine.
 
 loadRevisionIds ()
 Load revision IDs.
 
 localiseDiff ( $text)
 Localise diff output.
 
 showMissingRevision ()
 

Private Attributes

 $mNewTags
 
 $mOldTags
 
bool $mRevisionsIdsLoaded = false
 Have the revisions IDs been loaded.
 

Detailed Description

Todo
document

Definition at line 30 of file DifferenceEngine.php.

Constructor & Destructor Documentation

◆ __construct()

DifferenceEngine::__construct ( $context = null,
$old = 0,
$new = 0,
$rcid = 0,
$refreshCache = false,
$unhide = false )

#-

Parameters
IContextSource$contextContext to use, anything else will be ignored
int$oldOld ID we want to show and diff with.
string | int$newEither revision ID or 'prev' or 'next'. Default: 0.
int$rcidDeprecated, no longer used!
bool$refreshCacheIf set, refreshes the diff cache
bool$unhideIf set, allow viewing deleted revs

Definition at line 112 of file DifferenceEngine.php.

References ContextSource\$context, $refreshCache, $unhide, ContextSource\setContext(), and wfDebug().

Member Function Documentation

◆ addHeader()

DifferenceEngine::addHeader ( $diff,
$otitle,
$ntitle,
$multi = '',
$notice = '' )

Add the header to a diff body.

Parameters
string$diffDiff body
string$otitleOld revision header
string$ntitleNew revision header
string$multiNotice telling user that there are intermediate revisions between the ones being compared
string$noticeOther notices, e.g. that user is viewing deleted content
Returns
string

Definition at line 1286 of file DifferenceEngine.php.

References $header, getDiffLang(), and ContextSource\getLanguage().

Referenced by getDiff(), and showDiffPage().

◆ addLocalisedTitleTooltips()

DifferenceEngine::addLocalisedTitleTooltips ( $text)
private

Add title attributes for tooltips on moved paragraph indicators.

Parameters
string$text
Returns
string

Definition at line 1132 of file DifferenceEngine.php.

Referenced by localiseDiff().

◆ addLocalisedTitleTooltipsCb()

DifferenceEngine::addLocalisedTitleTooltipsCb ( array $matches)
private
Parameters
array$matches
Returns
string

Definition at line 1144 of file DifferenceEngine.php.

References $matches, and ContextSource\msg().

◆ debug()

DifferenceEngine::debug ( $generator = "internal")
protected

Generate a debug comment indicating diff generating time, server node, and generator backend.

Parameters
string$generator: What diff engine was used
Returns
string

Definition at line 1071 of file DifferenceEngine.php.

References $generator, $wgShowHostnames, wfHostname(), and wfTimestamp().

Referenced by textDiff().

◆ deletedIdMarker()

DifferenceEngine::deletedIdMarker ( $id)

Build a wikitext link toward a deleted revision, if viewable.

Parameters
int$idRevision ID
Returns
string Wikitext fragment

Definition at line 212 of file DifferenceEngine.php.

References $link, and deletedLink().

Referenced by showMissingRevision().

◆ deletedLink()

DifferenceEngine::deletedLink ( $id)

Look up a special:Undelete link to the given deleted revision id, as a workaround for being unable to load deleted diffs in currently.

Parameters
int$idRevision ID
Returns
string|bool Link HTML or false

Definition at line 179 of file DifferenceEngine.php.

References $dbr, $rev, DB_REPLICA, ContextSource\getUser(), and wfGetDB().

Referenced by deletedIdMarker().

◆ generateContentDiffBody()

DifferenceEngine::generateContentDiffBody ( Content $old,
Content $new )

Generate a diff, no caching.

This implementation uses generateTextDiffBody() to generate a diff based on the default serialization of the given Content objects. This will fail if $old or $new are not instances of TextContent.

Subclasses may override this to provide a different rendering for the diff, perhaps taking advantage of the content's native form. This is required for all content models that are not text based.

Since
1.21
Parameters
Content$oldOld content
Content$newNew content
Exceptions
MWExceptionIf old or new content is not an instance of TextContent.
Returns
bool|string

Definition at line 875 of file DifferenceEngine.php.

References generateTextDiffBody(), and Content\serialize().

Referenced by getDiffBody().

◆ generateTextDiffBody()

DifferenceEngine::generateTextDiffBody ( $otext,
$ntext )

Generate a diff, no caching.

Todo
move this to TextDifferenceEngine, make DifferenceEngine abstract. At some point.
Parameters
string$otextOld text, must be already segmented
string$ntextNew text, must be already segmented
Returns
bool|string

Definition at line 902 of file DifferenceEngine.php.

References $result, $time, textDiff(), and wfDebugLog().

Referenced by generateContentDiffBody().

◆ getDiff()

DifferenceEngine::getDiff ( $otitle,
$ntitle,
$notice = '' )

Get complete diff table, including header.

Parameters
string | bool$otitleHeader for old text or false
string | bool$ntitleHeader for new text or false
string$noticeHTML between diff header and body
Returns
mixed

Definition at line 709 of file DifferenceEngine.php.

References addHeader(), getDiffBody(), getMultiNotice(), and ContextSource\msg().

Referenced by showDiff().

◆ getDiffBody()

DifferenceEngine::getDiffBody ( )

Get the diff table body, without header.

Returns
mixed (string/false)

Definition at line 731 of file DifferenceEngine.php.

References $cache, generateContentDiffBody(), getDiffBodyCacheKey(), getDiffBodyCacheKeyParams(), loadRevisionData(), loadText(), localiseDiff(), and wfIncrStats().

Referenced by getDiff().

◆ getDiffBodyCacheKey()

DifferenceEngine::getDiffBodyCacheKey ( )
protected

Returns the cache key for diff body text or content.

Deprecated
since 1.31, use getDiffBodyCacheKeyParams() instead
Since
1.23
Exceptions
MWException
Returns
string|null

Definition at line 817 of file DifferenceEngine.php.

Referenced by getDiffBody().

◆ getDiffBodyCacheKeyParams()

DifferenceEngine::getDiffBodyCacheKeyParams ( )
protected

Get the cache key parameters.

Subclasses can replace the first element in the array to something more specific to the type of diff (e.g. "inline-diff"), or append if the cache should vary on more things. Overriding entirely should be avoided.

Since
1.31
Returns
array
Exceptions
MWException

Definition at line 834 of file DifferenceEngine.php.

References $engine, $params, DIFF_VERSION, ContextSource\getConfig(), and getEngine().

Referenced by getDiffBody().

◆ getDiffLang()

DifferenceEngine::getDiffLang ( )
Returns
Language

Definition at line 137 of file DifferenceEngine.php.

References $mDiffLang, and ContextSource\getTitle().

Referenced by addHeader().

◆ getEngine()

DifferenceEngine::getEngine ( )
private

Process $wgExternalDiffEngine and get a sane, usable engine.

Returns
bool|string 'wikidiff2', path to an executable, or false

Definition at line 944 of file DifferenceEngine.php.

References $wgExternalDiffEngine, wfDeprecated(), and wfWarn().

Referenced by getDiffBodyCacheKeyParams(), localiseDiff(), and textDiff().

◆ getMarkPatrolledLinkInfo()

DifferenceEngine::getMarkPatrolledLinkInfo ( )
protected

Returns an array of meta data needed to build a "mark as patrolled" link and adds the mediawiki.page.patrol.ajax to the output.

Returns
array|false An array of meta data for a patrol link (rcid only) or false if no link is needed

Definition at line 526 of file DifferenceEngine.php.

References $wgEnableAPI, $wgEnableWriteAPI, $wgUseRCPatrol, DB_REPLICA, ContextSource\getOutput(), ContextSource\getUser(), and wfGetDB().

Referenced by markPatrolledLink().

◆ getMultiNotice()

DifferenceEngine::getMultiNotice ( )

If there are revisions between the ones being compared, return a note saying so.

Returns
string

Definition at line 1156 of file DifferenceEngine.php.

References $mNewRev, $mOldRev, and intermediateEditsMsg().

Referenced by getDiff(), and showDiffPage().

◆ getNewid()

DifferenceEngine::getNewid ( )
Returns
bool|int

Definition at line 165 of file DifferenceEngine.php.

References $mNewid, and loadRevisionIds().

◆ getOldid()

DifferenceEngine::getOldid ( )
Returns
int

Definition at line 156 of file DifferenceEngine.php.

References $mOldid, and loadRevisionIds().

◆ getParserOutput()

DifferenceEngine::getParserOutput ( WikiPage $page,
Revision $rev )
protected
Parameters
WikiPage$page
Revision$rev
Returns
ParserOutput|bool False if the revision was not found

Definition at line 659 of file DifferenceEngine.php.

References $rev, ContextSource\getContext(), WikiPage\getParserOutput(), and WikiPage\makeParserOptions().

Referenced by renderNewRevision().

◆ getRevisionHeader()

DifferenceEngine::getRevisionHeader ( Revision $rev,
$complete = '' )

Get a header for a specified revision.

Parameters
Revision$rev
string$complete'complete' to get the header wrapped depending the visibility of the revision and a link to edit the page.
Returns
string HTML fragment

Definition at line 1221 of file DifferenceEngine.php.

References $header, $lang, $rev, ContextSource\getLanguage(), ContextSource\getUser(), Revision\isCurrent(), Linker\linkKnown(), and ContextSource\msg().

Referenced by renderNewRevision(), and showDiffPage().

◆ intermediateEditsMsg()

static DifferenceEngine::intermediateEditsMsg ( $numEdits,
$numUsers,
$limit )
static

Get a notice about how many intermediate edits and users there are.

Parameters
int$numEdits
int$numUsers
int$limit
Returns
string

Definition at line 1199 of file DifferenceEngine.php.

References wfMessage().

Referenced by getMultiNotice().

◆ loadNewText()

DifferenceEngine::loadNewText ( )

Load the text of the new revision, not the old one.

Returns
bool

Definition at line 1540 of file DifferenceEngine.php.

References ContextSource\getUser(), and loadRevisionData().

Referenced by renderNewRevision().

◆ loadRevisionData()

DifferenceEngine::loadRevisionData ( )

Load revision metadata for the specified articles.

If newid is 0, then compare the old article in oldid to the current article; if oldid is 0, then compare the current article to the immediately previous one (ignoring the value of newid).

If oldid is false, leave the corresponding revision object set to false. This is impossible via ordinary user input, and is provided for API convenience.

Returns
bool

Definition at line 1425 of file DifferenceEngine.php.

References $dbr, $rev, DB_REPLICA, ContextSource\getTitle(), loadRevisionIds(), and wfGetDB().

Referenced by getDiffBody(), loadNewText(), loadText(), and showDiffPage().

◆ loadRevisionIds()

DifferenceEngine::loadRevisionIds ( )
private

Load revision IDs.

Definition at line 1390 of file DifferenceEngine.php.

References $mNewid, $mOldid, ContextSource\getTitle(), list, and mapDiffPrevNext().

Referenced by getNewid(), getOldid(), and loadRevisionData().

◆ loadText()

DifferenceEngine::loadText ( )

Load the text of the revisions, as well as revision data.

Returns
bool

Definition at line 1505 of file DifferenceEngine.php.

References ContextSource\getUser(), and loadRevisionData().

Referenced by getDiffBody().

◆ localiseDiff()

DifferenceEngine::localiseDiff ( $text)
private

Localise diff output.

Parameters
string$text
Returns
string

Definition at line 1093 of file DifferenceEngine.php.

References addLocalisedTitleTooltips(), getEngine(), and localiseLineNumbers().

Referenced by getDiffBody().

◆ localiseLineNumbers()

DifferenceEngine::localiseLineNumbers ( $text)

Replace line numbers with the text in the user's language.

Parameters
string$text
Returns
mixed

Definition at line 1110 of file DifferenceEngine.php.

Referenced by localiseDiff().

◆ localiseLineNumbersCb()

DifferenceEngine::localiseLineNumbersCb ( $matches)

Definition at line 1118 of file DifferenceEngine.php.

References $matches, and ContextSource\msg().

◆ mapDiffPrevNext()

DifferenceEngine::mapDiffPrevNext ( $old,
$new )

Maps a revision pair definition as accepted by DifferenceEngine constructor to a pair of actual integers representing revision ids.

Parameters
int$oldRevision id, e.g. from URL parameter 'oldid'
int | string$newRevision id or strings 'next' or 'prev', e.g. from URL parameter 'diff'
Returns
int[] List of two revision ids, older first, later second. Zero signifies invalid argument passed. false signifies that there is no previous/next revision ($old is the oldest/newest one).

Definition at line 1370 of file DifferenceEngine.php.

References ContextSource\getTitle().

Referenced by loadRevisionIds().

◆ markPatrolledLink()

DifferenceEngine::markPatrolledLink ( )

Build a link to mark a change as patrolled.

Returns empty string if there's either no revision to patrol or the user is not allowed to. Side effect: When the patrol link is build, this method will call OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.

Returns
string HTML or empty string

Definition at line 494 of file DifferenceEngine.php.

References $mMarkPatrolledLink, getMarkPatrolledLinkInfo(), Linker\linkKnown(), and ContextSource\msg().

Referenced by renderNewRevision(), and showDiffPage().

◆ renderNewRevision()

DifferenceEngine::renderNewRevision ( )

◆ revisionDeleteLink()

DifferenceEngine::revisionDeleteLink ( $rev)
protected
Parameters
Revision$rev
Returns
string

Definition at line 588 of file DifferenceEngine.php.

References $link, $rev, Linker\getRevDeleteLink(), and ContextSource\getUser().

Referenced by showDiffPage().

◆ setContent()

DifferenceEngine::setContent ( Content $oldContent,
Content $newContent )

Use specified text instead of loading from the database.

Parameters
Content$oldContent
Content$newContent
Since
1.21

Definition at line 1341 of file DifferenceEngine.php.

◆ setReducedLineNumbers()

DifferenceEngine::setReducedLineNumbers ( $value = true)
Parameters
bool$value

Definition at line 130 of file DifferenceEngine.php.

References $value.

◆ setTextLanguage()

DifferenceEngine::setTextLanguage ( $lang)

Set the language in which the diff text is written (Defaults to page content language).

Parameters
Language | string$lang
Since
1.19

Definition at line 1355 of file DifferenceEngine.php.

References $lang, and wfGetLangObj().

◆ showDiff()

DifferenceEngine::showDiff ( $otitle,
$ntitle,
$notice = '' )

Get the diff text, send it to the OutputPage object Returns false if the diff could not be generated, otherwise returns true.

Parameters
string | bool$otitleHeader for old text or false
string | bool$ntitleHeader for new text or false
string$noticeHTML between diff header and body
Returns
bool

Definition at line 676 of file DifferenceEngine.php.

References getDiff(), ContextSource\getOutput(), showDiffStyle(), and showMissingRevision().

Referenced by showDiffPage().

◆ showDiffPage()

◆ showDiffStyle()

DifferenceEngine::showDiffStyle ( )

Add style sheets for diff display.

Definition at line 696 of file DifferenceEngine.php.

References ContextSource\getOutput().

Referenced by showDiff(), and showDiffPage().

◆ showMissingRevision()

DifferenceEngine::showMissingRevision ( )
private

◆ textDiff()

DifferenceEngine::textDiff ( $otext,
$ntext )
protected

Generates diff, to be wrapped internally in a logging/instrumentation.

Parameters
string$otextOld text, must be already segmented
string$ntextNew text, must be already segmented
Returns
bool|string

Definition at line 977 of file DifferenceEngine.php.

References $engine, $wgContLang, debug(), ContextSource\getConfig(), getEngine(), wfEscapeWikiText(), wfLogWarning(), wfTempDir(), and wikidiff2_do_diff().

Referenced by generateTextDiffBody().

◆ wasCacheHit()

DifferenceEngine::wasCacheHit ( )
Returns
bool

Definition at line 149 of file DifferenceEngine.php.

References $mCacheHit.

Member Data Documentation

◆ $enableDebugComment

DifferenceEngine::$enableDebugComment = false

Set this to true to add debug info to the HTML output.

Warning: this may cause RSS readers to spuriously mark articles as "new" (T22601)

Definition at line 86 of file DifferenceEngine.php.

◆ $mCacheHit

bool DifferenceEngine::$mCacheHit = false

Was the diff fetched from cache?

Definition at line 79 of file DifferenceEngine.php.

Referenced by wasCacheHit().

◆ $mDiffLang

Language DifferenceEngine::$mDiffLang
protected

Definition at line 55 of file DifferenceEngine.php.

Referenced by getDiffLang().

◆ $mMarkPatrolledLink

string DifferenceEngine::$mMarkPatrolledLink = null
protected

Link to action=markpatrolled.

Definition at line 94 of file DifferenceEngine.php.

Referenced by markPatrolledLink().

◆ $mNewContent

Content DifferenceEngine::$mNewContent

Definition at line 52 of file DifferenceEngine.php.

◆ $mNewid

int DifferenceEngine::$mNewid

Definition at line 43 of file DifferenceEngine.php.

Referenced by getNewid(), and loadRevisionIds().

◆ $mNewPage

Title DifferenceEngine::$mNewPage

Definition at line 61 of file DifferenceEngine.php.

◆ $mNewRev

Revision DifferenceEngine::$mNewRev

Definition at line 67 of file DifferenceEngine.php.

Referenced by getMultiNotice().

◆ $mNewTags

DifferenceEngine::$mNewTags
private

Definition at line 46 of file DifferenceEngine.php.

◆ $mOldContent

Content DifferenceEngine::$mOldContent

Definition at line 49 of file DifferenceEngine.php.

◆ $mOldid

int DifferenceEngine::$mOldid

Definition at line 40 of file DifferenceEngine.php.

Referenced by getOldid(), and loadRevisionIds().

◆ $mOldPage

Title DifferenceEngine::$mOldPage

Definition at line 58 of file DifferenceEngine.php.

◆ $mOldRev

Revision DifferenceEngine::$mOldRev

Definition at line 64 of file DifferenceEngine.php.

Referenced by getMultiNotice().

◆ $mOldTags

DifferenceEngine::$mOldTags
private

Definition at line 45 of file DifferenceEngine.php.

◆ $mReducedLineNumbers

bool DifferenceEngine::$mReducedLineNumbers = false
protected

If true, line X is not displayed when X is 1, for example to increase readability and conserve space with many small diffs.

Definition at line 91 of file DifferenceEngine.php.

◆ $mRefreshCache

bool DifferenceEngine::$mRefreshCache = false
protected

Refresh the diff cache.

Definition at line 100 of file DifferenceEngine.php.

◆ $mRevisionsIdsLoaded

bool DifferenceEngine::$mRevisionsIdsLoaded = false
private

Have the revisions IDs been loaded.

Definition at line 70 of file DifferenceEngine.php.

◆ $mRevisionsLoaded

bool DifferenceEngine::$mRevisionsLoaded = false

Have the revisions been loaded.

Definition at line 73 of file DifferenceEngine.php.

◆ $mTextLoaded

int DifferenceEngine::$mTextLoaded = 0

How many text blobs have been loaded, 0, 1 or 2?

Definition at line 76 of file DifferenceEngine.php.

◆ $unhide

bool DifferenceEngine::$unhide = false
protected

Show rev_deleted content if allowed.

Definition at line 97 of file DifferenceEngine.php.

Referenced by __construct().

◆ DIFF_VERSION

const DifferenceEngine::DIFF_VERSION = '1.12'

Constant to indicate diff cache compatibility.

Bump this when changing the diff formatting in a way that fixes important bugs or such to force cached diff views to clear.

Definition at line 37 of file DifferenceEngine.php.

Referenced by getDiffBodyCacheKeyParams().


The documentation for this class was generated from the following file: