/** * 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. * * @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. $settings = &drupal_static(__FUNCTION__, array()); if (!isset($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… if ( ( // If this URI has a host, and… isset($parts['host']) && // The host is different from the current host… $parts['host'] !== $base_url_parts['host'] ) || // 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']; // Let's also normalize the server doc root. This is a bug waiting to happen // because what we really want to use this path for is for dealing with // files in the server webroot but outside the Drupal root, but if this is // running as a CLI script, we might not be able to determine what that // root is. In that case, we'll use the Drupal root. // @see http://drupal.org/node/1780398 $filter->settings['docroot'] = (drupal_is_cli() || !isset($_SERVER) || !isset($_SERVER['DOCUMENT_ROOT'])) ? DRUPAL_ROOT : $_SERVER['DOCUMENT_ROOT']; $settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $settings['current_settings'] = &$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 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 // $settings later and not have the changes be "permanent." $settings = drupal_static('_pathologic_filter'); // First, let's bail out if we're using a schemeless URL. // @see http://drupal.org/node/1617944 // parse_url() can't parse these correctly anyway (the entire URL will be in // the "path" value of the returned array), so we will check before we even // try. if (strpos($matches[2], '//') === 0) { return $matches[0]; } // 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. // "files" and "internal" are for Path Filter compatibility. || (isset($parts['scheme']) && !in_array($parts['scheme'], 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. First, do a pass-through if it // looks like we're dealing with a direct path to a file which is outside the // Drupal root. Use realpath() and the server's (?) docroot to iron out // wrinkles to the file's actual path. // @see http://drupal.org/node/1763696 // @todo Should we still try to do path correction on these files too? $filepath = realpath($settings['current_settings']['docroot'] . '/' . $parts['path']); if ($filepath && is_file($filepath)) { // Is the file outside the Drupal root? if (strpos($filepath, DRUPAL_ROOT) !== 0) { return $matches[0]; } else { // Linking to a file inside the Drupal root. Okay. $settings['is_file'] = TRUE; } } elseif (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. $settings['is_file'] = TRUE; } else { $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 ($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; } } // Okay, if here, we either found something, or we hit the end of the loop. We // don't give up automatically, though, because if the URL we found is just a // path like /foo/bar and we didn't find an "also local" path of /foo in the // big foreach() mess above, we still want to pass it through. if (!$found && !(isset($parts['path']) && !isset($parts['host']))) { return $matches[0]; } // 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]; } // Let's see if we can split off a language prefix from the path. if (!$settings['is_file']) { 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; } } } else { // 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' => ''); } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. // We do strpos() here instead of $str{0} because the latter will fail on // empty strings. if (strpos($parts['path'], '/') === 0) { $parts['path'] = substr($parts['path'], 1); } // 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' => $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, $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 enabled, 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($settings['is_file'])) { $settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$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 ($settings['is_file'] && !$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 ($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'] === $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); } Den vise mannen ifrån Persien. | IHM

Den vise mannen ifrån Persien.

Hej igen alla, man behöver ingen almanacka för att se att julen närmar sig, det räcker att se den ökande frekvensen av stora plastkassar i händerna på lätt panikslagna människor. Men håll ut, för snart kommer lugnet, om du vill, redan nu, så slå dig ner, låt axlarna sjunka, andas och läs den mycket efterfrågade berättelsen om den vise mannen ifrån Persien.

Slappna av…

…eller vänta tills du har tid.

En gång för mycket, mycket länge sedan, det var kallt, snöade och pulsen var ovanligt hög, allt måste fixas, allt måste vara klart, jag hinner, jag ska bara, för snart, snart kan jag luta mig tillbaka, njuta av, känna dofterna, förväntningarna och friden, för nu ska det bli den bästa julen i mannaminne. Med alla kassarna i ett fast grepp slängde jag mig in i en tobaksaffär för att göra några sista inköp. Jag fastnade lite i dörren, men med milt våld lyckades jag till slut baxa mig in. Det var varmt och glasögonen immade igen, helvete, jag försökte lyfta armen och gnugga bort lite imma, jag ser ju för fan ingenting. Ja, ni kan säkert se scenen framför er, en något för stor man, med alldeles för många kassar, högröd i ansiktet och helt igenimmade glasögon, i en väldigt liten tobaksaffär, med alldeles för många ställ för vykort, kvällstidningar, nya sorters choklad m.m. m.m. Katastrofen närmade sig…

…då, plötsligt, från ett litet paket, eller egentligen bakom paketet, hörs en röst: – Varmt välkommen ska du vara! Fortfarande lätt förblindad ser jag en suddig liten man närma sig, sträcker ut sina händer mot mina kassar och säger: – Kassarna kan vi ställa här och här får du en servett till dina fina ögon. Lite lätt omtumlad pressar jag fram: – Jag ska bara. Hinner inte längre innan han fortsätter: – Jag är mycket glad att du är här, jag heter Shahin och har precis bryggt oss en kopp te. Mina kassar står i hörnet, jag ser igen och följer efter den lilla mannen mot ett litet bord i hörnet av den lilla, lilla lokalen. – Här kan du sitta. Han häller upp en kopp te och räcker över till mig, förvånande nog tar jag emot den, jag gillar inte te egentligen.

Jag tar en klunk och tittar på den lilla mannen, han har stora bruna ögon, ja, de blir nästan gigantiska när de förstoras i hans glasögon, ett brett leende och grått, nästan vitt mjukt hår som lockar sig i hans panna. – Det var roligt att du kom idag, min lilla tehörna är precis klar, jag har väntat på min mors gamla matta som kom idag från hennes hemland. Jag tittade ner och såg en fantastisk mönstrad matta. – Det är ditt första besök här, och min första besökare, du ser vad mycket vi har gemensamt sa Shahin och log om möjligt ännu bredare. Efter en stunds tystnad frågar han mig vad han kan hjälpa till med.

Jag ställer ner min kopp. – Jag ska egentligen bara ha ett paket cigaretter och någon tidning med julens alla TV-program. – Då har du tur säger Shahin, jag har precis det. Han hämtar snabbt det jag frågat efter, tom rätt märke på cigaretterna.  – En liten gåva från mig säger den lille mannen och sträcker fram en tändare. Jag tittar på den röda tändaren och läser, Shahins Tbak och glädje. Tbak, mumlar jag försiktigt, jag har ändå precis fått en gåva, en felstavad röd gåva, från en man jag aldrig har träffat förut. – Ja, säger Shahin, Tbak, jag vill att du kommer tbak, och jag vill att du ska vara glad. Han ler igen, jag ler tillbaka och ber att få betala för mina varor, och så önskar jag min nyfunne lilla vän god jul. – Ännu godare jul till dig, din familj och dina vänner säger Shahin samtidigt som han plockar fram mina kassar, öppnar dörren, ler och vinkar glatt till några som passerar. Att de inte vinkar tillbaka verkar inte beröra Shahin. – Vi ses en annan dag säger jag och sätter fart hem.

Väl hemma så sätter jag igång och fixar allt som ska fixas, lite glögg medan jag griljerar skinkan. Min flickvän kommer hem med ännu mer kassar, frusen och med ett hemskt humör. Välkommen hem säger jag samtidigt som jag sträcker mig efter hennes kassar, vilken tur att du kom precis nu, kom och sätt dig här för jag har precis värmt lite glögg, och det är första gången jag ska smaka på årets glögg. Hon sjunker ner i stolen och tar en mun, lutar sig tillbaka och slappnar av. Du kan väl titta om det kommer något trevligt på TV medan jag fixar det sista, tidningen ligger på bordet. Jag går in och rör om lite i rödkålen som puttrar på spisen, kollar potatisen och plockar fram den där riktigt goda senapen jag längtat efter. 

Plötsligt ropar min flickvän. – Vem är Shahin? – Va? Hon upprepar sin fråga, – Vem är Shahin? Jag stänger av spisen och går ut till vardagsrummet, hon sitter och läser tidningen med julens alla TV-program, hon tittar upp på mig. – Vem är Shahin? säger hon och ler. – Ja, det är tobakshandlaren jag träffade idag men hur vet du det frågar jag. – Han har skrivit här i tidningen säger hon. Jag tittar i tidningen och ser att den är full med gula streck från en överstrykningspenna, och längst upp står det: Godare Jul. Det finns ingen bättre gåva än tid, tid att ta till vara på. Jag har markerat de program du kan titta på för att spara lite tid. Den tiden kan du ge till någon annan. Din vän Shahin.

Först blir jag förbannad, han kan ju inte bara skriva i min tidning. Min flickvän ler och läser vidare, efter en stund skrattar hon till, här har han skrivit mer. Jag sätter mig i soffan och hon flyttar över, vi läser tillsammans. Mellan två annonser har han skrivit: Just nu har jag extrapris på Tbak, välkommen. Min flickvän skrattar lite åt vad hon tror är en felstavning av tobak och jag visar tändaren jag fått i present, jag berättar att han menar att jag ska komma tillbaka, tbak, och att jag ska vara glad. – Ni verkar ha en hel del gemensamt säger hon. Lite längre fram har han skrivit igen: Om man inte gillar te, gillar man inte att träffas. Just nu xtra pris om du kommer tbak. Jag funderar en stund men sätter sedan igång med den sista julmaten.

Julen kommer och vi följer vårt noga planerade schema, hennes familj, min familj, en grav, hennes familj nr 2, några samtal, en snabb glögg med några vänner och mycket, mycket mat. Paket som öppnas, paket som lämnas, paket, paket, oj ett glömt paket, fixa, pust. På annandagen är det över, och lugnet har kommit, både jag och flickvännen sitter försjunkna i var sin bok. Efter en stund ser jag att mina cigaretter är slut så jag slänger på mig en jacka och går ut, undrar vad som är öppet?

De närmsta affärerna har stängt så jag promenerar en bit och ser snart att det lyser inne hos Shahin, han har hängt upp en stor julstjärna och när jag öppnar dörren så hör jag någon hemsk dansbandsmusik. Shahin ler glatt och tar emot mig med öppna armar, välkommen tbak min vän. Han tar min hand och leder mig mot tehörnan, där sitter vad jag förmodar är hans fru och en pojk med lika stora ögon som Shahin. –  Jag visste inte vilken tid du skulle komma så vi har väntat med att äta säger Shahin, min fru har lagat Ashe Mast, en soppa som vi egentligen äter i mars, på nyår. –  Men jag kom bara för att köpa cigaretter. – Bara? Inte bara, det är det jag lever av! Och du sa att vi ses en annandag, och det är idag sa Shahin och såg lite förvånad ut. – Men min flickvän sitter hemma och väntar försöker jag. – Men kan hon inte vänta här med oss säger Shahin och lyfter på telefonluren, och ler. Jag ringer hem och försöker förklara att det har blivit ett litet missförstånd, jag har tackat ja till en liten julfest hos Shahin, tobakshandlaren, så du kan väl slänga på dig en jacka och komma ner. Min flickvän skrattar och säger: – Visst, den där gubben vill jag träffa.

När min flickvän kommer så slänger sig Shahin fram och kramar om henne, – Äntligen är hela familjen samlad, jag har hört så mycket gott om dig. Men sätt dig nu till bords så kan vi äta. Han presenterar sin fru och sin son och börjar sjunga – Leende guldbruna ögon, Har jag förälskat mig I, Just dina guldbruna ögon, Så blå kan de aldrig mer bli. Jag älskar svensk folkmusik säger Shahin, det här var den första texten jag lärde mig, och då förstod jag att jag hittat mitt hemland, det var min fru de sjöng om, och min son, och det kunde vara jag som sjöng. Jag tittar på hans fru och hon har lika stora bruna ögon som Shahin, och sonen har fantastiskt blå ögon i samma storlek. Jag skrattar lite och säger att det är inte svensk folkmusik, det är dansbandsmusik. – Men om folk gillar att dansa, och det gör jag och min fru, och folk sjunger på svenska, då måste det vara svensk folkmusik säger Shahin. Vi har en underbar eftermiddag och kväll i tobaksaffären, det kommer några fler gäster under tiden, jag tror att de kommer för att handla, men Shahin är övertygad om de kommit till hans julfest och välkomnar dem till bords. På vägen hem säger min flickvän att det var den bästa julfest jag inte bjudit henne på.

Jag jobbar några dagar på annan ort, men när jag kommer hem igen så sticker jag in till Shahin, jag sätter mig där jag brukar, och han serverar lite te. – Var har du varit säger Shahin, jag hoppades att du slutat röka. – Jag har varit iväg och jobbat och jag har för mig att du sa härrom dagen att du lever av att sälja cigaretter. – Det stämmer sa Shahin, men om du inte lever så kan inte jag leva, du kan köpa choklad istället, och te, fast det bjuder jag på. Vi skrattade lite och började prata om allt möjligt. Efter en stund så berömde jag Shahin för hans goda svenska, visst hörde man en brytning, men han hade ett fantastiskt ordförråd, även grammatiken klarade han galant.

Shahin log sitt största leende, rodnade lite stolt och sa: – Det är tack vara den svenska folkmusiken, jag kan nästan alla texterna. Jag och min fru har åkt runt och dansat till nästan alla folkmusikorkestrarna, Vikingarna, Arvingarna, Streaplers och många fler, ett tag jobbade jag extra med några av dem, jag bar utrustning, dansade, dansade, bar utrustning. En gång, på nationaldagen, fick jag sjunga nationalsången på scen, Leende guldbruna ögon…

– Det är inte nationalsången sa jag snabbt. – Det var den första sången jag lärde mig, i mitt nya hemland, och det var på nationaldagen, hur kan det då inte vara min nationalsång frågade Shahin. Jag visste inte riktigt vad jag skulle svara så jag frågade vad som var hans hemland? – Det är här, det här är ett land och här har jag mitt hem, mitt hemland! – Jag log och frågade istället vad hans tidigare hemland var? – Persien. Mitt land är många länder utan gränser, mitt land finns inte hos er, ni kallar delar av mitt land för Iran, ni kallar andra delar av mitt land för Ryssland, Kaukasus, Turkmenistan, Uzbekistan, Tadzjikistan, Afghanistan, Pakistan, Irak, Jordanien, Syrien, Libanon, Israel och Egypten, mitt land finns bara i mitt huvud, och i huvudet på alla de andra från Persien, det var därför jag flyttade, jag hade inget land sa Shahin lite sorgset. Det blev tyst en stund, – Men nu har jag det sa han och sken upp som en sol, han sjöng sin nationalsång igen och berättade att i folkmusikbranschen kallades han inte för Shahin, för är man folkmusiker och står på scenen så kan man ha ett artistnamn, och hans artistnamn var Shakalaka, han avslutade nämligen alltid sina sånger med Shakalaka Boom, boom, boom. Inget förvånade mig längre.

– Men svenska är svårt sa Shahin, det är inte svårt att sjunga, men det är svårt att förstå ibland, det tog lång tid innan jag förstod skillnaden på banan och banan. När min son skulle ha skolavslutning en gång så skulle vi träffas vid skridskobanan. Jag körde runt länge och letade efter en stor gul banan med skridskor, jag har aldrig berättat det för någon, men du är min vän sa han och log. För att lära sig ett språk så måste man våga göra fel, och man måste våga skratta åt sina fel, men det är svårt när andra skrattar sa Shahin och log. Men jag bestämde mig tidigt för att jag ska begå många misstag, minst ett om dagen, och skriva upp dem i en bok, så jag kan skratta åt dem igen och igen, då har jag skrattat bäst. – Men vad är det värsta misstaget du har skrattat åt frågade jag.

– Oj, det är nästan för roligt för att berättas, men om du skrattar ordentligt med mig så kanske jag vågar. Jag hade inte varit så länge i mitt nya hemland och jag behövde försörja mig, jag höll på att bli tokig av att bara gå i skolan och lära mig svenska, jag ville jobba och lära mig svenska. Jag fick en liten lokal i huset där jag hyrde rum, nere i Skåne där jag bodde på den tiden. Den underbara gamla Tantebba som ägde huset älskade kakor och jag var ganska duktig på att baka, så en dag sa hon att jag borde starta ett litet bageri i lokalen som stod tom i huset. Jag fick själv göra ordning den lilla lokalen och målade den jättefint i rosa, gul, och blått. Två spisar fanns redan och ett stort bakbord fick jag av Tantebbas systerson. Jag fick ha lokalen så länge jag gjorde goda kakor som Tantebba kunde köpa. Jag fick låna en cykel också så jag kunde köpa mjöl och allt annat man måste ha.

– Jag cyklade, handlade, cyklade, bakade, cyklade, sov, cyklade och bakade varje dag. Jag hade inte cyklat sedan jag var liten och det var fantastiskt kul, ja allt var kul, folk gillade mina kakor, jag lärde mig svenska, Tantebba åt så hon blev tjock och jag bakade på. Det var egentligen bara ett problem.

Av allt cyklande hade jag fått ett fruktansvärt skavsår i de nedre regionerna, det sved som eld. Det här var inget jag kunde prata med Tantebba om, du vet gamla tjocka skånska damer pratar man inte skavsår med, allra helst inte i de nedre regionerna. Men jag kom att tänka på ett vitt pulver som min mamma hade när jag var liten, riktigt varma dagar så skulle alla ha det vita pulvret i de nedre regionerna för att undvika skavsår som brann som eld. När jag var och handlade till mitt lilla bageri så letade jag bland hyllorna för att hitta det pulvret, och en dag så hittade jag det. – Talk frågade jag. Shahin började skratta, han skrattade så att jag började skratta. – Är det talk det heter, jag har aldrig vågat fråga nästan skrek han mellan skratten. Jag skrattade nu så att jag grät bara av att se den lilla persiska mannen skratta. – Det stod Bakpulver på burken jag köpte sa han och skrattade nu som en frustande elefant. Du kan tänka dig vad som händer om häller bakpulver i de nedre varma regionerna sa han och kved nu som en liten groda. Jag såg scenen framför mig och skrattade så att jag inte fick luft. Det var det bästa skrattet sa Shahin och torkade tårarna.

Det blev många långa sittningar hos Shahin genom åren, många skratt och många förmaningar om att sluta röka, jag kunde ju äta choklad istället. Den stol jag alltid satt i döpte Shahin till Håkans stol, och andra fick bara sitta där om de var vän-liga sa Shahin och skrattade. En morgon när jag gick hemifrån så stod stolen med en stor lapp på utanför min dörr. Jag läste på lappen…

…satte mig i stolen och ömsom skrattade, ömsom grät. 

"Här får du tbak din stol som jag har förvarat. Vi har flyttat till Norrland. Hel och ren vettu. Din vän för alltid Shahin". 

 

Ha nu en riktigt god och lugn jul!

Aludd

12 december 2013