SHOW:
|
|
- or go back to the newest paste.
| 1 | using System; | |
| 2 | using System.IO; | |
| 3 | using System.Collections; | |
| 4 | using System.Collections.Generic; | |
| 5 | using System.Text; | |
| 6 | using System.Linq; | |
| 7 | using System.Text.RegularExpressions; | |
| 8 | ||
| 9 | namespace PandoraBox | |
| 10 | {
| |
| 11 | public class APARTICLEPlugin : IPluginMacro | |
| 12 | {
| |
| 13 | //пример / sample: [APARTICLE] | |
| 14 | Regex _block = new Regex(@"\[AP(FREE){0,1}ARTICLE\]", RegexOptions.Compiled);
| |
| 15 | //кодировка / encoding | |
| 16 | Encoding _enc = Encoding.GetEncoding("windows-1251");
| |
| 17 | //путь к данным / where data is stored | |
| 18 | - | String _root = @"d:\Save\Programming\_projects\PandoraBox\LinkAParser\bin\Debug\ap-data\text"; |
| 18 | + | String _root = @"c:\ap-data\text"; |
| 19 | //сколько минимум предложений должно быть в статье / how many sentances must be in article minimum | |
| 20 | int _minSentances = 10; | |
| 21 | //сколько максимум предложений должно быть в статье / how many sentances must be in article maximum | |
| 22 | int _maxSentances = 999; | |
| 23 | ||
| 24 | public string Execute(string template, PluginMacroArgs args) | |
| 25 | {
| |
| 26 | return _block.Replace(template, delegate(Match match) | |
| 27 | {
| |
| 28 | String key = CleanKey(args.Key); | |
| 29 | String dir = Path.Combine(_root, key); | |
| 30 | bool isFreeText = match.Groups[1].Value.Length > 0; | |
| 31 | if (!Directory.Exists(dir)) //текста по ключу нет, выводим стандартным макросом текста | |
| 32 | return isFreeText ? "[FREETEXT-3-5/p]" : "[TEXT-3-5/p]"; | |
| 33 | String article = GetArticle(dir); | |
| 34 | if (article == null) //статей по требованиям нет, выводим стандартным макросом текста | |
| 35 | return isFreeText ? "[FREETEXT-3-5/p]" : "[TEXT-3-5/p]"; | |
| 36 | if (!isFreeText) article = "{INSERTKEYS}" + article + "{/INSERTKEYS}";
| |
| 37 | return article; | |
| 38 | }); | |
| 39 | } | |
| 40 | ||
| 41 | private string GetArticle(String dir) | |
| 42 | {
| |
| 43 | var files = Shuffle(Directory.GetFiles(dir).ToList()); | |
| 44 | for (int i = 0; i < files.Count; i++) | |
| 45 | {
| |
| 46 | var sentances = File.ReadAllText(files[i], _enc).Split('|');
| |
| 47 | if (sentances.Length >= _minSentances) | |
| 48 | return String.Join("<br />", sentances.Take(_maxSentances));
| |
| 49 | } | |
| 50 | return null; | |
| 51 | } | |
| 52 | ||
| 53 | private string CleanKey(String key) | |
| 54 | {
| |
| 55 | String key1 = key; | |
| 56 | key1 = String.Join("", key1.Split(Path.GetInvalidPathChars()));
| |
| 57 | key1 = String.Join("", key1.Split(Path.GetInvalidFileNameChars()));
| |
| 58 | return key1; | |
| 59 | } | |
| 60 | ||
| 61 | private static List<T> Shuffle<T>(List<T> items) | |
| 62 | {
| |
| 63 | if (items.Count < 2) return items; | |
| 64 | ||
| 65 | for (int i = 0; i < items.Count; i++) | |
| 66 | {
| |
| 67 | int j = Rnd.InnerObject.Next(items.Count); | |
| 68 | T temp = items[i]; | |
| 69 | items[i] = items[j]; | |
| 70 | items[j] = temp; | |
| 71 | } | |
| 72 | return items; | |
| 73 | } | |
| 74 | ||
| 75 | public ushort Level { get { return 5; } }
| |
| 76 | public String Name { get { return "APARTICLEPlugin"; } }
| |
| 77 | } | |
| 78 | } |