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 La Fundación Gilberto Alzate Avendaño, hoy conocida como FUGA, es una entidad del sector cultural del distrito de Bogotá, que lleva un largo recorrido de 49 años de historia consolidándose como uno de los centros artísticos y culturales más importantes de la Capital.
Desde hace 40 años, la FUGA inició su colección de arte, por iniciativa del gestor cultural boyacense Germán Ferrer-Barrera (1942-1994), quien fuera director artístico de la entidad por varios años y quien le dio al espacio su misionalidad cultural, al establecer unos lineamientos artísticos, la realización de eventos propios y una programación regular en las salas de exposición. Este museo funcionó en las salas del segundo piso de la sede, y su apertura significó el inicio de la colección de la FUGA, constituida en su primera fase por un grupo de obras donadas por artistas destacados interesados en apoyar la iniciativa de la fundación.
Desde este espacio, luego conocido simplemente como las salas de exhibición de la FUGA, se han llevado a cabo eventos seriales tales como el Salón del Fuego, que contó con veinte ediciones, el Salón Bidimensional, con seis ediciones, el Premio Bienal, que cuenta ya con cinco versiones, el Salón de Arte Joven, que este año tendrá su tercera edición. Por estos eventos, premios y salones han pasado nombres fundamentales del arte nacional y han ejercido como jurado destacados curadores, artistas y gestores culturales.
Hoy día esta colección se nutre gracias a la adquisición, las donaciones y los premios de adquisición. Estos últimos son una estrategia fundamental para el robustecimiento de la colección, mediado por el criterio de jurados idóneos y en el marco de eventos públicos de importancia nacional como lo es la política de fomento a la creación del Programa Distrital de Estímulos.
La colección de la FUGA cuenta con 360 piezas que abarcan obras de arte moderno y contemporáneo colombiano de los distintos medios y lenguajes de las artes plásticas visuales y audiovisuales, así como por obras de autoría de artistas internacionales.
En lo que va corrido de 2019 la colección se ha exhibido en diferentes espacios externos a la entidad y cada una de esas exposiciones se ha planteado desde la necesidad de visibilizar la serie en su importancia histórica frente a la plástica nacional. Esto ha permitido ofrecerle al público una mirada (aunque breve, de importancia considerable) de algunas obras y de los artistas que conforman la colección. Esta itinerancia se ha llevado a cabo en las bibliotecas que conforman la Bibliored y en alianza con espacios culturales como el Teatro Villa Mayor, y gracias a ella la colección ha circulado por toda Bogotá. De esta manera, la FUGA ha buscado marcar una diferencia en la manera de llevar el arte y la cultura a diferentes públicos, mediante el acercamiento a diferentes expresiones artísticas y a importantes artistas colombianos como Miler Lagos, Guillermo Londoño y Mario Opazo.
De igual manera, la entidad fue invitada a exhibir parte de su colección en la Feria del Millón, que tuvo lugar en un conjunto de edificaciones históricas donde alguna vez estuvo el Hospital San Juan de Dios. Para esta muestra la FUGA propuso la exposición Una mirada a la colección de la FUGA, conformada por varias obras expuestas en dos espacios de la Feria: en el espacio de arte y tecnología, llamado VOLTAJE, se mostró la pieza “Bird” de Julieta María (de la serie “Ejercicios de la fe”, de 2010); en el otro espacio, se dispusieron las obras “Proyecto Río Magdalena. De la serie cuadrante Magdalena medio” de Ernesto Restrepo, un ensamblaje con esmalte, base de agua y soldados de plástico adheridos a una base de madera, del año 2003, y “Familiar Reformada” de la artista María Adelaida López, una obra de 2009.
En 2020 la FUGA cumple 50 años y celebramos la gestión de varios años de una gran colección distrital que atesora valores del arte nacional, fundamentalmente recientes.
Enriquecer, preservar y exhibir la colección de la FUGA es una manera de impactar generaciones venideras, de la misma manera que visitar las salas de exposiciones genera espacios para el disfrute de los derechos culturales de los ciudadanos.
years now, FUGA started its art collection at the initiative of German Ferrer-Barrera (1942-1994), a cultural agent originally from Boyaca (a department located in central Colombia), who was the artistic director of the institution and gave it its mission statement as a cultural organization: he established artistic guidelines, a regular program to be held in the exhibition halls and decided to carry out artistic events. The museum operated in the second floor of the building and its opening meant the beginning of FUGA’s collection, which consisted of a couple of art works donated by well-known artists who were interested in supporting Ferrer-Barrera’s initiative.
Over the course of time the place was simply known as FUGA’s exhibition halls where amazing serial events took place, such as the Salon del Fuego (Fire Hall), the Salon Bidimensional (Two-Dimensional Hall), both of which reached twenty and six editions, respectively, the Premio Bienal (Biennial Prize) with five versions and the Salon de Arte Joven (Hall of Young Art) that will have its third edition this year. We have had the pleasure to have notable names within Colombian plastic arts exhibiting in our halls and acknowledged curators, artists and cultural agents have also participated in our activities.
Today the collection keeps growing thanks to acquisitions, donations and acquisition awards. The latter are a main strategy to enhance the collection, mediated by suitable juries and under the umbrella of public events of national significance, such as the promotion of artistic creation policy carried out by the Programa Distrital de Estimulos (the local incentives program).
FUGA’s collection has 360 pieces, approximately, covering modern and contemporary Colombian art, which represent different languages and media pertaining to visual, audiovisual and plastic arts.
Throughout 2019 the collection has been exhibited outside FUGA. Each of the exhibitions has been put out considering the need to make it visible, from its historical perspective and importance regarding national plastic arts. Therefore, we have been able to give the audience an insight (although brief, very important) into some of the pieces and the artists that are part of the collection. These travelling exhibitions have been held in public libraries that comprise the library network of Bogota and in partnership with cultural spaces such as Teatro Villa Mayor. Thanks to this movement the collection has circulated through the city. By doing so FUGA has intended to make a difference in how to take art and culture to different audiences bringing over different artistic expressions as well as acknowledged Colombian artists, such as Miller Lagos, Guillermo Londoño and Mario Opazo.
Additionally, The Million Fair (a renowned art fair in Bogotá) invited FUGA to exhibit part of its collection in this years’ event. To do so, FUGA decided to set up an exhibition and named it “An insight into FUGA’s collection”. The showing consists of the following pieces: “Bird”, by Julieta María (from the series Ejercicios de la Fe (Faith Exercises), 2010) which was exposed at Voltaje, a space the Fair dedicated to arts and technology; “Proyecto Río Magdalena. De la serie cuadrante Magdalena medio” (Magdalena River Project – from the series Magdalena Medio quadrant), by Ernesto Restrepo (2003), an assembling that uses glaze, water-based and plastic soldiers stuck on a wooden base; and “Familia Reformada” (Reformed Family), by Maria Adelaida Lopez, a piece from 2009.
In 2020 FUGA will turn 50, a cause to celebrate years of cultural management of a local collection that treasures important values of our national plastic arts, mainly recent ones.
To enrich, preserve and exhibit FUGA’s collection is a way to have an impact on upcoming generations, as well as visiting our exhibition halls generates spaces for citizens to enjoy their cultural rights.