1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
<?php
namespace App\Console\Commands;
use App\Song;
use Illuminate\Console\Command;
class AddSongs extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'prosongsa:import {file}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import songs from an inputfile.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
define( 'AUTHOR_REGEX', "/^-(([A-Za-z.]+ ?)+)/" );
$filename = $this->argument('file');
$handle = fopen($filename, "r");
$theSong = [
'text' => '',
'verse' => '',
'number' => FALSE,
];
if ( !$handle ){
$this->error("Couldn't read file '$filename'");
return 1;
}
while (($line = fgets($handle)) !== false)
{
// If we see a number, then that is what song we are on.
$matches = array();
if ( preg_match("(^(X?C?B?\d+)\. )", $line, $matches) )
{
if ( $theSong['text'] && $theSong['number'] && $theSong['title']
&& ( $theSong['number'] != $matches[1] ) ) {
Song::create( $theSong );
$this->line( "Created $theSong[title]" );
$theSong = [
'text' => '',
'verse' => '',
'key' => NULL,
'author' => NULL,
];
}
$theSong['number'] = $matches[1];
$theSong['title'] = trim($line);
$this->line( "Creating $theSong[title]..." );
}
$theSong['text'] .= $line;
if ( preg_match( "/\{p?\d*\((.+m?)\)\}/", $line, $matches)
|| preg_match("/^{Key: ?([^ ]*).*}/i", $line, $matches)
) {
$theSong['key'] = $matches[1];
}
if ( preg_match( AUTHOR_REGEX, $line, $matches ) ) {
$theSong['author'] = $matches[1];
}
}
fclose($handle);
Song::create( $theSong );
}
}
|