<?php
// Options
$theme = 'eclipse'; // What ace theme to use('Eclipse', 'tomorrow' are good choices)
$fontsize = '14pt'; // Default font size to display
$wrap_lines = 'true'; // Wrap long lines? (*MUST* be a string, 'true' or 'false')
$show_invisibles = 'false'; // show whitespace (*MUST* be a string, 'true' or 'false')
$full_width = true; // Use the full browser width?
$tab_size = 3; // Tab size
/**
Your .htaccess file should look something like this (you will need mod_actions enabled)
Options +Indexes
IndexOptions FancyIndexing HTMLTable
# Two options to select what will get highlighted by this:
# 1. Highlight everything
ForceType text/plain
Action text/plain /path/to/highlight.php
# 2. Highlight only certain file extensions
Action highlight-code /path/to/highlight.php
AddHandler highlight-code .py
AddHandler highlight-code .java
*/
// Any custom css you want applied goes here:
$custom_css = "
/* style applied to line numbers in the gutter */
.ace_gutter-cell {
/* Custom color for the line number color */
color: #999;
/* If you change this font size for line numbers, you will need to set the line-height
to the height of the row. */
/* font-size: 10pt; */
/* line-height: 22px; */ /* 22px is the height when using 14pt $fontsize */
font-size: 10pt;
line-height: 22px; /* 22px is the height when using 14pt $fontsize */
}
";
//====================================================================================
// No need to edit below this point
// Get the file we want to show(PATH_TRANSLATED comes from apache's Action/AddHandler)
$filename = $_SERVER['PATH_TRANSLATED'];
// Default to showing ourself if there is no argument
if ($filename == '') {
$filename = basename(__FILE__);
}
// Allow viewing the raw file
if (isset($_GET['raw'])) {
header('Content-Type: text/plain');
readfile($filename);
exit();
}
$error = FALSE;
$filecontents = file_get_contents($filename);
if ($filecontents === FALSE) {
$error = "Error loading file.";
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title><?=basename($filename)?></title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/5.0.2/css/bootstrap.min.css">
-->
<!--
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
-->
<style type="text/css" media="screen">
html, body {
height: 100%;
}
.container {
position: relative;
height: 100%;
<?php if ($full_width): ?>
width:100%;
<?php endif;?>
}
#editor {
position: relative !important;
border: 1px solid lightgray;
margin: auto;
height: 200px;
width: 100%;
font-size: <?=$fontsize?>;
}
#header {
margin-bottom: 10px;
margin-top: 10px;
}
#header .title h1 {
float:left;
height: 50px;
margin: 0px;
margin-right: 20px;
}
#header .info {
float:left;
height: 50px;
}
#header .toolbox {
height: 50px;
float: right;
}
.toolbox .checkbox {
margin: 0px;
padding: 0px;
}
#footer p{
margin-top: 25px;
margin-bottom: 15px;
text-align: center;
font-size: 12pt;
}
<?=$custom_css;?>
</style>
</head>
<body>
<div class="container">
<div id="header">
<div class="title"><h1><?=basename($filename)?></h1></div>
<div class="info">
<a href="?raw">Download/View Raw File</a><br>
Filetype: <span id="filetype">Unknown</span>
</div>
<div class="toolbox">
<div class="checkbox">
<label for="show_invisibles">Show hidden characters
<input type="checkbox"
onchange="editor.setShowInvisibles(this.checked);"
id="show_invisibles" <?php echo ($show_invisibles=='true'?'CHECKED':'')?>></input>
</label>
<br>
<label for="wrap_lines">Wrap long lines
<input type="checkbox"
onchange="editor.getSession().setUseWrapMode(this.checked);"
id="wrap_lines" <?php echo ($wrap_lines=='true'?'CHECKED':'')?>></input>
</label>
</div>
</div>
</div>
<div class="row content">
<?php if (!$error): ?>
<pre id="editor"><?php echo htmlspecialchars($filecontents); ?></pre>
<?php else: ?>
<pre class="error"><?=$error?></pre>
<?php endif ?>
</div>
<div id="footer">
<p>
Syntax highlighting provided by <a href="http://ace.c9.io">Ace</a>.
</p>
</div>
</div>
<!--
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.9.6/ace.js" type="text/javascript" charset="utf-8"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.9.6/ext-modelist.js" type="text/javascript" charset="utf-8"></script>
-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.15.2/ace.js" integrity="sha512-NSbvq6xPdfFIa2wwSh8vtsPL7AyYAYRAUWRDCqFH34kYIjQ4M7H2POiULf3CH11TRcq3Ww6FZDdLZ8msYhMxjg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.15.2/ext-modelist.min.js" integrity="sha512-PwR8TdJiye9vhqN3sEQcuRHqJD4ykfnJYIdRHwaw3SFA3/WA+AwtyFJGX0RkDJJiNrHmKLL4kV80Qp4REbzWrA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<?php if (!$error): ?>
<script>
editor = ace.edit("editor");
editor.setTheme("ace/theme/<?=$theme?>");
editor.getSession().setUseWrapMode(document.getElementById("wrap_lines").checked);
editor.setReadOnly(true);
// Make the editor as big as the file to prevent scrolling(or 50 lines min)
editor.setOption("maxLines", Infinity);
editor.setOption("minLines", 50);
editor.setOption("tabSize",<?=$tab_size;?>);
editor.setOption("showPrintMargin", false);
<?php
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if ($ext == "py3") $ext = "py";
if ($ext == "f95") $ext = "f90";
if ($ext == "ads") $ext = "adb";
//if ($ext == "rs") $ext = "rst";
// etc...
?>
editor.setShowInvisibles(document.getElementById("show_invisibles").checked);
// Autodetect mode based on file name
var modelist = ace.require('ace/ext/modelist');
// var mode = modelist.getModeForPath("<?=basename($filename)?>");
var mode = modelist.getModeForPath("dummyname.<?=$ext?>");
editor.getSession().setMode(mode.mode);
document.getElementById("filetype").innerHTML = mode.caption;
</script>
<?php endif;?>
</body>
</html>