Futilities/human/lib/cFolderator: Difference between revisions
No edit summary |
(flow revised slightly to avoid the fact that cPathRoot has no name) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{fmt/title|Human Futilities: <code>cFolderator</code> class}} | {{fmt/title|Human Futilities: <code>cFolderator</code> class}} | ||
==Flow== | ==Flow== | ||
The flow typically starts with <code>StartSpider()</code>, which retrieves the source-path from Options (<code>GetSourcePath()</code>) and then passes control to <code>OnWantedFolder</code>. (We assume that the folder in the source-path is wanted, even if it fails inclusion criteria that are applied to its sub-folders.) | The flow typically starts with <code>StartSpider()</code>, which retrieves the source-path from Options (<code>GetSourcePath()</code>) and then passes control to '''<code>OnWantedFolder</code>'''. (We assume that the folder in the source-path is wanted, even if it fails inclusion criteria that are applied to its sub-folders.) | ||
This initiates a recursive loop guided in part by the app's Matcher object, which is an app-defined {{l/same|caMatch}} podling. | |||
===OnWantedFolder=== | |||
<syntaxhighlight lang=php inline>OnWantedFolder(caPathPiece $op)</syntaxhighlight> gets a directory listing for <code>$op</code>, puts that list in an array, and then for each entry in the array sets that entry as the last piece in <code>$opCurr</code> and passes it to '''<code>OnPath($opCurr)</code>'''. | |||
===OnPath=== | |||
<code>OnPath({{l/same|caPathPiece}} $op)</code> checks the filespec in <code>$op</code> to see whether it's a file or a folder (it is assumed to exist). In simplified form: | |||
<syntaxhighlight lang=php> | |||
if ($op->IsFolder()) { | |||
$this->OnFolder($op); | |||
} else { | |||
$this->OnFile($op); | |||
} | |||
</syntaxhighlight> | |||
...in other words: control is passed to '''<code>OnFile()</code>''' or '''<code>OnFolder()</code>''' depending on whether the filesystem entry (node) pointed to by the filespec is a file or a folder. | |||
===OnFolder=== | |||
<code>OnFolder(caPathNamed $op)</code> asks the Matcher if the folder is wanted: | |||
<syntaxhighlight lang=php inline>if ($this->GetMatcher()->IsFolderWanted($op)) { $this->OnWantedFolder($op); }</syntaxhighlight> | |||
If the Matcher declares that the folder passes muster, then: | |||
* ask the Matcher to <code>HandleFolder($op)</code> | |||
* start a new iteration by passing control back to '''<code>OnWantedFolder()</code>'''. | |||
===OnFile=== | |||
<code>OnFile(caPathNamed $op)</code> asks the Matcher if the file is wanted: | |||
<syntaxhighlight lang=php inline>if ($this->GetMatcher()->IsFileWanted($op)) { $this->GetMatcher()->HandleFile($op); }</syntaxhighlight> | |||
Note the slight difference between this and <code>OnFolder()</code>: because we don't need to recurse into files (at least until we support entering .tar/.zip archives), we can just pass control over to the Matcher to decide if the file is wanted ''and'' to handle it if it is. | |||
==Functions== | ==Functions== | ||
===actions=== | ===actions=== |
Latest revision as of 13:17, 28 September 2022
Human Futilities:
cFolderator class |
Flow
The flow typically starts with StartSpider()
, which retrieves the source-path from Options (GetSourcePath()
) and then passes control to OnWantedFolder
. (We assume that the folder in the source-path is wanted, even if it fails inclusion criteria that are applied to its sub-folders.)
This initiates a recursive loop guided in part by the app's Matcher object, which is an app-defined caMatch podling.
OnWantedFolder
OnWantedFolder(caPathPiece $op)
gets a directory listing for $op
, puts that list in an array, and then for each entry in the array sets that entry as the last piece in $opCurr
and passes it to OnPath($opCurr)
.
OnPath
OnPath(caPathPiece $op)
checks the filespec in $op
to see whether it's a file or a folder (it is assumed to exist). In simplified form:
if ($op->IsFolder()) {
$this->OnFolder($op);
} else {
$this->OnFile($op);
}
...in other words: control is passed to OnFile()
or OnFolder()
depending on whether the filesystem entry (node) pointed to by the filespec is a file or a folder.
OnFolder
OnFolder(caPathNamed $op)
asks the Matcher if the folder is wanted:
if ($this->GetMatcher()->IsFolderWanted($op)) { $this->OnWantedFolder($op); }
If the Matcher declares that the folder passes muster, then:
- ask the Matcher to
HandleFolder($op)
- start a new iteration by passing control back to
OnWantedFolder()
.
OnFile
OnFile(caPathNamed $op)
asks the Matcher if the file is wanted:
if ($this->GetMatcher()->IsFileWanted($op)) { $this->GetMatcher()->HandleFile($op); }
Note the slight difference between this and OnFolder()
: because we don't need to recurse into files (at least until we support entering .tar/.zip archives), we can just pass control over to the Matcher to decide if the file is wanted and to handle it if it is.
Functions
actions
- StartSpider(caMatch $om)
- formerly DoSearch() (kept for now as an alias)
events
- OnPath(caPathPiece $op)
- OnFolder(caPathNamed $op)
- OnWantedFolder(caPathPiece $op)
- OnFile(caPathNamed $op)
state
protected function ResetCount() { $this->nFi = 0; $this->nFo = 0; }
protected function IncFiles() { $this->nFi++; }
protected function IncFolders() { $this->nFo++; }
protected function SummarizeCount() : string { ... }
: returns a string summarizing file & folder countsprotected function ShortCount() : string { ... }
: like SummarizeCount(), but shorter string ("fo:#/fi:#")
object
This pair sets and returns a Matcher object: