/** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ /** * @file * Pathologic text filter for Drupal. * * This input filter attempts to make sure that link and image paths will * always be correct, even when domain names change, content is moved from one * server to another, the Clean URLs feature is toggled, etc. */ /** * Implements hook_filter_info(). */ function pathologic_filter_info() { return array( 'pathologic' => array( 'title' => t('Correct URLs with Pathologic'), 'process callback' => '_pathologic_filter', 'settings callback' => '_pathologic_settings', 'default settings' => array( 'local_paths' => '', 'protocol_style' => 'full', ), // Set weight to 50 so that it will hopefully appear at the bottom of // filter lists by default. 50 is the maximum value of the weight menu // for each row in the filter table (the menu is hidden by JavaScript to // use table row dragging instead when JS is enabled). 'weight' => 50, ) ); } /** * Settings callback for Pathologic. */ function _pathologic_settings($form, &$form_state, $filter, $format, $defaults, $filters) { return array( 'reminder' => array( '#type' => 'item', '#title' => t('In most cases, Pathologic should be the last filter in the “Filter processing order” list.'), '#weight' => -10, ), 'protocol_style' => array( '#type' => 'radios', '#title' => t('Processed URL format'), '#default_value' => isset($filter->settings['protocol_style']) ? $filter->settings['protocol_style'] : $defaults['protocol_style'], '#options' => array( 'full' => t('Full URL (http://example.com/foo/bar)'), 'proto-rel' => t('Protocol relative URL (//example.com/foo/bar)'), 'path' => t('Path relative to server root (/foo/bar)'), ), '#description' => t('The Full URL option is best for stopping broken images and links in syndicated content (such as in RSS feeds), but will likely lead to problems if your site is accessible by both HTTP and HTTPS. Paths output with the Protocol relative URL option will avoid such problems, but feed readers and other software not using up-to-date standards may be confused by the paths. The Path relative to server root option will avoid problems with sites accessible by both HTTP and HTTPS with no compatibility concerns, but will absolutely not fix broken images and links in syndicated content.'), '#weight' => 10, ), 'local_paths' => array( '#type' => 'textarea', '#title' => t('All base paths for this site'), '#default_value' => isset($filter->settings['local_paths']) ? $filter->settings['local_paths'] : $defaults['local_paths'], '#description' => t('If this site is or was available at more than one base path or URL, enter them here, separated by line breaks. For example, if this site is live at http://example.com/ but has a staging version at http://dev.example.org/staging/, you would enter both those URLs here. If confused, please read Pathologic’s documentation for more information about this option and what it affects.', array('!docs' => 'http://drupal.org/node/257026')), '#weight' => 20, ), ); } /** * Pathologic filter callback. * * Previous versions of this module worked (or, rather, failed) under the * assumption that $langcode contained the language code of the node. Sadly, * this isn't the case. * @see http://drupal.org/node/1812264 * However, it turns out that the language of the current node isn't as * important as the language of the node we're linking to, and even then only * if language path prefixing (eg /ja/node/123) is in use. REMEMBER THIS IN THE * FUTURE, ALBRIGHT. * * The below code uses the @ operator before parse_url() calls because in PHP * 5.3.2 and earlier, parse_url() causes a warning of parsing fails. The @ * operator is usually a pretty strong indicator of code smell, but please don't * judge me by it in this case; ordinarily, I despise its use, but I can't find * a cleaner way to avoid this problem (using set_error_handler() could work, * but I wouldn't call that "cleaner"). Fortunately, Drupal 8 will require at * least PHP 5.3.5, so this mess doesn't have to spread into the D8 branch of * Pathologic. * @see https://drupal.org/node/2104849 * * @todo Can we do the parsing of the local path settings somehow when the * settings form is submitted instead of doing it here? */ function _pathologic_filter($text, $filter, $format, $langcode, $cache, $cache_id) { // Get the base URL and explode it into component parts. We add these parts // to the exploded local paths settings later. global $base_url; $base_url_parts = @parse_url($base_url . '/'); // Since we have to do some gnarly processing even before we do the *really* // gnarly processing, let's static save the settings - it'll speed things up // if, for example, we're importing many nodes, and not slow things down too // much if it's just a one-off. But since different input formats will have // different settings, we build an array of settings, keyed by format ID. $cached_settings = &drupal_static(__FUNCTION__, array()); if (!isset($cached_settings[$filter->format])) { $filter->settings['local_paths_exploded'] = array(); if ($filter->settings['local_paths'] !== '') { // Build an array of the exploded local paths for this format's settings. // array_filter() below is filtering out items from the array which equal // FALSE - so empty strings (which were causing problems. // @see http://drupal.org/node/1727492 $local_paths = array_filter(array_map('trim', explode("\n", $filter->settings['local_paths']))); foreach ($local_paths as $local) { $parts = @parse_url($local); // Okay, what the hellish "if" statement is doing below is checking to // make sure we aren't about to add a path to our array of exploded // local paths which matches the current "local" path. We consider it // not a match, if… // @todo: This is pretty horrible. Can this be simplified? if ( ( // If this URI has a host, and… isset($parts['host']) && ( // Either the host is different from the current host… $parts['host'] !== $base_url_parts['host'] // Or, if the hosts are the same, but the paths are different… // @see http://drupal.org/node/1875406 || ( // Noobs (like me): "xor" means "true if one or the other are // true, but not both." (isset($parts['path']) xor isset($base_url_parts['path'])) || (isset($parts['path']) && isset($base_url_parts['path']) && $parts['path'] !== $base_url_parts['path']) ) ) ) || // Or… ( // The URI doesn't have a host… !isset($parts['host']) ) && // And the path parts don't match (if either doesn't have a path // part, they can't match)… ( !isset($parts['path']) || !isset($base_url_parts['path']) || $parts['path'] !== $base_url_parts['path'] ) ) { // Add it to the list. $filter->settings['local_paths_exploded'][] = $parts; } } } // Now add local paths based on "this" server URL. $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path']); $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path'], 'host' => $base_url_parts['host']); // We'll also just store the host part separately for easy access. $filter->settings['base_url_host'] = $base_url_parts['host']; $cached_settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $cached_settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $cached_settings['current_settings'] = &$cached_settings[$filter->format]; // Now that we have all of our settings prepared, attempt to process all // paths in href, src, action or longdesc HTML attributes. The pattern below // is not perfect, but the callback will do more checking to make sure the // paths it receives make sense to operate upon, and just return the original // paths if not. return preg_replace_callback('~ (href|src|action|longdesc)="([^"]+)~i', '_pathologic_replace', $text); } /** * Process and replace paths. preg_replace_callback() callback. */ function _pathologic_replace($matches) { // Get the base path. global $base_path; // Get the settings for the filter. Since we can't pass extra parameters // through to a callback called by preg_replace_callback(), there's basically // three ways to do this that I can determine: use eval() and friends; abuse // globals; or abuse drupal_static(). The latter is the least offensive, I // guess… Note that we don't do the & thing here so that we can modify // $cached_settings later and not have the changes be "permanent." $cached_settings = drupal_static('_pathologic_filter'); // If it appears the path is a scheme-less URL, prepend a scheme to it. // parse_url() cannot properly parse scheme-less URLs. Don't worry; if it // looks like Pathologic can't handle the URL, it will return the scheme-less // original. // @see https://drupal.org/node/1617944 // @see https://drupal.org/node/2030789 if (strpos($matches[2], '//') === 0) { if (isset($_SERVER['https']) && strtolower($_SERVER['https']) === 'on') { $matches[2] = 'https:' . $matches[2]; } else { $matches[2] = 'http:' . $matches[2]; } } // Now parse the URL after reverting HTML character encoding. // @see http://drupal.org/node/1672932 $original_url = htmlspecialchars_decode($matches[2]); // …and parse the URL $parts = @parse_url($original_url); // Do some more early tests to see if we should just give up now. if ( // If parse_url() failed, give up. $parts === FALSE || ( // If there's a scheme part and it doesn't look useful, bail out. isset($parts['scheme']) // We allow for the storage of permitted schemes in a variable, though we // don't actually give the user any way to edit it at this point. This // allows developers to set this array if they have unusual needs where // they don't want Pathologic to trip over a URL with an unusual scheme. // @see http://drupal.org/node/1834308 // "files" and "internal" are for Path Filter compatibility. && !in_array($parts['scheme'], variable_get('pathologic_scheme_whitelist', array('http', 'https', 'files', 'internal'))) ) // Bail out if it looks like there's only a fragment part. || (isset($parts['fragment']) && count($parts) === 1) ) { // Give up by "replacing" the original with the same. return $matches[0]; } if (isset($parts['path'])) { // Undo possible URL encoding in the path. // @see http://drupal.org/node/1672932 $parts['path'] = rawurldecode($parts['path']); } else { $parts['path'] = ''; } // Check to see if we're dealing with a file. // @todo Should we still try to do path correction on these files too? if (isset($parts['scheme']) && $parts['scheme'] === 'files') { // Path Filter "files:" support. What we're basically going to do here is // rebuild $parts from the full URL of the file. $new_parts = @parse_url(file_create_url(file_default_scheme() . '://' . $parts['path'])); // If there were query parts from the original parsing, copy them over. if (!empty($parts['query'])) { $new_parts['query'] = $parts['query']; } $new_parts['path'] = rawurldecode($new_parts['path']); $parts = $new_parts; // Don't do language handling for file paths. $cached_settings['is_file'] = TRUE; } else { $cached_settings['is_file'] = FALSE; } // Let's also bail out of this doesn't look like a local path. $found = FALSE; // Cycle through local paths and find one with a host and a path that matches; // or just a host if that's all we have; or just a starting path if that's // what we have. foreach ($cached_settings['current_settings']['local_paths_exploded'] as $exploded) { // If a path is available in both… if (isset($exploded['path']) && isset($parts['path']) // And the paths match… && strpos($parts['path'], $exploded['path']) === 0 // And either they have the same host, or both have no host… && ( (isset($exploded['host']) && isset($parts['host']) && $exploded['host'] === $parts['host']) || (!isset($exploded['host']) && !isset($parts['host'])) ) ) { // Remove the shared path from the path. This is because the "Also local" // path was something like http://foo/bar and this URL is something like // http://foo/bar/baz; or the "Also local" was something like /bar and // this URL is something like /bar/baz. And we only care about the /baz // part. $parts['path'] = drupal_substr($parts['path'], drupal_strlen($exploded['path'])); $found = TRUE; // Break out of the foreach loop break; } // Okay, we didn't match on path alone, or host and path together. Can we // match on just host? Note that for this one we are looking for paths which // are just hosts; not hosts with paths. elseif ((isset($parts['host']) && !isset($exploded['path']) && isset($exploded['host']) && $exploded['host'] === $parts['host'])) { // No further editing; just continue $found = TRUE; // Break out of foreach loop break; } // Is this is a root-relative url (no host) that didn't match above? // Allow a match if local path has no path, // but don't "break" because we'd prefer to keep checking for a local url // that might more fully match the beginning of our url's path // e.g.: if our url is /foo/bar we'll mark this as a match for // http://example.com but want to keep searching and would prefer a match // to http://example.com/foo if that's configured as a local path elseif (!isset($parts['host']) && (!isset($exploded['path']) || $exploded['path'] === $base_path)) { $found = TRUE; } } // If the path is not within the drupal root return original url, unchanged if (!$found) { return $matches[0]; } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. $parts['path'] = ltrim($parts['path'],'/'); // Examine the query part of the URL. Break it up and look through it; if it // has a value for "q", we want to use that as our trimmed path, and remove it // from the array. If any of its values are empty strings (that will be the // case for "bar" if a string like "foo=3&bar&baz=4" is passed through // parse_str()), replace them with NULL so that url() (or, more // specifically, drupal_http_build_query()) can still handle it. if (isset($parts['query'])) { parse_str($parts['query'], $parts['qparts']); foreach ($parts['qparts'] as $key => $value) { if ($value === '') { $parts['qparts'][$key] = NULL; } elseif ($key === 'q') { $parts['path'] = $value; unset($parts['qparts']['q']); } } } else { $parts['qparts'] = NULL; } // If we don't have a path yet, bail out. if (!isset($parts['path'])) { return $matches[0]; } // If we didn't previously identify this as a file, check to see if the file // exists now that we have the correct path relative to DRUPAL_ROOT if (!$cached_settings['is_file']) { $cached_settings['is_file'] = !empty($parts['path']) && is_file(DRUPAL_ROOT . '/'. $parts['path']); } // Okay, deal with language stuff. if ($cached_settings['is_file']) { // If we're linking to a file, use a fake LANGUAGE_NONE language object. // Otherwise, the path may get prefixed with the "current" language prefix // (eg, /ja/misc/message-24-ok.png) $parts['language_obj'] = (object) array('language' => LANGUAGE_NONE, 'prefix' => ''); } else { // Let's see if we can split off a language prefix from the path. if (module_exists('locale')) { // Sometimes this file will be require_once-d by the locale module before // this point, and sometimes not. We require_once it ourselves to be sure. require_once DRUPAL_ROOT . '/includes/language.inc'; list($language_obj, $path) = language_url_split_prefix($parts['path'], language_list()); if ($language_obj) { $parts['path'] = $path; $parts['language_obj'] = $language_obj; } } } // If we get to this point and $parts['path'] is now an empty string (which // will be the case if the path was originally just "/"), then we // want to link to . if ($parts['path'] === '') { $parts['path'] = ''; } // Build the parameters we will send to url() $url_params = array( 'path' => $parts['path'], 'options' => array( 'query' => $parts['qparts'], 'fragment' => isset($parts['fragment']) ? $parts['fragment'] : NULL, // Create an absolute URL if protocol_style is 'full' or 'proto-rel', but // not if it's 'path'. 'absolute' => $cached_settings['current_settings']['protocol_style'] !== 'path', // If we seem to have found a language for the path, pass it along to // url(). Otherwise, ignore the 'language' parameter. 'language' => isset($parts['language_obj']) ? $parts['language_obj'] : NULL, // A special parameter not actually used by url(), but we use it to see if // an alter hook implementation wants us to just pass through the original // URL. 'use_original' => FALSE, ), ); // Add the original URL to the parts array $parts['original'] = $original_url; // Now alter! // @see http://drupal.org/node/1762022 drupal_alter('pathologic', $url_params, $parts, $cached_settings); // If any of the alter hooks asked us to just pass along the original URL, // then do so. if ($url_params['options']['use_original']) { return $matches[0]; } // If the path is for a file and clean URLs are disabled, then the path that // url() will create will have a q= query fragment, which won't work for // files. To avoid that, we use this trick to temporarily turn clean URLs on. // This is horrible, but it seems to be the sanest way to do this. // @see http://drupal.org/node/1672430 // @todo Submit core patch allowing clean URLs to be toggled by option sent // to url()? if (!empty($cached_settings['is_file'])) { $cached_settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$cached_settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = TRUE; } } // Now for the url() call. Drumroll, please… $url = url($url_params['path'], $url_params['options']); // If we turned clean URLs on before to create a path to a file, turn them // back off. if ($cached_settings['is_file'] && !$cached_settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = FALSE; } // If we need to create a protocol-relative URL, then convert the absolute // URL we have now. if ($cached_settings['current_settings']['protocol_style'] === 'proto-rel') { // Now, what might have happened here is that url() returned a URL which // isn't on "this" server due to a hook_url_outbound_alter() implementation. // We don't want to convert the URL in that case. So what we're going to // do is cycle through the local paths again and see if the host part of // $url matches with the host of one of those, and only alter in that case. $url_parts = @parse_url($url); if (!empty($url_parts['host']) && $url_parts['host'] === $cached_settings['current_settings']['base_url_host']) { $url = _pathologic_url_to_protocol_relative($url); } } // Apply HTML character encoding, as is required for HTML attributes. // @see http://drupal.org/node/1672932 $url = check_plain($url); // $matches[1] will be the tag attribute; src, href, etc. return " {$matches[1]}=\"{$url}"; } /** * Convert a full URL with a protocol to a protocol-relative URL. * * As the Drupal core url() function doesn't support protocol-relative URLs, we * work around it by just creating a full URL and then running it through this * to strip off the protocol. * * Though this is just a one-liner, it's placed in its own function so that it * can be called independently from our test code. */ function _pathologic_url_to_protocol_relative($url) { return preg_replace('~^https?://~', '//', $url); } Сказки Крапивенского поля | КОММУНИСТИЧЕСКАЯ ПАРТИЯ БЕЛАРУСИ

Сказки Крапивенского поля

Битва под Оршей, которая произошла 500 лет назад, 8 сентября 1514 года, на Крапивенском поле между московской ратью и литовско-польской армией, событие на редкость политизированное. Рассказы о нем напоминают беседу четы Пустаревичей из «Паўлінкі» Янки Купалы. Пранцысь утверждал, что «пранцуз» идет на Борисов и ведет с собой четыреста тысяч войск. Агата возражала мужу: не четыреста тысяч, а четыре сотни тысяч. Большинство публикаций об Оршанской битве соответствуют уровню этой «дискуссии», высмеянной нашим классиком. Только место «пранцуза» занял «злобный московит».

Устами историка…
Четверть века искусственно нагнетается истерия вокруг сражения 500-летней давности. Любопытно, что никто так и не удосужился провести мало-мальски достойное научное исследование. Изучить источники, сравнить их, верифицировать. То есть сделать положенную историку работу. Соревновались лишь в степени восхваления победителей, уничижительно-издевательских оценках побежденных. Некоторые в особом псевдопатриотическом угаре даже умудрились переименовать гетмана Константина Острожского в Кастуся. Хотел бы я посмотреть на того смельчака, который бы обратился подобным образом к Константину Ивановичу. Ох, недалеко бы отбежал он от гетманского коня и прошлась бы сабелька по его неразумной головушке!

Казалось, все так и будет идти по накатанной дорожке. Но в 2009 году стали появляться работы питерского историка Алексея Лобина. Уже его первые публикации заставляли пересмотреть устоявшиеся стереотипы о сражении.

А монография «Битва под Оршей 8 сентября 1514 года», которая вышла в 2011 году, сразу всколыхнула научный мир. Убедительность аргументов, авторский метод подсчета вооруженных сил сторон, основанный на прекрасном знании эпохи, введение в научный оборот новых исторических источников – все это сделало книгу единственным на данный момент комплексным исследованием Оршанской битвы 1514 года.

Сторонники старой концепции ничем не смогли крыть, кроме пустых обвинений в имперскости, которые сразу же разрушались о высокий научный стиль и авторитет А.Лобина.

О чем же пишет автор? Приведем его доводы тезисно с нашими скромными вкраплениями и комментариями.

Во-первых, А.Лобин убедительно доказывает, что никаких грандиозных завоевательных задач русское войско осенью 1514 года больше не ставило. Основная цель кампании – взятие Смоленска – была достигнута. Городом овладели с третьего раза ценой серьезного напряжения сил. Армия Ивана Челяднина и Михаила Булгакова-Голицы сосредоточилась на днепровском рубеже, а их дальнейшие планы были весьма туманны.

Во-вторых, настойчиво повторяемая в ряде источников численность сражающихся на Крапивенском поле под Оршей в 30 тысяч у польско-литовской армии и 80 тысяч у московской не может считаться достоверной и является сильно завышенной. Проведя скрупулезный анализ состояния вооруженных сил двух государств в начале XVI века, А. Лобин пришел к следующим выводам. Московская рать насчитывала 12 тысяч человек, максимум 15 тысяч. В отношении ВКЛ историк обратил внимание на крайне низкие темпы мобилизации. Шляхта попросту отказывалась воевать – явление, довольно характерное для XVI – XVII веков и до сих пор недостаточно изученное.

А.Лобин привел схему расположения польско-литовской армии гетмана К.И.Острожского. На правом фланге до 4 тыс. поветовых хоругвей и господской почты под командованием Ю. Радзивилла. На левом – 2,5 тыс. польских добровольцев

Я. Тарновского и отряд придворных рыцарей Я. Самполинского. В центре – до 11 полевых орудий и 6,6 тыс. наемников Спергальдта и Я. Сверчовского. Всего порядка 13 тыс. человек при очевидном численном превосходстве представителей Короны и наемников над выходцами из ВКЛ.

В-третьих, потери сторон действительно были значительны. Погибло на поле боя или попало в плен почти все командование московской рати. Но распространенные данные о 30 тысячах (или даже 40 тысячах) убитых и пленных московитах далеки от реальности. Для сравнения, например, А. Лобин точно установил, что количество захваченных коней завышено в четыре раза.

В-четвертых, историк на основании вновь выявленных исторических документов опровергает один из главных аргументов сторонников «оршанского мифа». Будто бы битва положила конец геополитическому союзу Великого княжества Московского и Священной Римской империи, который должен был привести к разделам как Польши, так и ВКЛ. Само значение этого альянса, мягко говоря, несколько преувеличено, а его распад имел к событиям на Крапивенском поле весьма косвенное отношение. По большому счету, никакой оформленной коалиции так и не было создано. Лишь 2 февраля 1514 года в Москве был составлен проект русско-германского союзного договора. 7 марта русские послы отправились в Вену. 24 июня (то есть еще до битвы!) императорские войска должны были выступить против Польши. Однако этого не произошло, и польские рыцари преспокойно отправились походом к Днепру. 4 августа (опять-таки до сражения!) русским послам вручили ответ императора Максимилиана. 17 декабря великий князь Василий Иванович ознакомился с грамотой и категорически отказался от предложений германской стороны. А. Лобин делает вывод: «Таким образом, не результаты Оршанской битвы, а попытка императора через своих послов Я. Ослера и М. Бургшталлера, прибывших в декабре1514 г. внести изменения в текст договора, фактически привела к «заморозке» русско-австрийского союза».

Кстати, детально проработанные выводы современного историка подтвердил еще в XVI в. императорский посол Сигизмунд Герберштейн. В своих «Записках о Московии» он отметил, что «эта победа не дала королю ничего кроме возвращения трех крепостей по сю сторону Смоленска».

Сближению Вены и Кракова способствовала не битва под Оршей, а отказ короля Сигизмунда от претензий на Чехию и Моравию.

Говоря о дипломатических последствиях сражения (точнее их отсутствии), следует добавить, что в марте 1517 года был заключен русско-тевтонский союзный договор, и через два года началась очередная война Польши и Ордена.

В-пятых, не соответствуют действительности рассуждения о «судьбоносности» битвы, будто бы она предотвратила на полвека «вторжения Москвы». Бои продолжались и в дальнейшем. В октябре 1517 года армия ВКЛ под командованием оршанских победителей К. Острожского, Ю. Радзивилла, Я. Сверчовского потерпела сокрушительное поражение под Опочкой, потеряв тысячи воинов, оставив орудия и обоз. В 1518 году московская армия совершила глубокий рейд по территории ВКЛ в направлении Полоцка, Минска, Новогрудка и Молодечно, конные разъезды доходили до предместий Вильно. Русско-литовскую войну 1512 – 1514 годов ВКЛ проиграло: Смоленщина отошла под власть Москвы.

Тому, что война 1512 – 1522 гг. не стала для ВКЛ полной катастрофой, способствовало два обстоятельства: московская армия не умела брать хорошо укрепленные города (впрочем, кстати, как и литовская), а также действия крымского хана. Летом 1521 года крымцы совершили опустошительный поход на Москву. Были сожжены многие села, города, монастыри. В полон угнали сотни тысяч русских людей.

Оба великих княжества, и Литовское, и Московское, были истощены и вынуждены заключить перемирие.

Продукт пропаганды
На самом деле, легенда об Оршанской битве – результат искусной ягеллонской пропаганды. На фоне разительных поражений от московского государства, королю Сигизмунду просто необходимо было зацепиться за какое-то событие, чтобы показать перелом в долгом противостоянии. И ему это блестяще удалось!

Но поляки были далеко не первооткрывателями подобного хитроумного хода. Большинство более-менее значимых сражений древности и средневековья предстают в источниках событиями просто-таки космического масштаба. Так, если верить летописям, то на Куликовом поле полегло от 100 до 200 тысяч человек, а обе рати насчитывали многие сотни тысяч. Еще совсем недавно историки всерьез писали, что у Грюнвальда 163 тысячам польско-литовского войска противостояло 83 тысячи тевтонских рыцарей. А некоторые хронисты преувеличивали количество сражающихся и погибших в десятки раз!

Кстати, именно Грюнвальдская битва, произошедшая за сто лет до Оршанской, дает еще один яркий пример успешной и искусной пропаганды. Польский исследователь А. Грабский и литовский М. Ючас в своих работах показали, как тевтонская дипломатия сумела представить дело таким образом, чтобы создать негативный образ короля Владислава II Ягайло и великого князя Витовта в Западной Европе. Первый рисовался как коварный изменник, предавшийся язычникам, а второй и вовсе как предводитель сарацин. А заветной целью их военного похода было якобы уничтожение христианской веры. Именно так на битву и смотрели поначалу в Европе. Король Англии Генрих IV укорял Ягайло, а его французский собрат Карл VI грозил войной. Эта пропаганда имела самые непосредственные политические последствия. В итоге, несмотря на военное поражение, Орден не только сохранился, но и едва не организовал международную изоляцию Польши и Литвы.

Придуманный «праздник»
Весьма странно представлять 8 сентября как «День белорусской воинской славы». С чего вдруг? Такой традиции не было на протяжении столетий. Оршанскую битву по заслугам признавали значимым событием своего времени, но не более того. Кстати, в дипломатической переписке того времени в качестве героев сражения упоминаются в основном поляки. Исключение сделано только для гетмана Острожского.

В своих посланиях король Сигизмунд особо подчеркивал, что «схизматики» потерпели поражение от своего же единоверца.

Константин Иванович Острожский был, безусловно, фигурой выдающейся. Правда, говорить о его «белорусскости» можно весьма условно. Происхождение князей Острожских является предметом споров, в ВКЛ этот род относился к волынским панам, на Волыни находилась и семейная твердыня – знаменитый Острог. Хотя в те времена восточнославянское население Великого княжества Литовского никто не делил. Все они были русскими людьми.

Острожский знал в своей жизни и великие победы, и сокрушительные поражения. Гетман прославился как стойкий защитник и покровитель православия. Таким был и его сын Константин. И вот эту главную битву своего рода – оборону православной веры – Острожские, к сожалению, проиграли. Уже при жизни Константина Константиновича два его сына изменили вере предков. Правнучка оршанского триумфатора Анна-Алоиза стала жестокой гонительницей православия, окрестив по латинскому обряду даже кости своего покойного отца. А вскоре прервался и сам род…

В белорусской истории имеется много других славных страниц, в том числе и боевых, значение которых затмевают события 1514 года. Хвалебное и патетическое отношение к битве под Оршей не характерно для белорусской исторической традиции. М. Довнар-Запольский характеризовал битву как «страшное поражение, которое москвичи понесли под Оршей от князя Острожского», и только. Без всякого эмоционального надрыва, почти в одних выражениях о битве вспоминают В. Ластовский и В. Игнатовский, которые вовсе не отводили ему роль «коренного перелома», подчеркивая, что противостояние продолжалось и впоследствии.

Контора пишет!
И еще пару забавных сказок Крапивенского поля.

Некоторые «краеведы» всерьез утверждают, что Острая брама в Вильно была названа в честь князя Острожского. Действительно, въездную башню в столице ВКЛ построили в начале XVI века, но название ее происходит от южного предместья города – Острого конца, а никак не от княжеского рода.

Другие «специалисты» повествуют, будто бы бело-красно-белый флаг напрямую связан с треугольными флажками на пиках литовско-польской конницы, которые изображены на известной картине «Битва под Оршей». На самом деле, авторство этого флага принадлежит архитектору Клавдию Дуж-Душевскому, и основой для него послужили не какие-то исторические прототипы, а орнамент, характерный для Беларуси. Флажки на пиках – это символ Святого Георгия, покровителя рыцарей. Он встречается во многих странах. Например, является национальным знаменем Англии и Грузии. На этом основании наши «краеведы» могли бы смело предположить британское или кавказское происхождение белорусов. А что? Одной байкой больше, одной меньше… С них не убудет!

При праздновании Оршанской битвы неизменно исполняется «Слава Воршы ўжо не горша…», якобы историческая песня XVI века. Но еще в 2009 году известный знаток белорусских старинных текстов Олег Лицкевич убедительно доказал, что эта песня – мистификация, подделка, принадлежащая перу Вацлава Ластовского. Она не является аутентичной фольклорной песней, а тем более историческим источником.

Оршанская битва уже давно стала частью «литвинской легенды», до крайности русофобской в основе своей. По этой концепции вся история Беларуси предстает как некое титаническое противостояние с Россией. Ее адептов, которые все время повторяют мантры о некой «правдивой истории», никакие исследования, источники и архивы не интересуют. Как Портос у Дюма дрался, потому что он дрался, так и для них миф важен сам по себе в отрыве от реальных фактов. Впрочем, никому нельзя запретить создавать мифы и верить в них. Но, может быть, тогда стоит хотя бы историю оставить в покое?

Автор: 
Вадим ГИГИН
Номер газеты: 

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
1 + 2 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.