Bootstrap Converter now works with dropdowns and right-positioned elements

This commit is contained in:
Owen Versteeg 2013-12-11 18:43:38 -05:00
parent d5bc820823
commit b3a8a63a2d

View file

@ -14,6 +14,21 @@
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript">
(function($) {
$.fn.changeElementType = function(newType) {
var attrs = {};
$.each(this[0].attributes, function(idx, attr) {
attrs[attr.nodeName] = attr.nodeValue;
});
this.replaceWith(function() {
return $("<" + newType + "/>", attrs).append($(this).contents());
});
};
})(jQuery);
</script>
</head>
<body>
<br>
@ -25,21 +40,35 @@
<a onclick="document.getElementById('enteredHTML').value=bootstrapExamples[0]"><button class="smooth btn-b btn-small dontconvert">Load 1st Bootstrap example</button></a>
<br>
<a onclick="document.getElementById('enteredHTML').value=bootstrapExamples[1]"><button class="smooth btn-c btn-small dontconvert">Load 2nd Bootstrap example</button></a>
<br>
<a onclick="document.getElementById('enteredHTML').value=bootstrapExamples[2]"><button class="smooth btn-a btn-small dontconvert">Load 3rd Bootstrap example</button></a>
<br><br>
<div id="messagesDiv" class="mediumwidth"></div>
<br>
<div id="convertedHTMLDiv">
</div>
<script type="text/javascript">
bootstrapExamples = [
'<div class="navbar navbar-inverse navbar-fixed-top" role="navigation"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div class="navbar-collapse collapse"><form class="navbar-form navbar-right" role="form"><div class="form-group"> <input type="text" placeholder="Email" class="form-control"></div> <div class="form-group"> <input type="password" placeholder="Password" class="form-control"></div><button type="submit" class="btn btn-success">Sign in</button></form></div><!--/.navbar-collapse --></div></div><!-- Main jumbotron for a primary marketing message or call to action --><div class="jumbotron"><div class="container"><h1>Hello, world!</h1><p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p><p><a class="btn btn-primary btn-lg" role="button">Learn more &raquo;</a></p></div></div><div class="container"><!-- Example row of columns --><div class="row"><div class="col-md-4"><h2>Heading</h2><p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p><p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p></div><div class="col-md-4"><h2>Heading</h2><p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p><p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p></div><div class="col-md-4"><h2>Heading</h2><p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p><p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p></div></div><hr><footer><p>&copy; Company 2013</p></footer></div>',
'<div class="navbar navbar-inverse navbar-fixed-top" role="navigation"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div class="collapse navbar-collapse"><ul class="nav navbar-nav"><li class="active"><a href="#">Home</a> </li><li><a href="#about">About</a> </li><li><a href="#contact">Contact</a> </li></ul></div><!--/.nav-collapse --></div></div><div class="container"><div class="starter-template"><h1>Bootstrap starter template</h1><p class="lead">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p></div></div><!-- /.container -->'
'<div class="navbar navbar-inverse navbar-fixed-top" role="navigation"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div class="collapse navbar-collapse"><ul class="nav navbar-nav"><li class="active"><a href="#">Home</a> </li><li><a href="#about">About</a> </li><li><a href="#contact">Contact</a> </li></ul></div><!--/.nav-collapse --></div></div><div class="container"><div class="starter-template"><h1>Bootstrap starter template</h1><p class="lead">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p></div></div><!-- /.container -->',
'<div class="navbar navbar-default navbar-static-top" role="navigation"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div class="navbar-collapse collapse"><ul class="nav navbar-nav"><li class="active"><a href="#">Home</a></li><li><a href="#about">About</a></li><li><a href="#contact">Contact</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a><ul class="dropdown-menu"><li><a href="#">Action</a></li><li><a href="#">Another action</a></li><li><a href="#">Something else</a></li><li class="divider"></li><li class="dropdown-header">Nav header</li><li><a href="#">Separated link</a></li><li><a href="#">One more link</a></li></ul></li></ul><ul class="nav navbar-nav navbar-right"><li><a href="../navbar/">Default</a></li><li class="active"><a href="./">Static top</a></li><li><a href="../navbar-fixed-top/">Fixed top</a></li></ul></div><!--/.nav-collapse --></div></div><div class="container"><!-- Main component for a primary marketing message or call to action --><div class="jumbotron"><h1>Navbar example</h1><p>This example is a quick exercise to illustrate how the default, static and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p><p>To see the difference between static and fixed top navbars, just scroll.</p><p><a class="btn btn-lg btn-primary" href="../../components/#navbar" role="button">View navbar docs &raquo;</a></p></div>'
]
function moveFromAToB(a,b) {
$(b)[0].innerHTML += $(a)[0].innerHTML;
$(a)[0].remove();
function moveFromAToB(a, b, which) {
if (!which) var which = [0,0]
$(b)[which[1]].innerHTML += $(a)[which[0]].innerHTML;
$(a)[which[0]].remove();
}
function printMessage(messageText, messageType) {
$('#messagesDiv')[0].innerHTML += "<message class='"+messageType+"'>"+messageText+"</message><br>";
}
function convertHTML(htmlToConvert) {
//Erase previous messages
$('#messagesDiv')[0].innerHTML = "";
convertedHTML = htmlToConvert;
convertedHTMLDiv.innerHTML = convertedHTML;
@ -76,12 +105,76 @@
}
if ($('.navbar-form')[0] && $('.navbar')[0]) moveFromAToB('.navbar-form', '.navbar');
//Of course, Bootstrap *has* to have two ways to make a navbar
var lisToSquash = $('.nav.navbar-nav li');
//Of course, Bootstrap *has* to have two fucking ways to make a goddamn navbar
var lisToSquash = $('.nav.navbar-nav li').not('.dropdown').not('ul.dropdown-menu li').not('ul.navbar-right li');
for (var i=0; i<lisToSquash.length; i++) {
//if ($('li.active')[0]) $('li.active').removeClass('active').addClass('pagename')
//$('.nav.navbar-nav li')[0]
moveFromAToB('.nav.navbar-nav li', '.nav.navbar-nav')
moveFromAToB('.navbar .nav.navbar-nav:not(.dropdown-menu) > li[class!="dropdown"]', '.nav.navbar-nav')
}
var navbarPluginCSS = '<link rel="stylesheet" href="http://owenversteeg.com/min-navbar-plugin/navbar-plugin.css" type="text/css">'
if ($('li.dropdown')[0]) {
//If we have any dropdowns here, we have to include the min-navbar-plugin
convertedHTMLDiv.innerHTML += navbarPluginCSS;
//Let the user know that we've included it
printMessage('Your page requires the navbar plugin, which has been automatically included.<br><br>It adds dropdowns and right-positioned link capabilities to the navbar.', 'warning');
//Now, we need to convert from Bootstrap's weird-ass navbar dropdowns to Min's nice navbar dropdowns
var x = $('li.dropdown > a').length;
for (i=0; i<x; i++) {
moveFromAToB('li.dropdown > a', 'li.dropdown')
}
$('.caret').remove(); //we make carets automatically over here in min-land, unlike *some* frameworks I know
//now, we transmogrify all of Bootstrap's elements into Min elements.
$('li.dropdown').changeElementType('div');
$('div.dropdown').addClass('navbar-link').addClass('wpd').removeClass('dropdown');
var x = $('ul.dropdown-menu').length;
for (var i=0; i<x; i++) {
var pulldownDiv = document.createElement('div');
$(pulldownDiv).addClass('pulldown');
var ulInsidePulldownDiv = document.createElement('ul');
pulldownDiv.appendChild(ulInsidePulldownDiv);
$('ul.dropdown-menu')[0].parentElement.appendChild(pulldownDiv);
moveFromAToB('ul.dropdown-menu', 'div.pulldown ul', [i,i]);
}
$('div.wpd ul li a').removeClass('navbar-link')
$('ul.dropdown-menu').removeClass('dropdown-menu');
//Of course, Bootstrap *has* to make dropdown headers the fucking unstandard way.
$('li.dropdown-header').removeClass('dropdown-header').changeElementType('h5');
//Given that, what do you think Bootstrap uses to make a divider?
//Yes, that's right, folks: Bootstrap uses a fucking *li* element as a divider. No, not a <hr> or even a <div> - but a <li>. What the hell.
//I'm pretty sure the only thing that could possibly be less semantically correct would be a <canvas>
$('li.divider').removeClass('divider').changeElementType('hr');
}
//Now, we need to check if we have any right-positioned elements
if ($('.navbar-right')[0]) {
//If we don't already have the navbar plugin CSS, include it and let the user know that we did so
if (convertedHTMLDiv.innerHTML.indexOf(navbarPluginCSS) == -1) {
convertedHTMLDiv.innerHTML += navbarPluginCSS;
printMessage('Your page requires the navbar plugin, which has been automatically included.<br><br>It adds dropdowns and right-positioned link capabilities to the navbar.', 'warning');
}
var lisToRighten = $('ul.navbar-right > li[class!="dropdown"]');
for (var i=0; i<lisToRighten.length; i++) {
//Unwrap the <a>s from their oppressive <li> overlords.
moveFromAToB('ul.navbar-right > li[class!="dropdown"]', 'ul.navbar-right');
//Be free, my darlings!
}
//Now, we convert the navbar right <ul> to a navbar right div
$('ul.navbar-right').addClass('navlink-right').removeClass('nav').removeClass('navbar-nav').removeClass('navbar-right').changeElementType('div');
}
//if we have the second way to make a navbar, we need to push the links into the main navbar