Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/aimogen-pro/res/TextRazor.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
3
+
// http_build_query has its own ideas about how to serialize different types, so we use our own version here.
4
+
class TextRazorQueryBuilder
5
+
{
6
+
private $params = [];
7
+
8
+
public function add($key, $value)
9
+
{
10
+
if (is_null($value)) {
11
+
return;
12
+
} elseif (is_array($value)) {
13
+
foreach ($value as $listItem) {
14
+
$this->add($key, $listItem);
15
+
}
16
+
} elseif (is_bool($value)) {
17
+
$this->add($key, $value ? 'true' : 'false');
18
+
} else {
19
+
$this->params[] = urlencode($key) . '=' . urlencode($value);
20
+
}
21
+
}
22
+
23
+
public function build()
24
+
{
25
+
return implode('&', $this->params);
26
+
}
27
+
}
28
+
29
+
/**
30
+
* Represents global settings common to all TextRazor operations. Settings can be
31
+
* enabled here, or with each request.
32
+
*/
33
+
class TextRazorSettings
34
+
{
35
+
private static $apiKey;
36
+
37
+
private static $endPoint = 'http://api.textrazor.com/';
38
+
39
+
private static $secureEndPoint = 'https://api.textrazor.com/';
40
+
41
+
private static $enableEncryption = true;
42
+
43
+
private static $enableCompression = true;
44
+
45
+
// TextRazor has an internal timeout of 30 seconds, after which it will return an error.
46
+
// We set a higher default here to prevent any transport issues causing a client hang.
47
+
private static $connectTimeoutSeconds = 120;
48
+
49
+
private static $timeoutSeconds = 120;
50
+
51
+
public static function getApiKey()
52
+
{
53
+
return self::$apiKey;
54
+
}
55
+
56
+
public static function setApiKey($apiKey)
57
+
{
58
+
if ( ! is_string($apiKey)) {
59
+
throw new Exception('TextRazor Error: Invalid API Key');
60
+
}
61
+
62
+
self::$apiKey = $apiKey;
63
+
}
64
+
65
+
public static function getEndPoint()
66
+
{
67
+
return self::$endPoint;
68
+
}
69
+
70
+
public static function setEndPoint($endPoint)
71
+
{
72
+
if ( ! is_string($endPoint)) {
73
+
throw new Exception('TextRazor Error: Invalid HTTP Endpoint');
74
+
}
75
+
76
+
self::$endPoint = $endPoint;
77
+
}
78
+
79
+
public static function getSecureEndPoint()
80
+
{
81
+
return self::$secureEndPoint;
82
+
}
83
+
84
+
public static function setSecureEndPoint($endPoint)
85
+
{
86
+
if ( ! is_string($endPoint)) {
87
+
throw new Exception('TextRazor Error: Invalid HTTPS Endpoint');
88
+
}
89
+
90
+
self::$secureEndPoint = $endPoint;
91
+
}
92
+
93
+
public static function getEnableCompression()
94
+
{
95
+
return self::$enableCompression;
96
+
}
97
+
98
+
public static function setEnableCompression($enableCompression)
99
+
{
100
+
if ( ! is_bool($enableCompression)) {
101
+
throw new Exception('TextRazor Error: enableCompression must be a bool');
102
+
}
103
+
104
+
self::$enableCompression = $enableCompression;
105
+
}
106
+
107
+
public static function getEnableEncryption()
108
+
{
109
+
return self::$enableEncryption;
110
+
}
111
+
112
+
public static function setEnableEncryption($enableEncryption)
113
+
{
114
+
if ( ! is_bool($enableEncryption)) {
115
+
throw new Exception('TextRazor Error: enableEncryption must be a bool');
116
+
}
117
+
118
+
self::$enableEncryption = $enableEncryption;
119
+
}
120
+
121
+
/**
122
+
* Sets the connection phase timeout in seconds, or 0 for the default.
123
+
* See https://curl.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html for details.
124
+
*
125
+
* This timeout will not interrupt TextRazor's analysis process, which has a timeout of its own of 30 seconds.
126
+
*/
127
+
public static function setConnectTimeoutSeconds($connectTimeoutSeconds)
128
+
{
129
+
self::$connectTimeoutSeconds = $connectTimeoutSeconds;
130
+
}
131
+
132
+
public static function getConnectTimeoutSeconds()
133
+
{
134
+
return self::$connectTimeoutSeconds;
135
+
}
136
+
137
+
/**
138
+
* Sets the data transfer timeout in seconds, or 0 for the default.
139
+
* See https://curl.se/libcurl/c/CURLOPT_TIMEOUT.html for details.
140
+
*
141
+
* This timeout will not interrupt TextRazor's analysis process, which has a timeout of its own of 30 seconds.
142
+
*/
143
+
public static function setTimeoutSeconds($timeoutSeconds)
144
+
{
145
+
self::$timeoutSeconds = $timeoutSeconds;
146
+
}
147
+
148
+
public static function getTimeoutSeconds()
149
+
{
150
+
return self::$timeoutSeconds;
151
+
}
152
+
}
153
+
154
+
class TextRazorConnection
155
+
{
156
+
private $apiKey;
157
+
158
+
private $endPoint;
159
+
160
+
private $secureEndPoint;
161
+
162
+
private $enableEncryption;
163
+
164
+
private $enableCompression;
165
+
166
+
private $timeoutSeconds;
167
+
168
+
private $connectTimeoutSeconds;
169
+
170
+
public function __construct($apiKey)
171
+
{
172
+
$this->apiKey = TextRazorSettings::getApiKey();
173
+
$this->endPoint = TextRazorSettings::getEndPoint();
174
+
$this->secureEndPoint = TextRazorSettings::getSecureEndpoint();
175
+
$this->enableEncryption = TextRazorSettings::getEnableEncryption();
176
+
$this->enableCompression = TextRazorSettings::getEnableCompression();
177
+
$this->timeoutSeconds = TextRazorSettings::getTimeoutSeconds();
178
+
$this->connectTimeoutSeconds = TextRazorSettings::getConnectTimeoutSeconds();
179
+
180
+
if (isset($apiKey)) {
181
+
$this->apiKey = $apiKey;
182
+
}
183
+
184
+
if ( ! is_string($this->apiKey)) {
185
+
throw new Exception('TextRazor Error: Invalid API key');
186
+
}
187
+
188
+
if ( ! function_exists('curl_version')) {
189
+
throw new Exception('TextRazor Error: TextRazor requires cURL support to be enabled on your PHP installation');
190
+
}
191
+
}
192
+
193
+
public function setAPIKey($apiKey)
194
+
{
195
+
if ( ! is_string($apiKey)) {
196
+
throw new Exception('TextRazor Error: Invalid API key');
197
+
}
198
+
199
+
$this->apiKey = $apiKey;
200
+
}
201
+
202
+
public function setEndPoint($endPoint)
203
+
{
204
+
if ( ! is_string($endPoint)) {
205
+
throw new Exception('TextRazor Error: Invalid HTTP Endpoint');
206
+
}
207
+
208
+
$this->endPoint = $endPoint;
209
+
}
210
+
211
+
public function setSecureEndPoint($endPoint)
212
+
{
213
+
if ( ! is_string($endPoint)) {
214
+
throw new Exception('TextRazor Error: Invalid HTTPS Endpoint');
215
+
}
216
+
217
+
$this->secureEndPoint = $endPoint;
218
+
}
219
+
220
+
public function setConnectTimeoutSeconds($connectTimeoutSeconds)
221
+
{
222
+
$this->connectTimeoutSeconds = $connectTimeoutSeconds;
223
+
}
224
+
225
+
public function setTimeoutSeconds($timeoutSeconds)
226
+
{
227
+
$this->timeoutSeconds = $timeoutSeconds;
228
+
}
229
+
230
+
public function setEnableCompression($enableCompression)
231
+
{
232
+
if ( ! is_bool($enableCompression)) {
233
+
throw new Exception('TextRazor Error: enableCompression must be a bool');
234
+
}
235
+
236
+
$this->enableCompression = $enableCompression;
237
+
}
238
+
239
+
public function setEnableEncryption($enableEncryption)
240
+
{
241
+
if ( ! is_bool($enableEncryption)) {
242
+
throw new Exception('TextRazor Error: enableEncryption must be a bool');
243
+
}
244
+
245
+
$this->enableEncryption = $enableEncryption;
246
+
}
247
+
248
+
public function sendRequest($textrazorParams, $path = '', $method = 'POST', $contentType = null)
249
+
{
250
+
$curl = curl_init();
251
+
252
+
if ($this->enableEncryption) {
253
+
curl_setopt($curl, CURLOPT_URL, $this->secureEndPoint . $path);
254
+
} else {
255
+
curl_setopt($curl, CURLOPT_URL, $this->endPoint . $path);
256
+
}
257
+
258
+
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
259
+
260
+
if ($this->enableCompression) {
261
+
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
262
+
}
263
+
264
+
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->connectTimeoutSeconds);
265
+
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeoutSeconds);
266
+
267
+
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
268
+
curl_setopt($curl, CURLOPT_POSTFIELDS, $textrazorParams);
269
+
270
+
$headers = [];
271
+
$headers[] = 'X-TextRazor-Key: ' . trim($this->apiKey);
272
+
273
+
if ($contentType) {
274
+
$headers[] = 'Content-Type: ' . $contentType;
275
+
}
276
+
277
+
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
278
+
279
+
$reply = curl_exec($curl);
280
+
281
+
$curlError = curl_errno($curl);
282
+
if (0 != $curlError) {
283
+
throw new Exception('TextRazor Error: Network problem connecting to TextRazor. CURL Error Code:' . $curlError);
284
+
}
285
+
286
+
$httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
287
+
if (200 != $httpStatus) {
288
+
throw new Exception('TextRazor Error: TextRazor returned HTTP code: ' . $httpStatus . ' Message:' . $reply);
289
+
}
290
+
291
+
curl_close($curl);
292
+
unset($curl);
293
+
294
+
$jsonReply = json_decode($reply, true);
295
+
296
+
return $jsonReply;
297
+
}
298
+
}
299
+
300
+
class TextRazor extends TextRazorConnection
301
+
{
302
+
private $extractors = [];
303
+
304
+
private $rules = null;
305
+
306
+
private $cleanupHTML = false;
307
+
308
+
private $languageOverride = null;
309
+
310
+
private $dbpediaTypeFilters = [];
311
+
312
+
private $freebaseTypeFilters = [];
313
+
314
+
private $enrichmentQueries = [];
315
+
316
+
private $allowOverlap = true;
317
+
318
+
private $entityDictionaries = [];
319
+
320
+
private $cleanupMode = null;
321
+
322
+
private $cleanupReturnCleaned = false;
323
+
324
+
private $cleanupReturnRaw = false;
325
+
326
+
private $cleanupUseMetadata = false;
327
+
328
+
private $downloadUserAgent = null;
329
+
330
+
private $classifiers = [];
331
+
332
+
private $classifierMaxCategories = null;
333
+
334
+
public function __construct($apiKey = null)
335
+
{
336
+
parent::__construct($apiKey);
337
+
}
338
+
339
+
public function setExtractors($extractors)
340
+
{
341
+
if ( ! is_array($extractors)) {
342
+
throw new Exception('TextRazor Error: extractors must be an array of strings');
343
+
}
344
+
345
+
$this->extractors = $extractors;
346
+
}
347
+
348
+
public function addExtractor($extractor)
349
+
{
350
+
if ( ! is_string($extractor)) {
351
+
throw new Exception('TextRazor Error: extractor must be a string');
352
+
}
353
+
354
+
array_push($this->extractors, $extractor);
355
+
}
356
+
357
+
public function setClassifiers($classifiers)
358
+
{
359
+
if ( ! is_array($classifiers)) {
360
+
throw new Exception('TextRazor Error: $classifiers must be an array of strings');
361
+
}
362
+
363
+
$this->classifiers = $classifiers;
364
+
}
365
+
366
+
public function addClassifier($classifier)
367
+
{
368
+
if ( ! is_string($classifier)) {
369
+
throw new Exception('TextRazor Error: $classifier must be a string');
370
+
}
371
+
372
+
array_push($this->classifiers, $classifier);
373
+
}
374
+
375
+
public function setRules($rules)
376
+
{
377
+
if ( ! is_string($rules)) {
378
+
throw new Exception('TextRazor Error: rules must be a string');
379
+
}
380
+
381
+
$this->rules = $rules;
382
+
}
383
+
384
+
public function setCleanupHTML($cleanupHTML)
385
+
{
386
+
if ( ! is_bool($cleanupHTML)) {
387
+
throw new Exception('TextRazor Error: cleanupHTML must be a bool');
388
+
}
389
+
390
+
$this->cleanupHTML = $cleanupHTML;
391
+
}
392
+
393
+
public function setLanguageOverride($languageOverride)
394
+
{
395
+
if ( ! is_string($languageOverride)) {
396
+
throw new Exception('TextRazor Error: languageOverride must be a string');
397
+
}
398
+
399
+
$this->languageOverride = $languageOverride;
400
+
}
401
+
402
+
public function setAllowOverlap($allowOverlap)
403
+
{
404
+
if ( ! is_bool($allowOverlap)) {
405
+
throw new Exception('TextRazor Error: allowOverlap must be a bool');
406
+
}
407
+
408
+
$this->allowOverlap = $allowOverlap;
409
+
}
410
+
411
+
public function addEntityDictionary($dictionaryId)
412
+
{
413
+
if ( ! is_string($dictionaryId)) {
414
+
throw new Exception('TextRazor Error: dictionaryId must be a string');
415
+
}
416
+
417
+
array_push($this->entityDictionaries, $dictionaryId);
418
+
}
419
+
420
+
public function addDbpediaTypeFilter($filter)
421
+
{
422
+
if ( ! is_string($filter)) {
423
+
throw new Exception('TextRazor Error: filter must be a string');
424
+
}
425
+
426
+
array_push($this->dbpediaTypeFilters, $filter);
427
+
}
428
+
429
+
public function addFreebaseTypeFilter($filter)
430
+
{
431
+
if ( ! is_string($filter)) {
432
+
throw new Exception('TextRazor Error: filter must be a string');
433
+
}
434
+
435
+
array_push($this->freebaseTypeFilters, $filter);
436
+
}
437
+
438
+
public function addEnrichmentQuery($query)
439
+
{
440
+
if ( ! is_string($query)) {
441
+
throw new Exception('TextRazor Error: query must be a string');
442
+
}
443
+
444
+
array_push($this->enrichmentQueries, $query);
445
+
}
446
+
447
+
public function setCleanupMode($cleanupMode)
448
+
{
449
+
if ( ! is_string($cleanupMode)) {
450
+
throw new Exception('TextRazor Error: Invalid Cleanup Mode');
451
+
}
452
+
453
+
$this->cleanupMode = $cleanupMode;
454
+
}
455
+
456
+
public function setCleanupReturnCleaned($cleanupReturnCleaned)
457
+
{
458
+
if ( ! is_bool($cleanupReturnCleaned)) {
459
+
throw new Exception('TextRazor Error: cleanupReturnCleaned must be a bool');
460
+
}
461
+
462
+
$this->cleanupReturnCleaned = $cleanupReturnCleaned;
463
+
}
464
+
465
+
public function setCleanupReturnRaw($cleanupReturnRaw)
466
+
{
467
+
if ( ! is_bool($cleanupReturnRaw)) {
468
+
throw new Exception('TextRazor Error: cleanupReturnRaw must be a bool');
469
+
}
470
+
471
+
$this->cleanupReturnRaw = $cleanupReturnRaw;
472
+
}
473
+
474
+
public function setCleanupUseMetadata($cleanupUseMetadata)
475
+
{
476
+
if ( ! is_bool($cleanupUseMetadata)) {
477
+
throw new Exception('TextRazor Error: cleanupUseMetadata must be a bool');
478
+
}
479
+
480
+
$this->cleanupUseMetadata = $cleanupUseMetadata;
481
+
}
482
+
483
+
public function setDownloadUserAgent($downloadUserAgent)
484
+
{
485
+
if ( ! is_string($downloadUserAgent)) {
486
+
throw new Exception('TextRazor Error: Invalid downloadUserAgent');
487
+
}
488
+
489
+
$this->downloadUserAgent = $downloadUserAgent;
490
+
}
491
+
492
+
public function setClassifierMaxCategories($classifierMaxCategories)
493
+
{
494
+
$this->classifierMaxCategories = $classifierMaxCategories;
495
+
}
496
+
497
+
public function analyzeUrl($url)
498
+
{
499
+
if ( ! is_string($url)) {
500
+
throw new Exception('TextRazor Error: url must be a UTF8 encoded string');
501
+
}
502
+
503
+
$builder = $this->buildRequest();
504
+
$builder->add('url', $url);
505
+
506
+
return $this->sendRequest($builder->build());
507
+
}
508
+
509
+
private function buildRequest()
510
+
{
511
+
$builder = new TextRazorQueryBuilder();
512
+
513
+
$builder->add('extractors', $this->extractors);
514
+
$builder->add('cleanupHTML', $this->cleanupHTML);
515
+
$builder->add('extractors', $this->extractors);
516
+
$builder->add('rules', $this->rules);
517
+
$builder->add('languageOverride', $this->languageOverride);
518
+
519
+
$builder->add('entities.allowOverlap', $this->allowOverlap);
520
+
$builder->add('entities.filterDbpediaTypes', $this->dbpediaTypeFilters);
521
+
$builder->add('entities.filterFreebaseTypes', $this->freebaseTypeFilters);
522
+
$builder->add('entities.enrichmentQueries', $this->enrichmentQueries);
523
+
$builder->add('entities.dictionaries', $this->entityDictionaries);
524
+
525
+
$builder->add('classifiers', $this->classifiers);
526
+
$builder->add('classifier.maxCategories', $this->classifierMaxCategories);
527
+
528
+
$builder->add('cleanup.mode', $this->cleanupMode);
529
+
$builder->add('cleanup.returnCleaned', $this->cleanupReturnCleaned);
530
+
$builder->add('cleanup.returnRaw', $this->cleanupReturnRaw);
531
+
$builder->add('cleanup.useMetadata', $this->cleanupUseMetadata);
532
+
533
+
$builder->add('download.userAgent', $this->downloadUserAgent);
534
+
535
+
return $builder;
536
+
}
537
+
538
+
public function analyze($text)
539
+
{
540
+
if ( ! is_string($text)) {
541
+
throw new Exception('TextRazor Error: text must be a UTF8 encoded string');
542
+
}
543
+
544
+
$builder = $this->buildRequest();
545
+
$builder->add('text', $text);
546
+
547
+
return $this->sendRequest($builder->build());
548
+
}
549
+
}
550
+
551
+
class DictionaryManager extends TextRazorConnection
552
+
{
553
+
public function __construct($apiKey = null)
554
+
{
555
+
parent::__construct($apiKey);
556
+
}
557
+
558
+
/**
559
+
* Creates a new dictionary using properties provided in the dict $dictionaryProperties.
560
+
* See the properties of class Dictionary for valid options.
561
+
*
562
+
* @param $entityId
563
+
* @param null $matchType
564
+
* @param null $caseInsensitive
565
+
* @param null $language
566
+
*
567
+
* @return mixed
568
+
* @throws \Exception
569
+
*/
570
+
public function createDictionary($entityId, $matchType = null, $caseInsensitive = null, $language = null)
571
+
{
572
+
$request = [];
573
+
574
+
if ( ! is_string($entityId)) {
575
+
throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.');
576
+
}
577
+
578
+
if (isset($matchType)) {
579
+
$request['matchType'] = $matchType;
580
+
}
581
+
if (isset($caseInsensitive)) {
582
+
$request['caseInsensitive'] = $caseInsensitive;
583
+
}
584
+
if (isset($language)) {
585
+
$request['language'] = $language;
586
+
}
587
+
588
+
$encodedRequest = empty($request) ? '{}' : json_encode($request);
589
+
590
+
return $this->sendRequest($encodedRequest, '/entities/' . $entityId, 'PUT');
591
+
}
592
+
593
+
public function allDictionaries()
594
+
{
595
+
return $this->sendRequest('', '/entities/', 'GET');
596
+
}
597
+
598
+
public function deleteDictionary($entityId)
599
+
{
600
+
if ( ! is_string($entityId)) {
601
+
throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.');
602
+
}
603
+
604
+
return $this->sendRequest('', '/entities/' . $entityId, 'DELETE');
605
+
}
606
+
607
+
public function getDictionary($entityId)
608
+
{
609
+
if ( ! is_string($entityId)) {
610
+
throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.');
611
+
}
612
+
613
+
return $this->sendRequest('', '/entities/' . $entityId, 'GET');
614
+
}
615
+
616
+
public function allEntries($entityId, $limit = null, $offset = null)
617
+
{
618
+
if ( ! is_string($entityId)) {
619
+
throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.');
620
+
}
621
+
622
+
$urlParams = [];
623
+
624
+
if (isset($limit)) {
625
+
$urlParams['limit'] = $limit;
626
+
}
627
+
628
+
if (isset($offset)) {
629
+
$urlParams['offset'] = $offset;
630
+
}
631
+
632
+
return $this->sendRequest('', '/entities/' . $entityId . '/_all?' . http_build_query($urlParams), 'GET');
633
+
}
634
+
635
+
public function addEntries($entityId, $entries)
636
+
{
637
+
if ( ! is_array($entries)) {
638
+
throw new Exception('TextRazor Error: Entries must be a List of dicts corresponding to properties of the new DictionaryEntry objects.');
639
+
}
640
+
641
+
if (empty($entries)) {
642
+
throw new Exception('TextRazor Error: Array of new entries cannot be empty.');
643
+
}
644
+
645
+
return $this->sendRequest(json_encode($entries), '/entities/' . $entityId . '/', 'POST');
646
+
}
647
+
648
+
public function getEntry($dictionaryId, $entryId)
649
+
{
650
+
if ( ! is_string($dictionaryId)) {
651
+
throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.');
652
+
}
653
+
654
+
if ( ! is_string($entryId)) {
655
+
throw new Exception('TextRazor Error: Custom Entity Dictionary Entries can only be retrieved by ID.');
656
+
}
657
+
658
+
return $this->sendRequest('', '/entities/' . $dictionaryId . '/' . $entryId, 'GET');
659
+
}
660
+
661
+
public function deleteEntry($dictionaryId, $entryId)
662
+
{
663
+
if ( ! is_string($dictionaryId)) {
664
+
throw new Exception('TextRazor Error: Custom Entity Dictionaries must have an ID.');
665
+
}
666
+
667
+
if ( ! is_string($entryId)) {
668
+
throw new Exception('TextRazor Error: Custom Entity Dictionary Entries can only be deleted by ID.');
669
+
}
670
+
671
+
return $this->sendRequest('', '/entities/' . $dictionaryId . '/' . $entryId, 'DELETE');
672
+
}
673
+
}
674
+
675
+
class ClassifierManager extends TextRazorConnection
676
+
{
677
+
public function __construct($apiKey = null)
678
+
{
679
+
parent::__construct($apiKey);
680
+
}
681
+
682
+
public function createClassifier($classifierID, $categories)
683
+
{
684
+
if ( ! is_string($classifierID)) {
685
+
throw new Exception('TextRazor Error: Classifiers must have an ID.');
686
+
}
687
+
688
+
if ( ! is_array($categories)) {
689
+
throw new Exception('TextRazor Error: $categories must be a List of dicts corresponding to properties of the new Category objects.');
690
+
}
691
+
692
+
if (empty($categories)) {
693
+
throw new Exception('TextRazor Error: Array of new categories cannot be empty.');
694
+
}
695
+
696
+
return $this->sendRequest(json_encode($categories), '/categories/' . $classifierID, 'PUT', 'application/json');
697
+
}
698
+
699
+
public function createClassifierWithCSV($classifierID, $categoriesCSV)
700
+
{
701
+
if ( ! is_string($classifierID)) {
702
+
throw new Exception('TextRazor Error: Classifiers must have an ID.');
703
+
}
704
+
705
+
if ( ! is_string($categoriesCSV)) {
706
+
throw new Exception('TextRazor Error: $categoriesCSV must be a String containing the contents of a csv file that defines a new classifier.');
707
+
}
708
+
709
+
return $this->sendRequest($categoriesCSV, '/categories/' . $classifierID, 'PUT', 'application/csv');
710
+
}
711
+
712
+
public function deleteClassifier($classifierID)
713
+
{
714
+
return $this->sendRequest('', '/categories/' . $classifierID, 'DELETE');
715
+
}
716
+
717
+
public function allCategories($classifierID, $limit = null, $offset = null)
718
+
{
719
+
if ( ! is_string($classifierID)) {
720
+
throw new Exception('TextRazor Error: Classifiers must have an ID.');
721
+
}
722
+
723
+
$urlParams = [];
724
+
725
+
if (isset($limit)) {
726
+
$urlParams['limit'] = $limit;
727
+
}
728
+
729
+
if (isset($offset)) {
730
+
$urlParams['offset'] = $offset;
731
+
}
732
+
733
+
return $this->sendRequest('', '/categories/' . $classifierID . '/_all?' . http_build_query($urlParams), 'GET');
734
+
}
735
+
736
+
public function deleteCategory($classifierID, $categoryID)
737
+
{
738
+
return $this->sendRequest('', '/categories/' . $classifierID . '/' . $categoryID, 'DELETE');
739
+
}
740
+
741
+
public function getCategory($classifierID, $categoryID)
742
+
{
743
+
return $this->sendRequest('', '/categories/' . $classifierID . '/' . $categoryID, 'GET');
744
+
}
745
+
}
746
+
747
+
class AccountManager extends TextRazorConnection
748
+
{
749
+
public function __construct($apiKey = null)
750
+
{
751
+
parent::__construct($apiKey);
752
+
}
753
+
754
+
public function getAccount()
755
+
{
756
+
return $this->sendRequest('', '/account/', 'GET');
757
+
}
758
+
}
759
+