Alfred Workflows voor gevorderde gebruikers

Nou, je hebt de geavanceerde zelfstudie gehaald. Goed gedaan! Nu voor het echte werk. Alfred kan worden gebruikt om ingewikkelde dingen te doen, inclusief recursieve programmering! De concepten hier zijn niet gemakkelijk en niet voor de onervaren programmeur.

Scriptfilters

Scriptfilter is het laatste bloktype dat besproken moet worden. Zoals de Bestandsfilter, een Scriptfilter geeft de gebruiker een lijst met opties om te selecteren. Het verschil is, een Scriptfilter laat de programmeur de lijst met opties maken met een script.

Een eenvoudige keuzeselectie voor het maken van een project in de projectmap toont het gebruik van a Scriptfilter. Voeg eerst een toe Scriptfilter naar de Project Manager Workflow uit de tussentijdse zelfstudie.


Scriptfilters: configuratiescherm

Stel de keyword naar pm: maak, controleer de met ruimte checkbox, stel het argumenttype in op Argument optioneel, de Placeholder titel naar Maak een project, de Placeholder Subtext naar Projectleider, de "Please Wait" subtekst naar Opties laden ... . De meeste van deze opties zijn hetzelfde als in andere vakken.

De met ruimte checkbox vertelt Alfred om een ​​spatie te verwachten voor het optionele argument. Daarom zal het de voorafgaande spatie verwijderen voordat het argument aan het script wordt doorgegeven. Anders zal het alles gewoon voorbijgaan na de keyword naar het script voor dit blok.

De Argumenttype selector heeft drie waarden: Argument vereist, Argument optioneel, en Geen argument. De Argument vereist accepteert geen regelterugloop totdat een argument wordt gegeven achter het sleutelwoord. Het zal alles doorgeven aan het script terwijl de gebruiker typt. De Argument optioneel laat de gebruiker toe om op enter te drukken zonder een gegeven argument. De Geen argument verplaatst naar het volgende overeenkomende sleutelwoord als de gebruiker een argument begint te geven. Anders valt het uit naar een standaardzoekopdracht.

De "Please Wait" subtekst kunt u een subtekst geven aan de gebruiker terwijl het script in de Scriptfilter wordt uitgevoerd. Hiermee kan de gebruiker van het script weten of alle keuzes beschikbaar zijn of niet.

Het scriptvakgebied is net als een Voer het script uit blok. U selecteert de gewenste programmeertaal, welke escapemogelijkheden u nodig heeft en het script zelf. Zet het op / Usr / bin / php, allemaal ontsnappend, en het volgende script:

 echo <<   Eenvoudige HTML-site Projectleider icon.png   Backbone HTML-site Projectleider icon.png   EOF;

Dit PHP-script echoot simpelweg de XML voor de resultaten van het script. EEN Scriptfilter verwacht dat het script een geldige XML-instructie uitvoert met een reeks items: één voor elke optie die beschikbaar is voor de gebruiker.

Elk item heeft een uid, arg, Geldig, en autocomplete opties. De uid is een uniek nummer of een unieke naam voor dat item. Als het altijd dezelfde unieke naam voor dat item is, hoe meer een gebruiker het selecteert, hoe meer het naar de bovenkant van de lijst wordt geplaatst. De arg is wat het volgende blok zal ontvangen als dat item is geselecteerd. De Geldig argument kan alleen zijn Ja of Nee. Als Nee, dan kan dat item niet worden geselecteerd, maar het autocomplete waarde zal worden geplaatst in de Alfred Prompt met het trefwoord. Als Ja, dan accepteert het een enter om het argument naar het volgende blok te sturen en de autocomplete waarde wordt genegeerd.

De titel, subtitel, en icoon Met kinderen van elk item kan het script de titel, ondertiteling en het pictogram instellen om de resultaten weer te geven voor de gebruiker. Daarom kan elk item een ​​ander pictogram hebben. Als u een submap in uw werkstroomgebied hebt aangeroepen pictogrammen, je kunt de gebruiken icons / day.png pad om naar een opgeroepen foto te verwijzen day.png in die submap. Hiermee kunt u uw resultaten personaliseren voor een eenvoudigere selectie.


Scriptfilters: weergeven

Nu, wanneer de Scriptfilter is geactiveerd, de bovenstaande afbeeldingen tonen de resultaten. Het zal nog steeds niets uitvoeren behalve de selectie naar Alfred sturen.


Scriptfilters: een toevoegen Voer het script uit Blok

Om iets te doen op basis van de selectie, moet u een toevoegen Voer het script uit blokkeer vervolgens en vul het in als een bash-script zonder te ontsnappen. Het scriptgedeelte kan worden gevuld met het volgende script:

 ######################### # Contants. ######################### VPREFS = "$ HOME /Library/Caches/com.runningwithcrayons.Alfred-2/Workflow Data /" NVPREFS = "$ HOME / Bibliotheek / Application Support / Alfred 2 / Workflow Data /" ############################### ######################## # Lezen de bundleid uit de info.plist van de workflow ####################################### ##################################### getBundleId () / usr / libexec / PlistBuddy -c " Afdrukken: bundleid "" info.plist " ### ################################## ####################################### # Verkrijg de workflowgegevens dir ##### ################################################## ######################## getDataDir () local BUNDLEID = $ (getBundleId) echo "$ NVPREFS $ BUNDLEID" if [! -d "$ (getDataDir)"]; dan mkdir -p "$ (getDataDir)"; raak "$ (getDataDir) /projectDir.txt" aan; fi projD = "cat" $ (getDataDir) /projectDir.txt ""; als [ ! -d "$ projD"]; dan mkdir -p "$ projD"; fi cd "$ projD"; type = " vraag"; vraag "$ type" in standaard) echo "Basic"; curl -o tmp.zip -L "https://codeload.github.com/h5bp/html5-boilerplate/zip/v4.3.0"; unzip tmp.zip >> / dev / null; mv html5-boilerplate-4.3.0 / *. ; rm -Rf "html5-boilerplate-4.3.0 /"; rm -Rf "tmp.zip"; echo "HTML5 Boilerplate op zijn plaats."; ;; backbone) echo "BackBone"; curl -o tmp.zip -L "https://codeload.github.com/h5bp/html5-boilerplate/zip/v4.3.0"; unzip tmp.zip >> / dev / null; mv html5-boilerplate-4.3.0 / *. ; rm -Rf "html5-boilerplate-4.3.0 /"; rm -Rf "tmp.zip"; curl -o js / vendor / backbone-min.js -L "http://backbonejs.org/backbone-min.js"; echo "HTML5 Boilerplate with Backbone.js op zijn plaats."; ;; esac

Met dit script wordt eenvoudig het type project gemaakt in de map die is ingesteld als de map van het project. Het eerste deel van het script is net als de scripts die in de tussentijdse zelfstudie worden gebruikt om toegang te krijgen tot de twee plaatsen waar gegevens kunnen worden opgeslagen. De gegevensdirectory en de cache directory. Hier wordt alleen de gegevensdirectory gebruikt om de locatie van de projectdirectory te krijgen.

De rest van het script gaat naar de projectdirectory en vult het in op basis van het geselecteerde type project. Een eenvoudig HTML-project downloadt de HTML5 Boilerplate-sjabloon en installeert deze in de projectdirectory. Een Backbone-project installeert de HTML5 Boilerplate Template en Backbone.js JavaScript-bibliotheek. Dit kan eenvoudig worden verbeterd door Yeoman te gebruiken om de projectcomponenten te installeren, maar dat zou verder gaan dan het bereik van deze tutorial.

Het probleem met de manier waarop dit Scriptfilter werd geschreven, is dat het moeilijk uit te breiden en te onderhouden is. Het zou veel gemakkelijker zijn om een ​​functie te bellen die de XML naar behoefte zal creëren. Door deze benadering van het programma te gebruiken, kan de gebruiker de lijst met mogelijke acties niet verfijnen door te typen. Ze hoeven alleen maar langs de lijst te gaan of op een sneltoets voor dat item te drukken.

Omdat het bij Alfred allemaal draait om het vinden en selecteren van opties eenvoudiger, moet er een manier zijn om dit mogelijk te maken. Dank aan alle toegewijde programmeurs die helpen met Alfred, er zijn enkele bibliotheken geschreven die dit proces veel gemakkelijker zullen maken.

Bibliotheken met Helper-functies

Een van de zegeningen van het ecosysteem van Alfred is dat veel mensen bibliotheken ontwerpen voor hun favoriete scripttaal om het programmeren door Alfred eenvoudiger te maken. De volledige lijst met Alfred Libraries is te vinden op het Alfred Forum. Er zijn bibliotheken voor Bash / Zsh (waarvan ik er stukken heb gebruikt in deze scripts), Python, PHP, Ruby, AppleScript en go (het wordt vermeld als een AppleScript-bibliotheek, maar het is voor de go-programmeertaal van Google)!

Om gebruik te maken van de bibliotheek voor PHP, moet je het workflows.php-bestand van deze site downloaden van David Ferguson. Plaats dit in de workflow-map. Nu moet dit script in de PHP-code worden geladen voor de Scriptfilter. Wijzig die code in:

 // // Laad de PHP-workflow-bibliotheek. // include_once ("workflows.php"); // // Maak het te gebruiken werkstroomobject. // $ wf = nieuwe workflows (); // // Haal de onbewerkte vraag op en sla deze op voor gebruik. // $ clean = trim ("query"); // // Stel de opties in. // $ wf-> result ("1PM", "basic", "Basic HTML Site", "Project Manager", 'icon.png', "yes"); $ wf-> result ("2PM", "backbone", "Backbone HTML Site", "Project Manager", 'icon.png', "yes"); // // Echo uit de xml van de keuzes. // echo $ wf-> toxml ();

Dit is veel gemakkelijker te lezen en te begrijpen. Opmerkingen kunnen eenvoudig worden toegevoegd om de code uit te leggen voor toekomstig gebruik. Dit geeft precies dezelfde resultaten als de lege XML-lijst, maar nu is het in een vorm die uitbreiding eenvoudiger maakt.

Dit script wordt nu in de bibliotheek geladen en initialiseert een klassenvariabele, $ wf, van de Workflow () klas uit de bibliotheek. De resultaat() lidfunctie wordt gebruikt om de XML-code te maken met de opties. De opties op volgorde zijn: count, arg, title, subtitel, pictogrambestand en geldig. De toxml () lidfunctie retourneert eenvoudig de uiteindelijke XML-code die wordt geëchood.

Nu, om het te maken Scriptfilter er beter uitzien. Neem de twee afbeeldingsbestanden in het downloadbestand voor deze zelfstudie en voeg ze toe aan uw workflowdirectory. Verander dan de Stel de opties in sectie in de Scriptfilter code om:

 // // Stel de opties in. // $ wf-> result ("1PM", "basic", "Basic HTML Site", "Project Manager", 'html5BP.jpeg', "yes"); $ wf-> result ("2PM", "backbone", "Backbone HTML Site", "Project Manager", 'backbone.png', "yes");

Het pictogram dat voor elke keuze wordt gebruikt, vertegenwoordigt nu de keuze. Een veel betere gebruikersinterface. Alfred kan zowel jpeg- als png-grafische bestanden voor de pictogrammen gebruiken. Het herschaalt ook de pictogrammen naar behoefte. De resultaten worden hieronder getoond:


Maak een project met pictogrammen

Zoals te zien is, wordt de tweede optie eerst weergegeven. Dat komt omdat ik het het meest gebruikte tijdens het testen. Alfred onthoudt welke keuze het meest wordt gebruikt en probeert de lijst dienovereenkomstig te bestellen. Dit is handig voor opdrachten die vaker worden gebruikt.

Maar de lijst kan niet worden verkleind door een deel van de naam in te typen. Dat is een echte must als er veel keuzes zijn. Helaas heeft deze PHP-bibliotheek daar geen functie voor. Daarom moet een nieuwe functie worden gedefinieerd. Verander het optiegebied naar dit:

 // // Stel de opties in. // $ added = buildResult ($ wf, "$ clean", "1PM", "basic", "Basic HTML Site", "Project Manager", 'html5BP.jpeg', "yes"); $ added + = buildResult ($ wf, "$ clean", "2PM", "backbone", "Backbone HTML Site", "Project Manager", 'backbone.png', "yes"); if ($ added == 0) $ wf-> result ("999", "", "Geen projecttype komt overeen met $ clean!", "Project Manager", 'icon.png', 'no'); 

De buildResult () functie neemt alles dat de resultaat() functie deed, maar heeft ook twee nieuwe parameters: de Workflow () objectvariabele en de tekst die overeenkomt met de opdracht.

Voeg nu de definitie van de nieuwe functie toe net nadat de bibliotheek het volgende bevat:

 functie buildResult ($ wf, $ input, $ count, $ arg, $ title, $ subtitle, $ icon, $ valid) $ result = 0; if (preg_match ("/.*$ input / i", "$ arg") === 1) $ wf-> result ($ count, $ arg, $ title, $ subtitle, $ icon, $ valid); $ resultaat = 1;  return ($ resultaat); 

Deze functie maakt gebruik van de preg_match () PHP-functie om een ​​reguliere expressie te maken match van de string met een jokerteken toegevoegd aan de invoertekenreeks. Als wat de gebruiker typt niet overeenkomt, wordt dat resultaat niet toegevoegd. Als een resultaat is toegevoegd, zal het een resultaat opleveren. Anders wordt een 0 geretourneerd.

Is het u opgevallen dat de extra code is toegevoegd? Dat was om te zien of er iets aan de resultaten was toegevoegd. Als niets de test doorstaat om als resultaat te nemen, wordt een standaardresultaat toegevoegd dat zegt dat het niets kon vinden. Met de Geldig parameter ingesteld op Nee, de gebruiker kan er geen return op raken. Dat zorgt ervoor dat uw workflow de gebruiker niet naar de standaardzoekopdracht dumpt met alles op de Alfred Prompt of van het verzenden van rotzooi naar het volgende script om erachter te komen.


Projecttype niet gevonden Fout

Met dat kleine beetje foutcontrole, vertelt de workflow nu gracieus aan de gebruiker dat er een probleem is zonder een dump naar de standaardzoekopdracht te veroorzaken. Denk altijd aan foutafhandeling in de workflows. Het is belangrijk voor een professionele uitstraling.

Recursieve programmering in Alfred

Sinds de Scriptfilter blok blijft het script voor elke door de gebruiker getypte letter aanroepen, het is een geweldige plek om recursieve programmering te doen. Meestal wordt recursieve programmering genoemd wanneer een routine zichzelf noemt. Dat is directe recursie. Wat wordt gedaan in Alfred's Scriptfilter zou indirecte recursie worden genoemd.

State Machine Workflows

Het eerste type recursie om te onderzoeken is de toestandsmachine. Een staatsmachine is een programma dat wordt bestuurd door een variabele die het status- of uitvoeringsniveau van het programma bepaalt.


Recursie: bekijk Script-script met projecten

De Project Manager Workflow heeft een manier nodig om projecten te volgen en bepaalde acties op die projecten uit te voeren. Om het te starten, maakt u een Scriptfilter blokkeren zoals hierboven. Voeg vervolgens dit script toe aan de Script Gebied:

 // // Laad de PHP-workflow-bibliotheek. // include_once ("workflows.php"); // // Functie: buildResultaat // // Beschrijving: bouw de resultaat-XML voorwaardelijk op als de // -invoer het argument bevat. // functie buildResult ($ wf, $ input, $ count, $ arg, $ title, $ subtitle, $ icon, $ valid, $ ret) $ result = 0; $ parts = explode ("|", $ arg); if (count ($ parts)> 0) $ arg = $ parts [0];  if (preg_match ("/.*$ input / i", "$ arg") === 1) $ wf-> result ($ count, $ arg, $ title, $ subtitle, $ icon, $ valid, $ ret); $ resultaat = 1;  return ($ resultaat);  // // Maak het te gebruiken werkstroomobject. // $ wf = nieuwe workflows (); // // Haal de onbewerkte vraag op en sla deze op voor gebruik. // $ clean = trim ("query"); // // Geef de staat door de gewenste items weer. // $ parts = explode ("|", $ clean); $ pcount = count ($ parts); $ returncount = 0; switch ($ pcount) case 1: // // Dit is de basistoestand. Hier wordt een lijst met projecten en // de mogelijkheid om een ​​nieuw project te maken vermeld. // // // Krijg en vermeld de projecten. // $ count = 0; $ filename = $ wf-> data (). "/Projects.txt"; if (file_exists ($ filename)) $ projs = explode ("\ n", file_get_contents ($ filename)); foreach ($ projs as $ proj) $ projparts = explode (":", $ proj); if (strcmp ($ projparts [0], "")! = 0) $ returncount + = buildResult ($ wf, $ parts [0], $ count, "$ projparts [0] |", "Project: $ projparts [0] "," Project Manager ", 'icon.png'," no "," $ projparts [0] | "); $ tel + = 1;  // // Geef een optie voor een nieuw project. // $ wf-> result ("999", "nieuw |", "Voeg een nieuw project toe", "Projectmanager", 'icon.png', 'nee', "nieuw |"); $ returncount + = 1; breken; geval 2: // // Twee mogelijke gebieden: een bepaald project uitvoeren of // een nieuw project maken. // if (strcmp ($ parts [0], "new") === 0) // // Maak een nieuw project. Haal de naam. // $ wf-> result ("999", "nieuw | $ parts [1]", "Project Name: $ parts [1]", "Project Manager", 'icon.png', 'yes ', "new | $ onderdelen [1]"); $ returncount + = 1;  else // // Nu om acties uit te voeren voor een project. // $ count = 1; $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "remove | $ parts [0]", "Project verwijderen: $ parts [0]" , "Project Manager", 'icon.png', "yes", ""); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "pow | $ parts [0]", "Add to Pow: $ parts [0] "," Project Manager ", 'icon.png'," yes "," "); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "alfred | $ parts [0]", "View in Alfred: $ parts [0] "," Project Manager ", 'icon.png'," yes "," "); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "current | $ parts [0]", "Make Current Project: $ parts [0] "," Project Manager ", 'icon.png'," yes "," "); $ returncount + = buildResult ($ wf, "$ parts [1]", $ count ++. "pml", "serve | $ parts [0]", "Launch Server in Project: $ parts [0]  "," Project Manager ", 'icon.png'," yes "," ");  pauze;  If ($ returncount < 1)  $wf->result ("999", "", "Ongeldige status! Gelieve opnieuw te beginnen.", "Project Manager", 'icon.png', 'no', "");  // // Echo uit de xml van de keuzes. // echo $ wf-> toxml ();

Het begin van het script is precies hetzelfde als het laatste script. Logica is toegevoegd om het eerste deel van een meerdelig deel te behouden $ arg (Met andere woorden, een string gegeven in de $ arg parameter die de | symbool.) naar de buildResult () functie.

Direct na het opschonen van de invoer van Alfred, wordt de invoer gesplitst volgens de | charater en het aantal onderdelen is berekend. Deze informatie geeft de staat de statusmachine. De schakelen ... case verklaring werkt op de verschillende toestanden van de staatsmachine. In dit geval heeft de statusmachine slechts twee toestanden.

De eerste staat vermeldt de projectnamen uit een lijst met projecten en geeft de gebruiker de mogelijkheid om een ​​nieuw project toe te voegen. De lijst met projecten wordt gemaakt vanuit het bestand projects.txt in de gegevensmap van de workflows. Let op, er wordt veel zorg besteed om te zien of het bestand bestaat en of er projecten in het bestand zitten. Ik wilde ervoor zorgen dat de workflow nooit naar de standaardzoekopdracht bomt.

De tweede staat controleert de nieuwe commando in de invoerregel. Vervolgens wordt verwacht dat de gebruiker een nieuwe projectnaam invoert. Als het geen is nieuwe commando, dan wordt aangenomen dat dit de naam van een project is. Vervolgens maakt het een lijst met acties die op het project kunnen worden uitgevoerd.


Recursie: bekijk projecten in actie

Met de staten zo gedefinieerd, is de bovenstaande afbeelding de projectlijst met de toevoeging van een nieuw project.


Recursie: lijstprojecten: een nieuw project toevoegen

Deze foto toont het nieuwe project met een nieuwe naam.


Recursie: lijstprojecten: acties voor projecten

Nadat de projecten zijn gedefinieerd, kan een project worden geselecteerd en wordt een lijst met acties die kunnen worden uitgevoerd voor het project weergegeven. Wanneer geselecteerd, verzendt het script de actieopdracht met de naam van het project.

Workflows die gebruik maken van andere workflows

Nu de informatie in de pijplijn zit, moet er actie worden ondernomen. Voeg een ... toe Voer het script uit blokkeer rechts de Scriptfilter blokkeren om met een nieuwe vorm van recursie te spelen: andere workflows bellen!


Recursie: actie ondernemen in het project

Deze Voer het script uit block is een PHP-script met de parameters zoals hierboven weergegeven. Vervolgens moet je dit in de Script Gebied:

 // // Laad de PHP-workflow-bibliotheek. // include_once ("workflows.php"); // // Functie: getProjDirectory // // Beschrijving: deze functie wordt gebruikt om de directory-gerelateerde // voor het opgegeven project op te halen. // // Inputs: // $ projname De naam van het project. // functie getProjDirectory ($ wf, $ projname) // // Haal de projectdirectory uit de projecten.txt lijst met projecten. // $ pdir = ""; $ projs = explode ("\ n", file_get_contents ($ wf-> data (). "/projects.txt")); foreach ($ projs as $ proj) $ projparts = explode (":", $ proj); if (strcmp ($ projparts [0], $ projname) === 0) // // Dit is de naam van het project, sla de map op. // $ pdir = $ projparts [1];  return ($ pdir);  // // Maak het te gebruiken werkstroomobject. // $ wf = nieuwe workflows (); // // Haal de onbewerkte vraag op en sla deze op voor gebruik. // $ clean = trim ("query"); // // Bereken de status van de query-items. // $ parts = explode ("|", $ clean); $ pcount = count ($ parts); switch ($ parts [0]) case "new": // // Maak een nieuwe projectlijst. // file_put_contents ($ wf-> data (). "/ projectName.txt", $ parts [1]); // // Download de map door Alfred te bellen. // systeem ("osascript -e 'vertel app \" Alfred 2.app \ "om \" pm te zoeken: setprojectdirectory \ "'"); breken; case "pow": // // Haal de projectdirectory uit de projects.txt-lijst met projecten. // $ pdir = getProjDirectory ($ wf, $ parts [1]); // // Maak de zachte koppeling in de map ~ / .pow. // $ home = getenv ("HOME"); if (symlink ($ pdir, "$ home / .pow / $ parts [1]")) // // Vertel de gebruiker. // echo "Toegevoegd $ parts [1] aan POW.";  else // // Iets werkte niet. // echo "Kon de symbolische link naar $ pdir niet maken!";  pauze; case "remove": // // Verkrijg de lijst met alle projecten en controleer ze allemaal. // $ projs = explode ("\ n", file_get_contents ($ wf-> data (). "/projects.txt")); $ lines [] = ""; foreach ($ projs as $ proj) $ projparts = explode (":", $ proj); if (strcmp ($ projparts [0], $ parts [1])! = 0) // // Dit is niet het project dat wordt verwijderd. Voeg het terug toe. // $ lines [] = $ proj;  // // Sla alle projecten op, behalve de verwijderde. // file_put_contents ($ wf-> data (). "/projects.txt",implode("\n",$lines)); // // Vertel de gebruiker. // echo "Het project $ parts [1] is verwijderd."; breken; case "serve": // // Bel de POW-workflow om te zien of deze wordt weergegeven. // system ("osascript -e 'vertel app \" Alfred 2.app \ "om te zoeken \" pow browse $ parts [1] \ "'"); breken; case "alfred": // // Haal de projectdirectory uit de projects.txt-lijst met projecten. // $ pdir = getProjDirectory ($ wf, $ parts [1]); // // Download de map door Alfred te bellen. // system ("osascript -e 'vertel app \" Alfred 2.app \ "om \" $ pdir \ "'" te doorzoeken); breken; case "current": // // Haal de projectdirectory uit de projects.txt-lijst met projecten. // $ pdir = getProjDirectory ($ wf, $ parts [1]); // // Stel de map in door Alfred te bellen. // file_put_contents ($ wf-> data (). "/projectDir.txt" ,$pdir); echo "$ parts [1] is nu het huidige project."; breken; 

Vlak na het laden van de Alfred PHP Workflow-bibliotheek is er een definitie voor de functie getProjDirectory (). Deze functie neemt de naam van het project en retourneert de directory voor dat project zoals opgeslagen in de projects.txt bestand in de gegevensdirectory van de workflows. Aangezien dit stuk code vaak wordt gebruikt, is het de moeite waard om in een functie te plaatsen.

De rest van de code volgt precies de Scriptfilter, behalve de inhoud van de schakelen ... case uitspraak. Dit is nog steeds een type toestandsmachine, de invoerregel geeft de status aan die moet worden verwerkt. Hier zijn de verschillende toestanden: nieuw, pow, verwijderen, serveren, alfred en current. Elke status komt overeen met een actie die moet worden uitgevoerd op een project zoals getoond in de Scriptfilter.

Nieuwe staat

De nieuwe staat is voor het maken van nieuwe projecten in de lijst met projecten. Het maakt niets anders dan plaatst een link in de projects.txt bestand in de gegevensdirectory. Dit wordt gedaan door de naam van het project op te slaan in de projectName.txt bestand in de gegevensdirectory en de pm: setprojectdirectory in Alfred om naar de map te zoeken die aan de projectnaam moet worden gekoppeld. Dit is een type staatsfeedback in die zin dat het script Alfred in een nieuwe staat recursief aanroept (zoeken op een nieuw token).

Let op hoe Alfred wordt genoemd: de PHP-code roept het osascript-programma op om dit te vertellen Alfred 2.app zoeken naar pm: setprojectdirectory. Deze techniek is de gemakkelijkste manier om iets aan te vragen bij Alfred en kan in elke scripttaal worden geïmplementeerd.

Het einde van het script in Voer het script uit voor de pm: setprojectdirectory Voer het script uit blok moet worden gewijzigd in:

 als [-f "$ (getDataDir) /projectName.txt"]; dan currentName = "cat" $ (getDataDir) /projectName.txt ""; echo "$ currentName: query" >> "$ (getDataDir) /projects.txt"; rm "$ (getDataDir) /projectName.txt"; fi echo "query"> "$ (getDataDir) /projectDir.txt"; echo "De projectdirectory is: query";

Wat dit nu doet is controleren op het bestaan ​​van de projectName.txt bestand wanneer dit script wordt aangeroepen. Als het bestaat, worden de opgegeven map en projectnaam toegevoegd aan de lijst met projecten in de projects.txt bestand en de projectName.txt bestand is verwijderd. Nogmaals, dit is een type staatsmachine waar het bestaan ​​van de projectName.txt bestand definieert een nieuwe actiestatus voor dat script.

Pow State

De pow State maakt gebruik van de POW Alfred Workflow om te communiceren met het POW-programma. Beide moeten worden geïnstalleerd op het systeem waarop deze werkstroom wordt uitgevoerd. Deze toestand neemt eenvoudig de projectdirectory en projectnaam en creëert een symbolische link in de ~ / .Pow directory. Met de symbolische link daar kan de POW-workflow doorheen bladeren en de server opnieuw opstarten.

Staat verwijderen

De status verwijderen neemt de projectnaam en verwijdert deze uit de lijst met projecten. Het is aan de gebruiker om de map te verwijderen.

Serveer staat

De serveren staat recursief roept Alfred op om de POW Alfred Workflow om de server te bekijken. De POW programma controleert of de server goed werkt voordat hij de locatie doorgeeft die in de browser moet worden bekeken.

Alfred State

De alfred State herhaalt recursief Alfred met de directory van het project. Als Alfred wordt aangeroepen met een absoluut mappad, zal het die map in de Alfred-browser bekijken.

Huidige toestand

De huidige toestand maakt de projectdirectory het huidige project voor de functie verplaatsingsbestanden gemaakt in de tussentijdse zelfstudie.

Met alle staten die op deze manier zijn gedefinieerd, is het eenvoudig om nieuwe acties toe te voegen om de functionaliteit van deze workflow uit te breiden. Voeg gewoon de staat toe aan de Scriptfilter en de actie voor de staat in de Voer het script uit blok.

Conclusie

Wauw, dat was veel om te dekken. Nu de Projectleider workflow is handig en kan eenvoudig worden uitgebreid. Je huiswerk is om deze basis te nemen en meer functies toe te voegen! Als u aan de werkstroom toevoegt, publiceert u uw werk hieronder in de opmerkingen. Het delen van workflows is erg leuk en helpt anderen te leren van wat je hebt gedaan.