/** * @file * Functions to support theming in the Bartik theme. */ use Drupal\Component\Utility\Html; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\ByteSizeMarkup; use Drupal\Core\Template\Attribute; use Drupal\views\Form\ViewsForm; /** * Implements hook_preprocess_HOOK() for HTML document templates. * * Adds body classes if certain regions have content. */ function bartik_preprocess_html(&$variables) { // Add information about the number of sidebars. if (!empty($variables['page']['sidebar_first']) && !empty($variables['page']['sidebar_second'])) { $variables['attributes']['class'][] = 'layout-two-sidebars'; } elseif (!empty($variables['page']['sidebar_first'])) { $variables['attributes']['class'][] = 'layout-one-sidebar'; $variables['attributes']['class'][] = 'layout-sidebar-first'; } elseif (!empty($variables['page']['sidebar_second'])) { $variables['attributes']['class'][] = 'layout-one-sidebar'; $variables['attributes']['class'][] = 'layout-sidebar-second'; } else { $variables['attributes']['class'][] = 'layout-no-sidebars'; } if (!empty($variables['page']['featured_top'])) { $variables['attributes']['class'][] = 'has-featured-top'; } } /** * Implements hook_preprocess_HOOK() for page title templates. */ function bartik_preprocess_page_title(&$variables) { // Since the title and the shortcut link are both block level elements, // positioning them next to each other is much simpler with a wrapper div. if (!empty($variables['title_suffix']['add_or_remove_shortcut']) && $variables['title']) { // Add a wrapper div using the title_prefix and title_suffix render // elements. $variables['title_prefix']['shortcut_wrapper'] = [ '#markup' => '
', '#weight' => 100, ]; $variables['title_suffix']['shortcut_wrapper'] = [ '#markup' => '
', '#weight' => -99, ]; // Make sure the shortcut link is the first item in title_suffix. $variables['title_suffix']['add_or_remove_shortcut']['#weight'] = -100; } } /** * Implements hook_preprocess_HOOK() for maintenance-page.html.twig. */ function bartik_preprocess_maintenance_page(&$variables) { // By default, site_name is set to Drupal if no db connection is available // or during site installation. Setting site_name to an empty string makes // the site and update pages look cleaner. // @see template_preprocess_maintenance_page if (!$variables['db_is_active']) { $variables['site_name'] = ''; } // Bartik has custom styling for the maintenance page. $variables['#attached']['library'][] = 'bartik/maintenance_page'; } /** * Implements hook_preprocess_HOOK() for node.html.twig. */ function bartik_preprocess_node(&$variables) { // Remove the "Add new comment" link on teasers or when the comment form is // displayed on the page. if ($variables['teaser'] || !empty($variables['content']['comments']['comment_form'])) { unset($variables['content']['links']['comment']['#links']['comment-add']); } } /** * Implements hook_preprocess_HOOK() for block.html.twig. */ function bartik_preprocess_block(&$variables) { // Add a clearfix class to system branding blocks. if ($variables['plugin_id'] == 'system_branding_block') { $variables['attributes']['class'][] = 'clearfix'; } } /** * Implements hook_preprocess_HOOK() for menu.html.twig. */ function bartik_preprocess_menu(&$variables) { $variables['attributes']['class'][] = 'clearfix'; } /** * Implements hook_theme_suggestions_HOOK_alter() for form templates. */ function bartik_theme_suggestions_form_alter(array &$suggestions, array $variables) { if ($variables['element']['#form_id'] == 'search_block_form') { $suggestions[] = 'form__search_block_form'; } } /** * Implements hook_form_alter(). */ function bartik_form_alter(&$form, FormStateInterface $form_state, $form_id) { // Add classes to the search form. if (in_array($form_id, ['search_block_form', 'search_form'])) { $key = ($form_id == 'search_block_form') ? 'actions' : 'basic'; if (!isset($form[$key]['submit']['#attributes'])) { $form[$key]['submit']['#attributes'] = new Attribute(); } $form[$key]['submit']['#attributes']->addClass('search-form__submit'); } $form_object = $form_state->getFormObject(); // Add class to the Media Library views form. if ($form_object instanceof ViewsForm && strpos($form_object->getBaseFormId(), 'views_form_media_library') === 0) { // The conditional below exists because the media-library-views-form class // is currently added by Classy, but Umami will eventually not use Classy as // a base theme. // @todo remove conditional, keep class addition in // https://drupal.org/node/3110137 // @see https://www.drupal.org/node/3109287 // @see classy_form_alter() if (!isset($form['#attributes']['class']) || !in_array('media-library-views-form', $form['#attributes']['class'])) { $form['#attributes']['class'][] = 'media-library-views-form'; } } } /** * Implements hook_preprocess_links__media_library_menu(). * * This targets the menu of available media types in the media library's modal * dialog. * * @todo Do this in the relevant template once * https://www.drupal.org/project/drupal/issues/3088856 is resolved. */ function bartik_preprocess_links__media_library_menu(array &$variables) { foreach ($variables['links'] as &$link) { // This conditional exists because the media-library-menu__link class is // currently added by Classy, but Bartik will eventually not use Classy as a // base theme. // @todo remove conditional, keep class addition in // https://drupal.org/node/3110137 // @see https://www.drupal.org/node/3109287 // @see classy_preprocess_links__media_library_menu() if (!isset($link['link']['#options']['attributes']['class']) || !in_array('media-library-menu__link', $link['link']['#options']['attributes']['class'])) { $link['link']['#options']['attributes']['class'][] = 'media-library-menu__link'; } } } /** * Implements hook_preprocess_image_widget(). * * @todo Revisit in https://drupal.org/node/3117430 */ function bartik_preprocess_image_widget(&$variables) { if (!empty($variables['element']['fids']['#value'])) { $file = reset($variables['element']['#files']); $variables['data']["file_{$file->id()}"]['filename']['#suffix'] = ' (' . ByteSizeMarkup::create($file->getSize()) . ') '; } } /** * Implements template_preprocess_links(). * * This makes it so array keys of #links items are added as a class. This * functionality was removed in Drupal 8.1, but still necessary in some * instances. * * @todo remove in https://drupal.org/node/3120962 */ function bartik_preprocess_links(&$variables) { if (!empty($variables['links'])) { foreach ($variables['links'] as $key => $value) { if (!is_numeric($key)) { $class = Html::getClass($key); $variables['links'][$key]['attributes']->addClass($class); } } } } The Good Soldier Švejk — The Chicago Version: Three Videos | The Good Soldier Švejk Central
Hašek’s Voice Preserved

 

What the Apparatus Reveals

 

Why Švejk Matters

 

 


The Video Scripts
 

Hašek’s Voice Preserved

What if you could read the Good Soldier ŠVEJK
as Hašek WROTE IT,
not as represented by the later illustrations by Josef Lada?
and by translators, who have smoothed the texture.
The Centennial Edition Chicago Version takes a radically faithful approach to Hašek's language,
preserving his word order, repetition, rhythm, ambiguity, and structural choices wherever they can be understood in English.
Because Švejk is more than a comic soldier.
And more than an anti-war novel.
Beneath the laughter is a devastating portrait of bureaucracy, authority, obedience, and the absurd systems that shape modern life.
For readers discovering
Švejk for the first time...
and for those who thought they already knew the book...
The Chicago Version offers a chance to encounter Hašek ... again.
Takeaway:
Illuminating translation of the human complexity of a Czech classic.


What the Apparatus Reveals

What if The Good Soldier Švejk has been hiding something
in plain sight?
The Centennial Edition Chicago Version goes beyond translating Hašek's words.
Its extensive apparatus and online essays uncover the historical, cultural, and linguistic layers hidden beneath Hašek's words—and what can disappear in translation.
Because sometimes a single Czech word can change who is implicated.
A repeated phrase can reveal a pattern.
And a grammatical detail can change how we understand Švejk himself.
The laughter is still there.
But beneath it is something larger
Bureaucracy. Authority. Obedience. And the absurd systems that shape modern life:

svejkardomsvejkardom
BookLife calls it a translation of “greater bite
 heft and complexity." 
An “Illuminating translation of the human complexity of a Czech classic."
The Fateful Adventures
of the Good Soldier Švejk.
The Centennial Edition.
The Chicago version. 
 

Why Švejk Matters

Why does Švejk still matter more than a century later
Because the absurd system he faced did not disappear with the Austro-Hungarian Empire.
The Austro - Hungarian Empire did not vanish;
...it metastasized. Its techniques—
bureaucratic diffusion of guilt,
procedural violence,
moral displacement — 
are still with us
 though their uniforms and slogans have changed.
Švejk's answer is simple: carry the system's own logic to its absurd conclusion.
That method became known as švejking.
And the world that requires it has a name:
svejkardom
A world of systemic absurdity in which survival itself becomes an achievement.
Švejk is not a hero because he conquers the system.
He is a hero because he survives it.
And that may be why Švejk is becoming a hero for our time.
The Fateful Adventures...
of the Good Soldier Švejk.
The Centennial Edition.
The Chicago Version.
When people ask me to comment on current events or politics, my answer is simple:
Read The Good Soldier Švejk first...
THEN ask me again.