2025-01-05 16:10:40 -05:00
function _internal _joinPaths ( path1 , path2 ) {
if ( path2 [ 0 ] == "/" ) {
return _internal _sanitizePath ( path2 ) ;
}
else if ( path2 [ 0 ] == "~" && ( path2 . length == 1 || path2 [ 1 ] == "/" ) ) {
return _internal _sanitizePath ( HOME _DIR + path2 . slice ( 1 ) ) ;
}
else {
return _internal _sanitizePath ( path1 + "/" + path2 ) ;
}
}
function _internal _sanitizePath ( path ) {
while ( path . includes ( "//" ) ) {
path = path . replaceAll ( "//" , "/" ) ;
}
while ( path [ path . length - 1 ] == "/" ) {
path = path . slice ( 0 , path . length - 1 ) ;
}
let newPath = [ ] ;
for ( const dir of path . split ( "/" ) ) {
if ( dir == "." ) {
}
else if ( dir == ".." ) {
if ( newPath . length ) {
newPath = newPath . slice ( 0 , newPath . length - 1 ) ;
}
}
else if ( dir ) {
newPath . push ( dir ) ;
}
}
return "/" + newPath . join ( "/" ) ;
}
function _internal _getFile ( path ) {
function getFile _recursive ( files , path ) {
console . log ( files , path ) ;
let file = files [ path [ 0 ] ] ;
if ( ! file ) {
return null ;
}
if ( path . length == 1 ) {
return file ;
}
if ( file . type == "file" ) {
return null ;
}
return getFile _recursive ( file . files , path . slice ( 1 ) ) ;
}
if ( path == "/" ) {
return {
type : "directory" ,
name : "/" ,
files : FILESYSTEM
} ;
}
let dirs = path . split ( "/" ) ;
if ( dirs [ 0 ] == "" ) {
dirs = dirs . slice ( 1 ) ;
}
return getFile _recursive ( FILESYSTEM , dirs ) ;
}
function _internal _stringifyPath ( path ) {
if ( path . startsWith ( HOME _DIR ) ) {
return path . replace ( HOME _DIR , "~" ) ;
}
return path ;
}
function _internal _getPS1 ( winInfo ) {
return ` <b class="green"> ${ winInfo . ps1Override || "trinkey@website" } </b>:<b class="blue"> ${ _internal _stringifyPath ( winInfo . PWD ) } </b> $ ` ;
}
function _internal _getFlags ( command ) {
let flags = [ ] ;
let newCommand = [ ] ;
for ( const thing of command . split ( " " ) ) {
if ( thing . startsWith ( "-" ) ) {
flags . push ( ... thing . slice ( 1 ) . split ( "" ) ) ;
}
else {
newCommand . push ( thing ) ;
}
}
return {
flags : flags ,
removed : newCommand . join ( " " )
} ;
}
function _internal _fileSize ( size ) {
let suffix = "" ;
let amount = size ;
const sizes = [
{ suffix : "K" , amount : 1024 , threshold : 10000 } ,
{ suffix : "M" , amount : Math . pow ( 1024 , 2 ) , threshold : 1000000 }
] ;
for ( const info of sizes ) {
if ( size > info . threshold ) {
suffix = info . suffix ;
amount = Math . round ( size / info . amount * 10 ) / 10 ;
if ( String ( amount ) . length > 3 ) {
amount = Math . round ( info . amount ) ;
}
}
}
return ` ${ amount } ${ suffix } ` . padStart ( 4 , " " ) ;
}
function cat ( path , windowID ) {
if ( ! path ) {
return "<div>cat: You must specify a file</div>" ;
}
path = _internal _joinPaths ( windowInformation [ windowID ] . PWD || HOME _DIR , path ) ;
let file = _internal _getFile ( path ) ;
if ( ! file ) {
return ` <div>cat: ${ escapeHTML ( path ) } : No such file or directory</div> ` ;
}
else if ( file . type == "directory" ) {
return ` <div>cat: ${ escapeHTML ( path ) } : Is a directory</div> ` ;
}
else {
return file . content ;
}
}
function cd ( path , windowID ) {
if ( ! path ) {
windowInformation [ windowID ] . PWD = HOME _DIR ;
return "" ;
}
let newPWD = _internal _joinPaths ( windowInformation [ windowID ] . PWD , path ) ;
let newFileObj = _internal _getFile ( newPWD ) ;
if ( newFileObj === null ) {
return ` <div>cd: ${ escapeHTML ( path ) } : No such file or directory</div> ` ;
}
else if ( newFileObj . type == "file" ) {
return ` <div>cd: ${ escapeHTML ( path ) } : Not a directory</div> ` ;
}
windowInformation [ windowID ] . PWD = newPWD ;
return "" ;
}
function clear ( path , windowID ) {
WINDOWS [ windowID ] . element . querySelector ( ".window" ) . innerHTML = "" ;
return "" ;
}
function exit ( path , windowID ) {
setTimeout ( ( ) => {
WINDOWS [ windowID ] . element . querySelector ( ".close" ) . click ( ) ;
} , 1 ) ;
return "" ;
}
function help ( path , windowID ) {
return helpText ;
}
function ls ( path , windowID ) {
let { flags , removed } = _internal _getFlags ( path ) ;
path = _internal _joinPaths ( windowInformation [ windowID ] . PWD || HOME _DIR , removed ) ;
let file = _internal _getFile ( path ) ;
let files ;
if ( ! file ) {
return ` <div>ls: ${ escapeHTML ( path ) } : No such file or directory</div> ` ;
}
else if ( file . type == "file" ) {
files = { [ file . name ] : file } ;
}
else {
files = file . files ;
}
let directories = [ ] ;
let hidden = flags . includes ( "a" ) || flags . includes ( "A" ) ;
let long = flags . includes ( "l" ) ;
let out = flags . includes ( "a" ) ? ( long ? "<div>drwxrwxr-x trinkey trinkey 4096 <span class=\"blue\">.</span></div><div>drwxr-xr-x trinkey trinkey 4096 <span class=\"blue\">..</span></div>" : "<span class=\"blue\">.</span> <span class=\"blue\">..</span> " ) : "" ;
for ( const file of Object . keys ( files ) . sort ( ( a , b ) => ( ( { true : 1 , false : - 1 } ) [ String ( flags . includes ( "r" ) ? a < b : a > b ) ] ) ) ) {
if ( file . startsWith ( "." ) && ! hidden ) {
continue ;
}
let fObj = files [ file ] ;
if ( long ) {
if ( fObj . type == "directory" ) {
directories . push ( fObj ) ;
out += ` <div>drwxrwxr-x trinkey trinkey 4096 <span class= \" blue \" > ${ escapeHTML ( file ) } </span></div> ` ;
}
else {
out += ` <div>-rw-rw-r-- trinkey trinkey ${ _internal _fileSize ( fObj . content . length ) . replaceAll ( " " , " " ) } ${ escapeHTML ( file ) } </div> ` ;
}
}
else {
if ( fObj . type == "directory" ) {
directories . push ( fObj ) ;
out += ` <span class= \" blue \" > ${ escapeHTML ( file ) } </span> ` ;
}
else {
out += ` ${ escapeHTML ( file ) } ` ;
}
}
}
if ( ! long ) {
out = out . slice ( 0 , out . length - 7 ) ;
}
if ( flags . includes ( "R" ) ) {
for ( const dir of directories ) {
out += ` <div><br> ${ escapeHTML ( _internal _stringifyPath ( _internal _joinPaths ( path , dir . name ) ) ) } :</div> ${ ls ( ` ${ _internal _joinPaths ( path , dir . name ) } - ${ flags . join ( "" ) } ` , windowID ) } ` ;
}
}
return out ;
}
function _internal _set _ps1 ( args , windowID ) {
windowInformation [ windowID ] . ps1Override = args . split ( "|" ) [ 0 ] ;
WINDOWS [ windowID ] . element . querySelector ( ".window [data-type-area]" ) . innerHTML = args . split ( "|" ) [ 1 ] ;
return "" ;
}
function _internal _neofetch ( args , windowID ) {
WINDOWS [ windowID ] . element . querySelector ( ".window [data-type-area]" ) . innerHTML = "neofetch" ;
return _internal _neofetchOutputs [ args ] ;
}
const _internal _commands = {
cat : cat ,
cd : cd ,
clear : clear ,
help : help ,
ls : ls ,
exit : exit ,
_internal _set _ps1 : _internal _set _ps1 ,
_internal _neofetch : _internal _neofetch
} ;
const _internal _defaultFiles = {
about : ` <div><b>hi there! i'm trinkey!</b></div>
< div > -- -- -- -- -- -- -- -- -- -- < / d i v >
2025-02-15 10:57:30 -05:00
< div > i ' m a silly little kitty cat who lives in the usa ( sadly ) . < / d i v >
2025-01-05 16:10:40 -05:00
< div > i ' m < span class = "blue" > t < / s p a n > < s p a n c l a s s = " p i n k " > r < / s p a n > a < s p a n c l a s s = " p i n k " > n < / s p a n > < s p a n c l a s s = " b l u e " > s < / s p a n > ( s h e / h e r , t h e y / t h e m a n d i t / i t s a r e a l s o f i n e ) . < / d i v >
< div > i 'm not actively in a relationship, however i' m also not looking to get into one either . < / d i v >
< div > -- -- -- -- -- -- -- -- -- -- < / d i v >
< div > i like to code stuff ( mostly websites ) ! some of my programs can be found on the < a href = "javascript:windowPreset('projects')" > projects page < / a > . i k n o w a f e w l a n g u a g e s , t h o s e b e i n g p y t h o n , j a v a s c r i p t / t y p e s c r i p t , h t m l / c s s ( i f y o u c o u n t t h o s e ) , a n d a l i t t l e b i t o f j a v a . < / d i v >
< div > -- -- -- -- -- -- -- -- -- -- < / d i v >
< div > well , that ' s about it ! i hope you like my website ! < / d i v > ` ,
socials : ` <div>- fedi - <b>@trinkey@trinkey.com</b> (or @trinkey@is.trinkey.com)</div>
< div > - forgejo - < a href = "https://git.trinkey.com/trinkey/" target = "_blank" > < b > trinkey < / b > < / a > < / d i v >
< div > - github - < a href = "https://github.com/trinkey/" target = "_blank" > < b > trinkey < / b > < / a > < / d i v >
< div > - git . gay - < a href = "https://git.gay/trinkey/" target = "_blank" > < b > trinkey < / b > < / a > ( i n a c t i v e ) < / d i v >
< div > - smiggins - < a href = "https://smiggins.trinkey.com/u/trinkey/" target = "_blank" > < b > trinkey < / b > < / a > < / d i v >
< div > - signal - < b > @ trinkey . 01 < / b > < / d i v >
< div > - email - < b > trinkey [ at ] proton [ dot ] me < / b > < / d i v >
< div > - youtube - < a href = "https://youtube.com/@trinkey" target = "_blank" > < b > @ trinkey < / b > < / a > ( i n a c t i v e ) < / d i v > ` ,
2025-02-15 10:57:30 -05:00
projects : ` <div><b>projects</b> - the things i made</div>
< div > - < a href = "https://github.com/jerimiah-smiggins/smiggins/" target = "_blank" > < b > smiggins < / b > < / a > ( < a h r e f = " h t t p s : / / s m i g g i n s . t r i n k e y . c o m / " t a r g e t = " _ b l a n k " > w e b s i t e < / a > ) - a s o c i a l m e d i a p l a t f o r m i m a d e < / d i v >
< div > - < a href = "https://git.trinkey.com/trinkey/website/" target = "_blank" > < b > this website < / b > < / a > - c h e c k o u t t h e c o d e < / d i v >
< div > - < a href = "https://git.gay/trinkey/dotindex/" target = "_blank" > < b > dotindex < / b > < / a > ( < a h r e f = " h t t p s : / / p y p i . o r g / p r o j e c t / D o t I n d e x / " t a r g e t = " _ b l a n k " > p y p i < / a > ) - a p y t h o n l i b r a r y t h a t l e t s y o u a c c e s s d i c t s u s i n g t h e d o t n o t a t i o n ( d i c t . k e y ) i n s t e a d o f w h a t e v e r p y t h o n d o e s ( d i c t [ " k e y " ] ) < / d i v >
< div > - < a href = "https://git.gay/trinkey/infopage/" target = "_blank" > < b > infopage < / b > < / a > ( < a h r e f = " h t t p s : / / i n f p g . p y t h o n a n y w h e r e . c o m / " t a r g e t = " _ b l a n k " > w e b s i t e < / a > ) - m y v e r y o w n p r o n o u n s . p a g e c l o n e < / d i v >
< div > - < a href = "https://git.trinkey.com/t" target = "_blank" > < b > tSuite < / b > < / a > ( < a h r e f = " h t t p s : / / a u t h . t r i n k e y . c o m / " t a r g e t = " _ b l a n k " > w e b s i t e < / a > ) - a c o l l e c t i o n o f s e r v i c e s t h a t a r e a l l i n t e r c o n n e c t e d < / d i v > < b r >
< div > i 'll likely add more in the future, these are just the ones i' m most proud of at the moment . < / d i v > ` ,
2025-01-05 16:10:40 -05:00
buttons : ` <div><b>my button:</b> (click to copy html)</div>
< div > < img style = "cursor: pointer;" src = "img/88x31.png" alt = "trinkey's 88x31. image of her cat on the right with the word 'trinkey' taking up the rest of the button." title = "trinkey's 88x31. image of her cat on the right with the word 'trinkey' taking up the rest of the button." onclick = "copyButton()" > < / d i v >
< div > -- -- -- -- -- -- -- -- -- -- < / d i v >
< div > < b > cool people : < / b > < / d i v >
< div class = "buttons-88x31" >
2025-02-15 10:57:30 -05:00
< a href = "https://notfire.cc" target = "_blank" > < img src = "https://notfire.cc/design/images/buttons/notfire-cc-88x31-af.gif" alt = "notfire.cc" title = "notfire.cc" > < / a >
2025-01-05 16:10:40 -05:00
< a href = "https://micro.niko.lgbt" target = "_blank" > < img src = "https://micro.niko.lgbt/static/button_2.png" alt = "a non-spinning demigirl blobcat angled slightly with a black border to the left of "Micro"" title = "a non-spinning demigirl blobcat angled slightly with a black border to the left of "Micro"" > < / a >
2025-02-15 10:57:30 -05:00
< a href = "https://w.on-t.work" target = "_blank" > < img src = "https://w.on-t.work/assets/88x31.png" alt = "kopper's button" title = "kopper's button" > < / a >
< a href = "https://synth.download" target = "_blank" > < img src = "https://synth.download/assets/buttons/sneexy.svg" alt = "Sneexy" title = "Sneexy" > < / a >
2025-01-05 16:10:40 -05:00
< a href = "https://beepi.ng" target = "_blank" > < img src = "https://beepi.ng/88x31.png" alt = "unnick" title = "unnick" > < / a >
2025-02-15 10:57:30 -05:00
< a href = "http://autumn.town" target = "_blank" > < img src = "https://autumn.town/assets/buttons/mybutton.webp" alt = "Autumn Town Café" title = "Autumn Town Café" > < / a >
< a href = "https://redcatho.de" target = "_blank" > < img src = "https://redcatho.de/buttons/red.png" alt = "the text 'red is purple' on a purple background" title = "the text 'red is purple' on a purple background" > < / a >
2025-01-05 16:10:40 -05:00
< / d i v > ` ,
testimonials : ` <div>"warning: this user is trinkey"</div>
< div > - < a href = "https://booping.synth.download/@breaadyboy" target = "_blank" > bread < / a > < / d i v > < b r >
< div > "This user is only slightly crazy once was I. 10/10 would recommend" < / d i v >
< div > - < a href = "https://lea.pet/@subroutine" target = "_blank" > subroutine < / a > < / d i v > < b r >
< div > "the f slur but repeated 36 times" < / d i v >
< div > - < a href = "https://oomfie.city/@cornfields74" > corn fields seventy four < / a > < / d i v > ` ,
webrings : ` <div>
< a href = "https://ctp-webr.ing/trinkey/previous" > & larr ; < / a >
< a href = "https://ctp-webr.ing/" > catppuccin webring < / a >
< a href = "https://ctp-webr.ing/trinkey/next" > & rarr ; < / a >
< / d i v >
< div >
< a href = "https://fediring.net/previous?host=trinkey.com" > & larr ; < / a >
< a href = "https://fediring.net/" > fediring < / a >
< a href = "https://fediring.net/next?host=trinkey.com" > & rarr ; < / a >
< / d i v > ` ,
directory : ` <div>there's a lot that goes into this website. here are some links for your usage to help you navigate this hellhole</div><br>
< div > < b > < a href = "https://trinkey.com/" > trinkey . com < / a > : < / b > < / d i v >
< div > this is where you are right now < / d i v > < b r >
< div > * < b > < a href = "https://akkofe.trinkey.com/" > akkofe . trinkey . com < / a > : < / b > < / d i v >
< div > the frontend i use for < a href = "https://fediverse.info/" target = "_blank" > fedi < / a > < / d i v > < b r >
< div > < b > < a href = "https://auth.trinkey.com/" > auth . trinkey . com < / a > : < / b > < / d i v >
< div > authentication manager for tSuite < / d i v > < b r >
< div > < b > < a href = "https://blog.trinkey.com/" > blog . trinkey . com < / a > : < / b > < / d i v >
< div > tBlog , from tSuite < / d i v > < b r >
< div > < b > < a href = "https://everyone.trinkey.com/" > everyone . trinkey . com < / a > : < / b > < / d i v >
< div > frontend to a fedi bot that anyone can post to ( @ everyonebot @ is . trinkey . com ) < / d i v > < b r >
< div > * < b > < a href = "https://git.trinkey.com/" > git . trinkey . com < / a > : < / b > < / d i v >
< div > holds some of my git projects ( older ones on < a href = "https://github.com/trinkey/" target = "_blank" > github < /a> or <a href="https:/ / git . gay / trinkey / " target=" _blank " > git . gay < / a > ) < / d i v > < b r >
< div > * < b > < a href = "https://is.trinkey.com/" > is . trinkey . com < / a > : < / b > < / d i v >
< div > hosts < a href = "https://iceshrimp.dev/iceshrimp/iceshrimp.net" target = "_blank" > iceshrimp . net < / a > , w h i c h i s t h e f e d i b a c k e n d i u s e < / d i v > < b r >
2025-02-15 10:57:30 -05:00
< div > < b > < a href = "https://jayflame.trinkey.com/" > jayflame . trinkey . com < / a > : < / b > < / d i v >
< div > the website of my friend < a href = "https://www.youtube.com/@jayflame1" > Jayflame < / a > < / d i v > < b r >
2025-01-05 16:10:40 -05:00
< div > < b > < a href = "https://message.trinkey.com/" > message . trinkey . com < / a > : < / b > < / d i v >
< div > tMessage , from tSuite < / d i v > < b r >
< div > < b > < a href = "https://music.trinkey.com/" > music . trinkey . com < / a > : < / b > < / d i v >
< div > has some music . i haven 't actually updated the site in a while but i' ve been meaning to do rewrite it at some point . 100 % legal i pinky promise < / d i v > < b r >
< div > < b > < a href = "https://smiggins.trinkey.com/" > smiggins . trinkey . com < / a > : < / b > < / d i v >
< div > official jerimiah smiggins instance , that being my own social media platform < / d i v > < b r >
< div > ( asterisk ( * ) means i haven ' t written the code for it ) < / d i v > < b r > `
} ;
const _internal _neofetchOutputs = {
desktop : ` <pre> <b>...-:::::-...</b> <b class="green">trinkey</b>@<b class="green">desktop</b>
< b > . - MMMMMMMMMMMMMMM - . < / b > - - - - - - - - - - - - - - -
< b > . - MMMM < span class = "green" > \ ` ..-:::::::-.. \` </span>MMMM-.</b> <b class="green">OS</b>: Linux Mint 21.3 x86_64
< b > . : MMMM < span class = "green" > . : MMMMMMMMMMMMMMM : . < / s p a n > M M M M : . < / b > < b c l a s s = " g r e e n " > H o s t < / b > : M S - 7 E 2 7 1 . 0
< b > - MMM < span class = "green" > - M -- - MMMMMMMMMMMMMMMMMMM . < / s p a n > M M M - < / b > < b c l a s s = " g r e e n " > R e s o l u t i o n < / b > : 1 6 8 0 x 1 0 5 0 , 2 5 6 0 x 1 4 4 0
< b > \ ` :MMM<span class="green">:MM \` :MMMM:....::-...-MMMM:</span>MMM: \` </b> <b class="green">DE</b>: Cinnamon 6.0.4
< b > : MMM < span class = "green" > : MMM \ ` :MM: \` \` \` \` \` \` :MMM:</span>MMM:</b> <b class="green">WM</b>: Mutter (Muffin)
< b > . MMM < span class = "green" > . MMMM \ ` :MM. -MM. .MM- \` MMMM.</span>MMM.</b> <b class="green">CPU</b>: AMD Ryzen 9 7950X (32) @ 5.881GHz
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM-</span>MMM:</b> <b class="green">GPU</b>: AMD ATI 03:00.0 Device 747e
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM:</span>MMM:</b> <b class="green">GPU</b>: AMD ATI 11:00.0 Device 164e
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM-</span>MMM:</b> <b class="green">Memory</b>: 1MiB / 127901MiB
< b > . MMM < span class = "green" > . MMMM \ ` :MM:--:MM:--:MM: \` MMMM.</span>MMM.</b>
< b > : MMM < span class = "green" > : MMM - \ ` -MMMMMMMMMMMM- \` -MMM-</span>MMM:</b>
< b > : MMM < span class = "green" > : MMM : \ ` \` :MMM:</span>MMM:</b>
< b > . MMM < span class = "green" > . MMMM : -- -- -- -- -- -- -- : MMMM . < / s p a n > M M M . < / b >
< b > '-MMMM<span class="green">.-MMMMMMMMMMMMMMM-.</span>MMMM-' < / b >
< b > '.-MMMM<span class="green">\`\`--:::::--\`\`</span>MMMM-.' < / b >
< b > '-MMMMMMMMMMMMM-' < / b >
< b > \ ` \` -:::::- \` \` </b></pre> ` ,
laptop : ` <pre> <b>...-:::::-...</b> <b class="green">trinkey</b>@<b class="green">laptop</b>
< b > . - MMMMMMMMMMMMMMM - . < / b > - - - - - - - - - - - - - - -
< b > . - MMMM < span class = "green" > \ ` ..-:::::::-.. \` </span>MMMM-.</b> <b class="green">OS</b>: Linux Mint 21.2 x86_64
< b > . : MMMM < span class = "green" > . : MMMMMMMMMMMMMMM : . < / s p a n > M M M M : . < / b > < b c l a s s = " g r e e n " > H o s t < / b > : D e l l G 1 5 5 5 1 0
< b > - MMM < span class = "green" > - M -- - MMMMMMMMMMMMMMMMMMM . < / s p a n > M M M - < / b > < b c l a s s = " g r e e n " > R e s o l u t i o n < / b > : 2 5 6 0 x 1 4 4 0 , 1 9 2 0 x 1 0 8 0 , 1 6 8 0 x 1 0 5 0
< b > \ ` :MMM<span class="green">:MM \` :MMMM:....::-...-MMMM:</span>MMM: \` </b> <b class="green">DE</b>: Cinnamon 5.8.4
< b > : MMM < span class = "green" > : MMM \ ` :MM: \` \` \` \` \` \` :MMM:</span>MMM:</b> <b class="green">WM</b>: Mutter (Muffin)
< b > . MMM < span class = "green" > . MMMM \ ` :MM. -MM. .MM- \` MMMM.</span>MMM.</b> <b class="green">CPU</b>: Intel i5-10500H (12) @ 4.500GHz
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM-</span>MMM:</b> <b class="green">GPU</b>: NVIDIA GeForce RTX 3050 Ti Mobile
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM:</span>MMM:</b> <b class="green">GPU</b>: Intel CometLake-H GT2 [UHD Graphics]
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM-</span>MMM:</b> <b class="green">Memory</b>: 2001MiB / 15765MiB
< b > . MMM < span class = "green" > . MMMM \ ` :MM:--:MM:--:MM: \` MMMM.</span>MMM.</b>
< b > : MMM < span class = "green" > : MMM - \ ` -MMMMMMMMMMMM- \` -MMM-</span>MMM:</b>
< b > : MMM < span class = "green" > : MMM : \ ` \` :MMM:</span>MMM:</b>
< b > . MMM < span class = "green" > . MMMM : -- -- -- -- -- -- -- : MMMM . < / s p a n > M M M . < / b >
< b > '-MMMM<span class="green">.-MMMMMMMMMMMMMMM-.</span>MMMM-' < / b >
< b > '.-MMMM<span class="green">\`\`--:::::--\`\`</span>MMMM-.' < / b >
< b > '-MMMMMMMMMMMMM-' < / b >
< b > \ ` \` -:::::- \` \` </b></pre> ` ,
server : ` <pre> <b>...-:::::-...</b> <b class="green">trinkey</b>@<b class="green">server</b>
< b > . - MMMMMMMMMMMMMMM - . < / b > - - - - - - - - - - - - - - -
< b > . - MMMM < span class = "green" > \ ` ..-:::::::-.. \` </span>MMMM-.</b> <b class="green">OS</b>: Linux Mint 21.2 x86_64
< b > . : MMMM < span class = "green" > . : MMMMMMMMMMMMMMM : . < / s p a n > M M M M : . < / b > < b c l a s s = " g r e e n " > H o s t < / b > : M a c m i n i 7 , 1 1 . 0
< b > - MMM < span class = "green" > - M -- - MMMMMMMMMMMMMMMMMMM . < / s p a n > M M M - < / b > < b c l a s s = " g r e e n " > C P U < / b > : I n t e l i 5 - 4 2 7 8 U ( 4 ) @ 3 . 1 0 0 G H z
< b > \ ` :MMM<span class="green">:MM \` :MMMM:....::-...-MMMM:</span>MMM: \` </b> <b class="green">GPU</b>: Intel Haswell-ULT
< b > : MMM < span class = "green" > : MMM \ ` :MM: \` \` \` \` \` \` :MMM:</span>MMM:</b> <b class="green">Memory</b>: 9011MiB / 15866MiB
< b > . MMM < span class = "green" > . MMMM \ ` :MM. -MM. .MM- \` MMMM.</span>MMM.</b>
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM-</span>MMM:</b>
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM:</span>MMM:</b>
< b > : MMM < span class = "green" > : MMMM \ ` :MM. -MM- .MM: \` MMMM-</span>MMM:</b>
< b > . MMM < span class = "green" > . MMMM \ ` :MM:--:MM:--:MM: \` MMMM.</span>MMM.</b>
< b > : MMM < span class = "green" > : MMM - \ ` -MMMMMMMMMMMM- \` -MMM-</span>MMM:</b>
< b > : MMM < span class = "green" > : MMM : \ ` \` :MMM:</span>MMM:</b>
< b > . MMM < span class = "green" > . MMMM : -- -- -- -- -- -- -- : MMMM . < / s p a n > M M M . < / b >
< b > '-MMMM<span class="green">.-MMMMMMMMMMMMMMM-.</span>MMMM-' < / b >
< b > '.-MMMM<span class="green">\`\`--:::::--\`\`</span>MMMM-.' < / b >
< b > '-MMMMMMMMMMMMM-' < / b >
< b > \ ` \` -:::::- \` \` </b></pre> `
} ;
const helpText = ` <div> -=== <b class="pink">tSh help</b> ===-</div>
< div > -- -- -- -- -- -- -- -- -- -- < / d i v >
< div > -= < b class = "green" > cat < / b > = - < / d i v >
< div > Displays the contents of a file . < / d i v >
< div > -= < b class = "green" > cd < / b > = - < / d i v >
< div > Changes the working directory . < / d i v >
< div > -= < b class = "green" > clear < / b > = - < / d i v >
< div > Clears the terminal output . < / d i v >
< div > -= < b class = "green" > help < / b > = - < / d i v >
< div > Shows this help menu . < / d i v >
< div > -= < b class = "green" > ls < / b > = - < / d i v >
< div > Lists all files in a directory . < / d i v >
< div > & nbsp ; - l - displays more information about each file < / d i v >
< div > & nbsp ; - a - displays all files < / d i v >
< div > & nbsp ; - A - displays all files except implied . and . . < / d i v >
< div > & nbsp ; - r - reverses the order of the files < / d i v >
< div > & nbsp ; - R - recurse through all subdirectories < / d i v >
< div > -= < b class = "green" > exit < / b > = - < / d i v >
< div > Closes the terminal . < / d i v > ` ;
const HOME _DIR = "/home/trinkey" ;
let FILESYSTEM = {
home : {
type : "directory" ,
name : "home" ,
files : {
trinkey : {
type : "directory" ,
name : "trinkey" ,
files : {
people : { type : "directory" , name : "people" , files : {
"88x31.txt" : { type : "file" , name : "88x31.txt" , content : _internal _defaultFiles . buttons } ,
"testimonials.txt" : { type : "file" , name : "testimonials.txt" , content : _internal _defaultFiles . testimonials } ,
"webrings.txt" : { type : "file" , name : "webrings.txt" , content : _internal _defaultFiles . webrings }
} } ,
"about-me.txt" : { type : "file" , name : "about-me.txt" , content : _internal _defaultFiles . about } ,
"socials.txt" : { type : "file" , name : "socials.txt" , content : _internal _defaultFiles . socials } ,
"projects.txt" : { type : "file" , name : "projects.txt" , content : _internal _defaultFiles . projects } ,
"subdomains.txt" : { type : "file" , name : "subdomains.txt" , content : _internal _defaultFiles . directory }
}
}
}
} ,
bin : {
type : "directory" ,
name : "bin" ,
files : {
cat : { type : "file" , name : "cat" , content : "<div>function cat(file: string): string { ... }</div>" } ,
cd : { type : "file" , name : "cd" , content : "<div>function cd(directory: string): void { ... }</div>" } ,
clear : { type : "file" , name : "clear" , content : "<div>function clear(): void { ... }</div>" } ,
help : { type : "file" , name : "help" , content : "<div>function help(): string { ... }</div>" } ,
ls : { type : "file" , name : "ls" , content : "<div>function ls(directory: string): string { ... }</div>" } ,
neofetch : { type : "file" , name : "neofetch" , content : "<div>function neofetch(): string { ... }</div>" }
}
} ,
".secret-file" : { type : "file" , name : ".secret-file" , content : "<div>meow :3</div>" }
} ;
let windowInformation = { } ;
function commandManager ( windowID , command ) {
if ( ! windowInformation [ windowID ] ) {
windowInformation [ windowID ] = {
PWD : HOME _DIR
} ;
}
let out ;
if ( _internal _commands [ command . split ( " " ) [ 0 ] ] ) {
out = _internal _commands [ command . split ( " " ) [ 0 ] ] ( command . split ( " " ) . slice ( 1 ) . join ( " " ) . trim ( ) , windowID ) ;
}
else if ( command == "" ) {
out = "" ;
}
else {
out = ` <div class="red">Unknown command ' ${ escapeHTML ( command . split ( " " ) [ 0 ] ) } '.</div><div>Type 'help' for a list of commands</div> ` ;
}
let el = document . createElement ( "div" ) ;
el . innerHTML = out ;
WINDOWS [ windowID ] . element . querySelector ( ".window" ) . append ( el ) ;
let dTE = WINDOWS [ windowID ] . element . querySelector ( "[data-type-area]" ) ;
if ( dTE ) {
dTE . removeAttribute ( "data-type-area" ) ;
if ( dTE . querySelector ( "i.cursor" ) ) {
dTE . querySelector ( "i.cursor" ) . remove ( ) ;
}
else if ( dTE . querySelector ( ".cursor" ) ) {
dTE . querySelector ( ".cursor" ) . classList . remove ( "cursor" ) ;
}
}
WINDOWS [ windowID ] . element . querySelector ( ".window-header-title" ) . innerText = ` ${ _internal _stringifyPath ( windowInformation [ windowID ] . PWD ) } - tSh ` ;
let ps1 = document . createElement ( "div" ) ;
ps1 . innerHTML = _internal _getPS1 ( windowInformation [ windowID ] ) ;
let typeArea = document . createElement ( "span" ) ;
typeArea . dataset . typeArea = "" ;
typeArea . innerHTML = "<i class=\"cursor\"> </i>" ;
ps1 . append ( typeArea ) ;
WINDOWS [ windowID ] . element . querySelector ( ".window" ) . append ( ps1 ) ;
}