Compare commits

..

No commits in common. "master" and "push_ed_eventi" have entirely different histories.

19 changed files with 139 additions and 476 deletions

7
.gitignore vendored
View file

@ -1,10 +1,3 @@
#Specific Android sec file#
###########################
ilovexm24.keystore
myBuildConfig.json
# Compiled platform # # Compiled platform #
################### ###################
platforms/ platforms/

View file

@ -1,48 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10501" android:versionName="1.5.1" package="xm24.digitigrafo.it" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:authorities="${applicationId}.sharing.provider" android:exported="false" android:grantUriPermissions="true" android:name="nl.xservices.plugins.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/sharing_paths" />
</provider>
<activity android:exported="true" android:name="com.adobe.phonegap.push.PushHandlerActivity" android:permission="${applicationId}.permission.PushHandlerActivity" />
<receiver android:name="com.adobe.phonegap.push.BackgroundActionButtonHandler" />
<receiver android:exported="true" android:name="com.google.android.gms.gcm.GcmReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
<service android:exported="false" android:name="com.adobe.phonegap.push.GCMIntentService">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service android:exported="false" android:name="com.adobe.phonegap.push.PushInstanceIDListenerService">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID" />
</intent-filter>
</service>
<service android:exported="false" android:name="com.adobe.phonegap.push.RegistrationIntentService" />
</application>
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permission android:name="${applicationId}.permission.PushHandlerActivity" />
<permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<permission android:name="${applicationId}.permission.PushHandlerActivity" android:protectionLevel="signature" />
</manifest>

View file

@ -3,7 +3,6 @@ App per xm, prende i contenuti dal sito e te li salva nel cellulare.
<img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_post.png" style="width:300px;border:solid 1px black;border-radius:20px;" /> <img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_post.png" style="width:300px;border:solid 1px black;border-radius:20px;" />
<img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_eventi.png" style="width:300px;border:solid 1px black;border-radius:20px;" /> <img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_eventi.png" style="width:300px;border:solid 1px black;border-radius:20px;" />
<img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_menu.png" style="width:300px;border:solid 1px black;border-radius:20px;" /> <img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_menu.png" style="width:300px;border:solid 1px black;border-radius:20px;" />
<img src="https://git.lattuga.net/hacklabbo/Ilovexm24/raw/master/screenshot_lab.png" style="width:300px;border:solid 1px black;border-radius:20px;" />
## Environment ## ## Environment ##
@ -88,46 +87,6 @@ Per installare il plugin sulla rete che non viene installato in automatico
Per lanciare l'emulatore Android con l'applicazione. Per lanciare l'emulatore Android con l'applicazione.
Ovviamente si deve aver configurato il proprio environment correttamente. Ovviamente si deve aver configurato il proprio environment correttamente.
## Aggiornamento
Siam passati allal versione di Cordova 9 e la versione della piattaforma Android 8, per verificare, nella cartella del progetto IloveXM24:
$ cordova -v
9.0.0 (cordova-lib@9.0.1)
$ cordova platform list
Installed platforms:
android 8.0.0
I plugin così:
$ cordova plugin list
cordova-plugin-compat 1.2.0 "Compat"
cordova-plugin-file 4.3.3 "File"
cordova-plugin-media 3.0.1 "Media"
cordova-plugin-network-information 1.3.4 "Network Information"
cordova-plugin-splashscreen 4.0.3 "Splashscreen"
cordova-plugin-whitelist 1.3.3 "Whitelist"
cordova-plugin-x-socialsharing 5.1.8 "SocialSharing"
cordova-sqlite-storage 2.0.4 "Cordova sqlite storage plugin"
es6-promise-plugin 4.2.2 "Promise"
phonegap-plugin-push 1.9.4 "PushPlugin"
E le API dell'sdk Android, ora hanno target 28!
Per aggiornarle, da linea di comando, nella cartella dove avete l'ambiente android, io ce l'ho in home/.android/
$ ./android update sdk
Accettate le malvagie licenze e scaricate.
Poi il build pare funzionare :) yhuuu!
Non ricordo se era bloccante o no, ma ci siamo fatte una copia dell AndroidManifest.xml dopo aver aggiunto la platform, così:
cd platforms/android/app/
cp src/main/AndroidManifest.xml AndroidManifest.xml
## build app
cordova build android --release --buildConfig=myBuildConfig.json
### iOS ### ### iOS ###
Installando `phonegap-plugin-push` se si incontra questo errore: Installando `phonegap-plugin-push` se si incontra questo errore:
@ -140,27 +99,7 @@ Error: CocoaPods was not found. Please install version 1.0.1 or greater from htt
Occore installare `CocoaPods` come descritto sulla [documentazione del plugin](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/INSTALLATION.md#ios-details) Occore installare `CocoaPods` come descritto sulla [documentazione del plugin](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/INSTALLATION.md#ios-details)
## Download ##
## Google Play ##
Solo per chi ha un account google.
Sconsigliamo l'installazione dal Google Play perche' google come multinazionale profila ogni tuo gusto e l'utilizza a scopo commerciale. In pratica ti tratta come merce per accaparrarsi profitto. Se ti e' possibile quindi utilizza fdroid.
https://play.google.com/store/apps/details?id=xm24.digitigrafo.it
## Repository Privato Fdroid ##
Repository gestito da hacklabbo, non e' il repository fdroid ufficiale.
Per poter utilizzare questo repository devi comunque scaricare l'applicazione [fdroid](https://f-droid.org/) e aggiungere questo repository ed attivarlo nella configurazione dell'applicazaione. E' un operazione piuttosto semplice da effettuare.
https://fdroid.hacklabbo.indivia.net/
P.S. Per chi sviluppa: ad ogni commit sarebbe opportuno aumentare l'ultima cifra della versione in config.xml (riga 2: version=1.0.2 -> version=1.0.3) in modo che fdroid riconosca e proponga l'aggiornamento.
## TODO, ISSUE e FEATURE ## ## TODO, ISSUE e FEATURE ##
Usiamo l'[issue tracker](https://git.lattuga.net/hacklabbo/Ilovexm24/issues) non il wiki. Usiamo l'[issue tracker](https://git.lattuga.net/hacklabbo/Ilovexm24/issues) non il wiki.

BIN
android-debug.apk Normal file

Binary file not shown.

View file

@ -1,17 +1,19 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<widget id="xm24.digitigrafo.it" version="1.5.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> <widget id="xm24.digitigrafo.it" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>I love XM24</name> <name>I XM24</name>
<description> <description>
Spazio Sociale Autogestito XM24, Bolognina (BO): info, eventi, comunicati.. I love XM24, iloveXM24 XM24
</description> </description>
<author email="hacklabbo@indivia.net" href="http://hacklabbo.indivia.net"> <author email="info@digitigrafo.it" href="http://hacklabbo.indivia.net">
hacklabbo.indivia.net hacklabbo.indivia.net - digitigrafo.it
</author> </author>
<content src="index.html" /> <content src="index.html" />
<preference name="SplashScreen" value="res/splashscreen.png" />
<preference name = "SplashScreen" value = "res/splashscreen.png" />
<preference name="SplashScreenDelay" value="3000" /> <preference name="SplashScreenDelay" value="3000" />
<preference name="AutoHideSplashScreen" value="false" /> <preference name="AutoHideSplashScreen" value="false" />
<preference name="AndroidPersistentFileLocation" value="Compatibility" /> <preference name="AndroidPersistentFileLocation" value="Compatibility" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" /> <access origin="*" />
<allow-intent href="http://*/*" /> <allow-intent href="http://*/*" />
<allow-intent href="https://*/*" /> <allow-intent href="https://*/*" />
@ -20,36 +22,28 @@
<allow-intent href="mailto:*" /> <allow-intent href="mailto:*" />
<allow-intent href="geo:*" /> <allow-intent href="geo:*" />
<platform name="android"> <platform name="android">
<allow-intent href="market:*" /> <allow-intent href = "market:*" />
<icon src="res/icon.png" /> <icon src = "res/icon.png" />
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name = "SplashScreen" value = "res/splashscreen.png" />
<splash src = "res/splashscreen.png" />
<preference name = "AutoHideSplashScreen" value="false" />
<preference name = "SplashScreen" value = "splashscreen" />
<preference name = "SplashScreenDelay" value="3000" />
<preference name = "SplashMaintainAspectRatio" value="true" />
<preference name = "SplashShowOnlyFirstTime" value="false" />
<preference name="AndroidPersistentFileLocation" value="Compatibility" /> <preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="SplashScreen" value="res/splashscreen.png" />
<splash src="res/splashscreen.png" />
<preference name="AutoHideSplashScreen" value="false" />
<preference name="SplashScreen" value="splashscreen" />
<preference name="SplashScreenDelay" value="3000" />
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="SplashShowOnlyFirstTime" value="false" />
</platform> </platform>
<platform name="ios"> <platform name="ios">
<allow-intent href="itms:*" /> <allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" /> <allow-intent href="itms-apps:*" />
</platform> </platform>
<plugin name="cordova-plugin-file" spec="~4.3.3" />
<plugin name="cordova-plugin-media" spec="~3.0.1" />
<plugin name="cordova-plugin-network-information" spec="~1.3.3">
<variable name="SENDER_ID" value="667898382143" />
</plugin>
<plugin name="cordova-plugin-splashscreen" spec="~4.0.3">
<variable name="SENDER_ID" value="667898382143" />
</plugin>
<plugin name="cordova-plugin-whitelist" spec="~1.3.2" />
<plugin name="cordova-plugin-x-socialsharing" spec="~5.1.8">
<variable name="SENDER_ID" value="667898382143" />
</plugin>
<plugin name="cordova-sqlite-storage" spec="~2.0.4" />
<plugin name="phonegap-plugin-push" spec="~1.9.4"> <plugin name="phonegap-plugin-push" spec="~1.9.4">
<variable name="SENDER_ID" value="667898382143" /> <variable name="SENDER_ID" value="667898382143" />
</plugin> </plugin>
<engine name="android" spec="^8.0.0" />
<plugin name="cordova-sqlite-storage" spec="~2.0.2" />
<plugin name="cordova-plugin-media" spec="~3.0.0" />
<plugin name="cordova-plugin-splashscreen" />
</widget> </widget>

View file

@ -1,43 +0,0 @@
#!/usr/bin/env node
//
// This hook removes specific permissions from the AndroidManifest.xml
// The AndroidManifest is re-generated during the prepare stage,
// so this must be run on the "after_prepare" hook.
//
// Configure the permissions to be forcefully removed.
// NOTE: These permissions will be removed regardless of how many plugins
// require the permission. You can check the permission is only required
// by the plugin you *think* needs it, by looking at the "count" shown in
// your /plugins/android.json file.
// If the count is more than 1, you should search through
// the /plugins//plugin.xml files for <uses-permission> tags.
var permsToRm = [ "RECORD_AUDIO", "MODIFY_AUDIO_SETTINGS", "READ_PHONE_STATE" ];
var fs = require('fs');
var path = require('path');
var rootdir = process.argv[2];
var manifestFile = path.join(rootdir, "plugin/cordova-plugin-media/config.xml");
/*
"platforms/android/app/AndroidManifest.xml"
*/
fs.readFile( manifestFile, "utf8", function( err, data ) {
if (err)
return console.log( "Error reading plugin/cordova-plugin-media/config.xml", err );
var result = data;
for(var i = 0; i < permsToRm.length; i++) {
var search = '<uses-permission android:name="android.permission.' + permsToRm[i] + '" />';
result = result.replace(search, '');
}
fs.writeFile( manifestFile, result, "utf8", function( err ){
if (err)
return console.log( "Error writing AndroidManifest.xml", err );
});
} );

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 131 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -56,7 +56,7 @@
<body> <body>
<!--panel --> <!--panel -->
<div data-role="panel" data-position="left" id="outside" data-theme="a" data-position-fixed="true" data-display="overlay" data-swipe-close="true"> <div data-role="panel" data-position="left" id="outside" data-theme="a" data-position-fixed="true" data-display="overlay" data-swipe-close="true">
<p><img src="image/xm-logo.png" class="panel_logo" /></p> <p><img src="image/ilovexm24_menu.png" class="panel_logo" /></p>
<ul data-role="listview"> <ul data-role="listview">
<li><a class="nav" href="#info">Home</a></li> <li><a class="nav" href="#info">Home</a></li>
<li><a class="nav" href="#ilove">I love XM24</a></li> <li><a class="nav" href="#ilove">I love XM24</a></li>

View file

@ -54,12 +54,11 @@ EVENTS.getDataAndLoad = function (type) {
var evDesc = ai1ec.event.getDescription(event); var evDesc = ai1ec.event.getDescription(event);
var evUrl = ai1ec.event.getUrl(event); var evUrl = ai1ec.event.getUrl(event);
var evGeo = ai1ec.event.getGeo(event); var evGeo = ai1ec.event.getGeo(event);
var evImg = ai1ec.event.getImage(event);
var evInitDate = EVENTS.formatDate(ai1ec.event.getInitDate(event), EVENTS.storeDateFormat); var evInitDate = EVENTS.formatDate(ai1ec.event.getInitDate(event), EVENTS.storeDateFormat);
var evEndDate = EVENTS.formatDate(ai1ec.event.getEndDate(event), EVENTS.storeDateFormat); var evEndDate = EVENTS.formatDate(ai1ec.event.getEndDate(event), EVENTS.storeDateFormat);
FONTE.dbHandler.executeSql('INSERT INTO ' + table + ' VALUES (?,?,?,?,?,?,?,?)', [evId, evTitle, evDesc, evInitDate, evEndDate, evUrl, evGeo, evImg], FONTE.dbHandler.executeSql('INSERT INTO ' + table + ' VALUES (?,?,?,?,?,?,?)', [evId, evTitle, evDesc, evInitDate, evEndDate, evUrl, evGeo],
//onSuccess //onSuccess
function (resultSet) { function (resultSet) {
n_evs_ins++; n_evs_ins++;

View file

@ -1,6 +1,6 @@
var ai1ec = (function(){ var ai1ec = (function(){
var API = {}, json = [], events = []; var API = {}, json = [], events = [];
//Categorie di eventi //Categorie di eventi
API.cats = { API.cats = {
single: 34, single: 34,
@ -12,60 +12,56 @@ var ai1ec = (function(){
endChar = uid.indexOf('@'); endChar = uid.indexOf('@');
return uid.substr(initChar+1, uid.length - uid.substr(endChar -1).length - initChar ); return uid.substr(initChar+1, uid.length - uid.substr(endChar -1).length - initChar );
}; };
//Parser di un evento dell'array tornato da getXmlData //Parser di un evento dell'array tornato da getXmlData
API.event = { API.event = {
getId : function(event) { getId : function(event) {
return event.properties.uid ? getCleanId(event.properties.uid.text) : null; return event.uid ? getCleanId(event.uid) : null;
}, },
getTitle : function(event) { getTitle : function(event) {
return event.properties.summary.text || null; return event.summary || null;
}, },
getDescription : function(event) { getDescription : function(event) {
return event.properties.description.text || ""; return event.description || "";
}, },
getInitDate : function(event) { getInitDate : function(event) {
return event.properties.dtstart && event.properties.dtstart["date-time"] ? event.properties.dtstart["date-time"] : ""; return event.dtstart && event.dtstart._ ? event.dtstart._ : "";
}, },
getEndDate : function(event) { getEndDate : function(event) {
return event.properties.dtend && event.properties.dtend["date-time"] ? event.properties.dtend["date-time"] : ""; return event.dtend && event.dtend._ ? event.dtend._ : "";
}, },
getCats : function(event) { getCats : function(event) {
return event.properties.categories.text || ""; return event.categories || "";
}, },
getTags : function(event) { getTags : function(event) {
return event.properties["x-tags"] && event.properties["x-tags"]._ ? event.properties["x-tags"]._ : ""; return event["x-tags"] && event["x-tags"]._ ? event["x-tags"]._ : "";
}, },
getUrl : function(event) { getUrl : function(event) {
return event.properties.url && event.properties.url.uri && event.properties.url.uri ? event.properties.url.uri : ""; return event.url && event.url.$ && event.url.$.uri ? event.url.$.uri : "";
}, },
getContact : function(event) { getContact : function(event) {
return event.properties.contact || ""; return event.contact || "";
}, },
getGeo : function(event) { getGeo : function(event) {
return event.properties.location.text || ""; return event.geo || "";
}, },
//Regole per gli eventi ripetitivi //Regole per gli evebti ripetitivi
getRule : function(event) { getRule : function(event) {
return event.properties.rrule || ""; return event.rrule || "";
}, },
getImage : function(event){
return event.properties['x-wp-images-url'] && event.properties['x-wp-images-url'].unknown ? event.properties['x-wp-images-url'].unknown : "";
},
}; };
var getXmlData = function(url, catId, callback) { var getXmlData = function(url, catId, callback) {
$.ajax({ $.ajax({
url: url, url: url,
@ -73,7 +69,7 @@ var ai1ec = (function(){
method: 'GET', method: 'GET',
success: function(res) { success: function(res) {
json[catId] = $.xml2json(res); json[catId] = $.xml2json(res);
events[catId] = json[catId]["#document"].icalendar.vcalendar.components.vevent; events[catId] = json[catId]["#document"].vcalendar.vevent;
console.log(events[catId]); console.log(events[catId]);
return callback(events[catId]); return callback(events[catId]);
}, },
@ -83,13 +79,13 @@ var ai1ec = (function(){
} }
}); });
}; };
var getDefaultUrl = function(catId){ var getDefaultUrl = function(catId){
catId = catId || API.cats.single; catId = catId || API.cats.single;
return API.remote.site + API.remote.q + "&" + API.remote.catq + catId + "&" + API.remote.xmlq; return API.remote.site + API.remote.q + "&" + API.remote.catq + catId + "&" + API.remote.xmlq;
}; }
//Oggetto che gestisce attività remote //Oggetto che gestisce attività remote
API.remote = { API.remote = {
site : 'http://www.ecn.org/xm24', site : 'http://www.ecn.org/xm24',
@ -99,20 +95,20 @@ var ai1ec = (function(){
xmlq : 'xml=true', xmlq : 'xml=true',
win : 'window=true', win : 'window=true',
//post_ids //post_ids
//Torna un array con tutti gli eventi organizzati da xm24, un array vuoto se errore. //Torna un array con tutti gli eventi organizzati da xm24, un array vuoto se errore.
getAllEvents : function(catId, callback) { getAllEvents : function(catId, callback) {
var url = getDefaultUrl(catId); var url = getDefaultUrl(catId);
getXmlData(url, catId, callback); getXmlData(url, catId, callback);
}, },
//Torna un array con gli eventi tra -30 e +30 giorni da oggi, un array vuoto se errore. //Torna un array con gli eventi tra -30 e +30 giorni da oggi, un array vuoto se errore.
getLastEvents : function(catId, callback) { getLastEvents : function(catId, callback) {
var url = getDefaultUrl(catId) + '&' + API.remote.win; var url = getDefaultUrl(catId) + '&' + API.remote.win;
getXmlData(url, catId, callback); getXmlData(url, catId, callback);
}, },
} }
return API; return API;
})(); })();

View file

@ -12,12 +12,12 @@ PROJECT.labs = [
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "http://ampioraggio.noblogs.org", //sito personale site: "http://ampioraggio.noblogs.org", //sito personale
contatto : "", //email contatto : "", //email
page: "http://www.ecn.org/xm24/ciclofficina-ampioraggio", //pagina su sito xm24 page: "http://www.ecn.org/xm24/?page_id=16", //pagina su sito xm24
sn: "", //social network sn: "", //social network
}, },
{ collettivo: "SIM", { collettivo: "SIM",
dshort: '“Nessuno educa nessuno, nessuno educa se stesso, gli uomini'+ dshort: '“Nessuno educa nessuno, nessuno educa se stesso, gli uomini'+
'si educano insieme, con la mediazione del mondo.” Paulo Freire', 'si educano insieme, con la mediazione del mondo.” Paulo Freire,',
dlong: "La Scuola dItaliano CON migranti del XM24 è una scuola "+ dlong: "La Scuola dItaliano CON migranti del XM24 è una scuola "+
"autogestita che unisce al percorso linguistico un percorso politico, sia "+ "autogestita che unisce al percorso linguistico un percorso politico, sia "+
"perchè si oppone alle leggi razziste dello stato, sia perchè concepisce "+ "perchè si oppone alle leggi razziste dello stato, sia perchè concepisce "+
@ -25,33 +25,27 @@ PROJECT.labs = [
"di emancipazione, autodefinizione e socializzazione.", "di emancipazione, autodefinizione e socializzazione.",
when : [ when : [
{day: "Lun", hour: ["19:00", "21:00"], title:"Scuola Italiano con Migranti"}, {day: "Lun", hour: ["19:00", "21:00"], title:"Scuola Italiano con Migranti"},
{day: "Lun", hour: ["21:00", "23:00"], title:"Assemlea di gestione SIM"}, {day: "Mar", hour: ["19:00", "21:00"], title:"Scuola Italiano con Migranti"},
{day: "Mar", hour: ["19:00", "21:00"], title:"Scuola Italiano con Migranti"} {day: "Mer", hour: ["19:00", "21:00"], title:"Scuola Italiano con Migranti"}
], ],
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "http://simxm24.noblogs.org", //sito personale site: "http://simxm24.noblogs.org", //sito personale
contatto : "", //email contatto : "", //email
page: "", //pagina su sito xm24 page: "", //pagina su sito xm24
sn: "https://www.fb.com/infoschockxm24", //social network sn: "", //social network
}, },
{ collettivo: "Hacklabbo", { collettivo: "Hacklabbo",
dshort: "Serata di smanettamento collettivo, giochi, confronto. Sottoterra nascono idee, "+ dshort: "Serata di smanettamento collettivo, giochi, confronto. Sottoterra nascono idee, serpeggiano progetti, si condividono codice, saldatori e birrette.",
"serpeggiano progetti, si condividono codice, saldatori e birrette.", dlong: "Le tecnologie invasive, limposizione di una socialita predigerita da parte dei colossi dellinformatica e dei media, la profilazione pervasiva a scopo commerciale e di controllo sociale, la censura governativa ed aziendale e la commercializzazione di massa di prodotti hardware e software che utilizzano licenze limitanti e brevetti intellettuali come armi legali e dogane virtuali sono gabbie sociali in cui lutente viene rinchiuso." +
dlong: "Analizziamo e smontiamo e scardiniamoLe tecnologie invasive, limposizione "+ "Per uscirne analizziamo, smontiamo e scardiniamo le meccaniche in cui ci siamo fatti inscatolare rivendicando la libera circolazione (analogica e digitale) dellinformazione, il diritto alla privacy, allanonimato e alla liberta di espressione ed invenzione e condividiamo conoscenza autoproducendo dal basso strumenti alternativi ed infrastrutture autonome di comunicazione per una partecipazione politica consapevole.",
"di una socialita predigerita da parte dei colossi dellinformatica "+
"e dei media, la profilazione, la censura licenze limitanti e brevetti "+
"Rivendicando la libera circolazione "+
"(analogica e digitale) dellinformazione, il diritto alla privacy, "+
"allanonimato e alla liberta di espressione ed invenzione. Condividiamo "+
"conoscenza autoproducendo dal basso strumenti alternativi ed infrastrutture "+
"autonome di comunicazione per una partecipazione politica consapevole.",
when : [ when : [
{day: "Mer", hour: ["21:00", "24:00"], title:"Hacklabbo" }, {day: "Mer", hour: ["20:00", "23:00"], title:"Hacklabbo" },
], ],
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "http://liste.indivia.net/listinfo/hacklabbo", //sito personale site: "http://liste.indivia.net/listinfo/hacklabbo", //sito personale
contatto : "", //email contatto : "", //email
page: "http://www.ecn.org/xm24/hacklabbo/", //pagina su sito xm24 page: "http://www.ecn.org/xm24/hacklabbo/", //pagina su sito xm24
sn: "", //social network
}, },
{ collettivo: "Infoshock", { collettivo: "Infoshock",
dshort: "L InfoShock di XM24 è uno spazio di consultazione e distribuzione "+ dshort: "L InfoShock di XM24 è uno spazio di consultazione e distribuzione "+
@ -60,7 +54,7 @@ PROJECT.labs = [
"sociale, di incontro, confronto e condivisione, un veicolo sperimentale e "+ "sociale, di incontro, confronto e condivisione, un veicolo sperimentale e "+
"creativo per la trasmissione della cultura e della politica.", "creativo per la trasmissione della cultura e della politica.",
when : [ when : [
{day: "Giov", hour: ["20:00", "23:00"], title:"Apertura spazio Infoshock" }, {day: "Giov", hour: ["18:00", "23:00"], title:"Apertura spazio Infoshock" },
], ],
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "https://infoshockxm24.noblogs.org", //sito personale site: "https://infoshockxm24.noblogs.org", //sito personale
@ -74,9 +68,7 @@ PROJECT.labs = [
"applicare la creazione legata al mondo del visuale. La serigrafia come "+ "applicare la creazione legata al mondo del visuale. La serigrafia come "+
"tecnica di stampa manuale legata al mondo d.i.y. si pone in maniera "+ "tecnica di stampa manuale legata al mondo d.i.y. si pone in maniera "+
"opposta alle logiche della produzione industriale massiva e omologante.", "opposta alle logiche della produzione industriale massiva e omologante.",
when : [ when : [],
{day: "Mer", hour: ["19:30", "22:00"], title:"Apertura serigrafia"},
],
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "", //sito personale site: "", //sito personale
contatto : "serixm@autistici.org", //email contatto : "serixm@autistici.org", //email
@ -90,15 +82,14 @@ PROJECT.labs = [
"tecnica di stampa manuale legata al mondo d.i.y. si pone in maniera "+ "tecnica di stampa manuale legata al mondo d.i.y. si pone in maniera "+
"opposta alle logiche della produzione industriale massiva e omologante.", "opposta alle logiche della produzione industriale massiva e omologante.",
when : [ when : [
{day: "Mar", hour: ["18:30", "20:00"], title:"Hata Yoga"}, {day: "Mar", hour: ["18:30", "20:30"], title:"Hata Yoga"},
{day: "Mer", hour: ["20:30", "22:30"], title:"Hata Yoga meditativa"}, {day: "Mer", hour: ["20:30", "22:30"], title:"Hata Yoga meditativa)"},
{day: "Lun", hour: ["20:30", "22:30"], title:"Hata Yoga meditativa"}, {day: "Gio", hour: ["18:30", "21:00"], title:"Hata Yoga"},
{day: "Gio", hour: ["18:30", "20:00"], title:"Hata Yoga"},
{day: "Lun", hour: ["19:00", "21:00"], title:"Tessuti aerei"}, {day: "Lun", hour: ["19:00", "21:00"], title:"Tessuti aerei"},
{day: "Mer", hour: ["19:00", "21:00"], title:"Tessuti aerei"}, {day: "Mer", hour: ["19:00", "21:00"], title:"Tessuti aerei"},
{day: "Ven", hour: ["19:00", "21:00"], title:"Tessuti aerei"}, {day: "Ven", hour: ["19:00", "21:00"], title:"Tessuti aerei"},
{day: "Sab", hour: ["15:00", "17:00"], title:"Shiatsu"}, {day: "Sab", hour: ["15:00", "17:00"], title:"Shiatsu"},
//{day: "Lun", hour: ["15:00", "17:00"], title:"Acrobalance"} {day: "Lun", hour: ["15:00", "17:00"], title:"Acrobalance"}
], ],
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "http://liste.indivia.net/listinfo/pallestra", //sito personale site: "http://liste.indivia.net/listinfo/pallestra", //sito personale
@ -113,15 +104,15 @@ PROJECT.labs = [
"di insegnare a praticare una disciplina che ha come principi luguaglianza "+ "di insegnare a praticare una disciplina che ha come principi luguaglianza "+
"e il rispetto reciproco", "e il rispetto reciproco",
when : [ when : [
{day: "Lun", hour: ["19:00", "21:00"], title:"Pugilato"}, {day: "Lun", hour: ["20:00", "22:00"], title:"Pugilato"},
{day: "Mer", hour: ["19:00", "21:00"], title:"Pugilato Principianti"}, {day: "Mer", hour: ["20:00", "22:00"], title:"Pugilato Principianti"},
{day: "Ven", hour: ["19:00", "21:00"], title:"Pugilato"}, {day: "Ven", hour: ["20:00", "22:00"], title:"Pugilato"},
], ],
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "http://liste.indivia.net/listinfo/pallestra", //sito personale site: "http://liste.indivia.net/listinfo/pallestra", //sito personale
contatto : "palestrapopolarestevenson@autistici.org", //email contatto : "palestrapopolarestevenson@autistici.org", //email
page: "http://www.ecn.org/xm24/palestrina-libera/", //pagina su sito xm24 page: "http://www.ecn.org/xm24/palestrina-libera/", //pagina su sito xm24
sn: "https://www.fb.com/palestrapopolarestevenson", //social network sn: "https://www.facebook.com/palestrapopolarestevenson", //social network
}, },
{ collettivo: "Lab57 Alchemica", { collettivo: "Lab57 Alchemica",
dshort: "Ascolto psicologico e punto di primo soccorso", dshort: "Ascolto psicologico e punto di primo soccorso",
@ -135,7 +126,7 @@ PROJECT.labs = [
old_event: "", //un vecchio evento old_event: "", //un vecchio evento
site: "http://lab57.indivia.net", //sito personale site: "http://lab57.indivia.net", //sito personale
contatto : "lab57@indivia.net", //email contatto : "lab57@indivia.net", //email
page: "http://www.ecn.org/xm24/alchemicalab57/", //pagina su sito xm24 page: "http://www.ecn.org/xm24/evento/sportello-consulenza-lab57alchemica/", //pagina su sito xm24
sn: "", //social network sn: "", //social network
}, },
{ collettivo: "Campi aperti", { collettivo: "Campi aperti",
@ -173,7 +164,11 @@ PROJECT.labs = [
when : [ when : [
{day: "Mar", hour: ["20.30", "24:30"], title:"Assemblea pubblica Xm24"}, {day: "Mar", hour: ["20.30", "24:30"], title:"Assemblea pubblica Xm24"},
], ],
old_event: "", //un vecchio evento
site: "http://www.ecn.org/xm24/", //sito personale site: "http://www.ecn.org/xm24/", //sito personale
contatto : "", //email
page: "http://www.ecn.org/xm24/", //pagina su sito xm24
sn: "", //social network
}, },
{ collettivo: "No Borders", { collettivo: "No Borders",
dshort: "Lottiamo contro tutte le frontiere, fisiche e immaginarie, e siamo per la libertà di movimento di tutti e tutte.", dshort: "Lottiamo contro tutte le frontiere, fisiche e immaginarie, e siamo per la libertà di movimento di tutti e tutte.",
@ -241,26 +236,18 @@ var init = true;
PROJECT.hr = "<hr class='post-divider'>"; PROJECT.hr = "<hr class='post-divider'>";
var getLabelUrl = function(url){ PROJECT.getHtmlA = function(label, url, _class) {
var label = url.replace(/(http|https):\/\/(www\.)*/,'')
.replace(/\/\s*$/, ""); //l'ultima barra
return label;
};
PROJECT.getHtmlA = function(label, url, _class, isMail) {
if(!url) if(!url)
return ""; return "";
_class = _class || ""; _class = _class || "";
var link = isMail ? "mailto:" + url : url; return "<span class='"+_class+"'>" + label + "</span>"+
"<a class='"+_class+"' href='" + url + "' rel='external'>" +
return "<span class='e_link title "+_class+"'>" + label + "</span>"+ url +
"<a class='e_link e_url"+_class+"' href='" + link + "' rel='external'>" + "</a>";
getLabelUrl(url) +
"</a>" +
"<br>";
}; };
PROJECT.getHtmlDate = function(evt, noDay) { PROJECT.getHtmlDate = function(evt, noDay) {
@ -278,28 +265,22 @@ PROJECT.getHtmlDate = function(evt, noDay) {
}; };
PROJECT.labOrder = function(lab){ PROJECT.labOrder = function(lab){
var events = ""; var events = "<ul>";
for(var e = 0; e < lab.when.length; e++) { for(var e = 0; e < lab.when.length; e++) {
events += "<li>" + PROJECT.getHtmlDate(lab.when[e]) + "</li>"; events += "<ol>" + PROJECT.getHtmlDate(lab.when[e]) + "</ol>";
}
if(events !== '') {
events = "<small>Orari:</small>"+
"<ul>" +
events +
"</ul>";
} }
events += "</ul>";
var li = "<li>"+ var li = "<li>"+
"<p class='title'>" + lab.collettivo + "</p>"+ "<span class='title'>" + lab.collettivo + "</span>"+
"<p class='dshort'>" + lab.dshort + "</p>"+ "<br>"+
PROJECT.getHtmlA("Url: ", lab.page) + "<span class='dshort'>" + lab.dshort + "</span>"+
PROJECT.getHtmlA("Sito: ", lab.site) + "<br>"+
PROJECT.getHtmlA("Email: ", lab.contatto, null, true) + PROJECT.getHtmlA("Sito:", lab.site)+
PROJECT.getHtmlA("Social: ", lab.sn)+ PROJECT.getHtmlA("Social Network", lab.sn)+
"<br>" + events+
events + //"<small>" + cleanTime + "</small>"+
PROJECT.hr + "<hr class='post-divider'>"+
"</li>"; "</li>";
return li; return li;
@ -393,4 +374,4 @@ PROJECT.render = function() {
$('#project p').html("<ul>" + lab + "</ul>"); $('#project p').html("<ul>" + lab + "</ul>");
init = false; init = false;
}; };

View file

@ -1,5 +1,6 @@
function myJsonCategory(Qcategory, div, addTagCategory) { function myJsonCategory(Qcategory, div, addTagCategory) {
FONTE.dbHandler.executeSql("SELECT DISTINCT * FROM xm24_posts WHERE category = ? ORDER BY date COLLATE NOCASE DESC;", [Qcategory], function (resultSet) { $.mobile.loading('show');
FONTE.dbHandler.executeSql("SELECT * FROM xm24_posts WHERE category = ? ORDER BY date COLLATE NOCASE DESC;", [Qcategory], function (resultSet) {
var items = []; var items = [];
for (var i = 0; i < resultSet.rows.length; i++) { for (var i = 0; i < resultSet.rows.length; i++) {
var val = JSON.parse(resultSet.rows.item(i).post); var val = JSON.parse(resultSet.rows.item(i).post);
@ -82,10 +83,7 @@ var drawListPost = function(div, resultSet, position) {
} else if(position == 'prepend'){ } else if(position == 'prepend'){
ul.prependTo(div); ul.prependTo(div);
} }
$.mobile.loading('hide');
setTimeout(function () {
$.mobile.loading('hide');
}, 1000);
}; };
var appendPostList = function(div, resultSet, categories, fallback) { var appendPostList = function(div, resultSet, categories, fallback) {
@ -146,7 +144,7 @@ var getCategoryWhere = function(categories) {
var POST = POST || {}; var POST = POST || {};
POST.sql = { POST.sql = {
init: "SELECT DISTINCT * FROM xm24_posts JOIN xm24_cats_to_posts USING(id) WHERE ", init: "SELECT * FROM xm24_posts JOIN xm24_cats_to_posts USING(id) WHERE ",
end : "ORDER BY date COLLATE NOCASE DESC LIMIT ?" end : "ORDER BY date COLLATE NOCASE DESC LIMIT ?"
}; };
@ -197,7 +195,7 @@ function myJsonLastPage(div) {
var firstTime = storage.getItem('db_lastnews_firsttime'); var firstTime = storage.getItem('db_lastnews_firsttime');
if (firstTime != 'yes') { if (firstTime != 'yes') {
if (lastnewsDate) { if (lastnewsDate) {
FONTE.dbHandler.executeSql("SELECT DISTINCT * FROM xm24_posts WHERE date > ? ORDER BY date COLLATE NOCASE DESC LIMIT 40;", [lastnewsDate], function (resultSet) { FONTE.dbHandler.executeSql("SELECT * FROM xm24_posts WHERE date > ? ORDER BY date COLLATE NOCASE DESC LIMIT 40;", [lastnewsDate], function (resultSet) {
var items = []; var items = [];
$(div).empty(); $(div).empty();
if (resultSet.rows.length > 0) { if (resultSet.rows.length > 0) {
@ -234,7 +232,7 @@ function myJsonLastPage(div) {
function myJsonCategoryPaginated(Qcategory, div, pageNumber) { function myJsonCategoryPaginated(Qcategory, div, pageNumber) {
$.mobile.loading('show'); $.mobile.loading('show');
FONTE.dbHandler.executeSql("SELECT DISTINCT * FROM xm24_posts WHERE category = ? ORDER BY date COLLATE NOCASE DESC;", [Qcategory], function (resultSet) { FONTE.dbHandler.executeSql("SELECT * FROM xm24_posts WHERE category = ? ORDER BY date COLLATE NOCASE DESC;", [Qcategory], function (resultSet) {
var items = []; var items = [];
$(div).empty(); $(div).empty();
for (var i = 0; i < resultSet.rows.length; i++) { for (var i = 0; i < resultSet.rows.length; i++) {
@ -300,15 +298,11 @@ function drawEvent(div_title, div_content, resultSet){
var id = val.id; var id = val.id;
var title = val.title; var title = val.title;
var url = val.url; var url = val.url;
var content = entityToHtml(val.description); var content = val.description;
var geo = val.geo; var geo = val.geo;
var imgUrlThumb = getImageUrl(val.img, 'thumb');
$(div_title).html(title); $(div_title).html(title);
var img = imgUrlThumb != "" ? "<a href='" + getImageUrl(val.img, 'large') + "'>" + $(div_content).html("<small>" + evInitDate +"-" + evEndDate +"</small><p>" + content + "</p>");
"<img src='" + imgUrlThumb + "'/>" +
"</a><br>" : "";
$(div_content).html(img + "<small>" + evInitDate +"-" + evEndDate +"</small><p>" + content + "</p>");
renderShareButton(div_content, title, url, evInitDate + " "+ evEndDate); renderShareButton(div_content, title, url, evInitDate + " "+ evEndDate);
} }
} }
@ -319,7 +313,7 @@ function myJsonPost(Qid, div_title, div_content, _class) {
table = EVENTS.table.single; table = EVENTS.table.single;
} }
FONTE.dbHandler.executeSql("SELECT DISTINCT * FROM " + table + " WHERE id = ?;", [Qid], function(resultSet) { FONTE.dbHandler.executeSql("SELECT * FROM " + table + " WHERE id = ?;", [Qid], function(resultSet) {
if(!_class){ if(!_class){
drawPost(div_title, div_content, resultSet); drawPost(div_title, div_content, resultSet);
} else { } else {
@ -331,7 +325,7 @@ function myJsonPost(Qid, div_title, div_content, _class) {
function myJsonPage(Qid, div_title, div_content) { function myJsonPage(Qid, div_title, div_content) {
$.mobile.loading('show'); $.mobile.loading('show');
var pageId = parseInt(Qid); var pageId = parseInt(Qid);
FONTE.dbHandler.executeSql("SELECT DISTINCT * FROM xm24_pages WHERE id = ?;", [pageId], function (resultSet) { FONTE.dbHandler.executeSql("SELECT * FROM xm24_pages WHERE id = ?;", [pageId], function (resultSet) {
for (var i = 0; i < resultSet.rows.length; i++) { for (var i = 0; i < resultSet.rows.length; i++) {
var data = resultSet.rows.item(i); var data = resultSet.rows.item(i);
var id = data.id; var id = data.id;
@ -348,7 +342,7 @@ function myJsonPage(Qid, div_title, div_content) {
function myJsonRandomPost(div_title, div_content) { function myJsonRandomPost(div_title, div_content) {
$.mobile.loading('show'); $.mobile.loading('show');
FONTE.dbHandler.executeSql("SELECT DISTINCT * FROM xm24_posts ORDER BY RANDOM() LIMIT 1;", [], function (resultSet) { FONTE.dbHandler.executeSql("SELECT * FROM xm24_posts ORDER BY RANDOM() LIMIT 1;", [], function (resultSet) {
for (var i = 0; i < resultSet.rows.length; i++) { for (var i = 0; i < resultSet.rows.length; i++) {
var val = JSON.parse(resultSet.rows.item(i).post); var val = JSON.parse(resultSet.rows.item(i).post);
var id = val.id; var id = val.id;
@ -379,8 +373,7 @@ function createDB() {
//FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_tags (id INTEGER PRIMARY KEY, title, tag)'); //FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_tags (id INTEGER PRIMARY KEY, title, tag)');
//FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_tags_to_posts (id, tagid)'); //FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_tags_to_posts (id, tagid)');
//FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_pages (id INTEGER PRIMARY KEY, title, date, page)'); //FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_pages (id INTEGER PRIMARY KEY, title, date, page)');
FONTE.dbHandler.executeSql('DROP TABLE IF EXISTS xm24_events_single'); FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_events_single (id INTEGER PRIMARY KEY, title, description, initDate, endDate, url, geo)');
FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_events_single (id INTEGER PRIMARY KEY, title, description, initDate, endDate, url, geo, img)');
//FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_tags_to_events (id, tagid)'); //FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_tags_to_events (id, tagid)');
//FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_events_repeat (id INTEGER PRIMARY KEY, title, description, initDate, endDate, url, geo)'); //FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_events_repeat (id INTEGER PRIMARY KEY, title, description, initDate, endDate, url, geo)');
}, function () { }, function () {

View file

@ -245,9 +245,9 @@ function getLastSinglePageRecur(url, pagenum, categories) {
}); });
}); });
// if (data.length === 0) { if (data.length == 0) {
// renderLastNews(FONTE.contentListClass, categories); renderLastNews(FONTE.contentListClass, categories);
// } }
}, },
error: JSONErrorHandler error: JSONErrorHandler
}); });

View file

@ -8,7 +8,7 @@ function initStorage() {
} }
/*per network info*/ /*per network info*/
function checkConnection(code, msgConnect, print) { function checkConnection(code, msgConnect) {
var msgTitle = "Non sei connesso"; var msgTitle = "Non sei connesso";
msgConnect = msgConnect || "Occore essere connessi per poter ricevere i nuovi articoli"; msgConnect = msgConnect || "Occore essere connessi per poter ricevere i nuovi articoli";
@ -23,8 +23,7 @@ function checkConnection(code, msgConnect, print) {
states[Connection.CELL] = 'Cell generic connection'; states[Connection.CELL] = 'Cell generic connection';
states[Connection.NONE] = 'No network connection'; states[Connection.NONE] = 'No network connection';
if (states[networkState] == 'Unknown connection' || states[networkState] == 'No network connection') { if (states[networkState] == 'Unknown connection' || states[networkState] == 'No network connection') {
if(! print) toastr.warning(msgConnect, msgTitle);
toastr.warning(msgConnect, msgTitle);
console.log(code); console.log(code);
return false; return false;
} else { } else {
@ -59,15 +58,6 @@ function entityToHtml(string) {
return string; return string;
} }
function getImageUrl(str, dim) {
var sstr = str.split(";");
for(var i = 0; i < sstr.length; i++) {
if(sstr[i].indexOf(dim) > -1){
return sstr[i +1];
}
}
}
var entity_table = { var entity_table = {
// 34: "&quot;", // Quotation mark. Not required // 34: "&quot;", // Quotation mark. Not required
38: "&amp;", // Ampersand. Applied before everything else in the application 38: "&amp;", // Ampersand. Applied before everything else in the application

View file

@ -63,9 +63,6 @@
for (i = 0; i < xml.childNodes.length; i++) { for (i = 0; i < xml.childNodes.length; i++) {
node = xml.childNodes[i]; node = xml.childNodes[i];
if (node.nodeName === "#comment")
continue;
if (node.nodeType === 1) { if (node.nodeType === 1) {
if (node.attributes.length === 0 && node.childElementCount === 0){ if (node.attributes.length === 0 && node.childElementCount === 0){
@ -119,7 +116,7 @@
} }
var root = {}; var root = {};
if (xml.attributes && xml.attributes.length === 0 && xml.childElementCount === 0){ if (xml.attributes && xml.attributes.length === 0 && xml.childElementCount === 0){
root[xml.nodeName] = normalize(xml.textContent, options); root[xml.nodeName] = normalize(xml.textContent, options);
} else { } else {
@ -136,4 +133,4 @@
} else if (typeof window !== 'undefined') { } else if (typeof window !== 'undefined') {
window.xml2json = xml2json; window.xml2json = xml2json;
} }
})(); })();