joshtronic

in Software Development #PHP

WorkFlowy: Adventures in Text Parsing

First off, if you're not familiar with WorkFlowy you may want to watch this video. WorkFlowy is quite simply a list maker and based on my own usage of planning out a program / script I decided to create a script to take an exported list and convert it into a the workings of the program itself.

The script that I wrote is in PHP and only generates PHP files. I lost interest in the project, at least in the capacity of adding support for additional languages, so I took it down from my github (oh yeah, and no one was interested in the project itself ;))

At best, you can use this to take a list like this:

- My Script
  - [IF] Check if file exists
  - Reads the file in
  - [FOREACH] Loops through the data
    - [IF] Check if the data is empty
      - Processes the data
    - [ELSE]
      - Does some other stuff
  - Closes the file
  - [WHILE] Just a while loop
    - Increment counter

And turn it into something like this:

<?php

/**

  • My Script */

// Check if file exists if ($var == true) { }

// Reads the file in

// Loops through the data foreach ($array as $key => $value) { // Check if the data is empty if ($var == true) { // Processes the data } else { // Does some other stuff } }

// Closes the file

// Just a while loop while ($i < 10) { // Increment counter }

?>

Assuming you're into that, here's the source:

<!DOCTYPE html>
<html>
    <body>
        <h1>WorkFlowy Code Generator</h1>
        <form action="" method="post">
            <textarea name="list" rows="20" cols="100"><?php
                if (isset($_POST['list']))
                {
                    $items = explode("\n", $_POST['list']);

if (count($items) > 0) { $indents = null; $previous_spaces = null; $parenthesis = 0;

foreach ($items as $item) { preg_match('/^( +)?(- )(.+)$/', $item, $matches);

$spaces = strlen($matches[1]); $item = trim($matches[3]);

$is_syntax = (strpos($item, '[') === 0);

if ($item != '') { if ($indents === null) { $indents = 0; echo '<?php' . "\n\n"; echo '/**' . "\n" . ' * ' . $item . "\n" . ' */' . "\n\n"; } else { if ($previous_spaces !== null) { if ($previous_spaces > $spaces) { $difference = $previous_spaces - $spaces;

for ($i = 0; $i < $difference; $i = $i + 2) { $indents--;

if ($parenthesis > 0) { echo str_repeat("\t", $indents) . '}' . "\n\n"; $parenthesis--; } } } elseif ($previous_spaces < $spaces) { $difference = $spaces - $previous_spaces;

for ($i = 0; $i < $difference; $i = $i + 2) { $indents++; } } else { if ($parenthesis > 0) { echo $indent_string . '}' . "\n\n"; $parenthesis--; } } }

$indent_string = str_repeat("\t", $indents);

if ($is_syntax) { preg_match('/^([.+])(.+)?$/', $item, $matches);

$type = substr($matches[1], 1, strlen($matches[1]) - 2); $item = trim($matches[2]); } else { $type = false; }

if ($item != '') { echo $indent_string . '// ' . $item . "\n"; }

if ($type != false) { switch ($type) { case 'FOR': echo $indent_string . 'for ($i = 0; $i < 10; $i++)' . "\n" . $indent_string . '{'; break;

case 'FOREACH': echo $indent_string . 'foreach ($array as $key => $value)' . "\n" . $indent_string . '{'; break;

case 'IF': echo $indent_string . 'if ($var == true)' . "\n" . $indent_string . '{'; break;

case 'ELSEIF': echo $indent_string . 'elseif ($var == false)' . "\n" . $indent_string . '{'; break;

case 'ELSE': echo $indent_string . 'else' . "\n" . $indent_string . '{'; break;

case 'WHILE': echo $indent_string . 'while ($i < 10)' . "\n" . $indent_string . '{'; break; }

$parenthesis++; }

echo "\n";

$previous_spaces = $spaces; } } }

if ($parenthesis > 0) { echo '}' . "\n\n"; }

echo '?>'; } } ?></textarea>

<input type="submit" /> </form> </body> </html>