In LESS kann man Variablen vordefinieren. Farbwerte, Paddings und mehr. Hilfreich z.B., will man mal einen Grauton etwas heller stellen, Man muss nicht in diversen Dateien die color-Werte anpassen, sondern kann das an 1 Stelle erledigen. Bootstrap 3 übertreibt mit diesem Feature etwas und ich suche mir regelmäßig einen Wolf. Erster Schritt, eine sortierbare Übersicht. Vielleicht hilft's was.

Da ich mittlerweile auf Bootstrap 4 und SCSS/SASS umgestiegen bin, ist diese Liste lediglich für's Archiv, sozusagen.

Bootstrap-3-Variablen dynamisch ausgelesen

Gerenderte Ausgabe der Datei bootstrap-3-variables.php

Datei /media/plg_system_bs3ghsvs/less/3.3.7/variables.less nicht gefunden.ICOMOONCLASSES_APOLOGISE

Quelltext der Datei bootstrap-3-variables.php

<?php
/*
2015-10-11
bootstrap-3-variables.php
Variablen und Werte aus BS3-variables.less (Orig.) auslesen.
2015-10-17: zusätzlich Custom Werte aus template-eigener variables.less.
*/
?>
<?php
defined('_JEXEC') or die;

$selector = 'bootstrap-3-variables';

$html = array();
$link = '';
$countCollect = 0;

$app = JFactory::getApplication();

// Relevant für FooTable, wenn paging enabled
if (!($maxentries = $app->input->get->getInt('maxentries')))
{
 $maxentries = 50;
}

$apologise = JText::_('ICOMOONCLASSES_APOLOGISE');

$file = '/media/plg_system_bs3ghsvs/less/3.3.7/variables.less';
$fileAbs = JPATH_SITE . $file;

$template = $app->getTemplate();
$fileCustom = '/templates/' . $template . '/less/variables.less';
$fileCustomAbs = JPATH_SITE . $fileCustom;

if (!file_exists($fileAbs))
{
 $html[] = '<p class="alert alert-error">Datei ';
 $html[] = $file;
 $html[] = ' nicht gefunden.';
 $html[] = $apologise;
 $html[] = '</p>';
}
elseif (!file_exists($fileCustomAbs))
{
 $html[] = '<p class="alert alert-error">Datei ';
 $html[] = $fileCustom;
 $html[] = ' nicht gefunden.';
 $html[] = $apologise;
 $html[] = '</p>';
}
else
{

 $link = '<p><a href="' . JUri::root(true) . $file . '" target="_blank">' . $file . '</a></p>';
 $link .= '<p><a href="' . JUri::root(true) . $fileCustom . '" target="_blank">' . $fileCustom . '</a></p>';

 $collect = collectLessVariablesGhsvs($fileAbs);
 $countCollect = count($collect);
 
 if ($countCollect)
 {
  $i = 0;
  
  $collectCustom = collectLessVariablesGhsvs($fileCustomAbs);

  $html[] = '<h4>BS3-Original und Overrides des aktiven Templates</h4>';
  #$html[] = '<div class="table-responsive">';
  $html[] = '<table class="table table-condensed table-bordered" id="' . $selector . '"';
  $html[] = '>';
  $html[] = '<thead>';
  $html[] = '<tr>';
  $html[] = '<th>Variable</th>';
  $html[] = '<th data-breakpoints="xxs">Bootstrap</th>';
  $html[] = '<th data-breakpoints="xs">Template</th>';
  $html[] = '<th data-type="number">#</th>';
  $html[] = '</tr>';
  $html[] = '</thead>';
  $html[] = '<tbody>';
  foreach ($collect as $k => $v)
  {
   $vCustom = '';
   $html[] = '<tr>';
   $html[] = '<td data-ghsvs="toggle">' . $k . '</td>';
   $html[] = '<td>' . $v . '</td>';
   if (isset($collectCustom[$k]))
   {
    $vCustom = $collectCustom[$k];
    unset($collectCustom[$k]);
   }
   $html[] = '<td>' . $vCustom . '</td>';
   $html[] = '<td data-ghsvs="number">' . (++$i) . '</td>';
   $html[] = '</tr>';
  }
  $html[] = '</tbody>';
  $html[] = '</table>';
  #$html[] = '</div><!--/table-responsive-->';
 }
}
if (!count($html))
{
 $html[] = '<p class="alert alert-error">Da ist wohl was schief gelaufen. ';
 $html[] = $apologise;
 $html[] = '</p>';
}
else
{
 // Mehr Einträge in Tabelle anzeigen?
 $uri = JUri::getInstance();
 if ($countCollect > $maxentries)
 {
  $uri->setVar('maxentries', $countCollect);
  $link .= '<p class=" btn btn-default text-fett" style="font-size:1.3em;"><a rel="nofollow" href="'.$uri.'#BELOWHEADER">Alle '.$countCollect.' Einträge auf 1 Seite  anzeigen</a></p>';
 }

   
 ########### FooTable 3 START ###########
 // Speziell. Wir haben Footable auf unserem Server via Plugin installiert.
 // Ggf. Zeilen entfernen
 $options = array(
  'empty' => JText::_('GHSVS_MODULES_FOOTABLE_EMPTY'),
  'sorting' => array(
   'enabled' => true
  ),
  'filtering' => array(
   'enabled' => true
  ),
  'paging' => array(
   'enabled' => ($countCollect > $maxentries) ? true : false,
   'size' => $maxentries,
   'countFormat' => JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', '{CP}', '{TP}'),
   'current' => 1,
   'limit' => 10,
   'position' => 'center'
  ),
  'state' => array(
   'enabled' => true,
   'filtering' => true,
   'paging' => true,
   'sorting' => true,
   'key' => $selector
  ),
  // Erster geöffnet. Auch nach Sortieren wird erster geöffnet.
  'expandFirst' => false,
  //'useParentWidth' => true,
  'stopPropagation' => true,
  // Leichteres Handling der Breakpoints. Nehmen drunter liegende mit.
  'cascade' => true,
  'breakpoints' => array(
  // Du muss xxs eingeben, damit Spalte bei *xs* *verschwindet*!
  'xxs' => 480,
  'xs' => 620,
  'sm' => 768,
  'md' => 992,
  'lg' => 1200,
  ),
 );
 JHtml::_('bs3ghsvs.footable', '#' . $selector, $options);
 ########### FooTable 3 ENDE ###########
 
 echo '<style>table{
 word-wrap: normal
 -webkit-hyphens: none;
 -moz-hyphens: none;
 -ms-hyphens: none;
 -o-hyphens: none;
 hyphens: none;
 }
 @-moz-document url-prefix() {
 fieldset { display: table-cell; }
 }
 [data-ghsvs="toggle"]{
  font-weight: bold;
  background-color: #fafafa;
  cursor:pointer;
 }
 [data-ghsvs="number"]{
  text-align: right;
 }
 </style>';
}

echo $link . implode('', $html);

function collectLessVariablesGhsvs($fileAbs)
{
 $lines = file($fileAbs);
 $collect = array();
 foreach ($lines as $i => $line){
  $line = trim($line);
  if (strpos($line, '@') !== 0 || strpos($line, ':') === false)
  {
   continue;
  }
  // Fix 2015-10-17.
  // Derzeit verwendet BS3 nur "//" als Kommentarzeichen
  if (strpos($line, '//') !== false)
  {
   $line = explode('//', $line, 2);
   $line = $line[0];
  }

  $line = explode(':', $line, 2);
  if (count($line) != 2){
   continue;
  }
  
  // Vorsicht! Derzeit geht das noch mit Semikolon.
  // Es sind aber auch Semikolons statt Komma zwischen
  // Funktions-Parametern erlaubt.
  // Siehe "Fix 2015-10-17"
  // $parts = explode(';', $line[1], 2);
  // $line[1] = trim($parts[0]);
  
  $collect[trim($line[0])] = trim($line[1], ' ;');
 }
 return $collect;
}