}
    }
    closedir($dh);
}
require_login();
$context = get_system_context();
$PAGE->set_context($context);
$PAGE->set_heading($SITE->fullname);
$PAGE->set_title($SITE->fullname . ': ' . get_string('pluginname', 'local_moodlecheck'));
$PAGE->set_url(new moodle_url('/local/moodlecheck/index.php'));
$output = $PAGE->get_renderer('local_moodlecheck');
echo $output->header();
$form = new local_moodlecheck_form();
$form->display();
if ($form->is_submitted() && $form->is_validated()) {
    $data = $form->get_data();
    $paths = preg_split('/\\s*\\n\\s*/', trim($data->path), null, PREG_SPLIT_NO_EMPTY);
    $ignorepaths = preg_split('/\\s*\\n\\s*/', trim($data->ignorepath), null, PREG_SPLIT_NO_EMPTY);
    if (isset($data->checkall) && $data->checkall == 'selected' && isset($data->rule)) {
        foreach ($data->rule as $code => $value) {
            local_moodlecheck_registry::enable_rule($code);
        }
    } else {
        local_moodlecheck_registry::enable_all_rules();
    }
    foreach ($paths as $filename) {
        $path = new local_moodlecheck_path($filename, $ignorepaths);
        echo $output->display_path($path);
    }
}
echo $output->footer();
local_moodlecheck_registry::add_rule('constsdocumented')->set_callback('local_moodlecheck_constsdocumented');
local_moodlecheck_registry::add_rule('definesdocumented')->set_callback('local_moodlecheck_definesdocumented');
local_moodlecheck_registry::add_rule('noinlinephpdocs')->set_callback('local_moodlecheck_noinlinephpdocs');
local_moodlecheck_registry::add_rule('phpdocsfistline')->set_callback('local_moodlecheck_phpdocsfistline');
local_moodlecheck_registry::add_rule('functiondescription')->set_callback('local_moodlecheck_functiondescription');
local_moodlecheck_registry::add_rule('functionarguments')->set_callback('local_moodlecheck_functionarguments');
local_moodlecheck_registry::add_rule('variableshasvar')->set_callback('local_moodlecheck_variableshasvar');
local_moodlecheck_registry::add_rule('definedoccorrect')->set_callback('local_moodlecheck_definedoccorrect');
local_moodlecheck_registry::add_rule('filehascopyright')->set_callback('local_moodlecheck_filehascopyright');
local_moodlecheck_registry::add_rule('classeshavecopyright')->set_callback('local_moodlecheck_classeshavecopyright');
local_moodlecheck_registry::add_rule('filehaslicense')->set_callback('local_moodlecheck_filehaslicense');
local_moodlecheck_registry::add_rule('classeshavelicense')->set_callback('local_moodlecheck_classeshavelicense');
local_moodlecheck_registry::add_rule('phpdocsinvalidtag')->set_callback('local_moodlecheck_phpdocsinvalidtag');
local_moodlecheck_registry::add_rule('phpdocsnotrecommendedtag')->set_callback('local_moodlecheck_phpdocsnotrecommendedtag')->set_severity('warning');
local_moodlecheck_registry::add_rule('phpdocsinvalidinlinetag')->set_callback('local_moodlecheck_phpdocsinvalidinlinetag');
local_moodlecheck_registry::add_rule('phpdocsuncurlyinlinetag')->set_callback('local_moodlecheck_phpdocsuncurlyinlinetag');
/**
 * Checks if the first line in the file has open tag and second line is not empty
 *
 * @param local_moodlecheck_file $file
 * @return array of found errors
 */
function local_moodlecheck_noemptysecondline(local_moodlecheck_file $file)
{
    $tokens =& $file->get_tokens();
    if ($tokens[0][0] == T_OPEN_TAG && !$file->is_whitespace_token(1) && $file->is_multiline_token(0) == 1) {
        return array();
    }
    return array(array('line' => 2));
}
/**
 /**
  * Validates a file over registered rules and returns an array of errors
  *
  * @return array
  */
 public function validate()
 {
     if ($this->errors !== null) {
         return $this->errors;
     }
     $this->errors = array();
     if (!$this->needs_validation()) {
         return $this->errors;
     }
     foreach (local_moodlecheck_registry::get_enabled_rules() as $code => $rule) {
         $ruleerrors = $rule->validatefile($this);
         if (count($ruleerrors)) {
             $this->errors = array_merge($this->errors, $ruleerrors);
         }
     }
     $this->clear_memory();
     return $this->errors;
 }
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
/**
 * Registering rules for checking phpdocs related to package and category tags
 *
 * @package    local_moodlecheck
 * @copyright  2012 Marina Glancy
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
defined('MOODLE_INTERNAL') || die;
local_moodlecheck_registry::add_rule('packagespecified')->set_callback('local_moodlecheck_packagespecified');
local_moodlecheck_registry::add_rule('packagevalid')->set_callback('local_moodlecheck_packagevalid');
local_moodlecheck_registry::add_rule('categoryvalid')->set_callback('local_moodlecheck_categoryvalid');
/**
 * Checks if all functions (outside class) and classes have package
 * 
 * package tag may be inherited from file-level phpdocs
 *
 * @param local_moodlecheck_file $file
 * @return array of found errors
 */
function local_moodlecheck_packagespecified(local_moodlecheck_file $file)
{
    $errors = array();
    $phpdocs = $file->find_file_phpdocs();
    if ($phpdocs && count($phpdocs->get_tags('package', true))) {
        // package is specified on file level, it is automatically inherited
        return array();
 protected function definition()
 {
     global $path;
     $mform = $this->_form;
     $mform->addElement('header', '');
     $mform->addElement('textarea', 'path', get_string('path', 'local_moodlecheck'), array('rows' => 8, 'cols' => 120));
     $mform->addHelpButton('path', 'path', 'local_moodlecheck');
     $mform->addElement('textarea', 'ignorepath', get_string('ignorepath', 'local_moodlecheck'), array('rows' => 3, 'cols' => 120));
     $mform->setAdvanced('ignorepath');
     $mform->addElement('radio', 'checkall', '', get_string('checkallrules', 'local_moodlecheck'), 'all');
     $mform->addElement('radio', 'checkall', '', get_string('checkselectedrules', 'local_moodlecheck'), 'selected');
     $mform->setDefault('checkall', 'all');
     foreach (local_moodlecheck_registry::get_registered_rules() as $code => $rule) {
         $mform->addElement('checkbox', "rule[{$code}]", '', $rule->get_name());
         $mform->setDefault("rule[{$code}]", 1);
         $mform->setAdvanced("rule[{$code}]");
     }
     $mform->addElement('submit', 'submitbutton', get_string('check', 'local_moodlecheck'));
 }