@@ -31,7 +31,7 @@ discard block |
||
31 | 31 | class WikiBotConfig |
32 | 32 | { |
33 | 33 | public const VERSION = '2.1'; |
34 | - public const WATCHPAGE_FILENAME = __DIR__ . '/resources/watch_pages.json'; |
|
34 | + public const WATCHPAGE_FILENAME = __DIR__.'/resources/watch_pages.json'; |
|
35 | 35 | public const EXIT_ON_CHECK_WATCHPAGE = false; |
36 | 36 | // do not stop if they play with {stop} on bot talk page |
37 | 37 | public const BLACKLIST_EDITOR = ['OrlodrimBot']; |
@@ -56,7 +56,7 @@ discard block |
||
56 | 56 | * @var DateTimeImmutable |
57 | 57 | */ |
58 | 58 | protected $lastCheckStopDate; |
59 | - protected SMSInterface|null $SMSClient; |
|
59 | + protected SMSInterface | null $SMSClient; |
|
60 | 60 | protected $mediawikiFactory; |
61 | 61 | protected ?string $gitCommitHash = null; |
62 | 62 | |
@@ -90,9 +90,8 @@ discard block |
||
90 | 90 | { |
91 | 91 | $text = WikiTextUtil::removeHTMLcomments($text); |
92 | 92 | $botName = $botName ?: self::getBotName(); |
93 | - $denyReg = (empty($botName)) ? '' : |
|
94 | - '|\{\{bots ?\| ?(optout|deny)\=[^\}]*' . preg_quote($botName, '#') . '[^\}]*\}\}'; |
|
95 | - return preg_match('#({{nobots}}|{{bots ?\| ?(optout|deny) ?= ?all ?}}' . $denyReg . ')#i', $text) > 0; |
|
93 | + $denyReg = (empty($botName)) ? '' : '|\{\{bots ?\| ?(optout|deny)\=[^\}]*'.preg_quote($botName, '#').'[^\}]*\}\}'; |
|
94 | + return preg_match('#({{nobots}}|{{bots ?\| ?(optout|deny) ?= ?all ?}}'.$denyReg.')#i', $text) > 0; |
|
96 | 95 | } |
97 | 96 | |
98 | 97 | /** |
@@ -127,12 +126,12 @@ discard block |
||
127 | 126 | if ($this->gitCommitHash) { |
128 | 127 | return $this->gitCommitHash; |
129 | 128 | } |
130 | - $path = __DIR__ . '/../../.git/'; |
|
129 | + $path = __DIR__.'/../../.git/'; |
|
131 | 130 | if (!file_exists($path)) { |
132 | 131 | return null; |
133 | 132 | } |
134 | - $head = trim(substr(file_get_contents($path . 'HEAD'), 4)); |
|
135 | - $hash = trim(file_get_contents(sprintf($path . $head))); |
|
133 | + $head = trim(substr(file_get_contents($path.'HEAD'), 4)); |
|
134 | + $hash = trim(file_get_contents(sprintf($path.$head))); |
|
136 | 135 | $this->gitCommitHash = $hash; // cached |
137 | 136 | |
138 | 137 | return $hash; |
@@ -190,7 +189,7 @@ discard block |
||
190 | 189 | |
191 | 190 | protected function getBotTalkPageTitle(): string |
192 | 191 | { |
193 | - return self::TALK_PAGE_PREFIX . $this::getBotName(); |
|
192 | + return self::TALK_PAGE_PREFIX.$this::getBotName(); |
|
194 | 193 | } |
195 | 194 | |
196 | 195 | protected function sendSMSandFunnyTalk(string $lastEditor, ?bool $botTalk): void |
@@ -290,8 +289,8 @@ discard block |
||
290 | 289 | */ |
291 | 290 | public function minutesSinceLastEdit(string $title): int |
292 | 291 | { |
293 | - $time = $this->getTimestamp($title); // 2011-09-02T16:31:13Z |
|
292 | + $time = $this->getTimestamp($title); // 2011-09-02T16:31:13Z |
|
294 | 293 | |
295 | - return (int)round((time() - strtotime($time)) / 60); |
|
294 | + return (int) round((time() - strtotime($time)) / 60); |
|
296 | 295 | } |
297 | 296 | } |
@@ -18,7 +18,7 @@ discard block |
||
18 | 18 | */ |
19 | 19 | class StatsSqlite3 implements StatsInterface |
20 | 20 | { |
21 | - protected const DEFAULT_FILEPATH = __DIR__ . '/../../../log/stats.db'; |
|
21 | + protected const DEFAULT_FILEPATH = __DIR__.'/../../../log/stats.db'; |
|
22 | 22 | protected const MAX_TAG_LENGTH = 100; |
23 | 23 | |
24 | 24 | protected SQLite3 $db; |
@@ -75,7 +75,7 @@ discard block |
||
75 | 75 | // `num` default value is 1 so insert is enough to set num=1 |
76 | 76 | try { |
77 | 77 | return $this->sqliteExecWriteOrWait( |
78 | - 'INSERT INTO ' . $table . ' (tag) VALUES("' . $tag . '") ON CONFLICT(tag) DO UPDATE SET num=num+1' |
|
78 | + 'INSERT INTO '.$table.' (tag) VALUES("'.$tag.'") ON CONFLICT(tag) DO UPDATE SET num=num+1' |
|
79 | 79 | ); |
80 | 80 | } catch (Exception $e) { |
81 | 81 | return false; |
@@ -107,7 +107,7 @@ discard block |
||
107 | 107 | $tag = $this->formatTag($tag); |
108 | 108 | try { |
109 | 109 | return $this->sqliteExecWriteOrWait( |
110 | - 'INSERT OR REPLACE INTO tagnum (tag,num) VALUES("' . $tag . '", ' . $num . ')' |
|
110 | + 'INSERT OR REPLACE INTO tagnum (tag,num) VALUES("'.$tag.'", '.$num.')' |
|
111 | 111 | ); |
112 | 112 | } catch (Exception $e) { |
113 | 113 | return false; |
@@ -119,7 +119,7 @@ discard block |
||
119 | 119 | $tag = $this->formatTag($tag); |
120 | 120 | try { |
121 | 121 | return $this->sqliteExecWriteOrWait( |
122 | - 'INSERT INTO tagnum (tag) VALUES("' . $tag . '") ON CONFLICT(tag) DO UPDATE SET num=num-1' |
|
122 | + 'INSERT INTO tagnum (tag) VALUES("'.$tag.'") ON CONFLICT(tag) DO UPDATE SET num=num-1' |
|
123 | 123 | ); |
124 | 124 | } catch (Exception $e) { |
125 | 125 | return false; |
@@ -20,7 +20,7 @@ discard block |
||
20 | 20 | { |
21 | 21 | // use LoggerTrait; |
22 | 22 | |
23 | - protected const CRITICAL_LOG_PATH = __DIR__ . '/../../../log/critical.log'; |
|
23 | + protected const CRITICAL_LOG_PATH = __DIR__.'/../../../log/critical.log'; |
|
24 | 24 | public bool $verbose = false; |
25 | 25 | public bool $debug = false; |
26 | 26 | public bool $colorMode = false; |
@@ -36,7 +36,7 @@ discard block |
||
36 | 36 | |
37 | 37 | public function __call(string $method, array $args): void |
38 | 38 | { |
39 | - $this->notice('Call to undefined method ConsoleLogger:' . $method . '()'); |
|
39 | + $this->notice('Call to undefined method ConsoleLogger:'.$method.'()'); |
|
40 | 40 | } |
41 | 41 | |
42 | 42 | /** |
@@ -62,7 +62,7 @@ discard block |
||
62 | 62 | case 'emergency': |
63 | 63 | case 'alert': |
64 | 64 | case 'critical': |
65 | - $this->echoColor("[$level] " . $date . ' : ' . $message . "\n", Color::BG_RED . Color::WHITE); |
|
65 | + $this->echoColor("[$level] ".$date.' : '.$message."\n", Color::BG_RED.Color::WHITE); |
|
66 | 66 | if ($context !== []) { |
67 | 67 | dump($context); |
68 | 68 | } |
@@ -70,20 +70,20 @@ discard block |
||
70 | 70 | break; |
71 | 71 | case 'error': |
72 | 72 | case 'warning': |
73 | - $this->echoColor("[$level] " . $date . ' : ' . $message . "\n", Color::BG_YELLOW . Color::BLACK); |
|
73 | + $this->echoColor("[$level] ".$date.' : '.$message."\n", Color::BG_YELLOW.Color::BLACK); |
|
74 | 74 | if ($context !== []) { |
75 | 75 | dump($context); |
76 | 76 | } |
77 | 77 | break; |
78 | 78 | case 'notice': |
79 | - $this->echoColor("[$level] " . $message . "\n"); |
|
79 | + $this->echoColor("[$level] ".$message."\n"); |
|
80 | 80 | if ($context !== []) { |
81 | 81 | dump($context); |
82 | 82 | } |
83 | 83 | break; |
84 | 84 | case 'info': |
85 | 85 | if ($this->verbose || $this->debug) { |
86 | - $this->echoColor("[$level] " . $message . "\n", Color::GRAY); |
|
86 | + $this->echoColor("[$level] ".$message."\n", Color::GRAY); |
|
87 | 87 | if ($context !== []) { |
88 | 88 | dump($context); |
89 | 89 | } |
@@ -91,14 +91,14 @@ discard block |
||
91 | 91 | break; |
92 | 92 | case 'debug': |
93 | 93 | if ($this->debug) { |
94 | - $this->echoColor("[$level] " . $message . "\n", Color::GRAY); |
|
94 | + $this->echoColor("[$level] ".$message."\n", Color::GRAY); |
|
95 | 95 | if ($context !== []) { |
96 | 96 | dump($context); |
97 | 97 | } |
98 | 98 | } |
99 | 99 | break; |
100 | 100 | case 'echo': |
101 | - $this->echoColor($message . "\n"); |
|
101 | + $this->echoColor($message."\n"); |
|
102 | 102 | break; |
103 | 103 | } |
104 | 104 | } |
@@ -121,7 +121,7 @@ discard block |
||
121 | 121 | private function echoColor(string $text, ?string $color = null): void |
122 | 122 | { |
123 | 123 | if ($this->colorMode && !empty($color)) { |
124 | - echo $color . $text . Color::NORMAL; |
|
124 | + echo $color.$text.Color::NORMAL; |
|
125 | 125 | |
126 | 126 | return; |
127 | 127 | } |
@@ -132,7 +132,7 @@ discard block |
||
132 | 132 | { |
133 | 133 | file_put_contents( |
134 | 134 | self::CRITICAL_LOG_PATH, |
135 | - date('d-m-Y H:i:s') . " : $level : " . $message . PHP_EOL, |
|
135 | + date('d-m-Y H:i:s')." : $level : ".$message.PHP_EOL, |
|
136 | 136 | FILE_APPEND |
137 | 137 | ); |
138 | 138 | } |
@@ -49,12 +49,12 @@ discard block |
||
49 | 49 | $this->url = $url; |
50 | 50 | $this->registrableDomain = null; |
51 | 51 | if (!HttpUtil::isHttpURL($url)) { |
52 | - $this->log->debug('Skip : not Http URL : ' . $url, ['stats' => 'externref.skip.notRawURL']); |
|
52 | + $this->log->debug('Skip : not Http URL : '.$url, ['stats' => 'externref.skip.notRawURL']); |
|
53 | 53 | return false; |
54 | 54 | } |
55 | 55 | |
56 | 56 | if ($this->hasForbiddenFilenameExtension()) { |
57 | - $this->log->debug('Skip : ForbiddenFilenameExtension : ' . $url, ['stats' => 'externref.skip.forbiddenFilenameExtension']); |
|
57 | + $this->log->debug('Skip : ForbiddenFilenameExtension : '.$url, ['stats' => 'externref.skip.forbiddenFilenameExtension']); |
|
58 | 58 | return false; |
59 | 59 | } |
60 | 60 | |
@@ -70,7 +70,7 @@ discard block |
||
70 | 70 | */ |
71 | 71 | protected function hasForbiddenFilenameExtension(): bool |
72 | 72 | { |
73 | - return (bool)preg_match( |
|
73 | + return (bool) preg_match( |
|
74 | 74 | '#\.(pdf|jpg|jpeg|gif|png|webp|xls|xlsx|xlr|xml|xlt|txt|csv|js|docx|exe|gz|zip|ini|movie|mp3|mp4|ogg|raw|rss|tar|tgz|wma)$#i', |
75 | 75 | $this->url |
76 | 76 | ); |
@@ -81,7 +81,7 @@ discard block |
||
81 | 81 | try { |
82 | 82 | $this->registrableDomain = $this->internetDomainParser->getRegistrableDomainFromURL($this->url); |
83 | 83 | } catch (Exception) { |
84 | - $this->log->warning('Skip : registrableDomain not a valid URL : ' . $this->url, |
|
84 | + $this->log->warning('Skip : registrableDomain not a valid URL : '.$this->url, |
|
85 | 85 | ['stats' => 'externref.skip.URLAuthorized.exception2'] |
86 | 86 | ); |
87 | 87 | return null; |
@@ -35,13 +35,13 @@ discard block |
||
35 | 35 | use SummaryExternTrait, PublisherLogicTrait; |
36 | 36 | |
37 | 37 | final public const HTTP_REQUEST_LOOP_DELAY = 10; |
38 | - final public const SKIP_DOMAIN_FILENAME = __DIR__ . '/../resources/config_skip_domain.txt'; |
|
38 | + final public const SKIP_DOMAIN_FILENAME = __DIR__.'/../resources/config_skip_domain.txt'; |
|
39 | 39 | final public const REPLACE_404 = true; |
40 | 40 | final public const REPLACE_410 = true; |
41 | - final public const CONFIG_PRESSE = __DIR__ . '/../resources/config_presse.yaml'; |
|
42 | - final public const CONFIG_NEWSPAPER_JSON = __DIR__ . '/../resources/data_newspapers.json'; |
|
43 | - final public const CONFIG_SCIENTIFIC_JSON = __DIR__ . '/../resources/data_scientific_domain.json'; |
|
44 | - final public const CONFIG_SCIENTIFIC_WIKI_JSON = __DIR__ . '/../resources/data_scientific_wiki.json'; |
|
41 | + final public const CONFIG_PRESSE = __DIR__.'/../resources/config_presse.yaml'; |
|
42 | + final public const CONFIG_NEWSPAPER_JSON = __DIR__.'/../resources/data_newspapers.json'; |
|
43 | + final public const CONFIG_SCIENTIFIC_JSON = __DIR__.'/../resources/data_scientific_domain.json'; |
|
44 | + final public const CONFIG_SCIENTIFIC_WIKI_JSON = __DIR__.'/../resources/data_scientific_wiki.json'; |
|
45 | 45 | |
46 | 46 | public bool $skipSiteBlacklisted = true; |
47 | 47 | public bool $skipRobotNoIndex = true; |
@@ -96,13 +96,13 @@ discard block |
||
96 | 96 | } |
97 | 97 | $this->registrableDomain = $this->urlChecker->getRegistrableDomain($url); // hack |
98 | 98 | if ($this->isSiteBlackListed()) { |
99 | - $this->log->debug('Site blacklisted : ' . $this->registrableDomain, ['stats' => 'externref.skip.blacklisted']); |
|
99 | + $this->log->debug('Site blacklisted : '.$this->registrableDomain, ['stats' => 'externref.skip.blacklisted']); |
|
100 | 100 | return $url; |
101 | 101 | } |
102 | 102 | |
103 | 103 | if ($this->registrableDomain && !$this->validateConfigWebDomain($this->registrableDomain)) { |
104 | 104 | $this->log->debug( |
105 | - 'Domain blocked by config : ' . $this->registrableDomain, |
|
105 | + 'Domain blocked by config : '.$this->registrableDomain, |
|
106 | 106 | ['stats' => 'externref.skip.domainDisabledByConfig'] |
107 | 107 | ); |
108 | 108 | return $url; |
@@ -159,7 +159,7 @@ discard block |
||
159 | 159 | protected function isSiteBlackListed(): bool |
160 | 160 | { |
161 | 161 | if ($this->registrableDomain && $this->skipSiteBlacklisted && in_array($this->registrableDomain, $this->skip_domain)) { |
162 | - $this->log->notice("Skip web site " . $this->registrableDomain); |
|
162 | + $this->log->notice("Skip web site ".$this->registrableDomain); |
|
163 | 163 | return true; |
164 | 164 | } |
165 | 165 | return false; |
@@ -177,7 +177,7 @@ discard block |
||
177 | 177 | $this->config[$domain] = is_array($this->config[$domain]) ? $this->config[$domain] : []; |
178 | 178 | |
179 | 179 | if ($this->config[$domain] === 'deactivated' || isset($this->config[$domain]['deactivated'])) { |
180 | - $this->log->info("Domain " . $domain . " disabled\n"); |
|
180 | + $this->log->info("Domain ".$domain." disabled\n"); |
|
181 | 181 | |
182 | 182 | return false; |
183 | 183 | } |
@@ -188,9 +188,9 @@ discard block |
||
188 | 188 | protected function logDebugConfigWebDomain(string $domain): void |
189 | 189 | { |
190 | 190 | if (!isset($this->config[$domain])) { |
191 | - $this->log->debug("Domain " . $domain . " non configuré"); |
|
191 | + $this->log->debug("Domain ".$domain." non configuré"); |
|
192 | 192 | } else { |
193 | - $this->log->debug("Domain " . $domain . " configuré"); |
|
193 | + $this->log->debug("Domain ".$domain." configuré"); |
|
194 | 194 | } |
195 | 195 | } |
196 | 196 | |
@@ -216,7 +216,7 @@ discard block |
||
216 | 216 | if ($pageData === [] |
217 | 217 | || (empty($pageData['JSON-LD']) && empty($pageData['meta'])) |
218 | 218 | ) { |
219 | - $this->log->notice('No metadata : ' . $url); |
|
219 | + $this->log->notice('No metadata : '.$url); |
|
220 | 220 | |
221 | 221 | return true; |
222 | 222 | } |
@@ -231,7 +231,7 @@ discard block |
||
231 | 231 | protected function emptyMapData(array $mapData, string $url): bool |
232 | 232 | { |
233 | 233 | if ($mapData === [] || empty($mapData['url']) || empty($mapData['titre'])) { |
234 | - $this->log->info('Mapping incomplet : ' . $url); |
|
234 | + $this->log->info('Mapping incomplet : '.$url); |
|
235 | 235 | |
236 | 236 | return true; |
237 | 237 | } |
@@ -322,7 +322,7 @@ discard block |
||
322 | 322 | protected function correctSiteViaWebarchiver(array $mapData): array |
323 | 323 | { |
324 | 324 | if (!empty($this->options['originalRegistrableDomain']) && $mapData['site']) { |
325 | - $mapData['site'] = $this->options['originalRegistrableDomain'] . ' via ' . $mapData['site']; |
|
325 | + $mapData['site'] = $this->options['originalRegistrableDomain'].' via '.$mapData['site']; |
|
326 | 326 | } |
327 | 327 | |
328 | 328 | return $mapData; |
@@ -346,7 +346,7 @@ discard block |
||
346 | 346 | $templateOptimized = $optimizer->getOptiTemplate(); |
347 | 347 | |
348 | 348 | $serialized = $templateOptimized->serialize(true); |
349 | - $this->log->info('Serialized 444: ' . $serialized . "\n"); |
|
349 | + $this->log->info('Serialized 444: '.$serialized."\n"); |
|
350 | 350 | return $serialized; |
351 | 351 | } |
352 | 352 | |
@@ -354,7 +354,7 @@ discard block |
||
354 | 354 | { |
355 | 355 | $template = WikiTemplateFactory::create($templateName); |
356 | 356 | $template->userSeparator = " |"; |
357 | - $this->summary->memo['count ' . $templateName] = 1 + ($this->summary->memo['count ' . $templateName] ?? 0); |
|
357 | + $this->summary->memo['count '.$templateName] = 1 + ($this->summary->memo['count '.$templateName] ?? 0); |
|
358 | 358 | |
359 | 359 | return $template; |
360 | 360 | } |
@@ -23,7 +23,7 @@ discard block |
||
23 | 23 | { |
24 | 24 | protected HttpClientInterface $client; |
25 | 25 | |
26 | - public function __construct(private readonly LoggerInterface|NullLogger $log = new NullLogger()) |
|
26 | + public function __construct(private readonly LoggerInterface | NullLogger $log = new NullLogger()) |
|
27 | 27 | { |
28 | 28 | $this->client = ServiceFactory::getHttpClient(); |
29 | 29 | } |
@@ -38,16 +38,16 @@ discard block |
||
38 | 38 | { |
39 | 39 | $url = 'http://wikipedia.ramselehof.de/wikiblame.php?project=wikipedia&article=' |
40 | 40 | . str_replace(' ', '+', $article) |
41 | - . '&needle=' . urlencode($string) |
|
41 | + . '&needle='.urlencode($string) |
|
42 | 42 | . '&lang=fr&limit=2000&offjahr=2024&offmon=1&offtag=1&offhour=23&offmin=55' |
43 | 43 | . '&searchmethod=int&order=desc' |
44 | - . '&force_wikitags=' . ($hasWikicode ? 'on' : 'off') |
|
44 | + . '&force_wikitags='.($hasWikicode ? 'on' : 'off') |
|
45 | 45 | . '&user_lang=fr&ignorefirst=0'; |
46 | 46 | |
47 | 47 | $response = $this->client->get($url); |
48 | 48 | |
49 | 49 | if ($response->getStatusCode() !== 200) { |
50 | - $this->log->warning('WikiBlame: ' . $response->getStatusCode() . ' ' . $response->getReasonPhrase()); |
|
50 | + $this->log->warning('WikiBlame: '.$response->getStatusCode().' '.$response->getReasonPhrase()); |
|
51 | 51 | return null; |
52 | 52 | } |
53 | 53 | |
@@ -68,7 +68,7 @@ discard block |
||
68 | 68 | } |
69 | 69 | |
70 | 70 | return [ |
71 | - 'versionid' => (int)$matches[1], |
|
71 | + 'versionid' => (int) $matches[1], |
|
72 | 72 | 'dateraw' => $matches[2], |
73 | 73 | 'datetime' => DateUtil::simpleFrench2object($matches[2]), |
74 | 74 | ]; |
@@ -54,7 +54,7 @@ discard block |
||
54 | 54 | ) |
55 | 55 | { |
56 | 56 | if (!HttpUtil::isHttpURL($url)) { |
57 | - throw new Exception('string is not an URL ' . $url); |
|
57 | + throw new Exception('string is not an URL '.$url); |
|
58 | 58 | } |
59 | 59 | $this->url = $url; |
60 | 60 | } |
@@ -94,7 +94,7 @@ discard block |
||
94 | 94 | '//script[@type="application/ld+json"]' |
95 | 95 | ); |
96 | 96 | } catch (Exception $e) { |
97 | - $this->log->warning('TagParser->xpathResults NULL ' . $this->url); |
|
97 | + $this->log->warning('TagParser->xpathResults NULL '.$this->url); |
|
98 | 98 | |
99 | 99 | return []; |
100 | 100 | } |
@@ -176,7 +176,7 @@ discard block |
||
176 | 176 | { |
177 | 177 | try { |
178 | 178 | if (!HttpUtil::isHttpURL($this->url)) { |
179 | - throw new Exception('string is not an URL ' . $this->url); |
|
179 | + throw new Exception('string is not an URL '.$this->url); |
|
180 | 180 | } |
181 | 181 | if (!$this->domainParser instanceof InternetDomainParserInterface) { |
182 | 182 | $this->log->notice('InternetDomainParser is not set'); |
@@ -187,7 +187,7 @@ discard block |
||
187 | 187 | return $this->domainParser->getRegistrableDomainFromURL($this->url); |
188 | 188 | } catch (Exception $e) { |
189 | 189 | if ($this->log !== null) { |
190 | - $this->log->warning('InternetDomainParser->getRegistrableDomainFromURL NULL ' . $this->url); |
|
190 | + $this->log->warning('InternetDomainParser->getRegistrableDomainFromURL NULL '.$this->url); |
|
191 | 191 | } |
192 | 192 | throw new Exception('InternetDomainParser->getRegistrableDomainFromURL NULL', $e->getCode(), $e); |
193 | 193 | } |
@@ -63,7 +63,7 @@ |
||
63 | 63 | if ($webarchiveDTO->getArchiver() === '[[Internet Archive]]') { |
64 | 64 | $this->log->notice(' |
@@ -32,7 +32,7 @@ |
||
32 | 32 | $this->summary->memo['sites'][] = $this->externalPage->getPrettyDomainName(); // ??? |
33 | 33 | } |
34 | 34 | if (isset($mapData['accès url'])) { |
35 | - $this->log->debug('accès |